|
|
@ -49,9 +49,8 @@ static const char* libfaadname = "libfaad.so.0"; |
|
|
|
typedef struct { |
|
|
|
typedef struct { |
|
|
|
void* handle; /* dlopen handle */ |
|
|
|
void* handle; /* dlopen handle */ |
|
|
|
void* faac_handle; /* FAAD library handle */ |
|
|
|
void* faac_handle; /* FAAD library handle */ |
|
|
|
int frame_size; |
|
|
|
|
|
|
|
int sample_size; |
|
|
|
int sample_size; |
|
|
|
int flags; |
|
|
|
int init; |
|
|
|
|
|
|
|
|
|
|
|
/* faad calls */ |
|
|
|
/* faad calls */ |
|
|
|
faacDecHandle FAADAPI (*faacDecOpen)(void); |
|
|
|
faacDecHandle FAADAPI (*faacDecOpen)(void); |
|
|
@ -111,17 +110,20 @@ static int faac_init_mp4(AVCodecContext *avctx) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
int r = 0; |
|
|
|
int r = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (avctx->extradata) |
|
|
|
if (avctx->extradata){ |
|
|
|
r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata, |
|
|
|
r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata, |
|
|
|
avctx->extradata_size, |
|
|
|
avctx->extradata_size, |
|
|
|
&samplerate, &channels); |
|
|
|
&samplerate, &channels); |
|
|
|
// else r = s->faacDecInit(s->faac_handle ... );
|
|
|
|
if (r < 0){ |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
if (r < 0) |
|
|
|
"faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n", |
|
|
|
av_log(avctx, AV_LOG_ERROR, "faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n", |
|
|
|
r, samplerate, (long)channels, avctx->extradata_size); |
|
|
|
r, samplerate, (long)channels, avctx->extradata_size); |
|
|
|
} else { |
|
|
|
avctx->sample_rate = samplerate; |
|
|
|
avctx->sample_rate = samplerate; |
|
|
|
avctx->channels = channels; |
|
|
|
avctx->channels = channels; |
|
|
|
|
|
|
|
s->init = 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return r; |
|
|
|
return r; |
|
|
|
} |
|
|
|
} |
|
|
@ -155,6 +157,20 @@ static int faac_decode_frame(AVCodecContext *avctx, |
|
|
|
? buf_size : (int)bytesconsumed; |
|
|
|
? buf_size : (int)bytesconsumed; |
|
|
|
#else |
|
|
|
#else |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!s->init){ |
|
|
|
|
|
|
|
unsigned long srate; |
|
|
|
|
|
|
|
unsigned char channels; |
|
|
|
|
|
|
|
int r = faacDecInit(s->faac_handle, buf, buf_size, &srate, &channels); |
|
|
|
|
|
|
|
if(r < 0){ |
|
|
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "faac: codec init failed: %s\n", |
|
|
|
|
|
|
|
s->faacDecGetErrorMessage(frame_info.error)); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
avctx->sample_rate = srate; |
|
|
|
|
|
|
|
avctx->channels = channels; |
|
|
|
|
|
|
|
s->init = 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
out = s->faacDecDecode(s->faac_handle, &frame_info, (unsigned char*)buf, (unsigned long)buf_size); |
|
|
|
out = s->faacDecDecode(s->faac_handle, &frame_info, (unsigned char*)buf, (unsigned long)buf_size); |
|
|
|
|
|
|
|
|
|
|
|
if (frame_info.error > 0) { |
|
|
|
if (frame_info.error > 0) { |
|
|
|