From patchwork Mon Nov 23 19:10:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 23981 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 53D5F44A18E for ; Mon, 23 Nov 2020 21:17:59 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3877568BB8D; Mon, 23 Nov 2020 21:17:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f194.google.com (mail-lj1-f194.google.com [209.85.208.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 46B3868B9EF for ; Mon, 23 Nov 2020 21:17:58 +0200 (EET) Received: by mail-lj1-f194.google.com with SMTP id i17so19286573ljd.3 for ; Mon, 23 Nov 2020 11:17:58 -0800 (PST) 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:mime-version :content-transfer-encoding; bh=VKJPDSKqxRln6lQtSKVf+HVR/9yPTOof2MsADcKVgdE=; b=UiVa5lk0hFr7BbZFWGkU1g2EWFWCc+BlEgO+KzVziWGQ1bSGAT5nUOosG5GhMA5zhH lP24/5FnLuEh54QOvYDzDRB+X5Na8Dd4OEYm/ZBA0/bT/YFX8QK7/kwdmyyS+8090LW+ 7dTIXvDT9wgA0pJH+gDLiPIeLuFKvwsoGvmkKtqSHimUch6K9qLG60QznxBkrPNCu30v pGElVA0zx3ivYO7bVF+fBQudXqF0dmLtKl80sCM55U1qRBN4ZHX0z501dN4sL/6eaMnH T0nQNQ7fEOo+Nqz4iGKHBIngUKi0KWLo0SNucoqt8buxl4hipWD3fxpT9Z8aPFzKkSEj LryA== 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:mime-version:content-transfer-encoding; bh=VKJPDSKqxRln6lQtSKVf+HVR/9yPTOof2MsADcKVgdE=; b=SGKWeTIYhMbYx3m/vAKLGmjK7gZI6iUnQ7K1j4dy5PJFDpw9NrBwMkTm/Ssstx/vRT +s7Sa546ymn2FaXbj2d2UmTHW1GUCsjKkMIyVZO4rhhejdvFq212CpbxuptpcUcH8pWE W4d6QRE/jdZ+0UCIFnjjhBZWxzd+BignR75k6uhmuCYnwhfGStnpzkG5XYZZlQ6VkLuP cvujqlUwYhOp6hhaRv7/4dbfD+bMnuevBfWZeXn5p/Mg3DH6SU/g3gX3VsFrzRztpgGI pHMx8BNhHkAe/Xod6hGmSeF+3hzrGk0t8gClmqv5pZPgfvwysoK4sWYCgy/KC7hq9PxW 04/A== X-Gm-Message-State: AOAM530405Er3zLzcvgfF+Xq24vzyxVkd/66V9YdqD+j6H5HO+QsLHuB kxz1e/ALjjMlL9UhPlO+1Ci2UgDZTHmNLQ== X-Google-Smtp-Source: ABdhPJwyzfu6G6X4MfO8sEnl6b/eEzI43F/7NwrbQ7bFw0jpmK5zBSmD1gQ+TcSZF4TlSZygiQ+zGQ== X-Received: by 2002:a2e:9d99:: with SMTP id c25mr350584ljj.213.1606158652257; Mon, 23 Nov 2020 11:10:52 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id j19sm1469995lfb.29.2020.11.23.11.10.50 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Nov 2020 11:10:50 -0800 (PST) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Nov 2020 21:10:41 +0200 Message-Id: <20201123191046.28887-2-jeebjp@gmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201123191046.28887-1-jeebjp@gmail.com> References: <20201123191046.28887-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/6] cbs: Add function to read extradata from an AVCodecContext 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" From: Mark Thompson This is useful in decoders and parsers, matching the way that bitstream filters read extradata from AVCodecParameters. --- libavcodec/cbs.c | 77 ++++++++++++++++++++++++------------------------ libavcodec/cbs.h | 11 +++++++ 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c index c8c526ab12..f98531e131 100644 --- a/libavcodec/cbs.c +++ b/libavcodec/cbs.c @@ -223,66 +223,67 @@ static int cbs_fill_fragment_data(CodedBitstreamFragment *frag, return 0; } -int ff_cbs_read_extradata(CodedBitstreamContext *ctx, - CodedBitstreamFragment *frag, - const AVCodecParameters *par) +static int cbs_read_data(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + AVBufferRef *buf, + const uint8_t *data, size_t size, + int header) { int err; - err = cbs_fill_fragment_data(frag, par->extradata, - par->extradata_size); - if (err < 0) - return err; - - err = ctx->codec->split_fragment(ctx, frag, 1); - if (err < 0) - return err; - - return cbs_read_fragment_content(ctx, frag); -} - -int ff_cbs_read_packet(CodedBitstreamContext *ctx, - CodedBitstreamFragment *frag, - const AVPacket *pkt) -{ - int err; - - if (pkt->buf) { - frag->data_ref = av_buffer_ref(pkt->buf); + if (buf) { + frag->data_ref = av_buffer_ref(buf); if (!frag->data_ref) return AVERROR(ENOMEM); - frag->data = pkt->data; - frag->data_size = pkt->size; + frag->data = (uint8_t *)data; + frag->data_size = size; } else { - err = cbs_fill_fragment_data(frag, pkt->data, pkt->size); + err = cbs_fill_fragment_data(frag, data, size); if (err < 0) return err; } - err = ctx->codec->split_fragment(ctx, frag, 0); + err = ctx->codec->split_fragment(ctx, frag, header); if (err < 0) return err; return cbs_read_fragment_content(ctx, frag); } -int ff_cbs_read(CodedBitstreamContext *ctx, - CodedBitstreamFragment *frag, - const uint8_t *data, size_t size) +int ff_cbs_read_extradata(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + const AVCodecParameters *par) { - int err; + return cbs_read_data(ctx, frag, NULL, + par->extradata, + par->extradata_size, 1); +} - err = cbs_fill_fragment_data(frag, data, size); - if (err < 0) - return err; +int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + const AVCodecContext *avctx) +{ + return cbs_read_data(ctx, frag, NULL, + avctx->extradata, + avctx->extradata_size, 1); +} - err = ctx->codec->split_fragment(ctx, frag, 0); - if (err < 0) - return err; +int ff_cbs_read_packet(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + const AVPacket *pkt) +{ + return cbs_read_data(ctx, frag, pkt->buf, + pkt->data, pkt->size, 0); +} - return cbs_read_fragment_content(ctx, frag); +int ff_cbs_read(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + const uint8_t *data, size_t size) +{ + return cbs_read_data(ctx, frag, NULL, + data, size, 0); } static int cbs_write_unit_data(CodedBitstreamContext *ctx, diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h index 635921b11e..3fd0a0ef33 100644 --- a/libavcodec/cbs.h +++ b/libavcodec/cbs.h @@ -262,6 +262,17 @@ int ff_cbs_read_extradata(CodedBitstreamContext *ctx, CodedBitstreamFragment *frag, const AVCodecParameters *par); +/** + * Read the extradata bitstream found in a codec context into a + * fragment, then split into units and decompose. + * + * This acts identical to ff_cbs_read_extradata() for the case where + * you already have a codec context. + */ +int ff_cbs_read_extradata_from_codec(CodedBitstreamContext *ctx, + CodedBitstreamFragment *frag, + const AVCodecContext *avctx); + /** * Read the data bitstream from a packet into a fragment, then * split into units and decompose.