[FFmpeg-devel] [PATCH] MOV: support stz2 "Compact Sample Size Box"
Baptiste Coudurier
baptiste.coudurier
Tue Mar 10 02:57:13 CET 2009
On 3/9/2009 4:38 PM, Michael Niedermayer wrote:
> On Mon, Mar 09, 2009 at 07:31:00PM -0400, Alex Converse wrote:
>> On Fri, Mar 6, 2009 at 4:42 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
>>> On Fri, Mar 06, 2009 at 03:07:03PM -0500, Alex Converse wrote:
>>>> 2009/3/3 Michael Niedermayer <michaelni at gmx.at>:
>>>>> On Tue, Mar 03, 2009 at 02:45:15AM -0500, Alex Converse wrote:
>>>>> [...]
>>>>>> @@ -1143,8 +1150,33 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
>>>>>> if (!sc->sample_sizes)
>>>>>> return AVERROR(ENOMEM);
>>>>>>
>>>>>> + switch(field_size) {
>>>>>> + case 4:
>>>>>> + for(i=0; i<entries-1; i+=2) {
>>>>>> + int field = get_byte(pb);
>>>>>> + sc->sample_sizes[i ] = field >> 4;
>>>>>> + sc->sample_sizes[i+1] = field & 0xF;
>>>>>> + }
>>>>>> + if(entries&1) {
>>>>>> + sc->sample_sizes[entries-1] = get_byte(pb) >> 4;
>>>>>> + }
>>>>>> + break;
>>>>>> + case 8:
>>>>>> + for(i=0; i<entries; i++)
>>>>>> + sc->sample_sizes[i] = get_byte(pb);
>>>>>> + break;
>>>>>> + case 16:
>>>>>> + for(i=0; i<entries; i++)
>>>>>> + sc->sample_sizes[i] = get_be16(pb);
>>>>>> + break;
>>>>>> + case 32:
>>>>>> for(i=0; i<entries; i++)
>>>>>> sc->sample_sizes[i] = get_be32(pb);
>>>>>> + break;
>>>>>> + default:
>>>>>> + av_log(c->fc, AV_LOG_ERROR, "Invalid sample field size %d\n", field_size);
>>>>>> + return -1;
>>>>>> + }
>>>>> I think that should be using GetBitContext
>>>>>
>>>> Are you sure that's the best approach?
>>> no, but iam fairly sure above is worse ;)
>>> this code isnt speed critical, theres no sense in bloating the
>>> loops up like that ...
>>>
>> Is this better?
> [...]
>> @@ -1046,14 +1054,42 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
>> if (sample_size)
>> return 0;
>>
>> + switch(field_size) {
>> + case 4:
>> + break;
>> + case 8:
>> + get_size = &get_byte;
>> + break;
>> + case 16:
>> + get_size = &get_be16;
>> + break;
>> + case 32:
>> + get_size = &get_be32;
>> + break;
>> + default:
>> + av_log(c->fc, AV_LOG_ERROR, "Invalid sample field size %d\n", field_size);
>> + return -1;
>> + }
>> +
>
> normally one should not place more than 1 statement on a line but here
>
> switch(field_size) {
> case 4: break;
> case 8: get_size = &get_byte; break;
> case 16:get_size = &get_be16; break;
> case 32:get_size = &get_be32; break;
>
> looks better to me
>
> anyway, remaining review is for baptistes, iam happy with above
>
Well, maybe your first idea of using GetBitContext will be cleaner, it
would mean:
sc->sample_sizes[i] = get_bits_long(&gb, field_size);
You just have to malloc(), get_buffer/ free, unless we can have a way to
ask ByteIOContext to fill_buffer at least to what we need, and then
access ByteIOContext buffer. Do we have a way to do this ? That would be
nice.
--
Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA
Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
checking for life_signs in -lkenny... no
FFmpeg maintainer http://www.ffmpeg.org
More information about the ffmpeg-devel
mailing list