[FFmpeg-devel] [PATCH 1/3] lavc/pngdec: honor skip_frame option
Matthieu Bouron
matthieu.bouron at gmail.com
Mon Oct 19 10:28:18 CEST 2015
On Sat, Oct 17, 2015 at 10:34:22PM +0200, Matthieu Bouron wrote:
> From: Matthieu Bouron <matthieu.bouron at stupeflix.com>
>
> ---
> libavcodec/pngdec.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
> index 4cfdc58..5b2befe 100644
> --- a/libavcodec/pngdec.c
> +++ b/libavcodec/pngdec.c
> @@ -1087,6 +1087,13 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
> for (;;) {
> length = bytestream2_get_bytes_left(&s->gb);
> 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 (!(s->state & PNG_IDAT))
> return 0;
> @@ -1114,6 +1121,22 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s,
> ((tag >> 8) & 0xff),
> ((tag >> 16) & 0xff),
> ((tag >> 24) & 0xff), length);
> +
> + if (avctx->codec_id == AV_CODEC_ID_PNG &&
> + avctx->skip_frame == AVDISCARD_ALL) {
> + int i, found = 0;
> + static const int tags[] = { MKTAG('I', 'H', 'D', 'R'), MKTAG('t', 'E', 'X', 't'), MKTAG('I', 'D', 'A', 'T') };
> + for (i = 0; i < FF_ARRAY_ELEMS(tags); i++) {
> + if (tag == tags[i]) {
> + found = 1;
> + break;
> + }
> + }
> + if (!found) {
> + goto skip_tag;
> + }
> + }
> +
> switch (tag) {
> case MKTAG('I', 'H', 'D', 'R'):
> if ((ret = decode_ihdr_chunk(avctx, s, length)) < 0)
> @@ -1181,6 +1204,11 @@ skip_tag:
> }
> }
> 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)
> handle_small_bpp(s, p);
> @@ -1278,6 +1306,12 @@ static int decode_frame_png(AVCodecContext *avctx,
> if ((ret = decode_frame_common(avctx, s, p, avpkt)) < 0)
> 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)
> return ret;
>
> --
> 2.6.1
>
Patch updated, the SAR is not discarded anymore.
Matthieu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavc-pngdec-honor-skip_frame-option.patch
Type: text/x-diff
Size: 2724 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151019/5400e977/attachment.patch>
More information about the ffmpeg-devel
mailing list