From patchwork Tue Jan 9 01:16:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 7218 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.78.2 with SMTP id r2csp3317433jaa; Mon, 8 Jan 2018 17:17:41 -0800 (PST) X-Google-Smtp-Source: ACJfBotuwE1fBW0WZxz213vKbxTiFhNrvLxaOvxyifUaQ6P5pf0c0jFMkMzNcaFGI8htdBFSclnf X-Received: by 10.223.162.141 with SMTP id s13mr11233148wra.132.1515460661815; Mon, 08 Jan 2018 17:17:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515460661; cv=none; d=google.com; s=arc-20160816; b=wggMXCwkhfpLiiqrbtl3Ap2ktBXdsmZ1KmDF6DvzKYrr+eu5izJu3uychj3pf3hoAi Hp8VeCZbwH1ysapOSp/Wk5LJUKKawIe+Mnd7S20f02/M2pLg1DyxMGHqLxJG4L6ySbFB CqFAaudFJMgerFjjxbDxFrNHttLQTWhw/l1ejI2/TgkzcMYCKDkZk5q1VF0lJzqqbgSE rf1o+pKqfqG5Gbn04o/sEBpzEKoLlMxpa1+3IEd34R51AqBGvQ4e4YCzKjgni1fPqdyy 8DcH1+bw+Nb9Z4Wip5ph/NwrnlcjStxIcmKX6/oghzA7KGDGafr/GJGNs9POrKuIG3Nz dCbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to:arc-authentication-results; bh=iB/tBROeBWEHbxxefsQY7JXBykYBc8DAffJ3+F7VMIo=; b=EXn7RHZhOrnGratsj0rb2MbAQg6VIKGRbsLKeGFvgSTHbNNWdvq6FeiCowhz54/2dU 1mA1CQXzhkHbuo5cNucFrxcWTKctTEyvSp/Zlerl+Bd5LR126Yd658JpTyrXPw5nUv/M zWM38ky/33n/ncAgk5DFn0VWyeuWSsvPEM5nLkYhOdUEcK6KTNmdbCbXHVMEEh7Dm5xo /BP5ofiaiCrsQ6SNiukzT5yTtvR7QZY+Zu89STgGubVn+zGYoihIiBzIn7aA7zj7kvCF P7M45f4IVPsXUsxTtuEWNMTtWa/QQYK3F5dNI8iUHGZiBDJnoRwceZsWlu54N8g+eazO Vk6A== 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 q129si8662562wme.148.2018.01.08.17.17.41; Mon, 08 Jan 2018 17:17:41 -0800 (PST) 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 2A4BB689F6C; Tue, 9 Jan 2018 03:17:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from was-smtp1.livetimenet.net (50-206-97-56-static.hfc.comcastbusiness.net [50.206.97.56]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6455A689E65 for ; Tue, 9 Jan 2018 03:17:18 +0200 (EET) Received: by was-smtp1.livetimenet.net with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.84_2) (envelope-from ) id 1eYiXV-0008Fd-Jw; Mon, 08 Jan 2018 20:17:18 -0500 From: Devin Heitmueller To: ffmpeg-devel@ffmpeg.org Date: Mon, 8 Jan 2018 20:16:49 -0500 Message-Id: <20180109011658.72370-3-dheitmueller@ltnglobal.com> X-Mailer: git-send-email 2.13.2 In-Reply-To: <20180109011658.72370-1-dheitmueller@ltnglobal.com> References: <20180109011658.72370-1-dheitmueller@ltnglobal.com> X-Spam-Score: -1.9 (-) Subject: [FFmpeg-devel] [PATCH 02/11] decklink: Add support for output of Active Format Description (AFD) 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 Cc: jgreen@ltnglobal.com, Devin Heitmueller MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Implement support for including AFD in decklink output. This includes making sure the AFD data is preserved when going from an AVFrame to a V210 packet (needed for 10-bit support). Updated to reflect feedback from Marton Balint , Carl Eugen Hoyos and Aaron Levinson . Signed-off-by: Devin Heitmueller --- libavcodec/avcodec.h | 6 ++++++ libavcodec/v210enc.c | 8 ++++++++ libavdevice/decklink_enc.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index c13deb5..5fa028e 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1342,6 +1342,12 @@ enum AVPacketSideDataType { AV_PKT_DATA_A53_CC, /** + * Active Format Description data consisting of a single byte as specified + * in ETSI TS 101 154 using AVActiveFormatDescription enum. + */ + AV_PKT_DATA_AFD, + + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may * change when new side data types are added. diff --git a/libavcodec/v210enc.c b/libavcodec/v210enc.c index b9dcf9a..b024806 100644 --- a/libavcodec/v210enc.c +++ b/libavcodec/v210enc.c @@ -242,6 +242,14 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, memcpy(buf, side_data->data, side_data->size); } + side_data = av_frame_get_side_data(pic, AV_FRAME_DATA_AFD); + if (side_data && side_data->size) { + uint8_t *buf = av_packet_new_side_data(pkt, AV_PKT_DATA_AFD, side_data->size); + if (!buf) + return AVERROR(ENOMEM); + memcpy(buf, side_data->data, side_data->size); + } + pkt->flags |= AV_PKT_FLAG_KEY; *got_packet = 1; return 0; diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp index faa382a..ff60050 100644 --- a/libavdevice/decklink_enc.cpp +++ b/libavdevice/decklink_enc.cpp @@ -301,7 +301,8 @@ av_cold int ff_decklink_write_trailer(AVFormatContext *avctx) #if CONFIG_LIBKLVANC static int decklink_construct_vanc(AVFormatContext *avctx, struct decklink_ctx *ctx, - AVPacket *pkt, decklink_frame *frame) + AVPacket *pkt, decklink_frame *frame, + AVStream *st) { struct klvanc_line_set_s vanc_lines = { 0 }; int ret, size; @@ -359,6 +360,45 @@ static int decklink_construct_vanc(AVFormatContext *avctx, struct decklink_ctx * } } + data = av_packet_get_side_data(pkt, AV_PKT_DATA_AFD, &size); + if (data) { + struct klvanc_packet_afd_s *pkt; + uint16_t *afd; + uint16_t len; + + ret = klvanc_create_AFD(&pkt); + if (ret != 0) + return AVERROR(ENOMEM); + + ret = klvanc_set_AFD_val(pkt, data[0]); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid AFD value specified: %d\n", + data[0]); + klvanc_destroy_AFD(pkt); + return AVERROR(EINVAL); + } + + /* FIXME: Should really rely on the coded_width but seems like that + is not accessible to libavdevice outputs */ + if (av_cmp_q((AVRational) {st->codecpar->width, st->codecpar->height}, (AVRational) {4, 3}) == 1) + pkt->aspectRatio = ASPECT_16x9; + else + pkt->aspectRatio = ASPECT_4x3; + + ret = klvanc_convert_AFD_to_words(pkt, &afd, &len); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "Failed converting 708 packet to words\n"); + return AVERROR(ENOMEM); + } + klvanc_destroy_AFD(pkt); + + ret = klvanc_line_insert(ctx->vanc_ctx, &vanc_lines, afd, len, 12, 0); + if (ret != 0) { + av_log(avctx, AV_LOG_ERROR, "VANC line insertion failed\n"); + return AVERROR(ENOMEM); + } + } + IDeckLinkVideoFrameAncillary *vanc; int result = ctx->dlo->CreateAncillaryData(bmdFormat10BitYUV, &vanc); if (result != S_OK) { @@ -455,7 +495,7 @@ static int decklink_write_video_packet(AVFormatContext *avctx, AVPacket *pkt) frame = new decklink_frame(ctx, avpacket, st->codecpar->codec_id, ctx->bmd_height, ctx->bmd_width); #if CONFIG_LIBKLVANC - ret = decklink_construct_vanc(avctx, ctx, pkt, frame); + ret = decklink_construct_vanc(avctx, ctx, pkt, frame, st); if (ret != 0) { av_log(avctx, AV_LOG_ERROR, "Failed to construct VANC\n"); }