1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-28 20:53:54 +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)
{
AACAC3ParseContext *s = s1->priv_data;
const uint8_t *buf_ptr;
int len;
ParseContext *pc = &s->pc;
int len, i;
*poutbuf = NULL;
*poutbuf_size = 0;
buf_ptr = buf;
while (buf_size > 0) {
int size_needed= s->frame_size ? s->frame_size : s->header_size;
len = s->inbuf_ptr - s->inbuf;
if(len<size_needed){
len = FFMIN(size_needed - len, buf_size);
memcpy(s->inbuf_ptr, buf_ptr, len);
buf_ptr += len;
s->inbuf_ptr += len;
buf_size -= len;
i=END_NOT_FOUND;
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;
}
}
}
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 */
avctx->sample_rate = s->sample_rate;
/* 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->frame_size = s->samples;
}
}
} 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;
return i;
}

View File

@ -27,16 +27,18 @@
#include "avcodec.h"
typedef struct AACAC3ParseContext {
uint8_t *inbuf_ptr;
int frame_size;
int header_size;
int (*sync)(struct AACAC3ParseContext *hdr_info);
uint8_t inbuf[8192]; /* input buffer */
int (*sync)(uint64_t state, struct AACAC3ParseContext *hdr_info);
int channels;
int sample_rate;
int bit_rate;
int samples;
ParseContext pc;
int remaining_size;
uint64_t state;
} AACAC3ParseContext;
int ff_aac_ac3_parse(AVCodecParserContext *s1,

View File

@ -27,12 +27,13 @@
#define AAC_HEADER_SIZE 7
static int aac_sync(AACAC3ParseContext *hdr_info)
static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info)
{
GetBitContext bits;
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)
return 0;
@ -72,7 +73,6 @@ static int aac_sync(AACAC3ParseContext *hdr_info)
static av_cold int aac_parse_init(AVCodecParserContext *s1)
{
AACAC3ParseContext *s = s1->priv_data;
s->inbuf_ptr = s->inbuf;
s->header_size = AAC_HEADER_SIZE;
s->sync = aac_sync;
return 0;

View File

@ -123,12 +123,13 @@ int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr)
return 0;
}
static int ac3_sync(AACAC3ParseContext *hdr_info)
static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info)
{
int err;
uint64_t tmp = be2me_64(state);
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)
return 0;
@ -144,7 +145,6 @@ static int ac3_sync(AACAC3ParseContext *hdr_info)
static av_cold int ac3_parse_init(AVCodecParserContext *s1)
{
AACAC3ParseContext *s = s1->priv_data;
s->inbuf_ptr = s->inbuf;
s->header_size = AC3_HEADER_SIZE;
s->sync = ac3_sync;
return 0;