class InternalFFMpegRegister
{
- static void init_()
+public:
+ static void init()
{
+ AutoLock lock(_mutex);
static InternalFFMpegRegister instance;
++ initLogger_(); // update logger setup unconditionally (GStreamer's libav plugin may override these settings)
}
- InternalFFMpegRegister()
-
+ static void initLogger_()
{
- avformat_network_init();
-
- /* register all codecs, demux and protocols */
- av_register_all();
-
- /* register a callback function for synchronization */
- av_lockmgr_register(&LockCallBack);
-
- #ifndef NO_GETENV
+#ifndef NO_GETENV
char* debug_option = getenv("OPENCV_FFMPEG_DEBUG");
if (debug_option != NULL)
{
av_log_set_level(AV_LOG_ERROR);
}
}
- static void init()
- {
- if (!_initialized)
- {
- AutoLock lock(_mutex);
- if (!_initialized)
- {
- init_();
- }
- }
- initLogger_(); // update logger setup unconditionally (GStreamer's libav plugin may override these settings)
- }
-
+
+ public:
-#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0)
+ InternalFFMpegRegister()
+ {
-#endif
+ avformat_network_init();
-
- _initialized = true;
+
+ /* register all codecs, demux and protocols */
+ av_register_all();
+
+ /* register a callback function for synchronization */
+ av_lockmgr_register(&LockCallBack);
-
+ }
~InternalFFMpegRegister()
{
- _initialized = false;
av_lockmgr_register(NULL);
+ av_log_set_callback(NULL);
}
};
-bool CvCapture_FFMPEG::open( const char* _filename )
+bool CvCapture_FFMPEG::open(const char* _filename, const VideoCaptureParameters& params)
{
InternalFFMpegRegister::init();
+
AutoLock lock(_mutex);
+
unsigned i;
bool valid = false;
return 0;
}
return (dts_to_sec(picture_pts) * 1000);
- case CV_FFMPEG_CAP_PROP_POS_FRAMES:
+ case CAP_PROP_POS_FRAMES:
return (double)frame_number;
- case CV_FFMPEG_CAP_PROP_POS_AVI_RATIO:
+ case CAP_PROP_POS_AVI_RATIO:
return r2d(ic->streams[video_stream]->time_base);
- case CV_FFMPEG_CAP_PROP_FRAME_COUNT:
+ case CAP_PROP_FRAME_COUNT:
return (double)get_total_frames();
- case CV_FFMPEG_CAP_PROP_FRAME_WIDTH:
+ case CAP_PROP_FRAME_WIDTH:
- return (double)((rotation_auto && rotation_angle%180) ? frame.height : frame.width);
+ return (double)((rotation_auto && ((rotation_angle%180) != 0)) ? frame.height : frame.width);
- case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
+ case CAP_PROP_FRAME_HEIGHT:
- return (double)((rotation_auto && rotation_angle%180) ? frame.width : frame.height);
+ return (double)((rotation_auto && ((rotation_angle%180) != 0)) ? frame.width : frame.height);
- case CV_FFMPEG_CAP_PROP_FPS:
+ case CAP_PROP_FPS:
return get_fps();
- case CV_FFMPEG_CAP_PROP_FOURCC:
-#if LIBAVFORMAT_BUILD > 4628
+ case CAP_PROP_FOURCC:
codec_id = video_st->codec->codec_id;
codec_tag = (double) video_st->codec->codec_tag;
-#else
- codec_id = video_st->codec.codec_id;
- codec_tag = (double)video_st->codec.codec_tag;
-#endif
if(codec_tag || codec_id == AV_CODEC_ID_NONE)
{
if (value == -1)
return setRaw();
return false;
- case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO:
-#if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
- (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100)))
+ case CAP_PROP_ORIENTATION_AUTO:
+#if LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100)
- rotation_auto = value ? true : false;
+ rotation_auto = value != 0 ? true : false;
return true;
#else
- rotation_auto = 0;
+ rotation_auto = false;
return false;
#endif
- break;
default:
return false;
}
/// Create a video writer object that uses FFMPEG
bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
- double fps, int width, int height, bool is_color )
+ double fps, int width, int height, const VideoWriterParameters& params)
{
InternalFFMpegRegister::init();
+
+ AutoLock lock(_mutex);
+
CV_CODEC_ID codec_id = CV_CODEC(CODEC_ID_NONE);
- int err, codec_pix_fmt;
+ AVPixelFormat codec_pix_fmt;
double bitrate_scale = 1;
close();