[FFmpeg-devel] [PATCH v2 26/33] avdevice/dshow: when closing, set context fields back to zero
Diederick Niehorster
dcnieho at gmail.com
Fri Jun 11 23:30:57 EEST 2021
After the avdevice capabilities API is implemented, the format context
may be reused after querying device capabilities in a later
avformat_open_input call. To enable this reuse, after releasing
resources, make sure to also set the corresponding pointers back to
NULL. This correctly indicates their state after cleanup.
Signed-off-by: Diederick Niehorster <dcnieho at gmail.com>
---
libavdevice/dshow.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 4605bd6f8e..20f58aee63 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -291,14 +291,18 @@ dshow_read_close(AVFormatContext *s)
ICaptureGraphBuilder2_Release(ctx->graph_builder2[VideoDevice]);
if (ctx->graph_builder2[AudioDevice])
ICaptureGraphBuilder2_Release(ctx->graph_builder2[AudioDevice]);
+ ctx->graph_builder2[0] = NULL;
+ ctx->graph_builder2[1] = NULL;
if (ctx->control) {
IMediaControl_Stop(ctx->control);
IMediaControl_Release(ctx->control);
}
+ ctx->control = NULL;
if (ctx->media_event)
IMediaEvent_Release(ctx->media_event);
+ ctx->media_event = NULL;
if (ctx->graph) {
IEnumFilters *fenum;
@@ -316,25 +320,34 @@ dshow_read_close(AVFormatContext *s)
IEnumFilters_Release(fenum);
}
IGraphBuilder_Release(ctx->graph);
+ ctx->graph = NULL;
}
if (ctx->capture_pin[VideoDevice])
ff_dshow_pin_Release(ctx->capture_pin[VideoDevice]);
if (ctx->capture_pin[AudioDevice])
ff_dshow_pin_Release(ctx->capture_pin[AudioDevice]);
+ ctx->capture_pin[0] = NULL;
+ ctx->capture_pin[1] = NULL;
if (ctx->capture_filter[VideoDevice])
ff_dshow_filter_Release(ctx->capture_filter[VideoDevice]);
if (ctx->capture_filter[AudioDevice])
ff_dshow_filter_Release(ctx->capture_filter[AudioDevice]);
+ ctx->capture_filter[0] = NULL;
+ ctx->capture_filter[1] = NULL;
if (ctx->device_pin[VideoDevice])
IPin_Release(ctx->device_pin[VideoDevice]);
if (ctx->device_pin[AudioDevice])
IPin_Release(ctx->device_pin[AudioDevice]);
+ ctx->device_pin[0] = NULL;
+ ctx->device_pin[1] = NULL;
if (ctx->device_filter[VideoDevice])
IBaseFilter_Release(ctx->device_filter[VideoDevice]);
if (ctx->device_filter[AudioDevice])
IBaseFilter_Release(ctx->device_filter[AudioDevice]);
+ ctx->device_filter[0] = NULL;
+ ctx->device_filter[1] = NULL;
av_freep(&ctx->device_name[0]);
av_freep(&ctx->device_name[1]);
@@ -343,10 +356,13 @@ dshow_read_close(AVFormatContext *s)
if(ctx->mutex)
CloseHandle(ctx->mutex);
+ ctx->mutex = NULL;
if(ctx->event[0])
CloseHandle(ctx->event[0]);
if(ctx->event[1])
CloseHandle(ctx->event[1]);
+ ctx->event[0] = NULL;
+ ctx->event[1] = NULL;
pktl = ctx->pktl;
while (pktl) {
@@ -355,6 +371,7 @@ dshow_read_close(AVFormatContext *s)
av_free(pktl);
pktl = next;
}
+ ctx->pktl = NULL;
CoUninitialize();
--
2.28.0.windows.1
More information about the ffmpeg-devel
mailing list