[FFmpeg-devel] [RFC/PATCH] Dealing with 0 padded audio packets

Alex Converse alex.converse
Wed May 19 22:25:15 CEST 2010


On Wed, May 19, 2010 at 9:54 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Wed, May 19, 2010 at 02:13:09AM -0400, Alex Converse wrote:
>> On Tue, May 18, 2010 at 8:06 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
>> > On Tue, May 18, 2010 at 06:16:35PM -0400, Alex Converse wrote:
>> >> Currently the FFmpeg stumbles when decoding AAC where the container
>> >> has zero padded audio frames to make a constant packet size. This
>> >> situation is common for AAC in ASF[1] and WMP handles it fine.
>> >> QuickTime seems to handle the MP4 analog fine.
>> >>
>> >> The best idea I can come up with is a chomp[2] bitstream filter to
>> >> trim these when remuxing and to make the AAC decoder consume the rest
>> >> of a packet if it is all zero.
>> >>
>> >> Other ideas are welcome.
>> >
>> > i wish i had a better idea, but i dont.
>> > no real objections from me on this, just 2 nitpicks below
>> >
>> >
>> > [...]
>> >>
>> >> @@ -2065,6 +2066,12 @@ static int aac_decode_frame(AVCodecContext *avccontext, void *data,
>> >> ? ? ? ? ?ac->output_configured = OC_LOCKED;
>> >>
>> >> ? ? ?buf_consumed = (get_bits_count(&gb) + 7) >> 3;
>> >> + ? ?i = buf_consumed;
>> >> + ? ?while (i < buf_size && !buf[i])
>> >> + ? ? ? ?i++;
>> >> + ? ?if (i == buf_size)
>> >> + ? ? ? ?buf_consumed = buf_size;
>> >> +
>> >> ? ? ?return buf_size > buf_consumed ? buf_consumed : buf_size;
>> >
>> > this can be done less convoluted i think
>>
>> Is [attached] any better? It's the same length :/
> [...]
>> @@ -2065,6 +2066,12 @@ static int aac_decode_frame(AVCodecContext *avccontext, void *data,
>> ? ? ? ? ?ac->output_configured = OC_LOCKED;
>>
>> ? ? ?buf_consumed = (get_bits_count(&gb) + 7) >> 3;
>> + ? ?for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
>> + ? ? ? ?if (!buf[buf_offset])
>> + ? ? ? ? ? ?break;
>> + ? ?if (buf_offset == buf_size)
>> + ? ? ? ?buf_consumed = buf_size;
>> +
>> ? ? ?return buf_size > buf_consumed ? buf_consumed : buf_size;
>
> i was thinking of:
>
> for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
> ? ?if (!buf[buf_offset])
> ? ? ? ?break;
>
> return buf_size > buf_offset ? buf_consumed : buf_size;
>
> or even
>
> for (; buf_consumed < buf_size; buf_consumed++)
> ? ?if (!buf[buf_consumed])
> ? ? ? ?break;
>
> return buf_size > buf_consumed ? buf_consumed : buf_size;
>
>

Applied (both) with fixes.



More information about the ffmpeg-devel mailing list