From 668ed70bd09305b90b04bfbaee6db847ca5c3d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 1 Jul 2009 21:16:55 +0000 Subject: [PATCH] * Use a static global object to initialize libavformat and libavcodec. * Turn off tracing in the AVCodecDecoder which I accidentally turned on in a previous commit. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31366 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/plugins/ffmpeg/AVCodecDecoder.cpp | 16 +---------- .../media/plugins/ffmpeg/AVFormatReader.cpp | 10 +------ .../media/plugins/ffmpeg/FFmpegPlugin.cpp | 28 +++++++++++++++++++ .../media/plugins/ffmpeg/FFmpegPlugin.h | 9 ++++++ 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp index d5f8ffd5f1..b2a17bd504 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp @@ -20,7 +20,7 @@ #define DO_PROFILING 0 #undef TRACE -#define TRACE_AV_CODEC +//#define TRACE_AV_CODEC #ifdef TRACE_AV_CODEC # define TRACE(x...) printf(x) #else @@ -64,20 +64,6 @@ AVCodecDecoder::AVCodecDecoder() { TRACE("AVCodecDecoder::AVCodecDecoder()\n"); - // prevent multiple inits - static volatile vint32 ff_init_count = 0; - static bool ff_init_done = false; - if (atomic_add(&ff_init_count, 1) > 1) { - atomic_add(&ff_init_count, -1); - // spin until the thread that is initing is done - while (!ff_init_done) - snooze(20000); - } else { - avcodec_init(); - avcodec_register_all(); - ff_init_done = true; - } - ffc = avcodec_alloc_context(); ffpicture = avcodec_alloc_frame(); opicture = avcodec_alloc_frame(); diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp index d15bad272e..7a7683100b 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp @@ -77,7 +77,7 @@ position_io_close(URLContext *h) } -static URLProtocol position_io_protocol = { +URLProtocol sPositionIOProtocol = { "position_io", position_io_open, position_io_read, @@ -87,14 +87,6 @@ static URLProtocol position_io_protocol = { }; -static int -init_libavformat() -{ - av_register_all(); - return av_register_protocol(&position_io_protocol); -} - - // #pragma mark - AVFormatReader diff --git a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp index 0e5fc33543..cb4157c07b 100644 --- a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp +++ b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp @@ -12,13 +12,41 @@ #include "FFmpegPlugin.h" +#include + #include +extern "C" { + #include "avformat.h" +} + #include "AVCodecDecoder.h" #include "AVFormatReader.h" #include "CodecTable.h" +FFmpegPlugin::GlobalInitilizer::GlobalInitilizer() +{ + av_register_all(); + // This will also call av_codec_init() by registering codecs. + + extern URLProtocol sPositionIOProtocol; + av_register_protocol(&sPositionIOProtocol); +} + + +FFmpegPlugin::GlobalInitilizer::~GlobalInitilizer() +{ + // TODO: uninit anything here? +} + + +FFmpegPlugin::GlobalInitilizer FFmpegPlugin::sInitilizer; + + +// #pragma mark - + + Decoder* FFmpegPlugin::NewDecoder(uint index) { diff --git a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.h b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.h index 9d6094ea60..622b4a205c 100644 --- a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.h +++ b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.h @@ -24,6 +24,15 @@ public: virtual Decoder* NewDecoder(uint index); virtual status_t GetSupportedFormats(media_format** formats, size_t* count); + +private: + class GlobalInitilizer { + public: + GlobalInitilizer(); + ~GlobalInitilizer(); + }; + + static GlobalInitilizer sInitilizer; };