From 32912e8042fe93d9fe412dc3ec1ae120df527f8a Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 18 Jun 2020 12:32:24 +0300 Subject: [PATCH] Extra checks for rotation metadata support. --- modules/videoio/src/cap_ffmpeg_impl.hpp | 25 +++++++++++++++++++++++-- modules/videoio/test/test_ffmpeg.cpp | 5 ++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index 2b946a738e6e..1400699bfa5a 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -564,11 +564,17 @@ void CvCapture_FFMPEG::init() frame_number = 0; eps_zero = 0.000025; - rotation_auto = true; rotation_angle = 0; -#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 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; @@ -1458,7 +1464,12 @@ double CvCapture_FFMPEG::getProperty( int property_id ) const case CV_FFMPEG_CAP_PROP_ORIENTATION_META: return static_cast(rotation_angle); case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO: +#if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \ + (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 92, 100))) return static_cast(rotation_auto); +#else + return 0; +#endif default: break; } @@ -1540,9 +1551,12 @@ 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))) AVDictionaryEntry *rotate_tag = av_dict_get(video_st->metadata, "rotate", NULL, 0); if (rotate_tag != NULL) rotation_angle = atoi(rotate_tag->value); +#endif } void CvCapture_FFMPEG::seek(int64_t _frame_number) @@ -1641,7 +1655,14 @@ bool CvCapture_FFMPEG::setProperty( int property_id, double value ) 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, 111, 0))) rotation_auto = static_cast(value); + return true; +#else + rotation_auto = 0; + return false; +#endif break; default: return false; diff --git a/modules/videoio/test/test_ffmpeg.cpp b/modules/videoio/test/test_ffmpeg.cpp index 5f3a9d79f257..6acc65f177a3 100644 --- a/modules/videoio/test/test_ffmpeg.cpp +++ b/modules/videoio/test/test_ffmpeg.cpp @@ -644,7 +644,10 @@ TEST(videoio, mp4_orientation_meta_auto) VideoCapture cap; EXPECT_NO_THROW(cap.open(video_file, CAP_FFMPEG)); ASSERT_TRUE(cap.isOpened()) << "Can't open the video: " << video_file << " with backend " << CAP_FFMPEG << std::endl; - ASSERT_TRUE(cap.get(CAP_PROP_ORIENTATION_AUTO)); + + cap.set(CAP_PROP_ORIENTATION_AUTO, true); + if (cap.get(CAP_PROP_ORIENTATION_AUTO) == 0) + throw SkipTestException("FFmpeg frame rotation metadata is not supported"); Size actual; EXPECT_NO_THROW(actual = Size((int)cap.get(CAP_PROP_FRAME_WIDTH),