Revert ffmpeg related changes from "thread-safe VideoWriter and VideoCapture"
This reverts commit 4abf0b31936c96887c028d799c6e89edfc4e197b. Changes are reverted because they break build of proxy dlls on Windows
This commit is contained in:
parent
9d7300f003
commit
2ed6bc8aaf
@ -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:
|
|||||||
#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:
|
|||||||
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:
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class CvVideoWriter_FFMPEG_proxy : public CvVideoWriter
|
class CvVideoWriter_FFMPEG_proxy : public CvVideoWriter
|
||||||
{
|
{
|
||||||
public:
|
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()
|
|||||||
#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:
|
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
|
||||||
*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)
|
|
||||||
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 )
|
|||||||
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 )
|
|||||||
#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 )
|
|||||||
#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 )
|
|||||||
#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()
|
|||||||
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,
|
|||||||
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 )
|
|||||||
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
|
|||||||
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
|
|||||||
|
|
||||||
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:
|
|||||||
|
|
||||||
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
|
|||||||
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
|
|||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
if (ret == (int)AVERROR_EOF)
|
if (ret == AVERROR_EOF)
|
||||||
*endOfFile = true;
|
*endOfFile = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user