X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Fcommon%2Fmp3_libavcodec.c;fp=platform%2Fcommon%2Fmp3_libavcodec.c;h=3c93dfba18fcbf03c11cc6113474d9660a5e4097;hb=986d60fc6068356477327f742c0e41827e76a3fa;hp=833b30b4ddc8064953a589533db4978ff33f16a6;hpb=fc11dd059b5c7369a51ddcca532505b588bd0030;p=picodrive.git diff --git a/platform/common/mp3_libavcodec.c b/platform/common/mp3_libavcodec.c index 833b30b..3c93dfb 100644 --- a/platform/common/mp3_libavcodec.c +++ b/platform/common/mp3_libavcodec.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "../libpicofe/lprintf.h" @@ -17,6 +18,12 @@ static AVCodecContext *ctx; +/* avoid compile time linking to libavcodec due to huge list of it's deps.. + * we also use this old API as newer one is not available on pandora */ +void (*p_av_init_packet)(AVPacket *pkt); +int (*p_avcodec_decode_audio3)(AVCodecContext *avctx, int16_t *samples, + int *frame_size_ptr, AVPacket *avpkt); + int mp3dec_decode(FILE *f, int *file_pos, int file_len) { unsigned char input_buf[2 * 1024]; @@ -27,7 +34,7 @@ int mp3dec_decode(FILE *f, int *file_pos, int file_len) int offset; int len; - av_init_packet(&avpkt); + p_av_init_packet(&avpkt); do { @@ -60,8 +67,13 @@ int mp3dec_decode(FILE *f, int *file_pos, int file_len) avpkt.data = input_buf + offset; avpkt.size = frame_size; bytes_out = sizeof(cdda_out_buffer); +#if LIBAVCODEC_VERSION_MAJOR < 53 + // stupidity in v52: enforces this size even when + // it doesn't need/use that much at all + bytes_out = AVCODEC_MAX_AUDIO_FRAME_SIZE; +#endif - len = avcodec_decode_audio3(ctx, cdda_out_buffer, + len = p_avcodec_decode_audio3(ctx, cdda_out_buffer, &bytes_out, &avpkt); if (len <= 0) { lprintf("mp3 decode err (%i/%i) %i\n", @@ -81,12 +93,45 @@ int mp3dec_decode(FILE *f, int *file_pos, int file_len) int mp3dec_start(void) { + void (*avcodec_register_all)(void); + AVCodec *(*avcodec_find_decoder)(enum CodecID id); + AVCodecContext *(*avcodec_alloc_context)(void); + int (*avcodec_open)(AVCodecContext *avctx, AVCodec *codec); + void (*av_free)(void *ptr); AVCodec *codec; + void *soh; int ret; if (ctx != NULL) return 0; + // either v52 or v53 should be ok + soh = dlopen("libavcodec.so.52", RTLD_NOW); + if (soh == NULL) + soh = dlopen("libavcodec.so.53", RTLD_NOW); + if (soh == NULL) { + lprintf("mp3dec: load libavcodec.so: %s\n", dlerror()); + return -1; + } + + avcodec_register_all = dlsym(soh, "avcodec_register_all"); + avcodec_find_decoder = dlsym(soh, "avcodec_find_decoder"); + avcodec_alloc_context = dlsym(soh, "avcodec_alloc_context"); + avcodec_open = dlsym(soh, "avcodec_open"); + av_free = dlsym(soh, "av_free"); + p_av_init_packet = dlsym(soh, "av_init_packet"); + p_avcodec_decode_audio3 = dlsym(soh, "avcodec_decode_audio3"); + + if (avcodec_register_all == NULL || avcodec_find_decoder == NULL + || avcodec_alloc_context == NULL || avcodec_open == NULL + || av_free == NULL + || p_av_init_packet == NULL || p_avcodec_decode_audio3 == NULL) + { + lprintf("mp3dec: missing symbol(s) in libavcodec.so\n"); + dlclose(soh); + return -1; + } + // init decoder //avcodec_init();