diff options
author | Ramiro Polla <ramiro.polla@gmail.com> | 2011-09-09 00:10:07 -0300 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2011-09-16 11:02:13 +0200 |
commit | ee4ed804853026e647f3ec1a0344ec2133a5ae1f (patch) | |
tree | 2394fcc9bad4019119e15d00d6e950f0e8931b49 /libavdevice/dshow.c | |
parent | 41215fdeb33df3f192de48396fab35ac90fca1af (diff) | |
download | ffmpeg-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.c | 73 |
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; } |