1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

Change aac and ac3 parsers to use ff_combine_frame().

Originally committed as revision 12894 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2008-04-19 01:50:40 +00:00
parent bf237413f3
commit 454064ad1e
4 changed files with 44 additions and 47 deletions

View File

@ -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){
buf_ptr = buf; i= s->remaining_size;
while (buf_size > 0) { s->remaining_size = 0;
int size_needed= s->frame_size ? s->frame_size : s->header_size; }else{ //we need a header first
len = s->inbuf_ptr - s->inbuf; len=0;
for(i=s->remaining_size; i<buf_size; i++){
if(len<size_needed){ s->state = (s->state<<8) + buf[i];
len = FFMIN(size_needed - len, buf_size); if((len=s->sync(s->state, s)))
memcpy(s->inbuf_ptr, buf_ptr, len); break;
buf_ptr += len; }
s->inbuf_ptr += len; if(len<=0){
buf_size -= len; i=END_NOT_FOUND;
}else{
i-= s->header_size -1;
s->remaining_size = len + i;
}
} }
}
if(ff_combine_frame(pc, i, &buf, &buf_size)<0){
s->remaining_size -= FFMIN(s->remaining_size, buf_size);
*poutbuf = NULL;
*poutbuf_size = 0;
return buf_size;
}
*poutbuf = buf;
*poutbuf_size = buf_size;
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,
} }
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;
} }

View File

@ -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,

View File

@ -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)
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;

View File

@ -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)
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;