[FFmpeg-devel] aac_ac3_parser.c bug with splitted headers + patch

Nir Drang nir
Sun May 11 20:00:02 CEST 2008


Hi ,

This is my first post so If I have violated any rules regarding posting
messages please let me know.

I have created a ts file with aac audio and h.264 using a trranscoding phase
from mpeg2+ac3 using ffmpeg .

 

Now when I try to convert the output to mp4 I noticed that the audio frame
rate is wrong and other strange stuff happening.

I debugged it and discovered that when the aac header (7 bytes) was residing
cross ts packets there is a bug.

In my scenario 6 header bytes were in one ts packet and 1 header byte was in
the second packet.

 

It looked like the code doesn't handle this situation quite well.

I have patched it and requesting your comments to my patch , I might have
broke something else :

"

int ff_aac_ac3_parse(AVCodecParserContext *s1,

                     AVCodecContext *avctx,

                     const uint8_t **poutbuf, int *poutbuf_size,

                     const uint8_t *buf, int buf_size)

{

    AACAC3ParseContext *s = s1->priv_data;

    ParseContext *pc = &s->pc;

    int len, i;

    int new_frame_start;

 

get_next:

    i=END_NOT_FOUND;

    if(s->remaining_size <= buf_size){

        if(s->remaining_size && !s->need_next_header){

            i= s->remaining_size;

            s->remaining_size = 0;

        }else{ //we need a header first

            len=0;

            for(i=s->remaining_size; i<buf_size; i++){

                s->state = (s->state<<8) + buf[i];

                if((len=s->sync(s->state, s, &s->need_next_header,
&new_frame_start)))

                    break;

            }

            if(len<=0){

                i=END_NOT_FOUND;

            }else{

 
av_log(avctx, AV_LOG_ERROR, "frame size= %d\n",len);

              i-= s->header_size -1;

              s->remaining_size = len;

                if(!new_frame_start || i < 0 ){

                    s->remaining_size += i;

                    goto get_next;

                }

            }

        }

    }

... "

 

The red bolded is my patched code , this is line 55 in aac_ac3_parser.c .

 

In my case I got I < 0 (-6) due to the split header case .

 

In general I cant see when the original if(!new_frame_start) would hit
anyway since when len > 0 the flag new_frame_start will be on .

 

Thanks,

Nir.

 

 

 

 

 





More information about the ffmpeg-devel mailing list