[FFmpeg-devel] dshow: patches for adding some debug output, using more standardized codec table for lookup

Stefano Sabatini stefasab at gmail.com
Sat Sep 22 10:25:15 CEST 2012


On date Friday 2012-09-21 13:36:43 -0600, Roger Pack encoded:
> Here some dshow patches.  The third patch allows for debug messages
> when enumerating the pins while actually using them, like
> 
> $ ffmpeg -f dshow -i video=XXX
> 
> with -loglevel debug, will show you which pins it actually uses, etc.
> which could be helpful for debugging connection problems with
> different devices.
> 
> Thanks.
> -roger-

> From 704d4cd207d51f04792f7fe8e5f4692d11141c6c Mon Sep 17 00:00:00 2001
> From: rogerdpack <rogerpack2005 at gmail.com>
> Date: Fri, 7 Sep 2012 15:52:32 -0600
> Subject: [PATCH 1/3] dshow: enhance error message
> 
> 
> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
> ---
>  libavdevice/dshow.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
> index 120ddd9..1e86732 100644
> --- a/libavdevice/dshow.c
> +++ b/libavdevice/dshow.c
> @@ -378,7 +378,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>                      enum AVCodecID codec_id = dshow_codecid(bih->biCompression);
>                      AVCodec *codec = avcodec_find_decoder(codec_id);
>                      if (codec_id == AV_CODEC_ID_NONE || !codec) {
> -                        av_log(avctx, AV_LOG_INFO, "  unknown compression type");
> +                        av_log(avctx, AV_LOG_INFO, "  unknown compression type 0x%X", (int) bih->biCompression);
>                      } else {
>                          av_log(avctx, AV_LOG_INFO, "  vcodec=%s", codec->name);
>                      }
> -- 
> 1.7.9.5

LGTM 

