Commit 454064ad authored by Michael Niedermayer's avatar Michael Niedermayer

Change aac and ac3 parsers to use ff_combine_frame().

Originally committed as revision 12894 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent bf237413
...@@ -29,34 +29,40 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1, ...@@ -29,34 +29,40 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1,
const uint8_t *buf, int buf_size) const uint8_t *buf, int buf_size)
{ {
AACAC3ParseContext *s = s1->priv_data; AACAC3ParseContext *s = s1->priv_data;
const uint8_t *buf_ptr; ParseContext *pc = &s->pc;
int len; int len, i;
*poutbuf = NULL; i=END_NOT_FOUND;
*poutbuf_size = 0; if(s->remaining_size <= buf_size){
if(s->remaining_size){
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)))
break;
}
if(len<=0){
i=END_NOT_FOUND;
}else{
i-= s->header_size -1;
s->remaining_size = len + i;
}
}
}
buf_ptr = buf; if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
while (buf_size > 0) { s->remaining_size -= FFMIN(s->remaining_size, buf_size);
int size_needed= s->frame_size ? s->frame_size : s->header_size; *poutbuf = NULL;
len = s->inbuf_ptr - s->inbuf; *poutbuf_size = 0;
return buf_size;
}
if(len<size_needed){ *poutbuf = buf;
len = FFMIN(size_needed - len, buf_size); *poutbuf_size = buf_size;
memcpy(s->inbuf_ptr, buf_ptr, len);
buf_ptr += len;
s->inbuf_ptr += len;
buf_size -= len;
}
if (s->frame_size == 0) {
if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
len = s->sync(s);
if (len == 0) {
/* no sync found : move by one byte (inefficient, but simple!) */
memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
s->inbuf_ptr--;
} else {
s->frame_size = len;
/* update codec info */ /* update codec info */
avctx->sample_rate = s->sample_rate; avctx->sample_rate = s->sample_rate;
/* allow downmixing to stereo (or mono for AC3) */ /* allow downmixing to stereo (or mono for AC3) */
...@@ -71,17 +77,6 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1, ...@@ -71,17 +77,6 @@ int ff_aac_ac3_parse(AVCodecParserContext *s1,
} }
avctx->bit_rate = s->bit_rate; avctx->bit_rate = s->bit_rate;
avctx->frame_size = s->samples; avctx->frame_size = s->samples;
}
} return i;
} else {
if(s->inbuf_ptr - s->inbuf == s->frame_size){
*poutbuf = s->inbuf;
*poutbuf_size = s->frame_size;
s->inbuf_ptr = s->inbuf;
s->frame_size = 0;
break;
}
}
}
return buf_ptr - buf;
} }
...@@ -27,16 +27,18 @@ ...@@ -27,16 +27,18 @@
#include "avcodec.h" #include "avcodec.h"
typedef struct AACAC3ParseContext { typedef struct AACAC3ParseContext {
uint8_t *inbuf_ptr;
int frame_size; int frame_size;
int header_size; int header_size;
int (*sync)(struct AACAC3ParseContext *hdr_info); int (*sync)(uint64_t state, struct AACAC3ParseContext *hdr_info);
uint8_t inbuf[8192]; /* input buffer */
int channels; int channels;
int sample_rate; int sample_rate;
int bit_rate; int bit_rate;
int samples; int samples;
ParseContext pc;
int remaining_size;
uint64_t state;
} AACAC3ParseContext; } AACAC3ParseContext;
int ff_aac_ac3_parse(AVCodecParserContext *s1, int ff_aac_ac3_parse(AVCodecParserContext *s1,
......
...@@ -27,12 +27,13 @@ ...@@ -27,12 +27,13 @@
#define AAC_HEADER_SIZE 7 #define AAC_HEADER_SIZE 7
static int aac_sync(AACAC3ParseContext *hdr_info) static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info)
{ {
GetBitContext bits; GetBitContext bits;
int size, rdb, ch, sr; int size, rdb, ch, sr;
uint64_t tmp = be2me_64(state);
init_get_bits(&bits, hdr_info->inbuf, AAC_HEADER_SIZE * 8); init_get_bits(&bits, ((uint8_t *)&tmp)+8-AAC_HEADER_SIZE, AAC_HEADER_SIZE * 8);
if(get_bits(&bits, 12) != 0xfff) if(get_bits(&bits, 12) != 0xfff)
return 0; return 0;
...@@ -72,7 +73,6 @@ static int aac_sync(AACAC3ParseContext *hdr_info) ...@@ -72,7 +73,6 @@ static int aac_sync(AACAC3ParseContext *hdr_info)
static av_cold int aac_parse_init(AVCodecParserContext *s1) static av_cold int aac_parse_init(AVCodecParserContext *s1)
{ {
AACAC3ParseContext *s = s1->priv_data; AACAC3ParseContext *s = s1->priv_data;
s->inbuf_ptr = s->inbuf;
s->header_size = AAC_HEADER_SIZE; s->header_size = AAC_HEADER_SIZE;
s->sync = aac_sync; s->sync = aac_sync;
return 0; return 0;
......
...@@ -123,12 +123,13 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr) ...@@ -123,12 +123,13 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
return 0; return 0;
} }
static int ac3_sync(AACAC3ParseContext *hdr_info) static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info)
{ {
int err; int err;
uint64_t tmp = be2me_64(state);
AC3HeaderInfo hdr; AC3HeaderInfo hdr;
err = ff_ac3_parse_header(hdr_info->inbuf, &hdr); err = ff_ac3_parse_header(((uint8_t *)&tmp)+8-AC3_HEADER_SIZE, &hdr);
if(err < 0) if(err < 0)
return 0; return 0;
...@@ -144,7 +145,6 @@ static int ac3_sync(AACAC3ParseContext *hdr_info) ...@@ -144,7 +145,6 @@ static int ac3_sync(AACAC3ParseContext *hdr_info)
static av_cold int ac3_parse_init(AVCodecParserContext *s1) static av_cold int ac3_parse_init(AVCodecParserContext *s1)
{ {
AACAC3ParseContext *s = s1->priv_data; AACAC3ParseContext *s = s1->priv_data;
s->inbuf_ptr = s->inbuf;
s->header_size = AC3_HEADER_SIZE; s->header_size = AC3_HEADER_SIZE;
s->sync = ac3_sync; s->sync = ac3_sync;
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment