[FFmpeg-devel] [PATCH] Updated original IFF demuxer code to be 100% standard IFF-compliance

Sebastian Vater cdgs.basty
Sun Apr 25 21:38:54 CEST 2010


Hi Ronald!

Ronald S. Bultje a ?crit :
>> +    uint32_t  body_pos;
>>     
>
> Should be uint64_t.
>   
Fixed.
> This is wrong if data_size = 0xFFFFFFFF. It's unlikely, but the add
> will overflow.
>
> The whole data_skip_size sounds like NIH syndrome to me. Better
> approach is to do uint64_t orig_pos = url_ftell() after reading
> chunkID/size, and in the end skip data_size - (url_ftell(pb) -
> orig_pos) + (data_size & 1). That way you don't have to keep track of
> how many bytes you've read and how many you haven't, like you do
> everywhere below:
>   
Fixed in regards your method, it's really a neat idea!
> Bleh, also this mixes reindenting and functional changes
> (compression=... and the url_fskip(1)).
>   
Oops, fixed!
>>          case ID_BODY:
>> +            iff->body_pos = url_ftell(pb);
>>              iff->body_size = data_size;
>> -            done = 1;
>> +            data_size_skip -= data_size;
>>              break;
>>     
>
> This again won't work. The whole point of this change appears to be
> potential chunks after the BODY, but this code specifically does NOT
> skip the BODY data, thus you will never read any chunk after the BODY.
>   
Fixed!
>>          case ID_BMHD:
>>              st->codec->codec_type            = AVMEDIA_TYPE_VIDEO;
>> +            if (data_size <= 8)
>> +                return AVERROR_INVALIDDATA;
>> +
>>              st->codec->width                 = get_be16(pb);
>>              st->codec->height                = get_be16(pb);
>>              url_fskip(pb, 4); // x, y offset
>>              st->codec->bits_per_coded_sample = get_byte(pb);
>> -            url_fskip(pb, 1); // masking
>> -            compression                      = get_byte(pb);
>> -            url_fskip(pb, 3); // paddding, transparent
>> -            st->sample_aspect_ratio.num      = get_byte(pb);
>> -            st->sample_aspect_ratio.den      = get_byte(pb);
>> -            url_fskip(pb, 4); // source page width, height
>> +
>> +            data_size_skip -= 9;
>> +
>> +            if (data_size >= 11) {
>> +                url_fskip(pb, 1); // masking
>> +                compression                      = get_byte(pb);
>> +
>> +                data_size_skip -= 2;
>> +            }
>> +            if (data_size >= 16) {
>> +                url_fskip(pb, 3); // paddding, transparent
>> +                st->sample_aspect_ratio.num      = get_byte(pb);
>> +                st->sample_aspect_ratio.den      = get_byte(pb);
>> +
>> +                data_size_skip -= 5;
>> +            }
>>              break;
>>     
>
> And again, this part mixes functional/cosmetic changes, the
> data_skip_size is not needed as per my advice above.
>   
Fixed!
>> -        default:
>> -            url_fseek(pb, data_size + padding, SEEK_CUR);
>> +            data_size_skip -= data_size;
>>              break;
>> +
>> +        if (data_size_skip > 0)
>> +            url_fskip(pb, data_size_skip);
>>     
>
> This (the default case) is wrong, it should likely be removed
> completely. Now, for unknown chunks, you end up NOT skipping the data.
>   
Fixed!

-- 

Best regards,
                   :-) Basty/CDGS (-:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: iff-compliance.patch
Type: text/x-patch
Size: 3615 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100425/7bdc637c/attachment.bin>



More information about the ffmpeg-devel mailing list