summaryrefslogtreecommitdiff
path: root/libavdevice/dshow.c
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2011-09-09 00:10:07 -0300
committerStefano Sabatini <stefasab@gmail.com>2011-09-16 11:02:13 +0200
commitee4ed804853026e647f3ec1a0344ec2133a5ae1f (patch)
tree2394fcc9bad4019119e15d00d6e950f0e8931b49 /libavdevice/dshow.c
parent41215fdeb33df3f192de48396fab35ac90fca1af (diff)
downloadffmpeg-ee4ed804853026e647f3ec1a0344ec2133a5ae1f.tar.gz
dshow: factorise cycling through pins
Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'libavdevice/dshow.c')
-rw-r--r--libavdevice/dshow.c73
1 files changed, 47 insertions, 26 deletions
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 7035337c9d..2ef313f648 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -295,42 +295,27 @@ fail1:
return 0;
}
+/**
+ * Cycle through available pins using the device_filter device, of type
+ * devtype, retrieve the first output pin and return the pointer to the
+ * object found in *ppin.
+ */
static int
-dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum,
- enum dshowDeviceType devtype)
+dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype,
+ IBaseFilter *device_filter, IPin **ppin)
{
- struct dshow_ctx *ctx = avctx->priv_data;
- IBaseFilter *device_filter = NULL;
- IGraphBuilder *graph = ctx->graph;
IEnumPins *pins = 0;
IPin *device_pin = NULL;
- libAVPin *capture_pin = NULL;
- libAVFilter *capture_filter = NULL;
- int ret = AVERROR(EIO);
IPin *pin;
int r;
const GUID *mediatype[2] = { &MEDIATYPE_Video, &MEDIATYPE_Audio };
const char *devtypename = (devtype == VideoDevice) ? "video" : "audio";
- const wchar_t *filter_name[2] = { L"Audio capture filter", L"Video capture filter" };
-
- if ((r = dshow_cycle_devices(avctx, devenum, devtype, &device_filter)) < 0) {
- ret = r;
- goto error;
- }
-
- ctx->device_filter [devtype] = device_filter;
-
- r = IGraphBuilder_AddFilter(graph, device_filter, NULL);
- if (r != S_OK) {
- av_log(avctx, AV_LOG_ERROR, "Could not add device filter to graph.\n");
- goto error;
- }
r = IBaseFilter_EnumPins(device_filter, &pins);
if (r != S_OK) {
av_log(avctx, AV_LOG_ERROR, "Could not enumerate pins.\n");
- goto error;
+ return AVERROR(EIO);
}
while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK && !device_pin) {
@@ -375,9 +360,48 @@ next:
IPin_Release(pin);
}
+ IEnumPins_Release(pins);
+
if (!device_pin) {
av_log(avctx, AV_LOG_ERROR,
"Could not find output pin from %s capture device.\n", devtypename);
+ return AVERROR(EIO);
+ }
+ *ppin = device_pin;
+
+ return 0;
+}
+
+static int
+dshow_open_device(AVFormatContext *avctx, ICreateDevEnum *devenum,
+ enum dshowDeviceType devtype)
+{
+ struct dshow_ctx *ctx = avctx->priv_data;
+ IBaseFilter *device_filter = NULL;
+ IGraphBuilder *graph = ctx->graph;
+ IPin *device_pin = NULL;
+ libAVPin *capture_pin = NULL;
+ libAVFilter *capture_filter = NULL;
+ int ret = AVERROR(EIO);
+ int r;
+
+ const wchar_t *filter_name[2] = { L"Audio capture filter", L"Video capture filter" };
+
+ if ((r = dshow_cycle_devices(avctx, devenum, devtype, &device_filter)) < 0) {
+ ret = r;
+ goto error;
+ }
+
+ ctx->device_filter [devtype] = device_filter;
+
+ r = IGraphBuilder_AddFilter(graph, device_filter, NULL);
+ if (r != S_OK) {
+ av_log(avctx, AV_LOG_ERROR, "Could not add device filter to graph.\n");
+ goto error;
+ }
+
+ if ((r = dshow_cycle_pins(avctx, devtype, device_filter, &device_pin)) < 0) {
+ ret = r;
goto error;
}
ctx->device_pin[devtype] = device_pin;
@@ -409,9 +433,6 @@ next:
ret = 0;
error:
- if (pins)
- IEnumPins_Release(pins);
-
return ret;
}