From patchwork Mon Oct 16 18:38:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Rice X-Patchwork-Id: 5588 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp4020857jah; Mon, 16 Oct 2017 11:39:00 -0700 (PDT) X-Google-Smtp-Source: ABhQp+QPJiXEPE7ifMNcvq66YBluv3AFqmVtrgxIYTsloi7zomunb+m+ZlzLJqgaswKkrw9gUePA X-Received: by 10.28.63.206 with SMTP id m197mr1715624wma.106.1508179140250; Mon, 16 Oct 2017 11:39:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508179140; cv=none; d=google.com; s=arc-20160816; b=kf66fT6ZG7hXTNvtD4ZlGdiMjF6KWP9and9xYmWAtjiJrAXWWFglYI26esvyJh1jru UQCzDZzhm17AIZLheEF4qWJXSu2g5qZM2PZlr0kogp4+iHtN2UJIZCxdXL3JtqnPYz2l X0c1+hfOnRW5KMhX3YlTT2655FH3uhmiLQVOdynjeqZ3bHF5kAfHnaXK2oW55xeoS3GO gjZZVYq0fs1kPded4okcHKDouwM+TE9duA9e2BQ0kTqb/h0F2Aqizpmtj3WdvmFYLEQT K0EIfR3AZA1DExe5aYUHolrTIgWh0cpae+nNFln2ONSmykE97AZwqJ72+Y+0PryTJBEJ Ko6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:to:date :message-id:mime-version:from:delivered-to :arc-authentication-results; bh=iwBixD7kDyWoKVQk+KTqRSAvrw8QhuqEdkdnRJeQDfk=; b=asz8NjiVRKW/UTlLL/w5ArSX6GHflQQfPDHP+pn83GOwac64pxc2RFNI6NDEBK/na9 48WKX+rbKLXvni5t/klmFiFZlsf1dbjLGASWV/LWMGfKR/+RLaIGe2r3aut3CDdTh8qB D8YNlmqoeExDojhNCkc0eryAgqUGTIDS4uJKO+4+BCpBVCta2RJHNZ5e5VAPVf37G/7u z+ypEoQH0G9JJdlU5FK0P1uV/ThrZshC7W53meYwpiGDaNqo56oSOxIxpT10h0S3VcMZ YFVdEzaCiP6gmTMx8UsY9EnMYGNfkGzttFBcuRLzLHpEfOSQlIzd0Ju6bGbQnDZZ2u2H Tmng== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p187si5543316wme.182.2017.10.16.11.38.59; Mon, 16 Oct 2017 11:39:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7B55C689E1D; Mon, 16 Oct 2017 21:38:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from server172-2.web-hosting.com (server172-2.web-hosting.com [68.65.122.110]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E5C03689AF2 for ; Mon, 16 Oct 2017 21:38:46 +0300 (EEST) Received: from [146.96.19.240] (port=16173 helo=[10.10.201.39]) by server172.web-hosting.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1e4AHn-000T3o-Ss for ffmpeg-devel@ffmpeg.org; Mon, 16 Oct 2017 14:38:49 -0400 From: Dave Rice Mime-Version: 1.0 (Mac OS X Mail 10.0 \(3226\)) Message-Id: <5823C84E-19DF-4E05-ABC0-72396DDD0BDA@dericed.com> Date: Mon, 16 Oct 2017 14:38:46 -0400 To: FFmpeg development discussions and patches X-Mailer: Apple Mail (2.3226) X-OutGoing-Spam-Status: No, score=-2.9 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server172.web-hosting.com X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - dericed.com X-Get-Message-Sender-Via: server172.web-hosting.com: authenticated_id: dave@dericed.com X-Authenticated-Sender: server172.web-hosting.com: dave@dericed.com X-Source: X-Source-Args: X-Source-Dir: X-From-Rewrite: unmodified, already matched Subject: [FFmpeg-devel] [PATCH] libavdevice/decklink: 32 bit audio support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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 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); + } /* 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 }, };