]> git.sesse.net Git - ffmpeg/commitdiff
avdevice/decklink_dec: add support for rgb/yuv pixel format autodetection
authorMarton Balint <cus@passwd.hu>
Wed, 15 Jul 2020 18:45:22 +0000 (20:45 +0200)
committerMarton Balint <cus@passwd.hu>
Sun, 13 Sep 2020 15:59:30 +0000 (17:59 +0200)
Signed-off-by: Marton Balint <cus@passwd.hu>
doc/indevs.texi
libavdevice/decklink_dec.cpp
libavdevice/decklink_dec_c.c

index 4d2312e201f8d83d36e6a630476d4d769c6c0a51..7748232b26c38adc8225d6a9fa22b60043b7e7ae 100644 (file)
@@ -296,16 +296,31 @@ supports it.
 Set the pixel format of the captured video.
 Available values are:
 @table @samp
+@item auto
+
+This is the default which means 8-bit YUV 422 or 8-bit ARGB if format
+autodetection is used, 8-bit YUV 422 otherwise.
+
 @item uyvy422
 
+8-bit YUV 422.
+
 @item yuv422p10
 
+10-bit YUV 422.
+
 @item argb
 
+8-bit RGB.
+
 @item bgra
 
+8-bit RGB.
+
 @item rgb10
 
+10-bit RGB.
+
 @end table
 
 @item teletext_lines
index af0ef04c5686dbaba68cf3989a9e2004b6ffc3ba..92b8feed1426e8b851c3d1b4373c5b1a38cf6eec 100644 (file)
@@ -1044,9 +1044,13 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
 
 HRESULT decklink_input_callback::VideoInputFormatChanged(
     BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode *mode,
-    BMDDetectedVideoInputFormatFlags)
+    BMDDetectedVideoInputFormatFlags formatFlags)
 {
+    struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data;
     ctx->bmd_mode = mode->GetDisplayMode();
+    // check the C context member to make sure we set both raw_format and bmd_mode with data from the same format change callback
+    if (!cctx->raw_format)
+        ctx->raw_format = (formatFlags & bmdDetectedVideoInputRGB444) ? bmdFormat8BitARGB : bmdFormat8BitYUV;
     return S_OK;
 }
 
@@ -1228,6 +1232,8 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
         }
         av_log(avctx, AV_LOG_INFO, "Autodetected the input mode\n");
     }
+    if (ctx->raw_format == bmdFormatUnspecified)
+        ctx->raw_format = bmdFormat8BitYUV;
     if (ff_decklink_set_format(avctx, DIRECTION_IN) < 0) {
         av_log(avctx, AV_LOG_ERROR, "Could not set format code %s for %s\n",
             cctx->format_code ? cctx->format_code : "(unset)", avctx->url);
index 9f4b32088c2bf44a66c925b05b20a8bda6a6128b..54cd681710cc5b1d2c942afb52382e597470da9a 100644 (file)
@@ -33,7 +33,8 @@ static const AVOption options[] = {
     { "list_devices", "list available devices"  , OFFSET(list_devices), AV_OPT_TYPE_INT   , { .i64 = 0   }, 0, 1, DEC },
     { "list_formats", "list supported formats"  , OFFSET(list_formats), AV_OPT_TYPE_INT   , { .i64 = 0   }, 0, 1, DEC },
     { "format_code",  "set format by fourcc"    , OFFSET(format_code),  AV_OPT_TYPE_STRING, { .str = NULL}, 0, 0, DEC },
-    { "raw_format",   "pixel format to be returned by the card when capturing" , OFFSET(raw_format),  AV_OPT_TYPE_INT, { .i64 = MKBETAG('2','v','u','y')}, 0, UINT_MAX, DEC, "raw_format" },
+    { "raw_format",   "pixel format to be returned by the card when capturing" , OFFSET(raw_format),  AV_OPT_TYPE_INT, { .i64 = 0}, 0, UINT_MAX, DEC, "raw_format" },
+    { "auto",          NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = 0                        }, 0, 0, DEC, "raw_format"},
     { "uyvy422",       NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = MKBETAG('2','v','u','y') }, 0, 0, DEC, "raw_format"},
     { "yuv422p10",     NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = MKBETAG('v','2','1','0') }, 0, 0, DEC, "raw_format"},
     { "argb",          NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = 32                       }, 0, 0, DEC, "raw_format"},