diff options
author | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:22:21 +0000 |
---|---|---|
committer | tc@google.com <tc@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 21:22:21 +0000 |
commit | a7542f344f1f6784071be2fc3e17db7cc0764566 (patch) | |
tree | bdb6d82abb4fa912a786bbe53e970725fcb83051 /media | |
parent | 8d5a34e2b9853514b5fc5cb33be629f452e558eb (diff) | |
download | chromium_src-a7542f344f1f6784071be2fc3e17db7cc0764566.zip chromium_src-a7542f344f1f6784071be2fc3e17db7cc0764566.tar.gz chromium_src-a7542f344f1f6784071be2fc3e17db7cc0764566.tar.bz2 |
Revert "Revert r18122: "Reapply ffmpeg changes." (it broke the Linux make build)."
This reverts commit r18168 and reapplies r18122. I.e., this
reapplies the ffmpeg changes.
Review URL: http://codereview.chromium.org/125003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18200 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/DEPS | 2 | ||||
-rw-r--r-- | media/base/media_posix.cc | 290 |
2 files changed, 17 insertions, 275 deletions
@@ -1,3 +1,3 @@ include_rules = [ - "+third_party/ffmpeg/include", + "+third_party/ffmpeg", ] diff --git a/media/base/media_posix.cc b/media/base/media_posix.cc index 9a964dd..51efbca 100644 --- a/media/base/media_posix.cc +++ b/media/base/media_posix.cc @@ -11,304 +11,46 @@ #include "base/file_path.h" #include "base/logging.h" #include "base/path_service.h" -#include "media/filters/ffmpeg_common.h" - -// We create stub references to dynamically loaded functions in FFmpeg -// for ease of linking. -// -// TODO(ajwong): We need to find a more maintainable way to have this work. -// Also, this code should really be in the FFmpeg wrapper, and not here -// in the media level. The concept of "weak symbols" looks like it might -// be promising, but I don't quite understand it yet. -// -// TODO(scherkus): I am *this close* to writing the world's coolest macro to -// make modifying this file easier. -extern "C" { - -// libavcodec functions. -void (*av_free_packet_ptr)(AVPacket* pkt) = NULL; -void av_free_packet(AVPacket* pkt) { - av_free_packet_ptr(pkt); -} - -int (*av_get_bits_per_sample_format_ptr)(enum SampleFormat sample_fmt) = NULL; -int av_get_bits_per_sample_format(enum SampleFormat sample_fmt) { - return av_get_bits_per_sample_format_ptr(sample_fmt); -} - -void (*av_init_packet_ptr)(AVPacket* pkt) = NULL; -void av_init_packet(AVPacket* pkt) { - av_init_packet_ptr(pkt); -} - -int (*av_new_packet_ptr)(AVPacket* pkt, int size) = NULL; -int av_new_packet(AVPacket* pkt, int size) { - return av_new_packet_ptr(pkt, size); -} - -AVFrame* (*avcodec_alloc_frame_ptr)(void) = NULL; -AVFrame* avcodec_alloc_frame(void) { - return avcodec_alloc_frame_ptr(); -} - -int (*avcodec_decode_audio3_ptr)(AVCodecContext* avctx, int16_t* samples, - int* frame_size_ptr, AVPacket* avpkt) = NULL; -int avcodec_decode_audio3(AVCodecContext* avctx, int16_t* samples, - int* frame_size_ptr, AVPacket* avpkt) { - return avcodec_decode_audio3_ptr(avctx, samples, frame_size_ptr, avpkt); -} - -int (*avcodec_decode_video2_ptr)(AVCodecContext* avctx, AVFrame* picture, - int* got_picture_ptr, AVPacket* avpkt) = NULL; -int avcodec_decode_video2(AVCodecContext* avctx, AVFrame* picture, - int* got_picture_ptr, AVPacket* avpkt) { - return avcodec_decode_video2_ptr(avctx, picture, got_picture_ptr, avpkt); -} - -AVCodec* (*avcodec_find_decoder_ptr)(enum CodecID id) = NULL; -AVCodec* avcodec_find_decoder(enum CodecID id) { - return avcodec_find_decoder_ptr(id); -} - -void (*avcodec_flush_buffers_ptr)(AVCodecContext *avctx) = NULL; -void avcodec_flush_buffers(AVCodecContext *avctx) { - avcodec_flush_buffers_ptr(avctx); -} - -void (*avcodec_init_ptr)(void) = NULL; -void avcodec_init(void) { - avcodec_init_ptr(); -} - -int (*avcodec_open_ptr)(AVCodecContext* avctx, AVCodec* codec) = NULL; -int avcodec_open(AVCodecContext* avctx, AVCodec* codec) { - return avcodec_open_ptr(avctx, codec); -} - -int (*avcodec_thread_init_ptr)(AVCodecContext* s, int thread_count) = NULL; -int avcodec_thread_init(AVCodecContext* s, int thread_count) { - return avcodec_thread_init_ptr(s, thread_count); -} - - -// libavformat functions. -int (*av_find_stream_info_ptr)(AVFormatContext* ic) = NULL; -int av_find_stream_info(AVFormatContext* ic) { - return av_find_stream_info_ptr(ic); -} - -int (*av_open_input_file_ptr)(AVFormatContext** ic_ptr, const char* filename, - AVInputFormat* fmt, int buf_size, - AVFormatParameters* ap) = NULL; -int av_open_input_file(AVFormatContext** ic_ptr, const char* filename, - AVInputFormat* fmt, int buf_size, - AVFormatParameters* ap) { - return av_open_input_file_ptr(ic_ptr, filename, fmt, buf_size, ap); -} - -int (*av_read_frame_ptr)(AVFormatContext* s, AVPacket* pkt) = NULL; -int av_read_frame(AVFormatContext* s, AVPacket* pkt) { - return av_read_frame_ptr(s, pkt); -} - -void (*av_register_all_ptr)(void) = NULL; -void av_register_all(void) { - av_register_all_ptr(); -} - -int (*av_register_protocol_ptr)(URLProtocol* protocol) = NULL; -int av_register_protocol(URLProtocol* protocol) { - return av_register_protocol_ptr(protocol); -} - -int (*av_seek_frame_ptr)(AVFormatContext* s, int stream_index, - int64_t timestamp, int flags) = NULL; -int av_seek_frame(AVFormatContext* s, int stream_index, - int64_t timestamp, int flags) { - return av_seek_frame_ptr(s, stream_index, timestamp, flags); -} - - -// libavutil functions. -void (*av_free_ptr)(void* ptr) = NULL; -void av_free(void* ptr) { - return av_free_ptr(ptr); -} - -void* (*av_malloc_ptr)(unsigned int size) = NULL; -void* av_malloc(unsigned int size) { - return av_malloc_ptr(size); -} - -int64_t (*av_rescale_q_ptr)(int64_t a, AVRational bq, AVRational cq) = NULL; -int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { - return av_rescale_q_ptr(a, bq, cq); -} - -} // extern "C" +#include "third_party/ffmpeg/ffmpeg_stubs.h" +namespace tp_ffmpeg = third_party_ffmpeg; namespace media { namespace { -enum FFmpegDSOKeys { - FILE_LIBAVCODEC, // full path to libavcodec media decoding library. - FILE_LIBAVFORMAT, // full path to libavformat media parsing library. - FILE_LIBAVUTIL, // full path to libavutil media utility library. -}; - -// Retrieves the DLLName for the given key. -std::string GetDSOName(FFmpegDSOKeys dso_key) { +// Retrieves the DSOName for the given key. +std::string GetDSOName(tp_ffmpeg::StubModules stub_key) { // TODO(ajwong): Do we want to lock to a specific ffmpeg version? // TODO(port): These library names are incorrect for mac. We need .dynlib // suffixes. - switch (dso_key) { - case FILE_LIBAVCODEC: + switch (stub_key) { + case tp_ffmpeg::kModuleAvcodec52: return FILE_PATH_LITERAL("libavcodec.so.52"); - case FILE_LIBAVFORMAT: + case tp_ffmpeg::kModuleAvformat52: return FILE_PATH_LITERAL("libavformat.so.52"); - case FILE_LIBAVUTIL: + case tp_ffmpeg::kModuleAvutil50: return FILE_PATH_LITERAL("libavutil.so.50"); default: - LOG(DFATAL) << "Invalid DSO key requested: " << dso_key; + LOG(DFATAL) << "Invalid stub module requested: " << stub_key; return FILE_PATH_LITERAL(""); } } } // namespace -// Attempts to initialize the media library (loading DLLs, DSOs, etc.). +// Attempts to initialize the media library (loading DSOs, etc.). // Returns true if everything was successfully initialized, false otherwise. bool InitializeMediaLibrary(const FilePath& module_dir) { // TODO(ajwong): We need error resolution. - FFmpegDSOKeys path_keys[] = { - FILE_LIBAVCODEC, - FILE_LIBAVFORMAT, - FILE_LIBAVUTIL - }; - void* libs[arraysize(path_keys)] = {}; - for (size_t i = 0; i < arraysize(path_keys); ++i) { - FilePath path = module_dir.Append(GetDSOName(path_keys[i])); - libs[i] = dlopen(path.value().c_str(), RTLD_LAZY); - if (!libs[i]) - break; - } - - // Check that we loaded all libraries successfully. We only need to check the - // last array element because the loop above breaks on any failure. - if (libs[arraysize(libs)-1] == NULL) { - // Free any loaded libraries if we weren't successful. - for (size_t i = 0; i < arraysize(libs) && libs[i] != NULL; ++i) { - dlclose(libs[i]); - libs[i] = NULL; // Just to be safe. - } - return false; - } - - // TODO(ajwong): Extract this to somewhere saner, and hopefully - // autogenerate the bindings from the .def files. Having all this - // code here is incredibly ugly. - - // libavcodec functions. - av_free_packet_ptr = - reinterpret_cast<void (*)(AVPacket*)>( - dlsym(libs[FILE_LIBAVCODEC], "av_free_packet")); - av_get_bits_per_sample_format_ptr = - reinterpret_cast<int (*)(enum SampleFormat)>( - dlsym(libs[FILE_LIBAVCODEC], "av_get_bits_per_sample_format")); - av_init_packet_ptr = - reinterpret_cast<void (*)(AVPacket*)>( - dlsym(libs[FILE_LIBAVCODEC], "av_init_packet")); - av_new_packet_ptr = - reinterpret_cast<int (*)(AVPacket*, int)>( - dlsym(libs[FILE_LIBAVCODEC], "av_new_packet")); - avcodec_alloc_frame_ptr = - reinterpret_cast<AVFrame* (*)(void)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_alloc_frame")); - avcodec_decode_audio3_ptr = - reinterpret_cast<int (*)(AVCodecContext*, int16_t*, int*, AVPacket*)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_decode_audio3")); - avcodec_decode_video2_ptr = - reinterpret_cast<int (*)(AVCodecContext*, AVFrame*, int*, AVPacket*)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_decode_video2")); - avcodec_find_decoder_ptr = - reinterpret_cast<AVCodec* (*)(enum CodecID)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_find_decoder")); - avcodec_flush_buffers_ptr = - reinterpret_cast<void (*)(AVCodecContext*)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_flush_buffers")); - avcodec_init_ptr = - reinterpret_cast<void (*)(void)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_init")); - avcodec_open_ptr = - reinterpret_cast<int (*)(AVCodecContext*, AVCodec*)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_open")); - avcodec_thread_init_ptr = - reinterpret_cast<int (*)(AVCodecContext*, int)>( - dlsym(libs[FILE_LIBAVCODEC], "avcodec_thread_init")); - - // libavformat functions. - av_find_stream_info_ptr = - reinterpret_cast<int (*)(AVFormatContext*)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_find_stream_info")); - av_open_input_file_ptr = - reinterpret_cast<int (*)(AVFormatContext**, const char*, - AVInputFormat*, int, - AVFormatParameters*)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_open_input_file")); - av_read_frame_ptr = - reinterpret_cast<int (*)(AVFormatContext*, AVPacket*)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_read_frame")); - av_register_all_ptr = - reinterpret_cast<void (*)(void)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_register_all")); - av_register_protocol_ptr = - reinterpret_cast<int (*)(URLProtocol*)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_register_protocol")); - av_seek_frame_ptr = - reinterpret_cast<int (*)(AVFormatContext*, int, int64_t, int)>( - dlsym(libs[FILE_LIBAVFORMAT], "av_seek_frame")); - - // libavutil functions. - av_free_ptr = - reinterpret_cast<void (*)(void*)>( - dlsym(libs[FILE_LIBAVUTIL], "av_free")); - av_malloc_ptr = - reinterpret_cast<void* (*)(unsigned int)>( - dlsym(libs[FILE_LIBAVUTIL], "av_malloc")); - av_rescale_q_ptr = - reinterpret_cast<int64_t (*)(int64_t, AVRational, AVRational)>( - dlsym(libs[FILE_LIBAVUTIL], "av_rescale_q")); - - // Check that all the symbols were loaded correctly before returning true. - if (av_free_packet_ptr && - av_get_bits_per_sample_format_ptr && - av_init_packet_ptr && - av_new_packet_ptr && - avcodec_alloc_frame_ptr && - avcodec_decode_audio3_ptr && - avcodec_decode_video2_ptr && - avcodec_find_decoder_ptr && - avcodec_flush_buffers_ptr && - avcodec_init_ptr && - avcodec_open_ptr && - avcodec_thread_init_ptr && - - av_find_stream_info_ptr && - av_open_input_file_ptr && - av_read_frame_ptr && - av_register_all_ptr && - av_register_protocol_ptr && - av_seek_frame_ptr && - - av_free_ptr && - av_malloc_ptr && - av_rescale_q_ptr) { - return true; + tp_ffmpeg::StubPathMap paths; + for (int i = 0; i < static_cast<int>(tp_ffmpeg::kNumStubModules); ++i) { + tp_ffmpeg::StubModules module = static_cast<tp_ffmpeg::StubModules>(i); + FilePath path = module_dir.Append(GetDSOName(module)); + paths[module].push_back(path.value()); } - return false; + return tp_ffmpeg::InitializeStubs(paths); } } // namespace media |