From patchwork Fri Jul 12 15:21:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: hwren X-Patchwork-Id: 13919 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 3C8BF44787A for ; Fri, 12 Jul 2019 18:21:53 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20EEA68ACAB; Fri, 12 Jul 2019 18:21:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from m15-113.126.com (m15-113.126.com [220.181.15.113]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4AF2368ABBF for ; Fri, 12 Jul 2019 18:21:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:Subject:Date:Message-Id; bh=/SQ8ZVgoruG2D6KLW+ Bv+D0yJoSvMt0UwFuvO2aYasM=; b=MArkeeR/lwCHLJinpHryB/j/YCO/ZrHi2u vvpEbD+NWw7Iow21AXvjRiPk+7R8kXvbmhzg10jlyH5SVnH1bdpDRc91s5liPQNu f0KT/hro0rztMz/pdThRbIKZLBr+5Rm1kgFtysdYOvtxD2SsXMWDQxf+zyPZ1JxW 6kJrT59YA= Received: from localhost.localdomain (unknown [218.17.115.198]) by smtp3 (Coremail) with SMTP id DcmowAAHhQqApShdUMGVKA--.20073S6; Fri, 12 Jul 2019 23:21:38 +0800 (CST) From: hwrenx To: ffmpeg-devel@ffmpeg.org Date: Fri, 12 Jul 2019 23:21:34 +0800 Message-Id: <1562944894-29396-4-git-send-email-hwrenx@126.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1562944894-29396-1-git-send-email-hwrenx@126.com> References: <1562935660-6235-3-git-send-email-hwrenx@126.com> <1562944894-29396-1-git-send-email-hwrenx@126.com> X-CM-TRANSID: DcmowAAHhQqApShdUMGVKA--.20073S6 X-Coremail-Antispam: 1Uf129KBjvJXoWxGF4rZr45CF1kCFy7Gr1rZwb_yoW5tFyUpw 43ArZ3t3WUJFs7Ar93Aw1FvF43WrZ2gF40kr4DJr109ayFyryUtrWxtryS9ayI9FWkK34a gF4ktF15u3WDta7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jqhFcUUUUU= X-Originating-IP: [218.17.115.198] X-CM-SenderInfo: pkzuv0b06rjloofrz/1tbiTwLv6VpD9gDUAAAAsw Subject: [FFmpeg-devel] [PATCH v3 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" Can effectivly improved decoding speed when memcpy becomes a limitation for proccessing high resolution source. Tested under i7-8700k with `ffmpeg -i 7680x4320.avs2 -vsync 0 -f null -` got performance 23fps => 42fps Signed-off-by: hwrenx --- libavcodec/libdavs2.c | 54 +++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c index 1b274a3..af0778f 100644 --- a/libavcodec/libdavs2.c +++ b/libavcodec/libdavs2.c @@ -60,13 +60,24 @@ 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; + + pic.magic = (davs2_picture_t *)data; + + 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; @@ -104,29 +115,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; } @@ -158,7 +168,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; } @@ -207,7 +216,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;