From e9025573faf69416fcc29a689447e3296c3eaf58 Mon Sep 17 00:00:00 2001 From: Matthias Hunstock Date: Sun, 20 Dec 2015 11:57:32 +0000 Subject: [PATCH] decklink: support all valid numbers of audio channels As it is already written in the documentation, BMD DeckLink cards are capable of capturing 2, 8 or 16 audio channels (for SDI Inputs). Currently the value is hardcoded to 2. Introduces new option. Reviewed-by: Deti Fliegl Signed-off-by: Matthias Hunstock Signed-off-by: Marton Balint --- doc/indevs.texi | 13 ++++++++++++- libavdevice/decklink_common_c.h | 1 + libavdevice/decklink_dec.cpp | 16 ++++++++++++++-- libavdevice/decklink_dec_c.c | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/doc/indevs.texi b/doc/indevs.texi index a3ed0e7405..3fb852b1f8 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -218,7 +218,8 @@ On Windows, you need to run the IDL files through @command{widl}. DeckLink is very picky about the formats it supports. Pixel format is uyvy422 or v210, 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 -of channels can be 2, 8 or 16. +of channels can be 2, 8 or 16. Note that all audio channels are bundled in one single +audio track. @subsection Options @@ -246,6 +247,10 @@ can use the special @option{all} constant to select all possible lines, or receivers. Capturing teletext only works for SD PAL sources in 8 bit mode. To use this option, ffmpeg needs to be compiled with @code{--enable-libzvbi}. +@item channels +Defines number of audio channels to capture. Must be @samp{2}, @samp{8} or @samp{16}. +Defaults to @samp{2}. + @end table @subsection Examples @@ -276,6 +281,12 @@ Capture video clip at 1080i50 10 bit: ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi @end example +@item +Capture video clip at 1080i50 with 16 audio channels: +@example +ffmpeg -channels 16 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi +@end example + @end itemize @section dshow diff --git a/libavdevice/decklink_common_c.h b/libavdevice/decklink_common_c.h index ce1dff7d5d..2b5d92f250 100644 --- a/libavdevice/decklink_common_c.h +++ b/libavdevice/decklink_common_c.h @@ -33,6 +33,7 @@ struct decklink_cctx { int64_t teletext_lines; double preroll; int v210; + int audio_channels; }; #endif /* AVDEVICE_DECKLINK_COMMON_C_H */ diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 9a721c9ffa..9d7dc97fd5 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -466,6 +466,17 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) } #endif + /* Check audio channel option for valid values: 2, 8 or 16 */ + switch (cctx->audio_channels) { + case 2: + case 8: + case 16: + break; + default: + av_log(avctx, AV_LOG_ERROR, "Value of channels option must be one of 2, 8 or 16\n"); + return AVERROR(EINVAL); + } + iter = CreateDeckLinkIteratorInstance(); if (!iter) { av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); @@ -543,7 +554,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = AV_CODEC_ID_PCM_S16LE; st->codec->sample_rate = bmdAudioSampleRate48kHz; - st->codec->channels = 2; + st->codec->channels = cctx->audio_channels; avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */ ctx->audio_st=st; @@ -587,7 +598,8 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) ctx->teletext_st = st; } - result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, 2); + av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n", ctx->audio_st->codec->channels); + result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, ctx->audio_st->codec->channels); if (result != S_OK) { av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n"); diff --git a/libavdevice/decklink_dec_c.c b/libavdevice/decklink_dec_c.c index e5d6bc040f..40c21a753b 100644 --- a/libavdevice/decklink_dec_c.c +++ b/libavdevice/decklink_dec_c.c @@ -35,6 +35,7 @@ static const AVOption options[] = { { "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"}, { "all", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0x7ffffffffLL}, 0, 0, DEC, "teletext_lines"}, + { "channels", "number of audio channels", OFFSET(audio_channels), AV_OPT_TYPE_INT , { .i64 = 2 }, 2, 16, DEC }, { NULL }, };