OSDN Git Service

dshow: remove filters from graph before releasing them
authorRamiro Polla <ramiro.polla@gmail.com>
Tue, 13 Sep 2011 17:56:28 +0000 (14:56 -0300)
committerStefano Sabatini <stefasab@gmail.com>
Fri, 16 Sep 2011 09:16:05 +0000 (11:16 +0200)
Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
libavdevice/dshow.c

index 5fa9000..a9d400c 100644 (file)
@@ -112,6 +112,22 @@ dshow_read_close(AVFormatContext *s)
         IMediaControl_Release(ctx->control);
     }
 
+    if (ctx->graph) {
+        IEnumFilters *fenum;
+        int r;
+        r = IGraphBuilder_EnumFilters(ctx->graph, &fenum);
+        if (r == S_OK) {
+            IBaseFilter *f;
+            IEnumFilters_Reset(fenum);
+            while (IEnumFilters_Next(fenum, 1, &f, NULL) == S_OK)
+                if (IGraphBuilder_RemoveFilter(ctx->graph, f) == S_OK)
+                    IEnumFilters_Reset(fenum); /* When a filter is removed,
+                                                * the list must be reset. */
+            IEnumFilters_Release(fenum);
+        }
+        IGraphBuilder_Release(ctx->graph);
+    }
+
     if (ctx->capture_pin[VideoDevice])
         libAVPin_Release(ctx->capture_pin[VideoDevice]);
     if (ctx->capture_pin[AudioDevice])
@@ -130,22 +146,6 @@ dshow_read_close(AVFormatContext *s)
     if (ctx->device_filter[AudioDevice])
         IBaseFilter_Release(ctx->device_filter[AudioDevice]);
 
-    if (ctx->graph) {
-        IEnumFilters *fenum;
-        int r;
-        r = IGraphBuilder_EnumFilters(ctx->graph, &fenum);
-        if (r == S_OK) {
-            IBaseFilter *f;
-            IEnumFilters_Reset(fenum);
-            while (IEnumFilters_Next(fenum, 1, &f, NULL) == S_OK)
-                if (IGraphBuilder_RemoveFilter(ctx->graph, f) == S_OK)
-                    IEnumFilters_Reset(fenum); /* When a filter is removed,
-                                                * the list must be reset. */
-            IEnumFilters_Release(fenum);
-        }
-        IGraphBuilder_Release(ctx->graph);
-    }
-
     if (ctx->device_name[0])
         av_free(ctx->device_name[0]);
     if (ctx->device_name[1])