X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ffaad.c;h=49cc789a51ce529fb158148c9c20c7aeb9f79c89;hb=2c9a0285d499b2e525d465c4cbc3fcb7088b65ab;hp=236b250d5d1e9c83e9736dad8ed9dfeeededad43;hpb=305fa2644533cde5eda783dd352b4620582774b4;p=ffmpeg diff --git a/libavcodec/faad.c b/libavcodec/faad.c index 236b250d5d1..49cc789a51c 100644 --- a/libavcodec/faad.c +++ b/libavcodec/faad.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** @@ -47,51 +47,50 @@ static const char* libfaadname = "libfaad.so.0"; #endif typedef struct { - void* handle; /* dlopen handle */ - void* faac_handle; /* FAAD library handle */ - int frame_size; + void* handle; /* dlopen handle */ + void* faac_handle; /* FAAD library handle */ int sample_size; - int flags; + int init; /* faad calls */ faacDecHandle FAADAPI (*faacDecOpen)(void); faacDecConfigurationPtr FAADAPI (*faacDecGetCurrentConfiguration)(faacDecHandle hDecoder); #ifndef FAAD2_VERSION - int FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, + int FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, faacDecConfigurationPtr config); - int FAADAPI (*faacDecInit)(faacDecHandle hDecoder, - unsigned char *buffer, - unsigned long *samplerate, - unsigned long *channels); - int FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, + int FAADAPI (*faacDecInit)(faacDecHandle hDecoder, + unsigned char *buffer, + unsigned long *samplerate, + unsigned long *channels); + int FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned long *channels); - int FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, - unsigned char *buffer, - unsigned long *bytesconsumed, - short *sample_buffer, + int FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, + unsigned char *buffer, + unsigned long *bytesconsumed, + short *sample_buffer, unsigned long *samples); #else - unsigned char FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, + unsigned char FAADAPI (*faacDecSetConfiguration)(faacDecHandle hDecoder, faacDecConfigurationPtr config); - long FAADAPI (*faacDecInit)(faacDecHandle hDecoder, - unsigned char *buffer, - unsigned long buffer_size, - unsigned long *samplerate, - unsigned char *channels); - char FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, + long FAADAPI (*faacDecInit)(faacDecHandle hDecoder, + unsigned char *buffer, + unsigned long buffer_size, + unsigned long *samplerate, + unsigned char *channels); + char FAADAPI (*faacDecInit2)(faacDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); - void *FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, - faacDecFrameInfo *hInfo, - unsigned char *buffer, - unsigned long buffer_size); - unsigned char* FAADAPI (*faacDecGetErrorMessage)(unsigned char errcode); + void *FAADAPI (*faacDecDecode)(faacDecHandle hDecoder, + faacDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size); + char* FAADAPI (*faacDecGetErrorMessage)(unsigned char errcode); #endif - + void FAADAPI (*faacDecClose)(faacDecHandle hDecoder); - - + + } FAACContext; static const unsigned long faac_srates[] = @@ -111,26 +110,24 @@ static int faac_init_mp4(AVCodecContext *avctx) #endif int r = 0; - 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 (avctx->extradata){ + r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata, + avctx->extradata_size, + &samplerate, &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; } -static int faac_init_aac(AVCodecContext *avctx) -{ - return 0; -} - static int faac_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) @@ -146,36 +143,50 @@ static int faac_decode_frame(AVCodecContext *avctx, void *out; #endif if(buf_size == 0) - return 0; + return 0; #ifndef FAAD2_VERSION - out = s->faacDecDecode(s->faac_handle, - (unsigned char*)buf, - &bytesconsumed, - data, + out = s->faacDecDecode(s->faac_handle, + (unsigned char*)buf, + &bytesconsumed, + data, &samples); samples *= s->sample_size; if (data_size) - *data_size = samples; + *data_size = samples; return (buf_size < (int)bytesconsumed) - ? buf_size : (int)bytesconsumed; + ? buf_size : (int)bytesconsumed; #else - + + if(!s->init){ + unsigned long srate; + unsigned char channels; + int r = s->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 -1; + } + 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) { - av_log(avctx, AV_LOG_ERROR, "faac: frame decodinf failed: %s\n", - s->faacDecGetErrorMessage(frame_info.error)); - return 0; + av_log(avctx, AV_LOG_ERROR, "faac: frame decoding failed: %s\n", + s->faacDecGetErrorMessage(frame_info.error)); + return -1; } frame_info.samples *= s->sample_size; memcpy(data, out, frame_info.samples); // CHECKME - can we cheat this one if (data_size) - *data_size = frame_info.samples; + *data_size = frame_info.samples; return (buf_size < (int)frame_info.bytesconsumed) - ? buf_size : (int)frame_info.bytesconsumed; + ? buf_size : (int)frame_info.bytesconsumed; #endif } @@ -201,8 +212,8 @@ static int faac_decode_init(AVCodecContext *avctx) s->handle = dlopen(libfaadname, RTLD_LAZY); if (!s->handle) { - av_log(avctx, AV_LOG_ERROR, "FAAD library: %s could not be opened! \n%s\n", - libfaadname, dlerror()); + av_log(avctx, AV_LOG_ERROR, "FAAD library: %s could not be opened! \n%s\n", + libfaadname, dlerror()); return -1; } #define dfaac(a, b) \ @@ -214,32 +225,32 @@ static int faac_decode_init(AVCodecContext *avctx) #endif /* CONFIG_FAADBIN */ // resolve all needed function calls - dfaac(Open, (faacDecHandle FAADAPI (*)(void))); - dfaac(GetCurrentConfiguration, (faacDecConfigurationPtr - FAADAPI (*)(faacDecHandle))); + dfaac(Open, (faacDecHandle FAADAPI (*)(void))); + dfaac(GetCurrentConfiguration, (faacDecConfigurationPtr + FAADAPI (*)(faacDecHandle))); #ifndef FAAD2_VERSION - dfaac(SetConfiguration, (int FAADAPI (*)(faacDecHandle, - faacDecConfigurationPtr))); + dfaac(SetConfiguration, (int FAADAPI (*)(faacDecHandle, + faacDecConfigurationPtr))); - dfaac(Init, (int FAADAPI (*)(faacDecHandle, unsigned char*, - unsigned long*, unsigned long*))); + dfaac(Init, (int FAADAPI (*)(faacDecHandle, unsigned char*, + unsigned long*, unsigned long*))); dfaac(Init2, (int FAADAPI (*)(faacDecHandle, unsigned char*, - unsigned long, unsigned long*, - unsigned long*))); + unsigned long, unsigned long*, + unsigned long*))); dfaac(Close, (void FAADAPI (*)(faacDecHandle hDecoder))); - dfaac(Decode, (int FAADAPI (*)(faacDecHandle, unsigned char*, - unsigned long*, short*, unsigned long*))); + dfaac(Decode, (int FAADAPI (*)(faacDecHandle, unsigned char*, + unsigned long*, short*, unsigned long*))); #else - dfaac(SetConfiguration, (unsigned char FAADAPI (*)(faacDecHandle, - faacDecConfigurationPtr))); - dfaac(Init, (long FAADAPI (*)(faacDecHandle, unsigned char*, - unsigned long, unsigned long*, unsigned char*))); - dfaac(Init2, (char FAADAPI (*)(faacDecHandle, unsigned char*, - unsigned long, unsigned long*, - unsigned char*))); - dfaac(Decode, (void *FAADAPI (*)(faacDecHandle, faacDecFrameInfo*, - unsigned char*, unsigned long))); - dfaac(GetErrorMessage, (unsigned char* FAADAPI (*)(unsigned char))); + dfaac(SetConfiguration, (unsigned char FAADAPI (*)(faacDecHandle, + faacDecConfigurationPtr))); + dfaac(Init, (long FAADAPI (*)(faacDecHandle, unsigned char*, + unsigned long, unsigned long*, unsigned char*))); + dfaac(Init2, (char FAADAPI (*)(faacDecHandle, unsigned char*, + unsigned long, unsigned long*, + unsigned char*))); + dfaac(Decode, (void *FAADAPI (*)(faacDecHandle, faacDecFrameInfo*, + unsigned char*, unsigned long))); + dfaac(GetErrorMessage, (char* FAADAPI (*)(unsigned char))); #endif #undef dfacc @@ -248,8 +259,8 @@ static int faac_decode_init(AVCodecContext *avctx) } if (err) { dlclose(s->handle); - av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot resolve %s in %s!\n", - err, libfaadname); + av_log(avctx, AV_LOG_ERROR, "FAAD library: cannot resolve %s in %s!\n", + err, libfaadname); return -1; } #endif @@ -265,31 +276,31 @@ static int faac_decode_init(AVCodecContext *avctx) faac_cfg = s->faacDecGetCurrentConfiguration(s->faac_handle); if (faac_cfg) { - switch (avctx->bits_per_sample) { - case 8: av_log(avctx, AV_LOG_ERROR, "FAADlib unsupported bps %d\n", avctx->bits_per_sample); break; - default: - case 16: + switch (avctx->bits_per_sample) { + case 8: av_log(avctx, AV_LOG_ERROR, "FAADlib unsupported bps %d\n", avctx->bits_per_sample); break; + default: + case 16: #ifdef FAAD2_VERSION - faac_cfg->outputFormat = FAAD_FMT_16BIT; + faac_cfg->outputFormat = FAAD_FMT_16BIT; #endif - s->sample_size = 2; - break; - case 24: + s->sample_size = 2; + break; + case 24: #ifdef FAAD2_VERSION - faac_cfg->outputFormat = FAAD_FMT_24BIT; + faac_cfg->outputFormat = FAAD_FMT_24BIT; #endif - s->sample_size = 3; - break; - case 32: + s->sample_size = 3; + break; + case 32: #ifdef FAAD2_VERSION - faac_cfg->outputFormat = FAAD_FMT_32BIT; + faac_cfg->outputFormat = FAAD_FMT_32BIT; #endif - s->sample_size = 4; - break; - } + s->sample_size = 4; + break; + } - faac_cfg->defSampleRate = (!avctx->sample_rate) ? 44100 : avctx->sample_rate; - faac_cfg->defObjectType = LC; + faac_cfg->defSampleRate = (!avctx->sample_rate) ? 44100 : avctx->sample_rate; + faac_cfg->defObjectType = LC; } s->faacDecSetConfiguration(s->faac_handle, faac_cfg);