From patchwork Fri Jul 12 12:47:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: hwren X-Patchwork-Id: 13915 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 856C5448095 for ; Fri, 12 Jul 2019 16:19:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6C93768AD1A; Fri, 12 Jul 2019 16:19:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from m15-111.126.com (m15-111.126.com [220.181.15.111]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 01D4368ABCC for ; Fri, 12 Jul 2019 16:19:03 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:Subject:Date:Message-Id; bh=aAgN2NNJoNjFd6ftrb 8SUXVIivGxS3eFl5Z9c8oYHMg=; b=ZaXh74tLuWTP2FP/a+TR3vvK/7CWW618qr 58NUTMvVGcF69+0BWL5/amCl1YILQRiP2iAl7rkMrSL/OrPMLm469BN2lRaggNXs j62pn5WOZHr6XN4hXvgm2pj45bfJrcVMrQmcojOeGrE0ovt294w5gYFA7aOzgP2t QNBvwayI0= Received: from localhost.localdomain (unknown [218.17.115.198]) by smtp1 (Coremail) with SMTP id C8mowABHg5hvgShdM75uFA--.43089S5; Fri, 12 Jul 2019 20:47:45 +0800 (CST) From: hwrenx To: ffmpeg-devel@ffmpeg.org Date: Fri, 12 Jul 2019 20:47:40 +0800 Message-Id: <1562935660-6235-3-git-send-email-hwrenx@126.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1562935660-6235-1-git-send-email-hwrenx@126.com> References: <1562935660-6235-1-git-send-email-hwrenx@126.com> X-CM-TRANSID: C8mowABHg5hvgShdM75uFA--.43089S5 X-Coremail-Antispam: 1Uf129KBjvJXoWxCF45Cw4kCF4xtFy5ArWDArb_yoW5ur48pw 43JrZxt3WUJFs3Ar93Aw4FvF13XrZ7WF40kr4DJr109a4FyryUtFWxJryI9ayI9FWkG34a 9F4ktF15u3WDKa7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jTHq7UUUUU= X-Originating-IP: [218.17.115.198] X-CM-SenderInfo: pkzuv0b06rjloofrz/1tbi2xHv6VpD9hlHjQAAsw Subject: [FFmpeg-devel] [PATCH v2 3/3] lavc/libdavs2.c: use decoder data directly instead of memcpy 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" Signed-off-by: hwrenx --- libavcodec/libdavs2.c | 55 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c index df538af..f88dfa0 100644 --- a/libavcodec/libdavs2.c +++ b/libavcodec/libdavs2.c @@ -58,13 +58,25 @@ static av_cold int davs2_init(AVCodecContext *avctx) return 0; } +static void davs2_frame_unref(void *opaque, uint8_t *data) { + DAVS2Context *cad = (DAVS2Context *)opaque; + davs2_picture_t *pic = (davs2_picture_t *)data; + + /* set release pointer to itself */ + pic->magic = pic; + + if (cad->decoder) { + davs2_decoder_frame_unref(cad->decoder, pic); + } else { + av_log(NULL, AV_LOG_WARNING, "Decoder not found, frame unreference failed.\n"); + } +} + static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, int *got_frame, davs2_seq_info_t *headerset, int ret_type, AVFrame *frame) { DAVS2Context *cad = avctx->priv_data; - int bytes_per_sample = pic->bytes_per_sample; - int plane = 0; - int line = 0; + int plane; if (!headerset) { *got_frame = 0; @@ -102,29 +114,28 @@ static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, int *g return AVERROR_EXTERNAL; } - for (plane = 0; plane < 3; ++plane) { - int size_line = pic->widths[plane] * bytes_per_sample; - frame->buf[plane] = av_buffer_alloc(size_line * pic->lines[plane]); - - if (!frame->buf[plane]){ - av_log(avctx, AV_LOG_ERROR, "Decoder error: allocation failure, can't dump frames.\n"); - return AVERROR(ENOMEM); - } - - frame->data[plane] = frame->buf[plane]->data; - frame->linesize[plane] = size_line; - - for (line = 0; line < pic->lines[plane]; ++line) - memcpy(frame->data[plane] + line * size_line, - pic->planes[plane] + line * pic->strides[plane], - pic->widths[plane] * bytes_per_sample); - } - frame->width = cad->headerset.width; frame->height = cad->headerset.height; frame->pts = cad->out_frame.pts; frame->format = avctx->pix_fmt; + /* handle the actual picture in magic */ + frame->buf[0] = av_buffer_create((uint8_t *)pic->magic, + sizeof(davs2_picture_t *), + davs2_frame_unref, + (void *)cad, + AV_BUFFER_FLAG_READONLY); + if (!frame->buf[0]) { + av_log(avctx, AV_LOG_ERROR, + "Decoder error: allocation failure, can't dump frames.\n"); + return AVERROR(ENOMEM); + } + + for (plane = 0; plane < 3; ++plane) { + frame->linesize[plane] = pic->strides[plane]; + frame->data[plane] = pic->planes[plane]; + } + *got_frame = 1; return 0; } @@ -156,7 +167,6 @@ static int send_delayed_frame(AVCodecContext *avctx, AVFrame *frame, int *got_fr } if (ret == DAVS2_GOT_FRAME) { ret = davs2_dump_frames(avctx, &cad->out_frame, got_frame, &cad->headerset, ret, frame); - davs2_decoder_frame_unref(cad->decoder, &cad->out_frame); } return ret; } @@ -205,7 +215,6 @@ static int davs2_decode_frame(AVCodecContext *avctx, void *data, if (ret != DAVS2_DEFAULT) { ret = davs2_dump_frames(avctx, &cad->out_frame, got_frame, &cad->headerset, ret, frame); - davs2_decoder_frame_unref(cad->decoder, &cad->out_frame); } return ret == 0 ? buf_size : ret;