/*
- * Common AAC and AC3 parser
+ * Common AAC and AC-3 parser
* Copyright (c) 2003 Fabrice Bellard.
* Copyright (c) 2003 Michael Niedermayer.
*
int len, i;
int new_frame_start;
+get_next:
i=END_NOT_FOUND;
if(s->remaining_size <= buf_size){
- if(s->remaining_size){
+ if(s->remaining_size && !s->need_next_header){
i= s->remaining_size;
s->remaining_size = 0;
}else{ //we need a header first
i=END_NOT_FOUND;
}else{
i-= s->header_size -1;
- s->remaining_size = len + i;
+ s->remaining_size = len;
+ if(!new_frame_start || pc->index+i<=0){
+ s->remaining_size += i;
+ goto get_next;
+ }
}
}
}
*poutbuf = buf;
*poutbuf_size = buf_size;
- /* update codec info */
- avctx->sample_rate = s->sample_rate;
- /* allow downmixing to stereo (or mono for AC3) */
- if(avctx->request_channels > 0 &&
- avctx->request_channels < s->channels &&
- (avctx->request_channels <= 2 ||
- (avctx->request_channels == 1 &&
- avctx->codec_id == CODEC_ID_AC3))) {
- avctx->channels = avctx->request_channels;
- } else {
- avctx->channels = s->channels;
- }
- avctx->bit_rate = s->bit_rate;
- avctx->frame_size = s->samples;
+ /* update codec info */
+ avctx->sample_rate = s->sample_rate;
+ /* allow downmixing to stereo (or mono for AC-3) */
+ if(avctx->request_channels > 0 &&
+ avctx->request_channels < s->channels &&
+ (avctx->request_channels <= 2 ||
+ (avctx->request_channels == 1 &&
+ (avctx->codec_id == CODEC_ID_AC3 ||
+ avctx->codec_id == CODEC_ID_EAC3)))) {
+ avctx->channels = avctx->request_channels;
+ } else {
+ avctx->channels = s->channels;
+ }
+ avctx->bit_rate = s->bit_rate;
+ avctx->frame_size = s->samples;
return i;
}