aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMåns Rullgård <mans@mansr.com>2006-02-08 00:30:58 +0000
committerMåns Rullgård <mans@mansr.com>2006-02-08 00:30:58 +0000
commit79b0b66ba07890c4f71b42d2554d73db537bec97 (patch)
tree915e52259613990bbf787a801aa2d127a4ce9a6b
parent6ee669732dfe3c6339a4a5e7204c2bc628c66b29 (diff)
downloadffmpeg-79b0b66ba07890c4f71b42d2554d73db537bec97.tar.gz
decode adts aac streams
Originally committed as revision 4953 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/faad.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/libavcodec/faad.c b/libavcodec/faad.c
index 1018de062e..f11fd454c5 100644
--- a/libavcodec/faad.c
+++ b/libavcodec/faad.c
@@ -49,9 +49,8 @@ static const char* libfaadname = "libfaad.so.0";
typedef struct {
void* handle; /* dlopen handle */
void* faac_handle; /* FAAD library handle */
- int frame_size;
int sample_size;
- int flags;
+ int init;
/* faad calls */
faacDecHandle FAADAPI (*faacDecOpen)(void);
@@ -111,17 +110,20 @@ static int faac_init_mp4(AVCodecContext *avctx)
#endif
int r = 0;
- if (avctx->extradata)
+ if (avctx->extradata){
r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata,
avctx->extradata_size,
&samplerate, &channels);
- // else r = s->faacDecInit(s->faac_handle ... );
-
- if (r < 0)
- av_log(avctx, AV_LOG_ERROR, "faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n",
- r, samplerate, (long)channels, avctx->extradata_size);
- avctx->sample_rate = samplerate;
- avctx->channels = channels;
+ if (r < 0){
+ av_log(avctx, AV_LOG_ERROR,
+ "faacDecInit2 failed r:%d sr:%ld ch:%ld s:%d\n",
+ r, samplerate, (long)channels, avctx->extradata_size);
+ } else {
+ avctx->sample_rate = samplerate;
+ avctx->channels = channels;
+ s->init = 1;
+ }
+ }
return r;
}
@@ -155,6 +157,20 @@ static int faac_decode_frame(AVCodecContext *avctx,
? buf_size : (int)bytesconsumed;
#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);
if (frame_info.error > 0) {