Merge remote-tracking branch 'upstream/3.4' into merge-3.4
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Tue, 2 Mar 2021 21:46:30 +0000 (21:46 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Tue, 2 Mar 2021 21:47:19 +0000 (21:47 +0000)
1  2 
modules/videoio/src/cap_ffmpeg_impl.hpp

@@@ -839,23 -852,14 +829,16 @@@ static void ffmpeg_log_callback(void *p
  
  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;
  
@@@ -1494,21 -1421,26 +1492,21 @@@ double CvCapture_FFMPEG::getProperty( i
              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)
          {
@@@ -1731,14 -1667,16 +1729,14 @@@ bool CvCapture_FFMPEG::setProperty( in
          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;
      }
@@@ -2339,11 -2305,14 +2337,14 @@@ static inline void cv_ff_codec_tag_dump
  
  /// 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();