[FFmpeg-devel] [PATCH] libavdevice/decklink: 32 bit audio support
Paul B Mahol
onemda at gmail.com
Mon Oct 16 22:56:58 EEST 2017
On 10/16/17, Dave Rice <dave at dericed.com> wrote:
> Hi,
>
> I tested this with my Ultrastudio Express and confirmed that I'm getting
> higher bit depth recordings with the abitscope filter. This patch adds an
> option to get 32 bit audio as an input with the decklink device (beforehand
> only 16 bit audio was supported). This resolves
> http://trac.ffmpeg.org/ticket/6708 and is partly based upon Georg
> Lippitisch's earlier draft at
> https://ffmpeg.org/pipermail/ffmpeg-devel/2015-January/167649.html.
>
>
> From fbf2bd40471c8fa35374bb1a51c51a3f4f36b992 Mon Sep 17 00:00:00 2001
> From: Dave Rice <dave at dericed.com>
> Date: Thu, 12 Oct 2017 13:40:59 -0400
> Subject: [PATCH] libavdevice/decklink: 32 bit audio support
>
> Partially based upon Georg Lippitsch's patch at
> https://ffmpeg.org/pipermail/ffmpeg-devel/2015-January/167649.html.
> ---
> libavdevice/decklink_common.h | 1 +
> libavdevice/decklink_common_c.h | 1 +
> libavdevice/decklink_dec.cpp | 17 ++++++++++++++---
> libavdevice/decklink_dec_c.c | 1 +
> 4 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h
> index 6b2525fb53..b6acb01bb9 100644
> --- a/libavdevice/decklink_common.h
> +++ b/libavdevice/decklink_common.h
> @@ -97,6 +97,7 @@ struct decklink_ctx {
> int frames_buffer_available_spots;
>
> int channels;
> + int audio_depth;
> };
>
> typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t;
> diff --git a/libavdevice/decklink_common_c.h
> b/libavdevice/decklink_common_c.h
> index 5616ab32f9..368ac259e4 100644
> --- a/libavdevice/decklink_common_c.h
> +++ b/libavdevice/decklink_common_c.h
> @@ -42,6 +42,7 @@ struct decklink_cctx {
> double preroll;
> int v210;
> int audio_channels;
> + int audio_depth;
> int duplex_mode;
> DecklinkPtsSource audio_pts_source;
> DecklinkPtsSource video_pts_source;
> diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
> index d9ac01ac91..7e97d5f064 100644
> --- a/libavdevice/decklink_dec.cpp
> +++ b/libavdevice/decklink_dec.cpp
> @@ -771,7 +771,7 @@ HRESULT
> decklink_input_callback::VideoInputFrameArrived(
> av_init_packet(&pkt);
>
> //hack among hacks
> - pkt.size = audioFrame->GetSampleFrameCount() *
> ctx->audio_st->codecpar->channels * (16 / 8);
> + pkt.size = audioFrame->GetSampleFrameCount() *
> ctx->audio_st->codecpar->channels * (ctx->audio_depth / 8);
> audioFrame->GetBytes(&audioFrameBytes);
> audioFrame->GetPacketTime(&audio_pts,
> ctx->audio_st->time_base.den);
> pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock,
> ctx->audio_pts_source, ctx->audio_st->time_base, &initial_audio_pts);
> @@ -854,6 +854,7 @@ av_cold int ff_decklink_read_header(AVFormatContext
> *avctx)
> ctx->audio_pts_source = cctx->audio_pts_source;
> ctx->video_pts_source = cctx->video_pts_source;
> ctx->draw_bars = cctx->draw_bars;
> + ctx->audio_depth = cctx->audio_depth;
> cctx->ctx = ctx;
>
> /* Check audio channel option for valid values: 2, 8 or 16 */
> @@ -866,6 +867,16 @@ av_cold int ff_decklink_read_header(AVFormatContext
> *avctx)
> av_log(avctx, AV_LOG_ERROR, "Value of channels option must be
> one of 2, 8 or 16\n");
> return AVERROR(EINVAL);
> }
> +
> + /* Check audio bit depth option for valid values: 16 or 32 */
> + switch (cctx->audio_depth) {
> + case 16:
> + case 32:
> + break;
> + default:
> + av_log(avctx, AV_LOG_ERROR, "Value for audio bit depth option
> must be either 16 or 32\n");
> + return AVERROR(EINVAL);
This message is redundant with AVOptions, User should be able to
select only 16 or 32,
see bellow.
> + }
>
> /* List available devices. */
> if (ctx->list_devices) {
> @@ -930,7 +941,7 @@ av_cold int ff_decklink_read_header(AVFormatContext
> *avctx)
> goto error;
> }
> st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
> - st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
> + st->codecpar->codec_id = cctx->audio_depth == 32 ?
> AV_CODEC_ID_PCM_S32LE : AV_CODEC_ID_PCM_S16LE;
> st->codecpar->sample_rate = bmdAudioSampleRate48kHz;
> st->codecpar->channels = cctx->audio_channels;
> avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
> @@ -1021,7 +1032,7 @@ av_cold int ff_decklink_read_header(AVFormatContext
> *avctx)
> }
>
> av_log(avctx, AV_LOG_VERBOSE, "Using %d input audio channels\n",
> ctx->audio_st->codecpar->channels);
> - result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz,
> bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->channels);
> + result = ctx->dli->EnableAudioInput(bmdAudioSampleRate48kHz,
> cctx->audio_depth == 32 ? bmdAudioSampleType32bitInteger :
> bmdAudioSampleType16bitInteger, ctx->audio_st->codecpar->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 1127d23ada..1c6d826945 100644
> --- a/libavdevice/decklink_dec_c.c
> +++ b/libavdevice/decklink_dec_c.c
> @@ -72,6 +72,7 @@ static const AVOption options[] = {
> { "wallclock", NULL, 0,
> AV_OPT_TYPE_CONST, { .i64 = PTS_SRC_WALLCLOCK}, 0, 0, DEC, "pts_source"},
> { "draw_bars", "draw bars on signal loss" , OFFSET(draw_bars),
> AV_OPT_TYPE_BOOL, { .i64 = 1}, 0, 1, DEC },
> { "queue_size", "input queue buffer size", OFFSET(queue_size),
> AV_OPT_TYPE_INT64, { .i64 = (1024 * 1024 * 1024)}, 0, INT64_MAX, DEC },
> + { "audio_depth", "audio bitdepth (16 or 32)", OFFSET(audio_depth),
> AV_OPT_TYPE_INT, { .i64 = 16}, 16, 32, DEC },
Use AV_OPT_ ENUM instead.
More information about the ffmpeg-devel
mailing list