[FFmpeg-devel] [PATCH] png parser

Peter Holik peter
Wed May 27 16:19:26 CEST 2009


> "Peter Holik" <peter at holik.at> writes:
>
>>>> On Wed, May 27, 2009 at 02:32:40PM +0200, Peter Holik wrote:
>>>>>
>>>>> This patch adds a png parser to ffmpeg.
>>>>
>>>> There are two patches that should really be one.
>>>>
>>>>> --- /dev/null
>>>>> +++ b/libavcodec/png_parser.c
>>>>> @@ -0,0 +1,95 @@
>>>>> +/**
>>>>> + * @file libavcodec/png_parser.c
>>>>> + * PNG parser.
>>>>
>>>> Drop the period.
>>>>
>>>>> +/**
>>>>> + * finds the end of the current frame in the bitstream.
>>>>
>>>> Capitalize.
>>>>
>>>>> + * @return the position of the first byte of the next frame, or -1
>>>>> + */
>>>>> +static int find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
>>>>> +    int i=0;
>>>>> +    uint64_t state= pc->state64;
>>>>> +
>>>>> +    if(!pc->frame_start_found){
>>>>> +        for(i=0; i<buf_size; i++){
>>>>> +            state= (state<<8) | buf[i];
>>>>> +            if(state == PNGSIG || state == MNGSIG){
>>>>> +                i++;
>>>>> +                pc->frame_start_found=1;
>>>>> +                break;
>>>>
>>>> K&R coding style please, i.e. space between if/for/.. and ( and between
>>>> ) and {, spaces around operators and the { on the next line for function
>>>> declarations.
>>>>
>>>>> +static int png_parse(AVCodecParserContext *s,
>>>>> +                           AVCodecContext *avctx,
>>>>> +                           const uint8_t **poutbuf, int *poutbuf_size,
>>>>> +                           const uint8_t *buf, int buf_size)
>>>>
>>>> weird indentation
>>>
>>> Ok, I've taken this format out of other ffmpeg source files (unluckily)
>>>
>>> For Makefile i was unsure, because usually configure creates
>>> Makefiles and therefor a separated patchfile.
>
> Only in autohell, and FFmpeg is makefile heaven.
>
>> diff --git a/libavcodec/png_parser.c b/libavcodec/png_parser.c
>> new file mode 100644
>> index 0000000..1293ef2
>> --- /dev/null
>> +++ b/libavcodec/png_parser.c
>> @@ -0,0 +1,95 @@
>> +/*
>> + * PNG parser
>> + * Copyright (c) 2009 Peter Holik
>> + *
>> + * This file is part of FFmpeg.
>> + *
>> + * FFmpeg is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * FFmpeg is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with FFmpeg; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> + */
>> +
>> +/**
>> + * @file libavcodec/png_parser.c
>> + * PNG parser
>> + */
>> +
>> +#include "parser.h"
>> +
>> +#define PNGSIG 0x89504e470d0a1a0a
>> +#define MNGSIG 0x8a4d4e470d0a1a0a
>> +
>> +/**
>> + * Finds the end of the current frame in the bitstream.
>> + * @return the position of the first byte of the next frame, or -1
>> + */
>> +static int find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
>> +{
>> +    int i = 0;
>> +    uint64_t state = pc->state64;
>> +
>> +    if (!pc->frame_start_found) {
>> +        for (i = 0; i < buf_size; i++) {
>> +            state = (state << 8) | buf[i];
>> +            if (state == PNGSIG || state == MNGSIG) {
>> +                i++;
>> +                pc->frame_start_found = 1;
>> +                break;
>> +            }
>> +        }
>> +    }
>> +
>> +    if (pc->frame_start_found) {
>> +        /* EOF considered as end of frame */
>> +        if (buf_size == 0)
>> +            return 0;
>> +        for(; i < buf_size; i++){
>> +            state = (state << 8) | buf[i];
>> +            if (state == PNGSIG || state == MNGSIG) {
>> +                pc->frame_start_found = 0;
>> +                pc->state64 = 0;
>> +                return i - 7;
>> +            }
>> +        }
>> +    }

> Wouldn't it be faster to parse the PNG file structure, skipping chunks
> by size?  Reading the entire data a byte at a time is slow in itself,
> and the 64-bit shifts are unfriendly on 32-bit machines (I don't trust
> gcc to be sane).


Sure, but i read here usually only one picture - this is not a stream like an avi file.

I found this method in

h263_parser.c
dnxhd_parser.c (here also 64-bit)
h261_parser.c
mpeg4video_parser.c
vc1_parser.c
cavs_parser.c
mjpeg_parser.c


should i really care?

cu Peter




More information about the ffmpeg-devel mailing list