From patchwork Mon Jul 9 18:26:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 9657 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp2797921jad; Mon, 9 Jul 2018 11:29:48 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcYycbIcgbf0A9Z4eZhbajCaiR6hrsZ954wxfJLh+07UVcHnCkVovHe0eUGIleqPAmtONmM X-Received: by 2002:a1c:1183:: with SMTP id 125-v6mr12618834wmr.138.1531160988586; Mon, 09 Jul 2018 11:29:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531160988; cv=none; d=google.com; s=arc-20160816; b=Z1Sq1jsNkD8XySGQVNYvAPc6BE2Wbolib+GEgs0cvBDn5kJcwGxZUTrIq207VX3zkB IMrI6spgkQNGcdKgZBL9edce2oQPicyhbgZFjslB9CYa5I3jcB22PCw9yWA4VhlUBe72 A546G6AI7HdyOdHwhk9jXaHvGCAp7Fws68bIop1OQsj8XW/5+Km5ksquIEDUwZSOuGEQ p3bOaVAEXEUncchCt5spBQXcl3ZuNZmMFSLohphvgIW/xdXfdWevvvfZ8uQNhw4grAow sOEIj7TAIYB94pBFOXo2p+yvcYl1uVvSRpdqCIky0zYA2St3tarFMyMJtmhM6Mn+XbGv /nvw== 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: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:dkim-signature:delivered-to:arc-authentication-results; bh=ddAQgZ/jQYxL5Mw2M1DXshhos79vwG0TaLJtFk29+uA=; b=zK5AfgVhTEYPGB9LUlPANVTJbpYEyhAOiG2atK3/A20aMbhpnTEH6vgE+qdp6b6Alq vYG/wC3FbO7/0mo0Z2BBNTrpyQovNU1lm8tP2ahTsfZ8ixdhdaT8JuJUMhIpd0XUKnK3 TktpUF0AU9rLtL2wHx34RsWcYjYEr4IaSxT4CzovOUUyAVXuUJVjMdbcPHANeXdEY8yR e14f2Wqp1kOe06exSUe+UYcWJ7BiIgsGxIFEg2mgMPmVHHFDUnMSjXLIMjlC4SU60zQl WwKOfC/KHaWIdLQDdT11otO4Kl31w61Yp2A+b21ybwc/z/elTA9N3Z9qnlrnuImO5Ngh UF5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=INyqlq9p; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j140-v6si8031417wmd.76.2018.07.09.11.29.46; Mon, 09 Jul 2018 11:29:48 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=INyqlq9p; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 65E0E68A468; Mon, 9 Jul 2018 21:29:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f193.google.com (mail-qt0-f193.google.com [209.85.216.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E4EFB68A2C2 for ; Mon, 9 Jul 2018 21:29:22 +0300 (EEST) Received: by mail-qt0-f193.google.com with SMTP id f18-v6so16193598qtp.10 for ; Mon, 09 Jul 2018 11:29:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=ihU0Qsk1ZPa8T5wCeMyKqu+G69gHRdI8GhD1rFLbkGA=; b=INyqlq9p6thSZPRda/tAaWdnkj4qwBE0jQRDipvjadiJzBuYte7iK+8dJkL9s/Onoz quaSQYlgQOjvgO7ct23YGKwSdtnzuTLEXBVElBMKkkGLymTCcNAMaOQC7LSVaeS0D/wL vgeq4x3P1QB9vzP/J7PqC9bpUol8ZHTGVmuJlSrxRgYKnSx0tqerSSEiZL8z+NCfOYey Wa0kmnnv2Lj9VEgeLS5b4Vk3tXQQ7EdDIz4Gd86apjm2rwjUfNlO9vrJS5Dosen4MASF tN1r+lA78Rk4U1kp7XzRI3qurFgM5wW6JmKVQlleSbb9Qlk3BBphdNx9Clf2MGn2AFx/ mOFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=ihU0Qsk1ZPa8T5wCeMyKqu+G69gHRdI8GhD1rFLbkGA=; b=i3NFp3rfeVhegWsG/e3bwjGI2yN5P9v6Q5/RZHowZciX6Ngh9+Vg8JYlALDxlJFznk oEzLHmI3DlguJy6sWKAryQPSZjJsxhYQ5az9pFP6yMUavEPWVSUpdgy5B+X7jUYzsJSX hUbkD0qXrbIO2tvWdcSwpdKy6GDOU0atBqtQ4fWM7uLRu0m7+Y+Zr1B9RO8o4dVNDVPE OrkKrfj4VlG254pyAlSNs4ZbsHLVlVGsnxeCGnwBzpsGJH24esEpD3dhgb++v2wBalVS 2wHzc/r5YSLfILB9hedGEEYorCpG1lIoG7oN16qP2MA/2fWEFr/l46JnNyvXOd83JK5L z3Ig== X-Gm-Message-State: APt69E2nBEo661AJH4GvSwLmX196TO7Gu4CNNboejZUC1bhdZ51fIown jmfM6jUH0upq4lmIEnDiwLPyhQ== X-Received: by 2002:a0c:c90d:: with SMTP id r13-v6mr18595592qvj.45.1531160968658; Mon, 09 Jul 2018 11:29:28 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id f3-v6sm13138260qtf.61.2018.07.09.11.29.27 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 09 Jul 2018 11:29:28 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 9 Jul 2018 15:26:52 -0300 Message-Id: <20180709182654.9996-4-jamrial@gmail.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180709182654.9996-1-jamrial@gmail.com> References: <20180709182654.9996-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/5] avcodec/libaomenc: export Sequence Header and Metadata OBUs as extradata 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" aom_codec_get_global_headers() is not implemented as of libaom 1.0.0 for AV1, so we're forced to extract the relevant header OBUs from the first packet and propagate them as packet side data for now. Signed-off-by: James Almer --- This is far from ideal. Whereas the mp4 muxer can handle extradata propagated as packet side data without issues, the Matroska one can't feasibly do it since it would require to reserve space for it, and we don't know just how big the resulting extradata can be as it may have an arbitrary amount of OBUs. libaom should ideally implement aom_codec_get_global_headers() for AV1 (Which is clearly inspired by similar functionality in libx264 and other encoders, and can be used before any kind of image data is sent to the encoder), so lobby is welcome :p configure | 1 + libavcodec/libaomenc.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/configure b/configure index 1066df6621..a76dd06736 100755 --- a/configure +++ b/configure @@ -3046,6 +3046,7 @@ hevc_videotoolbox_encoder_deps="pthreads" hevc_videotoolbox_encoder_select="videotoolbox_encoder" libaom_av1_decoder_deps="libaom" libaom_av1_encoder_deps="libaom" +libaom_av1_encoder_select="extract_extradata_bsf" libcelt_decoder_deps="libcelt" libcodec2_decoder_deps="libcodec2" libcodec2_encoder_deps="libcodec2" diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c index 41b05dc1c0..0b75dc139c 100644 --- a/libavcodec/libaomenc.c +++ b/libavcodec/libaomenc.c @@ -55,6 +55,7 @@ struct FrameListData { typedef struct AOMEncoderContext { AVClass *class; + AVBSFContext *bsf; struct aom_codec_ctx encoder; struct aom_image rawimg; struct aom_fixed_buf twopass_stats; @@ -202,6 +203,7 @@ static av_cold int aom_free(AVCodecContext *avctx) av_freep(&ctx->twopass_stats.buf); av_freep(&avctx->stats_out); free_frame_list(ctx->coded_frame_list); + av_bsf_free(&ctx->bsf); return 0; } @@ -463,6 +465,28 @@ static av_cold int aom_init(AVCodecContext *avctx, if (!cpb_props) return AVERROR(ENOMEM); + if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { + const AVBitStreamFilter *filter = av_bsf_get_by_name("extract_extradata"); + int ret; + + if (!filter) { + av_log(avctx, AV_LOG_ERROR, "extract_extradata bitstream filter " + "not found. This is a bug, please report it.\n"); + return AVERROR_BUG; + } + ret = av_bsf_alloc(filter, &ctx->bsf); + if (ret < 0) + return ret; + + ret = avcodec_parameters_from_context(ctx->bsf->par_in, avctx); + if (ret < 0) + return ret; + + ret = av_bsf_init(ctx->bsf); + if (ret < 0) + return ret; + } + if (enccfg.rc_end_usage == AOM_CBR || enccfg.g_pass != AOM_RC_ONE_PASS) { cpb_props->max_bitrate = avctx->rc_max_rate; @@ -494,6 +518,7 @@ static inline void cx_pktcpy(struct FrameListData *dst, static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, AVPacket *pkt) { + AOMContext *ctx = avctx->priv_data; int ret = ff_alloc_packet2(avctx, pkt, cx_frame->sz, 0); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, @@ -505,6 +530,22 @@ static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, if (!!(cx_frame->flags & AOM_FRAME_IS_KEY)) pkt->flags |= AV_PKT_FLAG_KEY; + + if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { + ret = av_bsf_send_packet(ctx->bsf, pkt); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "extract_extradata filter " + "failed to send input packet\n"); + return ret; + } + ret = av_bsf_receive_packet(ctx->bsf, pkt); + + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "extract_extradata filter " + "failed to receive output packet\n"); + return ret; + } + } return pkt->size; }