> From 7279c01613c0345ce85f18e3814350d438a5e397 Mon Sep 17 00:00:00 2001
> From: rogerdpack <rogerpack2005 at gmail.com>
> Date: Fri, 7 Sep 2012 15:55:07 -0600
> Subject: [PATCH 2/3] dshow: attempt to use more standard codec lookup
> 
> 
> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
> ---
>  libavdevice/dshow.c |   19 ++++---------------
>  1 file changed, 4 insertions(+), 15 deletions(-)
> 
> diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
> index 1e86732..562368d 100644
> --- a/libavdevice/dshow.c
> +++ b/libavdevice/dshow.c
> @@ -23,6 +23,7 @@
>  #include "libavutil/pixdesc.h"
>  #include "libavutil/opt.h"
>  #include "libavformat/internal.h"
> +#include "libavformat/riff.h"
>  #include "avdevice.h"
>  #include "dshow_capture.h"
>  
> @@ -95,18 +96,6 @@ static enum PixelFormat dshow_pixfmt(DWORD biCompression, WORD biBitCount)
>      return PIX_FMT_NONE;
>  }
>  
> -static enum AVCodecID dshow_codecid(DWORD biCompression)
> -{
> -    switch(biCompression) {
> -    case MKTAG('d', 'v', 's', 'd'):
> -        return AV_CODEC_ID_DVVIDEO;
> -    case MKTAG('M', 'J', 'P', 'G'):
> -    case MKTAG('m', 'j', 'p', 'g'):
> -        return AV_CODEC_ID_MJPEG;
> -    }
> -    return AV_CODEC_ID_NONE;
> -}
> -
>  static int
>  dshow_read_close(AVFormatContext *s)
>  {
> @@ -375,7 +364,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>              if (!pformat_set) {
>                  enum PixelFormat pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount);
>                  if (pix_fmt == PIX_FMT_NONE) {
> -                    enum AVCodecID codec_id = dshow_codecid(bih->biCompression);
> +                    enum AVCodecID codec_id = ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression);
>                      AVCodec *codec = avcodec_find_decoder(codec_id);
>                      if (codec_id == AV_CODEC_ID_NONE || !codec) {
>                          av_log(avctx, AV_LOG_INFO, "  unknown compression type 0x%X", (int) bih->biCompression);
> @@ -393,7 +382,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>                  continue;
>              }
>              if (ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO) {
> -                if (ctx->video_codec_id != dshow_codecid(bih->biCompression))
> +                if (ctx->video_codec_id != ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression))
>                      goto next;
>              }
>              if (ctx->pixel_format != PIX_FMT_NONE &&
> @@ -780,7 +769,7 @@ dshow_add_device(AVFormatContext *avctx,
>          codec->height     = bih->biHeight;
>          codec->pix_fmt    = dshow_pixfmt(bih->biCompression, bih->biBitCount);
>          if (codec->pix_fmt == PIX_FMT_NONE) {
> -            codec->codec_id = dshow_codecid(bih->biCompression);
> +            codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression);
>              if (codec->codec_id == AV_CODEC_ID_NONE) {
>                  av_log(avctx, AV_LOG_ERROR, "Unknown compression type. "
>                                   "Please report verbose (-v 9) debug information.\n");
> -- 
> 1.7.9.5

LGTM assuming this is the expected behavior.

> From 6d743136a1c0e36416f598b43e68e2486ff4f214 Mon Sep 17 00:00:00 2001
> From: rogerdpack <rogerpack2005 at gmail.com>
> Date: Fri, 7 Sep 2012 17:32:26 -0600
> Subject: [PATCH 3/3] dshow: allow for pin enumeration logs when capturing
> 
> 
> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
> ---
>  libavdevice/dshow.c |   61 ++++++++++++++++++++++++++++-----------------------
>  1 file changed, 33 insertions(+), 28 deletions(-)
> 
> diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
> index 562368d..2d1df5a 100644
> --- a/libavdevice/dshow.c
> +++ b/libavdevice/dshow.c
> @@ -278,14 +278,13 @@ dshow_cycle_devices(AVFormatContext *avctx, ICreateDevEnum *devenum,
>  
>          buf = dup_wchar_to_utf8(var.bstrVal);
>  
> +        av_log(avctx, pfilter ? AV_LOG_DEBUG : AV_LOG_INFO, " \"%s\"\n", buf);
>          if (pfilter) {
>              if (strcmp(device_name, buf))
>                  goto fail1;
>  
>              if (!skip--)
>                  IMoniker_BindToObject(m, 0, 0, &IID_IBaseFilter, (void *) &device_filter);
> -        } else {
> -            av_log(avctx, AV_LOG_INFO, " \"%s\"\n", buf);
>          }
>  
>  fail1:
> @@ -325,7 +324,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>      AM_MEDIA_TYPE *type = NULL;
>      int format_set = 0;
>      void *caps = NULL;
> -    int i, n, size;
> +    int i, n, size, log_level;
>  
>      if (IPin_QueryInterface(pin, &IID_IAMStreamConfig, (void **) &config) != S_OK)
>          return;
> @@ -347,6 +346,7 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>              VIDEO_STREAM_CONFIG_CAPS *vcaps = caps;
>              BITMAPINFOHEADER *bih;
>              int64_t *fr;
> +            enum PixelFormat pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount);
>  #if DSHOWDEBUG
>              ff_print_VIDEO_STREAM_CONFIG_CAPS(vcaps);
>  #endif
> @@ -362,25 +362,30 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>                  goto next;
>              }
>              if (!pformat_set) {
> -                enum PixelFormat pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount);
> -                if (pix_fmt == PIX_FMT_NONE) {
> -                    enum AVCodecID codec_id = ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression);
> -                    AVCodec *codec = avcodec_find_decoder(codec_id);
> -                    if (codec_id == AV_CODEC_ID_NONE || !codec) {
> -                        av_log(avctx, AV_LOG_INFO, "  unknown compression type 0x%X", (int) bih->biCompression);
> -                    } else {
> -                        av_log(avctx, AV_LOG_INFO, "  vcodec=%s", codec->name);
> -                    }
> +                log_level = AV_LOG_INFO;
> +            } else {
> +                log_level = AV_LOG_DEBUG;
> +            }
> +            pix_fmt = dshow_pixfmt(bih->biCompression, bih->biBitCount);
> +            if (pix_fmt == PIX_FMT_NONE) {
> +                enum AVCodecID codec_id = ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression);
> +                AVCodec *codec = avcodec_find_decoder(codec_id);
> +                if (codec_id == AV_CODEC_ID_NONE || !codec) {
> +                    av_log(avctx, log_level, "  unknown compression type 0x%X", (int) bih->biCompression);
>                  } else {
> -                    av_log(avctx, AV_LOG_INFO, "  pixel_format=%s", av_get_pix_fmt_name(pix_fmt));
> +                    av_log(avctx, log_level, "  vcodec=%s", codec->name);
>                  }
> -                av_log(avctx, AV_LOG_INFO, "  min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g\n",
> -                       vcaps->MinOutputSize.cx, vcaps->MinOutputSize.cy,
> -                       1e7 / vcaps->MaxFrameInterval,
> -                       vcaps->MaxOutputSize.cx, vcaps->MaxOutputSize.cy,
> -                       1e7 / vcaps->MinFrameInterval);
> -                continue;
> +            } else {
> +                av_log(avctx, log_level, "  pixel_format=%s", av_get_pix_fmt_name(pix_fmt));
>              }
> +            av_log(avctx, log_level, "  min s=%ldx%ld fps=%g max s=%ldx%ld fps=%g\n",
> +                   vcaps->MinOutputSize.cx, vcaps->MinOutputSize.cy,
> +                   1e7 / vcaps->MaxFrameInterval,
> +                   vcaps->MaxOutputSize.cx, vcaps->MaxOutputSize.cy,
> +                   1e7 / vcaps->MinFrameInterval);
> +            if (!pformat_set)
> +                continue;
> +
>              if (ctx->video_codec_id != AV_CODEC_ID_RAWVIDEO) {
>                  if (ctx->video_codec_id != ff_codec_get_id(ff_codec_bmp_tags, bih->biCompression))
>                      goto next;
> @@ -417,12 +422,11 @@ dshow_cycle_formats(AVFormatContext *avctx, enum dshowDeviceType devtype,
>              } else {
>                  goto next;
>              }
> -            if (!pformat_set) {
> -                av_log(avctx, AV_LOG_INFO, "  min ch=%lu bits=%lu rate=%6lu max ch=%lu bits=%lu rate=%6lu\n",
> -                       acaps->MinimumChannels, acaps->MinimumBitsPerSample, acaps->MinimumSampleFrequency,
> -                       acaps->MaximumChannels, acaps->MaximumBitsPerSample, acaps->MaximumSampleFrequency);
> -                continue;
> -            }
> +            av_log(avctx, pformat_set ? AV_LOG_DEBUG : AV_LOG_INFO, "  min ch=%lu bits=%lu rate=%6lu max ch=%lu bits=%lu rate=%6lu\n",
> +                   acaps->MinimumChannels, acaps->MinimumBitsPerSample, acaps->MinimumSampleFrequency,
> +                   acaps->MaximumChannels, acaps->MaximumBitsPerSample, acaps->MaximumSampleFrequency);
> +            if (!pformat_set)
> +              continue;
>              if (ctx->sample_rate) {
>                  if (ctx->sample_rate > acaps->MaximumSampleFrequency ||
>                      ctx->sample_rate < acaps->MinimumSampleFrequency)
> @@ -546,6 +550,7 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype,
>          AM_MEDIA_TYPE *type;
>          GUID category;
>          DWORD r2;
> +        char *buf;
>  
>          IPin_QueryPinInfo(pin, &info);
>          IBaseFilter_Release(info.pFilter);
> @@ -560,10 +565,10 @@ dshow_cycle_pins(AVFormatContext *avctx, enum dshowDeviceType devtype,
>          if (!IsEqualGUID(&category, &PIN_CATEGORY_CAPTURE))
>              goto next;
>  
> +        buf = dup_wchar_to_utf8(info.achName);
> +        av_log(avctx, ppin ? AV_LOG_DEBUG : AV_LOG_INFO, " Pin \"%s\"\n", buf);
> +        av_free(buf);
>          if (!ppin) {
> -            char *buf = dup_wchar_to_utf8(info.achName);
> -            av_log(avctx, AV_LOG_INFO, " Pin \"%s\"\n", buf);
> -            av_free(buf);
>              dshow_cycle_formats(avctx, devtype, pin, NULL);
>              goto next;
>          }
> -- 
> 1.7.9.5

Why don't you print it inconditionally with AV_LOG_INFO? That would be
much simpler (and the patch more readable).


> From 44f1f3b763be45ce25a8b600074f30fd0f52a6fb Mon Sep 17 00:00:00 2001
> From: rogerdpack <rogerpack2005 at gmail.com>
> Date: Fri, 21 Sep 2012 13:26:02 -0600
> Subject: [PATCH 4/4] bitmap header lookup: add code comment
> 
> 
> Signed-off-by: rogerdpack <rogerpack2005 at gmail.com>
> ---
>  libavformat/riff.c |    5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/riff.c b/libavformat/riff.c
> index f69e536..f13e604 100644
> --- a/libavformat/riff.c
> +++ b/libavformat/riff.c
> @@ -28,7 +28,10 @@
>  #include "libavutil/avassert.h"
>  
>  /* Note: when encoding, the first matching tag is used, so order is
> -   important if multiple tags possible for a given codec. */
> +   important if multiple tags possible for a given codec. 
> +   Note also that this list is used for more than just riff, other
> +   files use it as well.
> +*/
>  const AVCodecTag ff_codec_bmp_tags[] = {
>      { AV_CODEC_ID_H264,         MKTAG('H', '2', '6', '4') },
>      { AV_CODEC_ID_H264,         MKTAG('h', '2', '6', '4') },
> -- 
> 1.7.9.5

Should be OK, but wait for a comment from Michael.
-- 
FFmpeg = Forgiving Freak Magical Peaceless Enhancing Gladiator


More information about the ffmpeg-devel mailing list