On 10/16/17, Dave Rice <d...@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 <d...@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. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel