From patchwork Wed Mar 21 14:21:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8069 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp5195075jad; Wed, 21 Mar 2018 07:22:01 -0700 (PDT) X-Google-Smtp-Source: AG47ELuSYUme4M48DsYsSs9yav+XJ00A4RvwW6WABKJ8l8hyK0RtNLylDnR6kz7Tr1WZcLJTvF79 X-Received: by 10.223.184.147 with SMTP id i19mr15550021wrf.129.1521642121815; Wed, 21 Mar 2018 07:22:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521642121; cv=none; d=google.com; s=arc-20160816; b=Pbdnd/hO12LarBRDnO4Cz4n+t3Vf+9xYlD/yLhV4/gOkiKQko121WaR1n+Bg4YhVTC rGoyziC93+9kMFBAwxSJ6Ka5hX8QRt4aqKWodskeXa95dHXSZTZfQfljGI3qXzG2XEZ6 vLiXYVBxOx/wd7zLkj6FGsZ6SCNtyxzj/Omd4zTXYKAF29EM3lbkn4d5U4RxBgSLwggS jTFV5yj8u3gTwLqgPeGIsyBVEpih8aUqK3FiQ2Rb7y1+C2mWnEvi58vfoSs7dgvMC0Iu USUDW6ld4T1Ws/XBJr4dh/Q3dsrmHS4APZbmyB5Jech/87U+sV0Vbb/R80PIAlGKSURq EvaA== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=2+P8HRTdt5IK9RKeVXyKIIaAzYacwEow8fkD1BW1A1Q=; b=X5nzXZFOYr1QJmujxgWaUh6IVc05Fr8Vnfu8ecdfb1FSPH8nnC7XE9Ss+LEiT6H08M xAsXTXIHeXkm7Fk52ZG+FZr6URZcKkBdiwj0rr4jkGHEeWtiSgBKuyI+H6wRVYO1+7EC tygS3LmKvEKfDumQQB71+Z1kPhRWxEPiyfWxPMPFjx+/8hwE1sZ7xykAGI/tIKskPyz5 EPmNHwyLO0Zlazs+GKp4AUpdmqS1wiXYPPgrHWJlskkkD8jRCphQePcP+HuciGDUo4xk kva8BywGUWccdt4Ry52Aihz5U76PiQ3YbzibTPfjN9BPN/BQYQ4LxlUtsHCtr5lGu9lf YqxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZUOk+FVv; 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 g65si2804401wmf.102.2018.03.21.07.22.01; Wed, 21 Mar 2018 07:22:01 -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=ZUOk+FVv; 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 8D731689A81; Wed, 21 Mar 2018 16:21:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f196.google.com (mail-qk0-f196.google.com [209.85.220.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BB260680220 for ; Wed, 21 Mar 2018 16:21:38 +0200 (EET) Received: by mail-qk0-f196.google.com with SMTP id b198so5576038qkg.9 for ; Wed, 21 Mar 2018 07:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=0ppfp1txjR9C8GirI4TLRGv9pygHytOquyyA8U/R/A4=; b=ZUOk+FVvy9xrlupBL8vQVadr83fUOQP9dfpDnNv3sKzjNSDC7mudMTW2b+/AGDWN4+ lp4M9eIth3Ky/hdggC6NsUZ5Xi+LfxwsROhpYRAjWmdi8WXJPrqXGGXXJZwoaaAmMHVc 0N4UGBS/RpQqi5UUcpHxOibLIelRzpZMJBcqoJfY7OIms9yeN514AzOJ96yskzbr2Rk2 ZwpB77vMBTRTKKC6r4xeGvflpOSBG9ztR2Fw/NgbfRpZ40q29DgtDxmLqdB+3hQIr7t6 hcuVk12oh5ROAlH7uIQzBLmCv6inDw4EsXpe4lp9l3DAJpVhwYswtOzp+DXYSlfo6rL4 +Wag== 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; bh=0ppfp1txjR9C8GirI4TLRGv9pygHytOquyyA8U/R/A4=; b=owLYPcsUIiZCBoEoq1BmOcVWqpcaqO282ShHe0wKalCZPiCTy2AUGfk/5Xw4wXoeTL eTDpXefZuM7cTYfJxQqgrMibQ1qpk49GRZwGziMPguzJ0GOvIk9tuPy7Nbzh3Wm1HVqu yJbFDItAaKOlTZLMb/P3s9A23lx0bk77EB52RVVNoAXZCaq2HbWKLmZio2DFKCS6CnzJ rRwkGVDNjwwj/XLpSl97Dz4ewo4s1AdiK/5VHrRgHqgIEwYy4GJcdxqbdWb9C85qF9Gy sB9HnNy7v8GO/tDqzG9utpRJ8ZZFfdNRaekgFN7G3hTMSAs/9/nN/Fq/+hPqAsYKCKw6 gttw== X-Gm-Message-State: AElRT7EEqVY2JY4Sr+jbTZmxRUocfS+U7ybnm6BnKJT3Pq8/kUxXYnoz zY0Nwxs9S+ae5jmMfLTRu8nngg== X-Received: by 10.55.136.129 with SMTP id k123mr28326663qkd.296.1521642111500; Wed, 21 Mar 2018 07:21:51 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id s16sm3559362qks.10.2018.03.21.07.21.50 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Mar 2018 07:21:51 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 21 Mar 2018 11:21:22 -0300 Message-Id: <20180321142122.10396-1-jamrial@gmail.com> X-Mailer: git-send-email 2.16.2 Subject: [FFmpeg-devel] [PATCH] avcodec/mpeg4_unpack_bframes: cache input packets directly 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" Avoids unnecessary allocs+copies and makes the code slightly simpler. Signed-off-by: James Almer --- libavcodec/mpeg4_unpack_bframes_bsf.c | 55 +++++++++++++---------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/libavcodec/mpeg4_unpack_bframes_bsf.c b/libavcodec/mpeg4_unpack_bframes_bsf.c index ba970794c5..e2e73446d8 100644 --- a/libavcodec/mpeg4_unpack_bframes_bsf.c +++ b/libavcodec/mpeg4_unpack_bframes_bsf.c @@ -24,8 +24,7 @@ #include "mpeg4video.h" typedef struct UnpackBFramesBSFContext { - uint8_t *b_frame_buf; - int b_frame_buf_size; + AVPacket *b_frame; } UnpackBFramesBSFContext; /* search next start code */ @@ -71,18 +70,6 @@ static void scan_buffer(const uint8_t *buf, int buf_size, } } -/* allocate new buffer and copy size bytes from src */ -static uint8_t *create_new_buffer(const uint8_t *src, int size) { - uint8_t *dst = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE); - - if (dst) { - memcpy(dst, src, size); - memset(dst + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); - } - - return dst; -} - static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) { UnpackBFramesBSFContext *s = ctx->priv_data; @@ -97,20 +84,18 @@ static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) av_log(ctx, AV_LOG_DEBUG, "Found %d VOP startcode(s) in this packet.\n", nb_vop); if (pos_vop2 >= 0) { - if (s->b_frame_buf) { + if (s->b_frame->data) { av_log(ctx, AV_LOG_WARNING, "Missing one N-VOP packet, discarding one B-frame.\n"); - av_freep(&s->b_frame_buf); - s->b_frame_buf_size = 0; + av_packet_unref(s->b_frame); } /* store the packed B-frame in the BSFContext */ - s->b_frame_buf_size = in->size - pos_vop2; - s->b_frame_buf = create_new_buffer(in->data + pos_vop2, s->b_frame_buf_size); - if (!s->b_frame_buf) { - s->b_frame_buf_size = 0; - ret = AVERROR(ENOMEM); + ret = av_packet_ref(s->b_frame, in); + if (ret < 0) { goto fail; } + s->b_frame->size -= pos_vop2; + s->b_frame->data += pos_vop2; } if (nb_vop > 2) { @@ -118,29 +103,23 @@ static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out) "Found %d VOP headers in one packet, only unpacking one.\n", nb_vop); } - if (nb_vop == 1 && s->b_frame_buf) { + if (nb_vop == 1 && s->b_frame->data) { /* use frame from BSFContext */ + av_packet_move_ref(out, s->b_frame); + + /* use properties from current input packet */ ret = av_packet_copy_props(out, in); if (ret < 0) { goto fail; } - ret = av_packet_from_data(out, s->b_frame_buf, s->b_frame_buf_size); - if (ret < 0) { - goto fail; - } if (in->size <= MAX_NVOP_SIZE) { /* N-VOP */ av_log(ctx, AV_LOG_DEBUG, "Skipping N-VOP.\n"); - s->b_frame_buf = NULL; - s->b_frame_buf_size = 0; } else { /* copy packet into BSFContext */ - s->b_frame_buf_size = in->size; - s->b_frame_buf = create_new_buffer(in->data, in->size); - if (!s->b_frame_buf) { - s->b_frame_buf_size = 0; - ret = AVERROR(ENOMEM); + ret = av_packet_ref(s->b_frame, in); + if (ret < 0) { goto fail; } } @@ -168,6 +147,12 @@ fail: static int mpeg4_unpack_bframes_init(AVBSFContext *ctx) { + UnpackBFramesBSFContext *s = ctx->priv_data; + + s->b_frame = av_packet_alloc(); + if (!s->b_frame) + return AVERROR(ENOMEM); + if (ctx->par_in->extradata) { int pos_p_ext = -1; scan_buffer(ctx->par_in->extradata, ctx->par_in->extradata_size, &pos_p_ext, NULL, NULL); @@ -184,7 +169,7 @@ static int mpeg4_unpack_bframes_init(AVBSFContext *ctx) static void mpeg4_unpack_bframes_close(AVBSFContext *bsfc) { UnpackBFramesBSFContext *ctx = bsfc->priv_data; - av_freep(&ctx->b_frame_buf); + av_packet_free(&ctx->b_frame); } static const enum AVCodecID codec_ids[] = {