From 458bd1652d93261d51cda120e1ecac755535a426 Mon Sep 17 00:00:00 2001 From: Vadim Levin Date: Mon, 24 Aug 2020 21:39:05 +0300 Subject: [PATCH] Merge pull request #18146 from VadimLevin:dev/vlevin/ffmpeg-remove-obsolte-versions-support Remove obsolete FFMPEG versions support * refactor: removed obsolete FFMPEG version support - Oldest available version via official FFMPEG repository mirror has tag v.0.5 LIBAVFORMAT version for this tag is 52.31.0 * refactor: prefer std::min function to MIN macro * refactor: use appropriate macro instead of manual version calculation * refactor: remove macros for versions prior 0.5.15 release * refactor: remove libavcodec macros for versions < 54.35.1 (default to Ubuntu 14.04) * refactor: remove libavformat macro for versions < 54.20.4 (default ubuntu 14.04) * refactor: remove libavutil macro for versions < 52.3.0 (default ubuntu 14.04) * refactor: remove missed macros for libavcodec and libavformat * refactor: remove unused _opencv_ffmpeg_free function * build: add FFMPEG libraries versions checks - Add verbose message about what FFMPEG libraries are missing. - Add minimal versions check set to libav 9.20 release (default ubuntu 14.04) and FFMPEG 1.1.16 release. If the check is failed CMake produces user-friendly message instead of build error. * fix: libavcodec version guard for AVDISCARD_NONINTRA * fix: libav check of libavcodec version guard for AVDISCARD_NONINTRA * fix: version check for AV_CODEC_FLAG_GLOBAL_HEADER * fix: missing FFMPEG libraries output --- modules/videoio/cmake/detect_ffmpeg.cmake | 41 ++++ modules/videoio/src/cap_ffmpeg_impl.hpp | 311 +++--------------------------- 2 files changed, 71 insertions(+), 281 deletions(-) diff --git a/modules/videoio/cmake/detect_ffmpeg.cmake b/modules/videoio/cmake/detect_ffmpeg.cmake index 58e1614..3e5c6ff 100644 --- a/modules/videoio/cmake/detect_ffmpeg.cmake +++ b/modules/videoio/cmake/detect_ffmpeg.cmake @@ -24,17 +24,56 @@ if(NOT HAVE_FFMPEG AND WIN32 AND NOT ARM AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD) endif() endif() +set(_required_ffmpeg_libraries libavcodec libavformat libavutil libswscale) +set(_used_ffmpeg_libraries ${_required_ffmpeg_libraries}) if(NOT HAVE_FFMPEG AND PKG_CONFIG_FOUND) ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale) if(FFMPEG_FOUND) ocv_check_modules(FFMPEG_libavresample libavresample) # optional if(FFMPEG_libavresample_FOUND) list(APPEND FFMPEG_LIBRARIES ${FFMPEG_libavresample_LIBRARIES}) + list(APPEND _used_ffmpeg_libraries libavresample) endif() set(HAVE_FFMPEG TRUE) + else() + set(_missing_ffmpeg_libraries "") + foreach (ffmpeg_lib ${_required_ffmpeg_libraries}) + if (NOT FFMPEG_${ffmpeg_lib}_FOUND) + list(APPEND _missing_ffmpeg_libraries ${ffmpeg_lib}) + endif() + endforeach () + message(STATUS "FFMPEG is disabled. Required libraries: ${_required_ffmpeg_libraries}." + " Missing libraries: ${_missing_ffmpeg_libraries}") + unset(_missing_ffmpeg_libraries) endif() endif() +#================================= +# Versions check. +if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER) + set(_min_libavcodec_version 54.35.1) + set(_min_libavformat_version 54.20.4) + set(_min_libavutil_version 52.3.0) + set(_min_libswscale_version 2.1.1) + set(_min_libavresample_version 1.0.1) + foreach(ffmpeg_lib ${_used_ffmpeg_libraries}) + if(FFMPEG_${ffmpeg_lib}_VERSION VERSION_LESS _min_${ffmpeg_lib}_version) + message(STATUS "FFMPEG is disabled. Can't find suitable ${ffmpeg_lib} library" + " (minimal ${_min_${ffmpeg_lib}_version}, found ${FFMPEG_${ffmpeg_lib}_VERSION}).") + set(HAVE_FFMPEG FALSE) + endif() + endforeach() + if(NOT HAVE_FFMPEG) + message(STATUS "FFMPEG libraries version check failed " + "(minimal libav release 9.20, minimal FFMPEG release 1.1.16).") + endif() + unset(_min_libavcodec_version) + unset(_min_libavformat_version) + unset(_min_libavutil_version) + unset(_min_libswscale_version) + unset(_min_libavresample_version) +endif() + #================================== if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK) @@ -53,6 +92,8 @@ if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHEC endif() #================================== +unset(_required_ffmpeg_libraries) +unset(_used_ffmpeg_libraries) if(HAVE_FFMPEG_WRAPPER) ocv_add_external_target(ffmpeg "" "" "HAVE_FFMPEG_WRAPPER") diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index 55b55bc..f806b26 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -76,10 +76,7 @@ extern "C" { #include "ffmpeg_codecs.hpp" #include - -#if LIBAVUTIL_BUILD > CALC_FFMPEG_VERSION(51,11,0) - #include -#endif +#include #if LIBAVUTIL_BUILD >= (LIBAVUTIL_VERSION_MICRO >= 100 \ ? CALC_FFMPEG_VERSION(51, 63, 100) : CALC_FFMPEG_VERSION(54, 6, 0)) @@ -124,9 +121,6 @@ extern "C" { #endif #endif -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif #if defined(__APPLE__) #define AV_NOPTS_VALUE_ ((int64_t)0x8000000000000000LL) @@ -146,22 +140,6 @@ extern "C" { # define CV_CODEC(name) name #endif -#if LIBAVUTIL_BUILD < (LIBAVUTIL_VERSION_MICRO >= 100 \ - ? CALC_FFMPEG_VERSION(51, 74, 100) : CALC_FFMPEG_VERSION(51, 42, 0)) -#define AVPixelFormat PixelFormat -#define AV_PIX_FMT_BGR24 PIX_FMT_BGR24 -#define AV_PIX_FMT_RGB24 PIX_FMT_RGB24 -#define AV_PIX_FMT_GRAY8 PIX_FMT_GRAY8 -#define AV_PIX_FMT_BGRA PIX_FMT_BGRA -#define AV_PIX_FMT_RGBA PIX_FMT_RGBA -#define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P -#define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P -#define AV_PIX_FMT_YUV444P PIX_FMT_YUV444P -#define AV_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P -#define AV_PIX_FMT_GRAY16LE PIX_FMT_GRAY16LE -#define AV_PIX_FMT_GRAY16BE PIX_FMT_GRAY16BE -#endif - #ifndef PKT_FLAG_KEY #define PKT_FLAG_KEY AV_PKT_FLAG_KEY #endif @@ -178,11 +156,7 @@ extern "C" { #ifndef USE_AV_INTERRUPT_CALLBACK -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 21, 0) #define USE_AV_INTERRUPT_CALLBACK 1 -#else -#define USE_AV_INTERRUPT_CALLBACK 0 -#endif #endif #ifndef USE_AV_SEND_FRAME_API @@ -314,9 +288,7 @@ inline double get_monotonic_time_diff_ms(timespec time1, timespec time2) static int get_number_of_cpus(void) { -#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(52, 111, 0) - return 1; -#elif defined _WIN32 +#if defined _WIN32 SYSTEM_INFO sysinfo; GetSystemInfo( &sysinfo ); @@ -404,12 +376,6 @@ inline const char* _opencv_avcodec_get_name(CV_CODEC_ID id) #endif } -static -inline void _opencv_ffmpeg_free(void** ptr) -{ - if(*ptr) free(*ptr); - *ptr = 0; -} static inline int _opencv_ffmpeg_interrupt_callback(void *ptr) @@ -541,9 +507,7 @@ struct CvCapture_FFMPEG */ char * filename; -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) AVDictionary *dict; -#endif #if USE_AV_INTERRUPT_CALLBACK AVInterruptCallbackMetadata interrupt_metadata; #endif @@ -581,16 +545,12 @@ void CvCapture_FFMPEG::init() rotation_angle = 0; -#if (LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) #if (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 92, 100)) rotation_auto = true; #else rotation_auto = false; #endif dict = NULL; -#else - rotation_auto = false; -#endif rawMode = false; rawModeInitialized = false; @@ -623,24 +583,13 @@ void CvCapture_FFMPEG::close() if( video_st ) { -#if LIBAVFORMAT_BUILD > 4628 avcodec_close( video_st->codec ); - -#else - avcodec_close( &(video_st->codec) ); - -#endif video_st = NULL; } if( ic ) { -#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 24, 2) - av_close_input_file(ic); -#else avformat_close_input(&ic); -#endif - ic = NULL; } @@ -660,10 +609,8 @@ void CvCapture_FFMPEG::close() packet.data = NULL; } -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) if (dict != NULL) av_dict_free(&dict); -#endif if (packet_filtered.data) { @@ -883,9 +830,7 @@ public: } InternalFFMpegRegister() { -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0) avformat_network_init(); -#endif /* register all codecs, demux and protocols */ av_register_all(); @@ -931,7 +876,6 @@ bool CvCapture_FFMPEG::open( const char* _filename ) ic->interrupt_callback.opaque = &interrupt_metadata; #endif -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) #ifndef NO_GETENV char* options = getenv("OPENCV_FFMPEG_CAPTURE_OPTIONS"); if(options == NULL) @@ -957,9 +901,6 @@ bool CvCapture_FFMPEG::open( const char* _filename ) } int err = avformat_open_input(&ic, _filename, input_format, &dict); -#else - int err = av_open_input_file(&ic, _filename, NULL, 0, NULL); -#endif if (err < 0) { @@ -967,12 +908,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) CV_WARN(_filename); goto exit_func; } - err = -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 6, 0) - avformat_find_stream_info(ic, NULL); -#else - av_find_stream_info(ic); -#endif + err = avformat_find_stream_info(ic, NULL); if (err < 0) { CV_WARN("Could not find codec parameters"); @@ -980,11 +916,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) } for(i = 0; i < ic->nb_streams; i++) { -#if LIBAVFORMAT_BUILD > 4628 - AVCodecContext *enc = ic->streams[i]->codec; -#else - AVCodecContext *enc = &ic->streams[i]->codec; -#endif + AVCodecContext* enc = ic->streams[i]->codec; //#ifdef FF_API_THREAD_INIT // avcodec_thread_init(enc, get_number_of_cpus()); @@ -992,10 +924,9 @@ bool CvCapture_FFMPEG::open( const char* _filename ) enc->thread_count = get_number_of_cpus(); //#endif -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(52, 123, 0) AVDictionaryEntry* avdiscard_entry = av_dict_get(dict, "avdiscard", NULL, 0); - if (avdiscard_entry != 0) { + if (avdiscard_entry) { if(strcmp(avdiscard_entry->value, "all") == 0) enc->skip_frame = AVDISCARD_ALL; else if (strcmp(avdiscard_entry->value, "bidir") == 0) @@ -1004,7 +935,10 @@ bool CvCapture_FFMPEG::open( const char* _filename ) enc->skip_frame = AVDISCARD_DEFAULT; else if (strcmp(avdiscard_entry->value, "none") == 0) enc->skip_frame = AVDISCARD_NONE; -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 59, 100) + // NONINTRA flag was introduced with version bump at revision: + // https://github.com/FFmpeg/FFmpeg/commit/b152152df3b778d0a86dcda5d4f5d065b4175a7b + // This key is supported only for FFMPEG version +#if LIBAVCODEC_VERSION_MICRO >= 100 && LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(55, 67, 100) else if (strcmp(avdiscard_entry->value, "nonintra") == 0) enc->skip_frame = AVDISCARD_NONINTRA; #endif @@ -1013,11 +947,6 @@ bool CvCapture_FFMPEG::open( const char* _filename ) else if (strcmp(avdiscard_entry->value, "nonref") == 0) enc->skip_frame = AVDISCARD_NONREF; } -#endif - -#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0) -#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO -#endif if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) { @@ -1031,13 +960,7 @@ bool CvCapture_FFMPEG::open( const char* _filename ) } else { codec = avcodec_find_decoder_by_name(av_dict_get(dict, "video_codec", NULL, 0)->value); } - if (!codec || -#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0) - avcodec_open2(enc, codec, NULL) -#else - avcodec_open(enc, codec) -#endif - < 0) + if (!codec || avcodec_open2(enc, codec, NULL) < 0) goto exit_func; // checking width/height (since decoder can sometimes alter it, eg. vp6f) @@ -1101,10 +1024,8 @@ bool CvCapture_FFMPEG::processRawPacket() rawModeInitialized = true; #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(58, 20, 100) CV_CODEC_ID eVideoCodec = ic->streams[video_stream]->codecpar->codec_id; -#elif LIBAVFORMAT_BUILD > 4628 - CV_CODEC_ID eVideoCodec = video_st->codec->codec_id; #else - CV_CODEC_ID eVideoCodec = video_st->codec.codec_id; + CV_CODEC_ID eVideoCodec = video_st->codec->codec_id; #endif const char* filterName = NULL; if (eVideoCodec == CV_CODEC(CODEC_ID_H264) @@ -1179,11 +1100,7 @@ bool CvCapture_FFMPEG::processRawPacket() return false; } #else -#if LIBAVFORMAT_BUILD > 4628 AVCodecContext* ctx = ic->streams[video_stream]->codec; -#else - AVCodecContext* ctx = &ic->streams[video_stream]->codec; -#endif int err = av_bitstream_filter_filter(bsfc, ctx, NULL, &packet_filtered.data, &packet_filtered.size, packet.data, packet.size, packet_filtered.flags & AV_PKT_FLAG_KEY); if (err < 0) @@ -1265,17 +1182,7 @@ bool CvCapture_FFMPEG::grabFrame() } // Decode video frame - #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) - avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet); - #elif LIBAVFORMAT_BUILD > 4628 - avcodec_decode_video(video_st->codec, - picture, &got_picture, - packet.data, packet.size); - #else - avcodec_decode_video(&video_st->codec, - picture, &got_picture, - packet.data, packet.size); - #endif + avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet); // Did we get a video frame? if(got_picture) @@ -1423,13 +1330,8 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const case CAP_PROP_FPS: return get_fps(); case CAP_PROP_FOURCC: -#if LIBAVFORMAT_BUILD > 4628 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) { @@ -1449,11 +1351,7 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const return _opencv_ffmpeg_get_sample_aspect_ratio(ic->streams[video_stream]).den; case CAP_PROP_CODEC_PIXEL_FORMAT: { -#if LIBAVFORMAT_BUILD > 4628 AVPixelFormat pix_fmt = video_st->codec->pix_fmt; -#else - AVPixelFormat pix_fmt = video_st->codec.pix_fmt; -#endif unsigned int fourcc_tag = avcodec_pix_fmt_to_codec_tag(pix_fmt); return (fourcc_tag == 0) ? (double)-1 : (double)fourcc_tag; } @@ -1466,8 +1364,7 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const case CAP_PROP_ORIENTATION_META: return static_cast(rotation_angle); case CAP_PROP_ORIENTATION_AUTO: -#if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \ - (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100))) +#if LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100) return static_cast(rotation_auto); #else return 0; @@ -1506,11 +1403,7 @@ double CvCapture_FFMPEG::get_fps() const #if 0 && LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 1, 100) && LIBAVFORMAT_VERSION_MICRO >= 100 double fps = r2d(av_guess_frame_rate(ic, ic->streams[video_stream], NULL)); #else -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0) double fps = r2d(ic->streams[video_stream]->avg_frame_rate); -#else - double fps = r2d(ic->streams[video_stream]->r_frame_rate); -#endif #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) if (fps < eps_zero) @@ -1553,8 +1446,7 @@ double CvCapture_FFMPEG::dts_to_sec(int64_t dts) const void CvCapture_FFMPEG::get_rotation_angle() { rotation_angle = 0; -#if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \ - (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100))) +#if LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100) AVDictionaryEntry *rotate_tag = av_dict_get(video_st->metadata, "rotate", NULL, 0); if (rotate_tag != NULL) rotation_angle = atoi(rotate_tag->value); @@ -1657,15 +1549,13 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value ) return setRaw(); return false; case CAP_PROP_ORIENTATION_AUTO: -#if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \ - (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100))) +#if LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100) rotation_auto = static_cast(value); return true; #else rotation_auto = 0; return false; #endif - break; default: return false; } @@ -1704,7 +1594,6 @@ struct CvVideoWriter_FFMPEG static const char * icvFFMPEGErrStr(int err) { -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) switch(err) { case AVERROR_BSF_NOT_FOUND: return "Bitstream filter not found"; @@ -1735,22 +1624,6 @@ static const char * icvFFMPEGErrStr(int err) default: break; } -#else - switch(err) { - case AVERROR_NUMEXPECTED: - return "Incorrect filename syntax"; - case AVERROR_INVALIDDATA: - return "Invalid data in header"; - case AVERROR_NOFMT: - return "Unknown format"; - case AVERROR_IO: - return "I/O error occurred"; - case AVERROR_NOMEM: - return "Memory allocation error"; - default: - break; - } -#endif return "Unspecified error"; } @@ -1829,28 +1702,16 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, int frame_rate, frame_rate_base; AVCodec *codec; -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0) st = avformat_new_stream(oc, 0); -#else - st = av_new_stream(oc, 0); -#endif if (!st) { CV_WARN("Could not allocate stream"); return NULL; } -#if LIBAVFORMAT_BUILD > 4628 c = st->codec; -#else - c = &(st->codec); -#endif -#if LIBAVFORMAT_BUILD > 4621 c->codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO); -#else - c->codec_id = oc->oformat->video_codec; -#endif if(codec_id != CV_CODEC(CODEC_ID_NONE)){ c->codec_id = codec_id; @@ -1861,13 +1722,11 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, c->codec_type = AVMEDIA_TYPE_VIDEO; -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54,25,0) // Set per-codec defaults CV_CODEC_ID c_id = c->codec_id; avcodec_get_context_defaults3(c, codec); // avcodec_get_context_defaults3 erases codec_id for some reason c->codec_id = c_id; -#endif /* put sample parameters */ int64_t lbit_rate = (int64_t)bitrate; @@ -1893,7 +1752,6 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, frame_rate_base*=10; frame_rate=(int)(fps*frame_rate_base + 0.5); } -#if LIBAVFORMAT_BUILD > 4752 c->time_base.den = frame_rate; c->time_base.num = frame_rate_base; /* adjust time base for supported framerates */ @@ -1915,10 +1773,6 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, c->time_base.den= best->num; c->time_base.num= best->den; } -#else - c->frame_rate = frame_rate; - c->frame_rate_base = frame_rate_base; -#endif c->gop_size = 12; /* emit one intra frame every twelve frames at most */ c->pix_fmt = (AVPixelFormat) pixel_format; @@ -1934,7 +1788,6 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, c->mb_decision=2; } -#if LIBAVUTIL_BUILD > CALC_FFMPEG_VERSION(51,11,0) /* Some settings for libx264 encoding, restore dummy values for gop_size and qmin since they will be set to reasonable defaults by the libx264 preset system. Also, use a crf encode with the default quality rating, @@ -1946,28 +1799,25 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, if (c->priv_data) av_opt_set(c->priv_data,"crf","23", 0); } -#endif -#if LIBAVCODEC_VERSION_INT>0x000409 // some formats want stream headers to be separate if(oc->oformat->flags & AVFMT_GLOBALHEADER) { -#if LIBAVCODEC_BUILD > CALC_FFMPEG_VERSION(56, 35, 0) + // flags were renamed: https://github.com/libav/libav/commit/7c6eb0a1b7bf1aac7f033a7ec6d8cacc3b5c2615 +#if LIBAVCODEC_BUILD >= (LIBAVCODEC_VERSION_MICRO >= 100 \ + ? CALC_FFMPEG_VERSION(56, 60, 100) : CALC_FFMPEG_VERSION(56, 35, 0)) c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; #else c->flags |= CODEC_FLAG_GLOBAL_HEADER; #endif } -#endif -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(52, 42, 0) #if defined(_MSC_VER) AVRational avg_frame_rate = {frame_rate, frame_rate_base}; st->avg_frame_rate = avg_frame_rate; #else st->avg_frame_rate = (AVRational){frame_rate, frame_rate_base}; #endif -#endif #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 20, 0) st->time_base = c->time_base; #endif @@ -1978,18 +1828,10 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, static const int OPENCV_NO_FRAMES_WRITTEN_CODE = 1000; static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0) uint8_t *, uint32_t, -#else - uint8_t * outbuf, uint32_t outbuf_size, -#endif AVFrame * picture ) { -#if LIBAVFORMAT_BUILD > 4628 - AVCodecContext * c = video_st->codec; -#else - AVCodecContext * c = &(video_st->codec); -#endif + AVCodecContext* c = video_st->codec; int ret = OPENCV_NO_FRAMES_WRITTEN_CODE; #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(57, 0, 0) @@ -2033,7 +1875,6 @@ static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, #else AVPacket pkt; av_init_packet(&pkt); -#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0) int got_output = 0; pkt.data = NULL; pkt.size = 0; @@ -2053,26 +1894,6 @@ static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, } else ret = OPENCV_NO_FRAMES_WRITTEN_CODE; -#else - int out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture); - /* if zero size, it means the image was buffered */ - if (out_size > 0) { -#if LIBAVFORMAT_BUILD > 4752 - if(c->coded_frame->pts != (int64_t)AV_NOPTS_VALUE) - pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_st->time_base); -#else - pkt.pts = c->coded_frame->pts; -#endif - if(c->coded_frame->key_frame) - pkt.flags |= PKT_FLAG_KEY; - pkt.stream_index= video_st->index; - pkt.data= outbuf; - pkt.size= out_size; - - /* write the compressed frame in the media file */ - ret = av_write_frame(oc, &pkt); - } -#endif #endif } return ret; @@ -2102,11 +1923,7 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int height = frame_height; // typecast from opaque data type to implemented struct -#if LIBAVFORMAT_BUILD > 4628 - AVCodecContext *c = video_st->codec; -#else - AVCodecContext *c = &(video_st->codec); -#endif + AVCodecContext* c = video_st->codec; // FFmpeg contains SIMD optimizations which can sometimes read data past // the supplied input buffer. @@ -2220,11 +2037,7 @@ void CvVideoWriter_FFMPEG::close() } // free pictures -#if LIBAVFORMAT_BUILD > 4628 if( video_st->codec->pix_fmt != input_pix_fmt) -#else - if( video_st->codec.pix_fmt != input_pix_fmt) -#endif { if(picture->data[0]) free(picture->data[0]); @@ -2236,11 +2049,7 @@ void CvVideoWriter_FFMPEG::close() av_free(input_picture); /* close codec */ -#if LIBAVFORMAT_BUILD > 4628 avcodec_close(video_st->codec); -#else - avcodec_close(&(video_st->codec)); -#endif av_free(outbuf); @@ -2249,17 +2058,7 @@ void CvVideoWriter_FFMPEG::close() if (!(fmt->flags & AVFMT_NOFILE)) { /* close the output file */ - -#if LIBAVCODEC_VERSION_INT < ((52<<16)+(123<<8)+0) -#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(49<<8)+0) - url_fclose(oc->pb); -#else - url_fclose(&oc->pb); -#endif -#else avio_close(oc->pb); -#endif - } /* free the stream */ @@ -2338,11 +2137,7 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, /* auto detect the output format from the name and fourcc code. */ -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) fmt = av_guess_format(NULL, filename, NULL); -#else - fmt = guess_format(NULL, filename, NULL); -#endif if (!fmt) return false; @@ -2363,19 +2158,13 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, } /* Lookup codec_id for given fourcc */ -#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0) - if( (codec_id = codec_get_bmp_id( fourcc )) == CV_CODEC(CODEC_ID_NONE) ) - return false; -#else if( (codec_id = av_codec_get_id(fmt->codec_tag, fourcc)) == CV_CODEC(CODEC_ID_NONE) ) { const struct AVCodecTag * fallback_tags[] = { -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(54, 1, 0) // APIchanges: // 2012-01-31 - dd6d3b0 - lavf 54.01.0 // Add avformat_get_riff_video_tags() and avformat_get_riff_audio_tags(). avformat_get_riff_video_tags(), -#endif #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(55, 25, 100) && defined LIBAVFORMAT_VERSION_MICRO && LIBAVFORMAT_VERSION_MICRO >= 100 // APIchanges: ffmpeg only // 2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h @@ -2410,14 +2199,9 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, fourcc = supported_tag; } } -#endif // alloc memory for context -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) oc = avformat_alloc_context(); -#else - oc = av_alloc_format_context(); -#endif assert (oc); /* set file name */ @@ -2429,14 +2213,12 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, // set a few optimal pixel formats for lossless codecs of interest.. switch (codec_id) { -#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0) case CV_CODEC(CODEC_ID_JPEGLS): // BGR24 or GRAY8 depending on is_color... // supported: bgr24 rgb24 gray gray16le // as of version 3.4.1 codec_pix_fmt = input_pix_fmt; break; -#endif case CV_CODEC(CODEC_ID_HUFFYUV): // supported: yuv422p rgb24 bgra // as of version 3.4.1 @@ -2537,21 +2319,13 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, break; } - double bitrate = MIN(bitrate_scale*fps*width*height, (double)INT_MAX/2); + double bitrate = std::min(bitrate_scale*fps*width*height, (double)INT_MAX/2); // TODO -- safe to ignore output audio stream? video_st = icv_add_video_stream_FFMPEG(oc, codec_id, width, height, (int)(bitrate + 0.5), fps, codec_pix_fmt); - /* set the output parameters (must be done even if no - parameters). */ -#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0) - if (av_set_parameters(oc, NULL) < 0) { - return false; - } -#endif - #if 0 #if FF_API_DUMP_FORMAT dump_format(oc, 0, filename, 1); @@ -2566,26 +2340,14 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, return false; } - AVCodec *codec; - AVCodecContext *c; - -#if LIBAVFORMAT_BUILD > 4628 - c = (video_st->codec); -#else - c = &(video_st->codec); -#endif + AVCodecContext* c = video_st->codec; c->codec_tag = fourcc; /* find the video encoder */ - codec = avcodec_find_encoder(c->codec_id); + AVCodec* codec = avcodec_find_encoder(c->codec_id); if (!codec) { - fprintf(stderr, "Could not find encoder for codec id %d: %s\n", c->codec_id, icvFFMPEGErrStr( - #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0) - AVERROR_ENCODER_NOT_FOUND - #else - -1 - #endif - )); + fprintf(stderr, "Could not find encoder for codec id %d: %s\n", c->codec_id, + icvFFMPEGErrStr(AVERROR_ENCODER_NOT_FOUND)); return false; } @@ -2596,13 +2358,7 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, c->bit_rate = (int)lbit_rate; /* open the codec */ - if ((err= -#if LIBAVCODEC_VERSION_INT >= ((53<<16)+(8<<8)+0) - avcodec_open2(c, codec, NULL) -#else - avcodec_open(c, codec) -#endif - ) < 0) { + if ((err= avcodec_open2(c, codec, NULL)) < 0) { fprintf(stderr, "Could not open codec '%s': %s\n", codec->name, icvFFMPEGErrStr(err)); return false; } @@ -2641,23 +2397,16 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc, } /* open the output file, if needed */ - if (!(fmt->flags & AVFMT_NOFILE)) { -#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0) - if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) -#else - if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0) -#endif - { + if (!(fmt->flags & AVFMT_NOFILE)) + { + if (avio_open(&oc->pb, filename, AVIO_FLAG_WRITE) < 0) + { return false; } } -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) /* write the stream header, if any */ err=avformat_write_header(oc, NULL); -#else - err=av_write_header( oc ); -#endif if(err < 0) { -- 2.7.4