Re: [FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged

2019-08-14 Thread Paul B Mahol
On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer 
wrote:

> 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) & 0x3FFF;
> @@ -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
> --
>


I dislike this hack and I'm for removing hack that removes dupe frames all
together.

2.22.0
>
> ___
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Re: [FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged

2019-08-14 Thread Paul B Mahol
On Wed, Aug 14, 2019 at 6:04 PM Paul B Mahol  wrote:

>
>
> On Mon, Aug 12, 2019 at 9:19 PM Michael Niedermayer 
> wrote:
>
>> 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) & 0x3FFF;
>> @@ -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
>> --
>>
>
>
> I dislike this hack and I'm for removing hack that removes dupe frames all
> together.
>

To all codecs that exhibit it. Not just qtrle


> 2.22.0
>>
>> ___
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
>
>
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH 7/8] avcodec/qtrle: return last frame even if unchanged

2019-08-12 Thread Michael Niedermayer
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) & 0x3FFF;
@@ -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
-- 
2.22.0

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".