Commit cb8b7291 authored by Gildas Fargeas's avatar Gildas Fargeas Committed by Marton Balint

avdevice/decklink_dec: add support for more pixel formats

The decklink input pixel format can now be specified with the 'raw_format'
option. The -bm_v210 option is now deprecated.
Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent 00a61f30
...@@ -214,8 +214,9 @@ need to configure with the appropriate @code{--extra-cflags} ...@@ -214,8 +214,9 @@ need to configure with the appropriate @code{--extra-cflags}
and @code{--extra-ldflags}. and @code{--extra-ldflags}.
On Windows, you need to run the IDL files through @command{widl}. On Windows, you need to run the IDL files through @command{widl}.
DeckLink is very picky about the formats it supports. Pixel format is DeckLink is very picky about the formats it supports. Pixel format of the
uyvy422 or v210, framerate and video size must be determined for your device with input can be set with @option{raw_format}.
Framerate and video size must be determined for your device with
@command{-list_formats 1}. Audio sample rate is always 48 kHz and the number @command{-list_formats 1}. Audio sample rate is always 48 kHz and the number
of channels can be 2, 8 or 16. Note that all audio channels are bundled in one single of channels can be 2, 8 or 16. Note that all audio channels are bundled in one single
audio track. audio track.
...@@ -239,9 +240,26 @@ Note that there is a FourCC @option{'pal '} that can also be used ...@@ -239,9 +240,26 @@ Note that there is a FourCC @option{'pal '} that can also be used
as @option{pal} (3 letters). as @option{pal} (3 letters).
@item bm_v210 @item bm_v210
This is a deprecated option, you can use @option{raw_format} instead.
If set to @samp{1}, video is captured in 10 bit v210 instead If set to @samp{1}, video is captured in 10 bit v210 instead
of uyvy422. Not all Blackmagic devices support this option. of uyvy422. Not all Blackmagic devices support this option.
@item raw_format
Set the pixel format of the captured video.
Available values are:
@table @samp
@item uyvy422
@item yuv422p10
@item argb
@item bgra
@item rgb10
@end table
@item teletext_lines @item teletext_lines
If set to nonzero, an additional teletext stream will be captured from the If set to nonzero, an additional teletext stream will be captured from the
vertical ancillary data. Both SD PAL (576i) and HD (1080i or 1080p) vertical ancillary data. Both SD PAL (576i) and HD (1080i or 1080p)
......
...@@ -241,7 +241,7 @@ int ff_decklink_set_format(AVFormatContext *avctx, ...@@ -241,7 +241,7 @@ int ff_decklink_set_format(AVFormatContext *avctx,
if (ctx->bmd_mode == bmdModeUnknown) if (ctx->bmd_mode == bmdModeUnknown)
return -1; return -1;
if (direction == DIRECTION_IN) { if (direction == DIRECTION_IN) {
if (ctx->dli->DoesSupportVideoMode(ctx->bmd_mode, bmdFormat8BitYUV, if (ctx->dli->DoesSupportVideoMode(ctx->bmd_mode, (BMDPixelFormat) cctx->raw_format,
bmdVideoOutputFlagDefault, bmdVideoOutputFlagDefault,
&support, NULL) != S_OK) &support, NULL) != S_OK)
return -1; return -1;
......
...@@ -49,6 +49,7 @@ struct decklink_cctx { ...@@ -49,6 +49,7 @@ struct decklink_cctx {
int video_input; int video_input;
int draw_bars; int draw_bars;
char *format_code; char *format_code;
int raw_format;
int64_t queue_size; int64_t queue_size;
}; };
......
...@@ -651,6 +651,11 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -651,6 +651,11 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
return AVERROR_EXIT; return AVERROR_EXIT;
} }
if (cctx->v210) {
av_log(avctx, AV_LOG_WARNING, "The bm_v210 option is deprecated and will be removed. Please use the -raw_format yuv422p10.\n");
cctx->raw_format = MKBETAG('v','2','1','0');
}
strcpy (fname, avctx->filename); strcpy (fname, avctx->filename);
tmp=strchr (fname, '@'); tmp=strchr (fname, '@');
if (tmp != NULL) { if (tmp != NULL) {
...@@ -723,15 +728,42 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -723,15 +728,42 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
st->time_base.num = ctx->bmd_tb_num; st->time_base.num = ctx->bmd_tb_num;
av_stream_set_r_frame_rate(st, av_make_q(st->time_base.den, st->time_base.num)); av_stream_set_r_frame_rate(st, av_make_q(st->time_base.den, st->time_base.num));
if (cctx->v210) { switch((BMDPixelFormat)cctx->raw_format) {
st->codecpar->codec_id = AV_CODEC_ID_V210; case bmdFormat8BitYUV:
st->codecpar->codec_tag = MKTAG('V', '2', '1', '0');
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 64, st->time_base.den, st->time_base.num * 3);
} else {
st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO; st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
st->codecpar->format = AV_PIX_FMT_UYVY422;
st->codecpar->codec_tag = MKTAG('U', 'Y', 'V', 'Y'); st->codecpar->codec_tag = MKTAG('U', 'Y', 'V', 'Y');
st->codecpar->format = AV_PIX_FMT_UYVY422;
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 16, st->time_base.den, st->time_base.num); st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 16, st->time_base.den, st->time_base.num);
break;
case bmdFormat10BitYUV:
st->codecpar->codec_id = AV_CODEC_ID_V210;
st->codecpar->codec_tag = MKTAG('V','2','1','0');
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 64, st->time_base.den, st->time_base.num * 3);
st->codecpar->bits_per_coded_sample = 10;
break;
case bmdFormat8BitARGB:
st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
st->codecpar->codec_tag = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);;
st->codecpar->format = AV_PIX_FMT_ARGB;
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
break;
case bmdFormat8BitBGRA:
st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
st->codecpar->codec_tag = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);
st->codecpar->format = AV_PIX_FMT_BGRA;
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
break;
case bmdFormat10BitRGB:
st->codecpar->codec_id = AV_CODEC_ID_R210;
st->codecpar->codec_tag = MKTAG('R','2','1','0');
st->codecpar->format = AV_PIX_FMT_RGB48LE;
st->codecpar->bit_rate = av_rescale(ctx->bmd_width * ctx->bmd_height * 30, st->time_base.den, st->time_base.num);
st->codecpar->bits_per_coded_sample = 10;
break;
default:
av_log(avctx, AV_LOG_ERROR, "Raw Format %.4s not supported\n", (char*) &cctx->raw_format);
ret = AVERROR(EINVAL);
goto error;
} }
switch (ctx->bmd_field_dominance) { switch (ctx->bmd_field_dominance) {
...@@ -776,7 +808,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ...@@ -776,7 +808,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
} }
result = ctx->dli->EnableVideoInput(ctx->bmd_mode, result = ctx->dli->EnableVideoInput(ctx->bmd_mode,
cctx->v210 ? bmdFormat10BitYUV : bmdFormat8BitYUV, (BMDPixelFormat) cctx->raw_format,
bmdVideoInputFlagDefault); bmdVideoInputFlagDefault);
if (result != S_OK) { if (result != S_OK) {
......
...@@ -34,6 +34,12 @@ static const AVOption options[] = { ...@@ -34,6 +34,12 @@ static const AVOption options[] = {
{ "list_formats", "list supported formats" , OFFSET(list_formats), 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 }, { "format_code", "set format by fourcc" , OFFSET(format_code), AV_OPT_TYPE_STRING, { .str = NULL}, 0, 0, DEC },
{ "bm_v210", "v210 10 bit per channel" , OFFSET(v210), AV_OPT_TYPE_INT , { .i64 = 0 }, 0, 1, DEC }, { "bm_v210", "v210 10 bit per channel" , OFFSET(v210), AV_OPT_TYPE_INT , { .i64 = 0 }, 0, 1, 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" },
{ "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"},
{ "bgra", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MKBETAG('B','G','R','A') }, 0, 0, DEC, "raw_format"},
{ "rgb10", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MKBETAG('r','2','1','0') }, 0, 0, DEC, "raw_format"},
{ "teletext_lines", "teletext lines bitmask", OFFSET(teletext_lines), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, 0x7ffffffffLL, DEC, "teletext_lines"}, { "teletext_lines", "teletext lines bitmask", OFFSET(teletext_lines), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, 0x7ffffffffLL, DEC, "teletext_lines"},
{ "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7fff9fffeLL}, 0, 0, DEC, "teletext_lines"}, { "standard", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7fff9fffeLL}, 0, 0, DEC, "teletext_lines"},
{ "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7ffffffffLL}, 0, 0, DEC, "teletext_lines"}, { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7ffffffffLL}, 0, 0, DEC, "teletext_lines"},
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 57 #define LIBAVDEVICE_VERSION_MAJOR 57
#define LIBAVDEVICE_VERSION_MINOR 9 #define LIBAVDEVICE_VERSION_MINOR 9
#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_MICRO 101
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \ LIBAVDEVICE_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment