Skip to content

Commit 1f40671

Browse files
committed
Merge pull request opencv#8920 from sovrasov:video_vriter_ext
2 parents 3ea02e4 + f1c16f4 commit 1f40671

File tree

4 files changed

+87
-39
lines changed

4 files changed

+87
-39
lines changed

modules/videoio/include/opencv2/videoio.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ enum VideoCaptureAPIs {
114114
CAP_GSTREAMER = 1800, //!< GStreamer
115115
CAP_FFMPEG = 1900, //!< Open and record video file or stream using the FFMPEG library
116116
CAP_IMAGES = 2000, //!< OpenCV Image Sequence (e.g. img_%02d.jpg)
117-
CAP_ARAVIS = 2100 //!< Aravis SDK
117+
CAP_ARAVIS = 2100, //!< Aravis SDK
118+
CAP_OCV_MJPEG = 2200 //!< Built-in MotionJPEG codec
118119
};
119120

120121
/** @brief %VideoCapture generic properties identifier.
@@ -849,6 +850,13 @@ class CV_EXPORTS_W VideoWriter
849850
CV_WRAP VideoWriter(const String& filename, int fourcc, double fps,
850851
Size frameSize, bool isColor = true);
851852

853+
/** @overload
854+
The `apiPreference` parameter allows to specify API backends to use. Can be used to enforce a specific reader implementation
855+
if multiple are available: e.g. cv::CAP_FFMPEG or cv::CAP_GSTREAMER.
856+
*/
857+
CV_WRAP VideoWriter(int apiPreference, const String& filename, int fourcc, double fps,
858+
Size frameSize, bool isColor = true);
859+
852860
/** @brief Default destructor
853861
854862
The method first calls VideoWriter::release to close the already opened file.
@@ -866,6 +874,17 @@ class CV_EXPORTS_W VideoWriter
866874
CV_WRAP virtual bool open(const String& filename, int fourcc, double fps,
867875
Size frameSize, bool isColor = true);
868876

877+
/** @brief Initializes or reinitializes video writer.
878+
879+
The method opens video writer. Parameters are the same as in the constructor
880+
VideoWriter::VideoWriter.
881+
@return `true` if video writer has been successfully initialized
882+
883+
The method first calls VideoWriter::release to close the already opened file.
884+
*/
885+
CV_WRAP bool open(int apiPreference, const String& filename, int fourcc, double fps,
886+
Size frameSize, bool isColor = true);
887+
869888
/** @brief Returns true if video writer has been successfully initialized.
870889
*/
871890
CV_WRAP virtual bool isOpened() const;

modules/videoio/include/opencv2/videoio/videoio_c.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ enum
124124
CV_CAP_FFMPEG = 1900, // FFMPEG
125125
CV_CAP_IMAGES = 2000, // OpenCV Image Sequence (e.g. img_%02d.jpg)
126126

127-
CV_CAP_ARAVIS = 2100 // Aravis GigE SDK
127+
CV_CAP_ARAVIS = 2100, // Aravis GigE SDK
128+
CV_CAP_OCV_MJPEG = 2200 // Built-in MotionJPEG codec
128129
};
129130

130131
/** @brief start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*)

modules/videoio/src/cap.cpp

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -371,47 +371,59 @@ CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
371371
CV_IMPL CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc,
372372
double fps, CvSize frameSize, int is_color )
373373
{
374-
// If none of the writers is used
375-
// these statements suppress 'unused parameter' warnings.
374+
return cvCreateVideoWriterWithPreference(CV_CAP_ANY, filename, fourcc, fps, frameSize, is_color);
375+
}
376+
377+
CvVideoWriter* cvCreateVideoWriterWithPreference(int apiPreference, const char* filename, int fourcc,
378+
double fps, CvSize frameSize, int is_color )
379+
{
376380
CV_UNUSED(frameSize);
377381
CV_UNUSED(is_color);
378382

379-
//CV_FUNCNAME( "cvCreateVideoWriter" );
380-
381383
CvVideoWriter *result = 0;
382384

383385
if(!fourcc || !fps)
384386
TRY_OPEN(result, cvCreateVideoWriter_Images(filename))
385387

386-
#ifdef HAVE_FFMPEG
387-
TRY_OPEN(result, cvCreateVideoWriter_FFMPEG_proxy (filename, fourcc, fps, frameSize, is_color))
388-
#endif
389-
390-
#ifdef HAVE_VFW
391-
TRY_OPEN(result, cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color))
392-
#endif
393-
394-
#ifdef HAVE_MSMF
395-
TRY_OPEN(result, cvCreateVideoWriter_MSMF(filename, fourcc, fps, frameSize, is_color))
396-
#endif
397-
398-
/* #ifdef HAVE_XINE
399-
TRY_OPEN(result, cvCreateVideoWriter_XINE(filename, fourcc, fps, frameSize, is_color))
400-
#endif
401-
*/
402-
#ifdef HAVE_AVFOUNDATION
403-
TRY_OPEN(result, cvCreateVideoWriter_AVFoundation(filename, fourcc, fps, frameSize, is_color))
404-
#endif
405-
406-
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
407-
TRY_OPEN(result, cvCreateVideoWriter_QT(filename, fourcc, fps, frameSize, is_color))
408-
#endif
409-
410-
#ifdef HAVE_GSTREAMER
411-
TRY_OPEN(result, cvCreateVideoWriter_GStreamer(filename, fourcc, fps, frameSize, is_color))
412-
#endif
413-
414-
TRY_OPEN(result, cvCreateVideoWriter_Images(filename))
388+
switch(apiPreference)
389+
{
390+
default:
391+
//exit if the specified API is unavaliable
392+
if (apiPreference != CV_CAP_ANY) break;
393+
#ifdef HAVE_FFMPEG
394+
case CV_CAP_FFMPEG:
395+
TRY_OPEN(result, cvCreateVideoWriter_FFMPEG_proxy (filename, fourcc, fps, frameSize, is_color))
396+
if (apiPreference != CV_CAP_ANY) break;
397+
#endif
398+
#ifdef HAVE_VFW
399+
case CV_CAP_VFW:
400+
TRY_OPEN(result, cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color))
401+
if (apiPreference != CV_CAP_ANY) break;
402+
#endif
403+
#ifdef HAVE_MSMF
404+
case CV_CAP_MSMF:
405+
TRY_OPEN(result, cvCreateVideoWriter_MSMF(filename, fourcc, fps, frameSize, is_color))
406+
if (apiPreference != CV_CAP_ANY) break;
407+
#endif
408+
#ifdef HAVE_AVFOUNDATION
409+
case CV_CAP_AVFOUNDATION:
410+
TRY_OPEN(result, cvCreateVideoWriter_AVFoundation(filename, fourcc, fps, frameSize, is_color))
411+
if (apiPreference != CV_CAP_ANY) break;
412+
#endif
413+
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
414+
case(CV_CAP_QT):
415+
TRY_OPEN(result, cvCreateVideoWriter_QT(filename, fourcc, fps, frameSize, is_color))
416+
if (apiPreference != CV_CAP_ANY) break;
417+
#endif
418+
#ifdef HAVE_GSTREAMER
419+
case CV_CAP_GSTREAMER:
420+
TRY_OPEN(result, cvCreateVideoWriter_GStreamer (filename, fourcc, fps, frameSize, is_color))
421+
if (apiPreference != CV_CAP_ANY) break;
422+
#endif
423+
case CV_CAP_IMAGES:
424+
TRY_OPEN(result, cvCreateVideoWriter_Images(filename))
425+
if (apiPreference != CV_CAP_ANY) break;
426+
}
415427

416428
return result;
417429
}
@@ -543,10 +555,11 @@ static Ptr<IVideoCapture> IVideoCapture_create(const String& filename)
543555
return Ptr<IVideoCapture>();
544556
}
545557

546-
static Ptr<IVideoWriter> IVideoWriter_create(const String& filename, int _fourcc, double fps, Size frameSize, bool isColor)
558+
static Ptr<IVideoWriter> IVideoWriter_create(int apiPreference, const String& filename, int _fourcc, double fps, Size frameSize, bool isColor)
547559
{
548560
Ptr<IVideoWriter> iwriter;
549-
if( _fourcc == CV_FOURCC('M', 'J', 'P', 'G') )
561+
if( (apiPreference == CAP_OCV_MJPEG || apiPreference == CAP_ANY)
562+
&& _fourcc == CV_FOURCC('M', 'J', 'P', 'G') )
550563
iwriter = createMotionJpegWriter(filename, fps, frameSize, isColor);
551564
return iwriter;
552565
}
@@ -725,6 +738,12 @@ VideoWriter::VideoWriter(const String& filename, int _fourcc, double fps, Size f
725738
open(filename, _fourcc, fps, frameSize, isColor);
726739
}
727740

741+
742+
VideoWriter::VideoWriter(int apiPreference, const String& filename, int _fourcc, double fps, Size frameSize, bool isColor)
743+
{
744+
open(apiPreference, filename, _fourcc, fps, frameSize, isColor);
745+
}
746+
728747
void VideoWriter::release()
729748
{
730749
iwriter.release();
@@ -737,14 +756,19 @@ VideoWriter::~VideoWriter()
737756
}
738757

739758
bool VideoWriter::open(const String& filename, int _fourcc, double fps, Size frameSize, bool isColor)
759+
{
760+
return open(CAP_ANY, filename, _fourcc, fps, frameSize, isColor);
761+
}
762+
763+
bool VideoWriter::open(int apiPreference, const String& filename, int _fourcc, double fps, Size frameSize, bool isColor)
740764
{
741765
CV_INSTRUMENT_REGION()
742766

743767
if (isOpened()) release();
744-
iwriter = IVideoWriter_create(filename, _fourcc, fps, frameSize, isColor);
768+
iwriter = IVideoWriter_create(apiPreference, filename, _fourcc, fps, frameSize, isColor);
745769
if (!iwriter.empty())
746770
return true;
747-
writer.reset(cvCreateVideoWriter(filename.c_str(), _fourcc, fps, frameSize, isColor));
771+
writer.reset(cvCreateVideoWriterWithPreference(apiPreference, filename.c_str(), _fourcc, fps, frameSize, isColor));
748772
return isOpened();
749773
}
750774

modules/videoio/src/precomp.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ CvCapture * cvCreateCameraCapture_Unicap (const int index);
163163
CvCapture * cvCreateCameraCapture_PvAPI (const int index);
164164
CvVideoWriter* cvCreateVideoWriter_GStreamer( const char* filename, int fourcc,
165165
double fps, CvSize frameSize, int is_color );
166+
CvVideoWriter* cvCreateVideoWriterWithPreference(int api, const char* filename, int fourcc,
167+
double fps, CvSize frame_size,
168+
int is_color CV_DEFAULT(1));
169+
166170

167171
namespace cv
168172
{

0 commit comments

Comments
 (0)