From patchwork Thu Feb 11 21:48:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Llu=C3=ADs_Batlle_i_Rossell?= X-Patchwork-Id: 25587 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 7440244ADEB for ; Thu, 11 Feb 2021 23:49:22 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 56BDD68ABC0; Thu, 11 Feb 2021 23:49:22 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from o139.p8.mailjet.com (o139.p8.mailjet.com [87.253.233.139]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8A23968AB37 for ; Thu, 11 Feb 2021 23:49:19 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; q=dns/txt; d=viric.name; i=viric@viric.name; s=mailjet; h=message-id:mime-version:from:to:subject:date:list-unsubscribe-post:list-unsubscribe: cc:feedback-id:in-reply-to:references:x-csa-complaints:x-mj-mid:x-mj-smtpguid: x-report-abuse-to:content-type:content-transfer-encoding; bh=ImvyrGtEDB+aX5lhaP9MdZoxSS/J3i755AL16CF9C5U=; b=KfAKPyOPPkIOR3oae4/DKAjSpo/eM83msWGdjDVPgfKNzsvgchBQqY/i7 QvGQ+X/QNS64IcguhwiJvINUai2MqUICzJeB9XB2SOvecCM4VSFMobZdKvZD vDnI1wZeCZuPx0kKgHP7r96hhkJ3BP4NKcItlXBMou2BWZpuWoj488= Message-Id: MIME-Version: 1.0 From: =?utf-8?q?Llu=C3=ADs_Batlle_i_Rossel?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Feb 2021 22:48:21 +0100 List-Unsubscribe-Post: List-Unsubscribe=One-Click Feedback-Id: 42.495910.472369:MJ In-Reply-To: <20210211214819.18855-1-viric@viric.name> References: <20210211214819.18855-1-viric@viric.name> X-CSA-Complaints: csa-complaints@eco.de X-MJ-Mid: AMUAAJVkjlsAAAAAAAAAALF60VUAARpcY_sAAAAAAAeRJgBgJaZenwtH1WwgQBK79zhomWgGqgAHNTE X-MJ-SMTPGUID: 9f0b47d5-6c20-4012-bbf7-3868996806aa X-REPORT-ABUSE-TO: Message sent by Mailjet please report to abuse@mailjet.com with a copy of the message Subject: [FFmpeg-devel] [PATCH 3/3] mmaldec with plain yuv420p without copy 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: =?utf-8?q?Llu=C3=ADs_Batlle_i_Rossell?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: LluĂ­s Batlle i Rossell --- libavcodec/mmaldec.c | 48 ++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index 4dfaacbb41..097b990f92 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -119,10 +119,11 @@ static void ffmmal_release_frame(void *opaque, uint8_t *data) // Setup frame with a new reference to buffer. The buffer must have been // allocated from the given pool. -static int ffmmal_set_ref(AVFrame *frame, FFPoolRef *pool, - MMAL_BUFFER_HEADER_T *buffer) +static int ffmmal_set_ref(AVCodecContext *avctx, AVFrame *frame, + FFPoolRef *pool, MMAL_BUFFER_HEADER_T *buffer) { FFBufferRef *ref = av_mallocz(sizeof(*ref)); + if (!ref) return AVERROR(ENOMEM); @@ -140,8 +141,19 @@ static int ffmmal_set_ref(AVFrame *frame, FFPoolRef *pool, atomic_fetch_add_explicit(&ref->pool->refcount, 1, memory_order_relaxed); mmal_buffer_header_acquire(buffer); - frame->format = AV_PIX_FMT_MMAL; - frame->data[3] = (uint8_t *)ref->buffer; + frame->format = avctx->pix_fmt; + + if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) { + int w = FFALIGN(avctx->width, 32); + int h = FFALIGN(avctx->height, 16); + + av_image_fill_arrays(frame->data, frame->linesize, + buffer->data + buffer->type->video.offset[0], + avctx->pix_fmt, w, h, 1); + } else { + frame->data[3] = (uint8_t *)ref->buffer; + } + return 0; } @@ -633,30 +645,14 @@ static int ffmal_copy_frame(AVCodecContext *avctx, AVFrame *frame, frame->interlaced_frame = ctx->interlaced_frame; frame->top_field_first = ctx->top_field_first; - if (avctx->pix_fmt == AV_PIX_FMT_MMAL) { - if (!ctx->pool_out) - return AVERROR_UNKNOWN; // format change code failed with OOM previously - - if ((ret = ff_decode_frame_props(avctx, frame)) < 0) - goto done; - - if ((ret = ffmmal_set_ref(frame, ctx->pool_out, buffer)) < 0) - goto done; - } else { - int w = FFALIGN(avctx->width, 32); - int h = FFALIGN(avctx->height, 16); - uint8_t *src[4]; - int linesize[4]; + if (!ctx->pool_out) + return AVERROR_UNKNOWN; // format change code failed with OOM previously - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) - goto done; + if ((ret = ff_decode_frame_props(avctx, frame)) < 0) + goto done; - av_image_fill_arrays(src, linesize, - buffer->data + buffer->type->video.offset[0], - avctx->pix_fmt, w, h, 1); - av_image_copy(frame->data, frame->linesize, src, linesize, - avctx->pix_fmt, avctx->width, avctx->height); - } + if ((ret = ffmmal_set_ref(avctx, frame, ctx->pool_out, buffer)) < 0) + goto done; frame->pts = buffer->pts == MMAL_TIME_UNKNOWN ? AV_NOPTS_VALUE : buffer->pts; #if FF_API_PKT_PTS