Commit cbe2dfa4 authored by Matthieu Bouron's avatar Matthieu Bouron

lavc/pngdec: honor skip_frame option

parent fc460fe6
...@@ -1088,6 +1088,13 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, ...@@ -1088,6 +1088,13 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
for (;;) { for (;;) {
length = bytestream2_get_bytes_left(&s->gb); length = bytestream2_get_bytes_left(&s->gb);
if (length <= 0) { if (length <= 0) {
if (avctx->codec_id == AV_CODEC_ID_PNG &&
avctx->skip_frame == AVDISCARD_ALL) {
av_frame_set_metadata(p, metadata);
return 0;
}
if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && length == 0) { if (CONFIG_APNG_DECODER && avctx->codec_id == AV_CODEC_ID_APNG && length == 0) {
if (!(s->state & PNG_IDAT)) if (!(s->state & PNG_IDAT))
return 0; return 0;
...@@ -1115,6 +1122,20 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, ...@@ -1115,6 +1122,20 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
((tag >> 8) & 0xff), ((tag >> 8) & 0xff),
((tag >> 16) & 0xff), ((tag >> 16) & 0xff),
((tag >> 24) & 0xff), length); ((tag >> 24) & 0xff), length);
if (avctx->codec_id == AV_CODEC_ID_PNG &&
avctx->skip_frame == AVDISCARD_ALL) {
switch(tag) {
case MKTAG('I', 'H', 'D', 'R'):
case MKTAG('p', 'H', 'Y', 's'):
case MKTAG('t', 'E', 'X', 't'):
case MKTAG('I', 'D', 'A', 'T'):
break;
default:
goto skip_tag;
}
}
switch (tag) { switch (tag) {
case MKTAG('I', 'H', 'D', 'R'): case MKTAG('I', 'H', 'D', 'R'):
if ((ret = decode_ihdr_chunk(avctx, s, length)) < 0) if ((ret = decode_ihdr_chunk(avctx, s, length)) < 0)
...@@ -1197,6 +1218,11 @@ skip_tag: ...@@ -1197,6 +1218,11 @@ skip_tag:
} }
} }
exit_loop: exit_loop:
if (avctx->codec_id == AV_CODEC_ID_PNG &&
avctx->skip_frame == AVDISCARD_ALL) {
av_frame_set_metadata(p, metadata);
return 0;
}
if (s->bits_per_pixel <= 4) if (s->bits_per_pixel <= 4)
handle_small_bpp(s, p); handle_small_bpp(s, p);
...@@ -1294,6 +1320,12 @@ static int decode_frame_png(AVCodecContext *avctx, ...@@ -1294,6 +1320,12 @@ static int decode_frame_png(AVCodecContext *avctx,
if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0) if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
goto the_end; goto the_end;
if (avctx->skip_frame == AVDISCARD_ALL) {
*got_frame = 0;
ret = bytestream2_tell(&s->gb);
goto the_end;
}
if ((ret = av_frame_ref(data, s->picture.f)) < 0) if ((ret = av_frame_ref(data, s->picture.f)) < 0)
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment