From patchwork Mon Aug 12 19:17:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 14448 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 3829F449C0F for ; Mon, 12 Aug 2019 22:19:06 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 26E9768AB7E; Mon, 12 Aug 2019 22:19:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-pe07-3.mx.upcmail.net (vie01a-dmta-pe07-3.mx.upcmail.net [84.116.36.19]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AC62A68A6A0 for ; Mon, 12 Aug 2019 22:18:55 +0300 (EEST) Received: from [172.31.216.235] (helo=vie01a-pemc-psmtp-pe12.mail.upcmail.net) by vie01a-dmta-pe07.mx.upcmail.net with esmtp (Exim 4.92) (envelope-from ) id 1hxFqJ-0000Ni-5U for ffmpeg-devel@ffmpeg.org; Mon, 12 Aug 2019 21:18:55 +0200 Received: from localhost ([213.47.41.20]) by vie01a-pemc-psmtp-pe12.mail.upcmail.net with ESMTP id xFpLh83FywlysxFpLhCBvj; Mon, 12 Aug 2019 21:17:55 +0200 X-Env-Mailfrom: michael@niedermayer.cc X-Env-Rcptto: ffmpeg-devel@ffmpeg.org X-SourceIP: 213.47.41.20 X-CNFS-Analysis: v=2.3 cv=E5OzWpVl c=1 sm=1 tr=0 a=I1eytVlZLDX1BM2VTtTtSw==:117 a=I1eytVlZLDX1BM2VTtTtSw==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=GEAsPZ9sns4A:10 a=ZZnuYtJkoWoA:10 a=gL84h8BTH7sYVF48sgsA:9 a=pHzHmUro8NiASowvMSCR:22 a=Ew2E2A-JSTLzCXPT_086:22 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Mon, 12 Aug 2019 21:17:07 +0200 Message-Id: <20190812191708.22608-7-michael@niedermayer.cc> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190812191708.22608-1-michael@niedermayer.cc> References: <20190812191708.22608-1-michael@niedermayer.cc> MIME-Version: 1.0 X-CMAE-Envelope: MS4wfIerrFpRO8aRbUoF48a/wvijvqnOKcxFhP0NYapujomwn+Q9Dkg/7/7hBMC6giRjElaU6p2nKyAGaNLO4SuqvdunWjZWLg+SuPMAOnFwl0VNcQjJn8lQ rfGIZCZAWWpCmXpWk59fWARYhkohe0ADBv8A1MLuYhc5LNpaSxRBHnN8 Subject: [FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged 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" Fixes: Ticket7880 Signed-off-by: Michael Niedermayer --- libavcodec/qtrle.c | 44 +++++++++++++++++++++++++++++++++++---- tests/ref/fate/qtrle-8bit | 1 + 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index 2c29547e5a..ab620cdb55 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -45,6 +45,8 @@ typedef struct QtrleContext { GetByteContext g; uint32_t pal[256]; + int need_flush; + AVPacket flush_pkt; } QtrleContext; #define CHECK_PIXEL_PTR(n) \ @@ -444,6 +446,12 @@ static av_cold int qtrle_decode_init(AVCodecContext *avctx) return 0; } +static void qtrle_flush(AVCodecContext *avctx){ + QtrleContext *s = avctx->priv_data; + + s->need_flush = 0; +} + static int qtrle_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) @@ -454,11 +462,33 @@ static int qtrle_decode_frame(AVCodecContext *avctx, int has_palette = 0; int ret, size; + if (!avpkt->data) { + if (s->need_flush) { + s->need_flush = 0; + if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) + return ret; + s->frame->pkt_pos = s->flush_pkt.pos; + s->frame->pkt_duration = s->flush_pkt.duration; + s->frame->pkt_dts = s->flush_pkt.dts; + s->frame->pkt_pts = + s->frame->pts = s->flush_pkt.pts; + if ((ret = av_frame_ref(data, s->frame)) < 0) + return ret; + *got_frame = 1; + } + return 0; + } + s->flush_pkt = *avpkt; + s->frame->pkt_dts = s->flush_pkt.dts; + bytestream2_init(&s->g, avpkt->data, avpkt->size); /* check if this frame is even supposed to change */ - if (avpkt->size < 8) + if (avpkt->size < 8) { + s->need_flush = 1; return avpkt->size; + } + s->need_flush = 0; /* start after the chunk size */ size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF; @@ -471,14 +501,18 @@ static int qtrle_decode_frame(AVCodecContext *avctx, /* if a header is present, fetch additional decoding parameters */ if (header & 0x0008) { - if (avpkt->size < 14) + if (avpkt->size < 14) { + s->need_flush = 1; return avpkt->size; + } start_line = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); height = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); - if (height > s->avctx->height - start_line) + if (height > s->avctx->height - start_line) { + s->need_flush = 1; return avpkt->size; + } } else { start_line = 0; height = s->avctx->height; @@ -572,5 +606,7 @@ AVCodec ff_qtrle_decoder = { .init = qtrle_decode_init, .close = qtrle_decode_end, .decode = qtrle_decode_frame, - .capabilities = AV_CODEC_CAP_DR1, + .flush = qtrle_flush, + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, + .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, }; diff --git a/tests/ref/fate/qtrle-8bit b/tests/ref/fate/qtrle-8bit index 27bb8aad71..39a03b7b6c 100644 --- a/tests/ref/fate/qtrle-8bit +++ b/tests/ref/fate/qtrle-8bit @@ -61,3 +61,4 @@ 0, 160, 160, 1, 921600, 0xcfd6ad2b 0, 163, 163, 1, 921600, 0x3b372379 0, 165, 165, 1, 921600, 0x36f245f5 +0, 166, 166, 1, 921600, 0x36f245f5