protected:
CvCapture_FFMPEG* ffmpegCapture;
- bool rotation_auto = 0 != getProperty(CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO);
- int rotation_angle = static_cast<int>(getProperty(CV_FFMPEG_CAP_PROP_ORIENTATION_META));
+
+ void rotateFrame(cv::Mat &mat) const
+ {
++ bool rotation_auto = 0 != getProperty(CAP_PROP_ORIENTATION_AUTO);
++ int rotation_angle = static_cast<int>(getProperty(CAP_PROP_ORIENTATION_META));
+
+ if(!rotation_auto || rotation_angle%360 == 0)
+ {
+ return;
+ }
+
+ cv::RotateFlags flag;
+ if(rotation_angle == 90 || rotation_angle == -270) { // Rotate clockwise 90 degrees
+ flag = cv::ROTATE_90_CLOCKWISE;
+ } else if(rotation_angle == 270 || rotation_angle == -90) { // Rotate clockwise 270 degrees
+ flag = cv::ROTATE_90_COUNTERCLOCKWISE;
+ } else if(rotation_angle == 180 || rotation_angle == -180) { // Rotate clockwise 180 degrees
+ flag = cv::ROTATE_180;
+ } else { // Unsupported rotation
+ return;
+ }
+
+ cv::rotate(mat, mat, flag);
+ }
};
} // namespace
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)frame.width;
+ return (double)((rotation_auto && rotation_angle%180) ? frame.height : frame.width);
- case CV_FFMPEG_CAP_PROP_FRAME_HEIGHT:
+ case CAP_PROP_FRAME_HEIGHT:
- return (double)frame.height;
+ return (double)((rotation_auto && rotation_angle%180) ? frame.width : frame.height);
- case CV_FFMPEG_CAP_PROP_FPS:
+ case CAP_PROP_FPS:
return get_fps();
- case CV_FFMPEG_CAP_PROP_FOURCC:
+ case CAP_PROP_FOURCC:
#if LIBAVFORMAT_BUILD > 4628
codec_id = video_st->codec->codec_id;
codec_tag = (double) video_st->codec->codec_tag;
if (rawMode)
return -1;
break;
- case CV_FFMPEG_CAP_PROP_BITRATE:
+ case CAP_PROP_BITRATE:
return static_cast<double>(get_bitrate());
- case CV_FFMPEG_CAP_PROP_ORIENTATION_META:
++ case CAP_PROP_ORIENTATION_META:
+ return static_cast<double>(rotation_angle);
- case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO:
++ case CAP_PROP_ORIENTATION_AUTO:
+ #if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
+ (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100)))
+ return static_cast<double>(rotation_auto);
+ #else
+ return 0;
+ #endif
default:
break;
}
if (value == -1)
return setRaw();
return false;
- case CV_FFMPEG_CAP_PROP_ORIENTATION_AUTO:
++ case CAP_PROP_ORIENTATION_AUTO:
+ #if ((LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0)) && \
+ (LIBAVUTIL_BUILD >= CALC_FFMPEG_VERSION(52, 94, 100)))
+ rotation_auto = static_cast<bool>(value);
+ return true;
+ #else
+ rotation_auto = 0;
+ return false;
+ #endif
+ break;
default:
return false;
}
INSTANTIATE_TEST_CASE_P(videoio, ffmpeg_cap_properties, testing::ValuesIn(videoio_ffmpeg_properties));
-#endif
++
++
+ // related issue: https://github.com/opencv/opencv/issues/15499
+ TEST(videoio, mp4_orientation_meta_auto)
+ {
++ if (!videoio_registry::hasBackend(CAP_FFMPEG))
++ throw SkipTestException("FFmpeg backend was not found");
++
+ string video_file = string(cvtest::TS::ptr()->get_data_path()) + "video/big_buck_bunny_rotated.mp4";
+
+ 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;
+
+ 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),
+ (int)cap.get(CAP_PROP_FRAME_HEIGHT)));
+ EXPECT_EQ(384, actual.width);
+ EXPECT_EQ(672, actual.height);
+
+ Mat frame;
+
+ cap >> frame;
+
+ ASSERT_EQ(384, frame.cols);
+ ASSERT_EQ(672, frame.rows);
+ }
+
+ // related issue: https://github.com/opencv/opencv/issues/15499
+ TEST(videoio, mp4_orientation_no_rotation)
+ {
++ if (!videoio_registry::hasBackend(CAP_FFMPEG))
++ throw SkipTestException("FFmpeg backend was not found");
++
+ string video_file = string(cvtest::TS::ptr()->get_data_path()) + "video/big_buck_bunny_rotated.mp4";
+
+ VideoCapture cap;
+ EXPECT_NO_THROW(cap.open(video_file, CAP_FFMPEG));
+ cap.set(CAP_PROP_ORIENTATION_AUTO, 0);
+ ASSERT_TRUE(cap.isOpened()) << "Can't open the video: " << video_file << " with backend " << CAP_FFMPEG << std::endl;
+ ASSERT_FALSE(cap.get(CAP_PROP_ORIENTATION_AUTO));
+
+ Size actual;
+ EXPECT_NO_THROW(actual = Size((int)cap.get(CAP_PROP_FRAME_WIDTH),
+ (int)cap.get(CAP_PROP_FRAME_HEIGHT)));
+ EXPECT_EQ(672, actual.width);
+ EXPECT_EQ(384, actual.height);
+
+ Mat frame;
+
+ cap >> frame;
+
+ ASSERT_EQ(672, frame.cols);
+ ASSERT_EQ(384, frame.rows);
+ }
+
}} // namespace