diff mbox

[FFmpeg-devel] libavdevice/decklink: 32 bit audio support

Message ID 5C9C4D52-2064-46F9-8623-6C8CFA3F3DC1@dericed.com
State New
Headers show

Commit Message

Dave Rice Oct. 18, 2017, 7:23 p.m. UTC
> On Oct 18, 2017, at 3:07 PM, Marton Balint <cus@passwd.hu> wrote:
> 
> On Mon, 16 Oct 2017, Dave Rice 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@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(-)
> 
> Missing docs/indevs.texi update and libavdevice micro bump.

Updated.

From 1e5ff78fec9b13eccac9a96acc358bbfd6a7015d Mon Sep 17 00:00:00 2001
From: Dave Rice <dave@dericed.com>
Date: Wed, 18 Oct 2017 15:21:46 -0400
Subject: [PATCH] libavdevice/decklink: 32 bit audio support

---
 doc/indevs.texi                 |  4 ++++
 libavdevice/decklink_common.h   |  1 +
 libavdevice/decklink_common_c.h |  1 +
 libavdevice/decklink_dec.cpp    | 17 ++++++++++++++---
 libavdevice/decklink_dec_c.c    |  1 +
 libavdevice/version.h           |  2 +-
 6 files changed, 22 insertions(+), 4 deletions(-)

Comments

Marton Balint Oct. 18, 2017, 7:52 p.m. UTC | #1
On Wed, 18 Oct 2017, Dave Rice wrote:

>
>> On Oct 18, 2017, at 3:07 PM, Marton Balint <cus@passwd.hu> wrote:
>> 
>> On Mon, 16 Oct 2017, Dave Rice 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@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(-)
>> 
>> Missing docs/indevs.texi update and libavdevice micro bump.
>
> Updated.

Thanks, applied.

Regards,
Marton
ffmpeg@dx9s.net Oct. 20, 2017, 3:08 a.m. UTC | #2
On 2017-10-18 12:23, Dave Rice wrote:
> [...]
> Updated.
> 
> From 1e5ff78fec9b13eccac9a96acc358bbfd6a7015d Mon Sep 17 00:00:00 2001
> From: Dave Rice <dave@dericed.com>
> Date: Wed, 18 Oct 2017 15:21:46 -0400
> Subject: [PATCH] libavdevice/decklink: 32 bit audio support
> 

Is that a commit (1e5ff78fec9b13eccac9a96acc358bbfd6a7015d) I should 
check out on my Decklink and try or is there another one I should try?

Will try to get to testing it this weekend.

--Doug (dx9s)
ffmpeg@dx9s.net Oct. 20, 2017, 3:19 a.m. UTC | #3
On 2017-10-19 20:08, Douglas Marsh wrote:
> 
> Is that a commit (1e5ff78fec9b13eccac9a96acc358bbfd6a7015d) I should
> check out on my Decklink and try or is there another one I should try?
> 
> Will try to get to testing it this weekend.
> 

Nevermind I found this:

* commit 89cc48551bbe9f147ba9f4ca3821a35797cf7b47
| Author: Dave Rice <dave@dericed.com>
| Date:   Wed Oct 18 15:21:46 2017 -0400
|
|     avdevice/decklink_dec: 32 bit audio support
|
|     Signed-off-by: Marton Balint <cus@passwd.hu>


I'll merge that with a local branch I forked for testing purposes 
(marking a known place for testing).

--Doug (dx9s)
ffmpeg@dx9s.net Oct. 20, 2017, 3:06 p.m. UTC | #4
On 2017-10-19 20:08, Douglas Marsh wrote:
> On 2017-10-18 12:23, Dave Rice wrote:
>> [...]
>> Updated.
>> 
>> From 1e5ff78fec9b13eccac9a96acc358bbfd6a7015d Mon Sep 17 00:00:00 2001
>> From: Dave Rice <dave@dericed.com>
>> Date: Wed, 18 Oct 2017 15:21:46 -0400
>> Subject: [PATCH] libavdevice/decklink: 32 bit audio support
>> 

I (quickly before going to bed) did the following from commit: 
858db4b01fa2b55ee55056c033054ca54ac9b0fd

(documented the morning after, but believe this is correct)

Works:
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' -c:a 
pcm_s24le -vcodec libx264 -crf 0 -preset superfast test.mov
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' -c:a 
pcm_s32le -vcodec libx264 -crf 0 -preset superfast test.mkv
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' 
-acodec flac -vcodec libx264 -crf 0 -preset superfast test.mkv

Doesn't work (issues with MOV and 32-bit audio so assuming not a deal, 
unless 32-bit audio SHOULD work)
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' 
-acodec copy -vcodec libx264 -crf 0 -preset superfast test.mov
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' -c:a 
pcm_s32le -vcodec libx264 -crf 0 -preset superfast test.mov

Haven't tested rgb10 (assuming is "soft" fails [600.0fps*] or complains 
like in previous builds):
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format rgb10 -i 'DeckLink Studio 4K' -c:a 
copy -vcodec libx264 -crf 0 -preset superfast test.mkv

*=soft fails as in older builds getting a reported 600.0fps (I posted 
something here previous) when -c copy output.avi and analyze the avi 
file metadata

(side note)
Also works: (with v4l2loopback)
$ ffmpeg10 -format_code Hp59 -f decklink -video_input hdmi -audio_input 
embedded -audio_depth 32 -raw_format argb -i 'DeckLink Studio 4K' -c:a 
null -c:v rawvideo -pix_fmt yuv420p -threads 2 -f v4l2 /dev/videoX

(where ffmpeg10 = 
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/x264-10bit/libx264.so.148 ffmpeg 
"$@")

--Doug (dx9s)
diff mbox

Patch

diff --git a/doc/indevs.texi b/doc/indevs.texi
index 55a4084bb2..d308bbf7de 100644
--- a/doc/indevs.texi
+++ b/doc/indevs.texi
@@ -311,6 +311,10 @@  Sets maximum input buffer size in bytes. If the buffering reaches this value,
 incoming frames will be dropped.
 Defaults to @samp{1073741824}.
 
+@item audio_depth
+Sets the audio sample bit depth. Must be @samp{16} or @samp{32}.
+Defaults to @samp{16}.
+
 @end table
 
 @subsection Examples
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);
+    }
 
     /* 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 },
     { NULL },
 };
 
diff --git a/libavdevice/version.h b/libavdevice/version.h
index d3622c5395..68defac417 100644
--- a/libavdevice/version.h
+++ b/libavdevice/version.h
@@ -29,7 +29,7 @@ 
 
 #define LIBAVDEVICE_VERSION_MAJOR  57
 #define LIBAVDEVICE_VERSION_MINOR  11
-#define LIBAVDEVICE_VERSION_MICRO 100
+#define LIBAVDEVICE_VERSION_MICRO 101
 
 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
                                                LIBAVDEVICE_VERSION_MINOR, \