From 885513f0a0d2712181b8f03e0590fabc3f0b4247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 29 Sep 2009 09:04:05 +0000 Subject: [PATCH] Apparantly, FFmpeg has lock management now, and from the tracing, it is indeed used. Spotted this on the libav*-user mailing list. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33346 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media/plugins/ffmpeg/FFmpegPlugin.cpp | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp index 3e4e1bb5ee..3155b0b222 100644 --- a/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp +++ b/src/add-ons/media/plugins/ffmpeg/FFmpegPlugin.cpp @@ -16,6 +16,8 @@ #include +#include + extern "C" { #include "avformat.h" } @@ -29,8 +31,59 @@ extern "C" { #include "MuxerTable.h" +//#define TRACE_FFMPEG_PLUGIN +#ifdef TRACE_FFMPEG_PLUGIN +# define TRACE printf +#else +# define TRACE(a...) +#endif + +#define ERROR(a...) fprintf(stderr, a) + + +static int +manage_locks(void** _lock, enum AVLockOp operation) +{ + TRACE("manage_locks(%p, %d)\n", *_lock, operation); + + BLocker** lock = reinterpret_cast(_lock); + + switch (operation) { + case AV_LOCK_CREATE: + TRACE(" AV_LOCK_CREATE\n"); + *lock = new(std::nothrow) BLocker("FFmpeg lock"); + if (*lock == NULL) + return 1; + break; + + case AV_LOCK_OBTAIN: + TRACE(" AV_LOCK_OBTAIN\n"); + if (!(*lock)->Lock()) + return 1; + break; + + case AV_LOCK_RELEASE: + TRACE(" AV_LOCK_RELEASE\n"); + (*lock)->Unlock(); + break; + + case AV_LOCK_DESTROY: + TRACE(" AV_LOCK_DESTROY\n"); + delete *lock; + break; + + default: + return 1; + } + return 0; +} + + FFmpegPlugin::GlobalInitilizer::GlobalInitilizer() { + if (av_lockmgr_register(manage_locks) != 0) + ERROR("Failed to register lock management!\n"); + av_register_all(); // This will also call av_codec_init() by registering codecs. } @@ -38,7 +91,7 @@ FFmpegPlugin::GlobalInitilizer::GlobalInitilizer() FFmpegPlugin::GlobalInitilizer::~GlobalInitilizer() { - // TODO: uninit anything here? + av_lockmgr_register(NULL); }