Commit 2ed6bc8a authored by Andrey Kamaev's avatar Andrey Kamaev

Revert ffmpeg related changes from "thread-safe VideoWriter and VideoCapture"

This reverts commit 4abf0b31.

Changes are reverted because they break build of proxy dlls on Windows
parent 9d7300f0
...@@ -57,32 +57,11 @@ static CvCreateVideoWriter_Plugin icvCreateVideoWriter_FFMPEG_p = 0; ...@@ -57,32 +57,11 @@ static CvCreateVideoWriter_Plugin icvCreateVideoWriter_FFMPEG_p = 0;
static CvReleaseVideoWriter_Plugin icvReleaseVideoWriter_FFMPEG_p = 0; static CvReleaseVideoWriter_Plugin icvReleaseVideoWriter_FFMPEG_p = 0;
static CvWriteFrame_Plugin icvWriteFrame_FFMPEG_p = 0; static CvWriteFrame_Plugin icvWriteFrame_FFMPEG_p = 0;
static cv::Mutex _icvInitFFMPEG_mutex; static void
icvInitFFMPEG(void)
class icvInitFFMPEG
{ {
public: static int ffmpegInitialized = 0;
static void Init() if( !ffmpegInitialized )
{
cv::AutoLock al(_icvInitFFMPEG_mutex);
static icvInitFFMPEG init;
}
private:
#if defined WIN32 || defined _WIN32
HMODULE icvFFOpenCV;
~icvInitFFMPEG()
{
if (icvFFOpenCV)
{
FreeLibrary(icvFFOpenCV);
icvFFOpenCV = 0;
}
}
#endif
icvInitFFMPEG()
{ {
#if defined WIN32 || defined _WIN32 #if defined WIN32 || defined _WIN32
const char* module_name = "opencv_ffmpeg" const char* module_name = "opencv_ffmpeg"
...@@ -92,7 +71,7 @@ private: ...@@ -92,7 +71,7 @@ private:
#endif #endif
".dll"; ".dll";
icvFFOpenCV = LoadLibrary( module_name ); static HMODULE icvFFOpenCV = LoadLibrary( module_name );
if( icvFFOpenCV ) if( icvFFOpenCV )
{ {
icvCreateFileCapture_FFMPEG_p = icvCreateFileCapture_FFMPEG_p =
...@@ -138,8 +117,10 @@ private: ...@@ -138,8 +117,10 @@ private:
icvReleaseVideoWriter_FFMPEG_p = (CvReleaseVideoWriter_Plugin)cvReleaseVideoWriter_FFMPEG; icvReleaseVideoWriter_FFMPEG_p = (CvReleaseVideoWriter_Plugin)cvReleaseVideoWriter_FFMPEG;
icvWriteFrame_FFMPEG_p = (CvWriteFrame_Plugin)cvWriteFrame_FFMPEG; icvWriteFrame_FFMPEG_p = (CvWriteFrame_Plugin)cvWriteFrame_FFMPEG;
#endif #endif
ffmpegInitialized = 1;
} }
}; }
class CvCapture_FFMPEG_proxy : public CvCapture class CvCapture_FFMPEG_proxy : public CvCapture
...@@ -174,9 +155,9 @@ public: ...@@ -174,9 +155,9 @@ public:
} }
virtual bool open( const char* filename ) virtual bool open( const char* filename )
{ {
icvInitFFMPEG::Init();
close(); close();
icvInitFFMPEG();
if( !icvCreateFileCapture_FFMPEG_p ) if( !icvCreateFileCapture_FFMPEG_p )
return false; return false;
ffmpegCapture = icvCreateFileCapture_FFMPEG_p( filename ); ffmpegCapture = icvCreateFileCapture_FFMPEG_p( filename );
...@@ -209,6 +190,7 @@ CvCapture* cvCreateFileCapture_FFMPEG_proxy(const char * filename) ...@@ -209,6 +190,7 @@ CvCapture* cvCreateFileCapture_FFMPEG_proxy(const char * filename)
#endif #endif
} }
class CvVideoWriter_FFMPEG_proxy : public CvVideoWriter class CvVideoWriter_FFMPEG_proxy : public CvVideoWriter
{ {
public: public:
...@@ -226,8 +208,8 @@ public: ...@@ -226,8 +208,8 @@ public:
} }
virtual bool open( const char* filename, int fourcc, double fps, CvSize frameSize, bool isColor ) virtual bool open( const char* filename, int fourcc, double fps, CvSize frameSize, bool isColor )
{ {
icvInitFFMPEG::Init();
close(); close();
icvInitFFMPEG();
if( !icvCreateVideoWriter_FFMPEG_p ) if( !icvCreateVideoWriter_FFMPEG_p )
return false; return false;
ffmpegWriter = icvCreateVideoWriter_FFMPEG_p( filename, fourcc, fps, frameSize.width, frameSize.height, isColor ); ffmpegWriter = icvCreateVideoWriter_FFMPEG_p( filename, fourcc, fps, frameSize.width, frameSize.height, isColor );
......
...@@ -328,179 +328,28 @@ void CvCapture_FFMPEG::close() ...@@ -328,179 +328,28 @@ void CvCapture_FFMPEG::close()
#define AVSEEK_FLAG_ANY 1 #define AVSEEK_FLAG_ANY 1
#endif #endif
class ImplMutex static void icvInitFFMPEG_internal()
{ {
public: static volatile bool initialized = false;
ImplMutex(); if( !initialized )
~ImplMutex();
void lock();
bool trylock();
void unlock();
struct Impl;
protected:
Impl* impl;
private:
ImplMutex(const ImplMutex&);
ImplMutex& operator = (const ImplMutex& m);
};
#if defined WIN32 || defined _WIN32 || defined WINCE
struct ImplMutex::Impl
{
Impl() { InitializeCriticalSection(&cs); refcount = 1; }
~Impl() { DeleteCriticalSection(&cs); }
void lock() { EnterCriticalSection(&cs); }
bool trylock() { return TryEnterCriticalSection(&cs) != 0; }
void unlock() { LeaveCriticalSection(&cs); }
CRITICAL_SECTION cs;
int refcount;
};
#ifndef __GNUC__
static int _interlockedExchangeAdd(int* addr, int delta)
{
#if defined _MSC_VER && _MSC_VER >= 1500
return (int)_InterlockedExchangeAdd((long volatile*)addr, delta);
#else
return (int)InterlockedExchangeAdd((long volatile*)addr, delta);
#endif
}
#endif // __GNUC__
#elif defined __APPLE__
#include <libkern/OSAtomic.h>
struct ImplMutex::Impl
{
Impl() { sl = OS_SPINLOCK_INIT; refcount = 1; }
~Impl() {}
void lock() { OSSpinLockLock(&sl); }
bool trylock() { return OSSpinLockTry(&sl); }
void unlock() { OSSpinLockUnlock(&sl); }
OSSpinLock sl;
int refcount;
};
#elif defined __linux__ && !defined ANDROID
struct ImplMutex::Impl
{
Impl() { pthread_spin_init(&sl, 0); refcount = 1; }
~Impl() { pthread_spin_destroy(&sl); }
void lock() { pthread_spin_lock(&sl); }
bool trylock() { return pthread_spin_trylock(&sl) == 0; }
void unlock() { pthread_spin_unlock(&sl); }
pthread_spinlock_t sl;
int refcount;
};
#else
struct ImplMutex::Impl
{
Impl() { pthread_mutex_init(&sl, 0); refcount = 1; }
~Impl() { pthread_mutex_destroy(&sl); }
void lock() { pthread_mutex_lock(&sl); }
bool trylock() { return pthread_mutex_trylock(&sl) == 0; }
void unlock() { pthread_mutex_unlock(&sl); }
pthread_mutex_t sl;
int refcount;
};
#endif
ImplMutex::ImplMutex()
{
impl = new ImplMutex::Impl;
}
ImplMutex::~ImplMutex()
{
delete impl;
impl = 0;
}
void ImplMutex::lock() { impl->lock(); }
void ImplMutex::unlock() { impl->unlock(); }
bool ImplMutex::trylock() { return impl->trylock(); }
static int LockCallBack(void **mutex, AVLockOp op)
{
switch (op)
{
case AV_LOCK_CREATE:
*mutex = reinterpret_cast<void*>(new ImplMutex());
if (!*mutex)
return 1;
break;
case AV_LOCK_OBTAIN:
reinterpret_cast<ImplMutex*>(*mutex)->lock();
break;
case AV_LOCK_RELEASE:
reinterpret_cast<ImplMutex*>(*mutex)->unlock();
break;
case AV_LOCK_DESTROY:
ImplMutex* cv_mutex = reinterpret_cast<ImplMutex*>(*mutex);
delete cv_mutex;
cv_mutex = NULL;
break;
}
return 0;
}
static ImplMutex _InternalFFMpegRegister_mutex;
class InternalFFMpegRegister
{
public:
static void Register()
{
_InternalFFMpegRegister_mutex.lock();
static InternalFFMpegRegister init;
_InternalFFMpegRegister_mutex.unlock();
}
~InternalFFMpegRegister()
{
av_lockmgr_register(NULL);
}
private:
InternalFFMpegRegister()
{ {
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0) #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
avformat_network_init(); avformat_network_init();
#endif #endif
/* register all codecs, demux and protocols */ /* register all codecs, demux and protocols */
av_register_all(); av_register_all();
/* register a callback function for synchronization */
av_lockmgr_register(&LockCallBack);
av_log_set_level(AV_LOG_ERROR); av_log_set_level(AV_LOG_ERROR);
initialized = true;
} }
}; }
bool CvCapture_FFMPEG::open( const char* _filename ) bool CvCapture_FFMPEG::open( const char* _filename )
{ {
InternalFFMpegRegister::Register(); icvInitFFMPEG_internal();
unsigned i; unsigned i;
bool valid = false; bool valid = false;
...@@ -512,8 +361,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) ...@@ -512,8 +361,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
int err = av_open_input_file(&ic, _filename, NULL, 0, NULL); int err = av_open_input_file(&ic, _filename, NULL, 0, NULL);
#endif #endif
if (err < 0) if (err < 0) {
{
CV_WARN("Error opening file"); CV_WARN("Error opening file");
goto exit_func; goto exit_func;
} }
...@@ -523,8 +371,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) ...@@ -523,8 +371,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#else #else
av_find_stream_info(ic); av_find_stream_info(ic);
#endif #endif
if (err < 0) if (err < 0) {
{
CV_WARN("Could not find codec parameters"); CV_WARN("Could not find codec parameters");
goto exit_func; goto exit_func;
} }
...@@ -546,8 +393,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) ...@@ -546,8 +393,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
#endif #endif
if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) {
{
AVCodec *codec = avcodec_find_decoder(enc->codec_id); AVCodec *codec = avcodec_find_decoder(enc->codec_id);
if (!codec || if (!codec ||
#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0) #if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0)
...@@ -555,8 +401,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) ...@@ -555,8 +401,7 @@ bool CvCapture_FFMPEG::open( const char* _filename )
#else #else
avcodec_open(enc, codec) avcodec_open(enc, codec)
#endif #endif
< 0) < 0) goto exit_func;
goto exit_func;
video_stream = i; video_stream = i;
video_st = ic->streams[i]; video_st = ic->streams[i];
...@@ -1430,7 +1275,7 @@ void CvVideoWriter_FFMPEG::close() ...@@ -1430,7 +1275,7 @@ void CvVideoWriter_FFMPEG::close()
bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
double fps, int width, int height, bool is_color ) double fps, int width, int height, bool is_color )
{ {
InternalFFMpegRegister::Register(); icvInitFFMPEG_internal();
CodecID codec_id = CODEC_ID_NONE; CodecID codec_id = CODEC_ID_NONE;
int err, codec_pix_fmt; int err, codec_pix_fmt;
...@@ -1650,7 +1495,6 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, ...@@ -1650,7 +1495,6 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
frame_width = width; frame_width = width;
frame_height = height; frame_height = height;
ok = true; ok = true;
return true; return true;
} }
...@@ -1662,7 +1506,6 @@ CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename ) ...@@ -1662,7 +1506,6 @@ CvCapture_FFMPEG* cvCreateFileCapture_FFMPEG( const char* filename )
capture->init(); capture->init();
if( capture->open( filename )) if( capture->open( filename ))
return capture; return capture;
capture->close(); capture->close();
free(capture); free(capture);
return 0; return 0;
...@@ -1711,6 +1554,7 @@ CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int four ...@@ -1711,6 +1554,7 @@ CvVideoWriter_FFMPEG* cvCreateVideoWriter_FFMPEG( const char* filename, int four
return 0; return 0;
} }
void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer ) void cvReleaseVideoWriter_FFMPEG( CvVideoWriter_FFMPEG** writer )
{ {
if( writer && *writer ) if( writer && *writer )
...@@ -1897,12 +1741,15 @@ AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CodecID ...@@ -1897,12 +1741,15 @@ AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CodecID
bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height, double fps) bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height, double fps)
{ {
InternalFFMpegRegister::Register();
fmt_ = 0; fmt_ = 0;
oc_ = 0; oc_ = 0;
video_st_ = 0; video_st_ = 0;
// tell FFMPEG to register codecs
av_register_all();
av_log_set_level(AV_LOG_ERROR);
// auto detect the output format from the name and fourcc code // auto detect the output format from the name and fourcc code
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
fmt_ = av_guess_format(NULL, fileName, NULL); fmt_ = av_guess_format(NULL, fileName, NULL);
...@@ -2073,8 +1920,6 @@ private: ...@@ -2073,8 +1920,6 @@ private:
bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma_format, int* width, int* height) bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma_format, int* width, int* height)
{ {
InternalFFMpegRegister::Register();
int err; int err;
ctx_ = 0; ctx_ = 0;
...@@ -2085,6 +1930,11 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma ...@@ -2085,6 +1930,11 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma
avformat_network_init(); avformat_network_init();
#endif #endif
// register all codecs, demux and protocols
av_register_all();
av_log_set_level(AV_LOG_ERROR);
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0) #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0)
err = avformat_open_input(&ctx_, fileName, 0, 0); err = avformat_open_input(&ctx_, fileName, 0, 0);
#else #else
...@@ -2204,7 +2054,7 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi ...@@ -2204,7 +2054,7 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi
if (ret < 0) if (ret < 0)
{ {
if (ret == (int)AVERROR_EOF) if (ret == AVERROR_EOF)
*endOfFile = true; *endOfFile = true;
return false; return false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment