[FFmpeg-devel] [PATCH] png parser

Michael Niedermayer michaelni
Wed Jun 17 19:38:45 CEST 2009


On Sat, Jun 13, 2009 at 01:54:46PM +0200, Peter Holik wrote:
[...]
> +static int png_parse(AVCodecParserContext *s, AVCodecContext *avctx,
> +                     const uint8_t **poutbuf, int *poutbuf_size,
> +                     const uint8_t *buf, int buf_size)
> +{
> +    ParseContext *pc = s->priv_data;
> +    uint32_t *state_ptr = &pc->state;

> +    uint32_t *chunk_length_ptr = (uint32_t *)&pc->state64;

this looks like you misuse the field


> +    uint32_t *remaining_size_ptr = &pc->overread_index;

thats a very obfuscated way o access a field from the struct


> +    int next = END_NOT_FOUND;
> +    int i = 0;
> +
> +    *poutbuf_size = 0;
> +    if (buf_size == 0)
> +        return 0;
> +
> +    if (!pc->frame_start_found) {
> +        uint64_t *state64_ptr = &pc->state64;
> +
> +        for (; i < buf_size; i++) {
> +            *state64_ptr = (*state64_ptr << 8) | buf[i];
> +            if (*state64_ptr == PNGSIG || *state64_ptr == MNGSIG) {
> +                pc->frame_start_found = 1;
> +                if (++i == 8)
> +                    break;

> +                /* workaround to start packet with a signature */
> +                buf_size = 8;
> +                *state64_ptr = be2me_64(*state64_ptr);
> +                if (ff_combine_frame(pc, next, (const uint8_t **)&state64_ptr, &buf_size) != -1) {

whatever this is supposed to do, it looks very hackish


> +                    next = buf_size;
> +                    goto fail;
> +                }
> +                return i;
> +            }
> +        }
> +    } else
> +        if (*remaining_size_ptr) {
> +            i = FFMIN(*remaining_size_ptr, buf_size);
> +            *remaining_size_ptr -= i;
> +            if (*remaining_size_ptr)
> +                goto flush;
> +            if (pc->frame_start_found == -1) {
> +                next = i;
> +                goto flush;
> +            }
> +        }
> +
> +    for (;pc->frame_start_found && i < buf_size; i++) {
> +        *state_ptr = (*state_ptr << 8) | buf[i];
> +        if (pc->frame_start_found == 4) {
> +                *chunk_length_ptr = AV_RL32(state_ptr) + 4;
> +                if (*chunk_length_ptr > 0x7fffffff) {
> +                    next = buf_size;
> +                    goto fail;
> +                }

i think this discards data?
if so, thats wrong, parsers should not discard any data, just split it the
best they can.
a decoder might very well be able to decode the correct parts of a frame ...

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Dictatorship naturally arises out of democracy, and the most aggravated
form of tyranny and slavery out of the most extreme liberty. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090617/8679c714/attachment.pgp>



More information about the ffmpeg-devel mailing list