mirror of
https://github.com/opencv/opencv.git
synced 2024-11-25 03:30:34 +08:00
7bcb51eded
videoio: HW decode/encode in FFMPEG backend; new properties with support in FFMPEG/GST/MSMF * HW acceleration in FFMPEG backend * fixes on Windows, remove D3D9 * HW acceleration in FFMPEG backend * fixes on Windows, remove D3D9 * improve va test * Copyright * check LIBAVUTIL_BUILD >= AV_VERSION_INT(55, 78, 100) // FFMPEG 3.4+ * CAP_MSMF test on .mp4 * .mp4 in test * improve va test * Copyright * check LIBAVUTIL_BUILD >= AV_VERSION_INT(55, 78, 100) // FFMPEG 3.4+ * CAP_MSMF test on .mp4 * .mp4 in test * .avi for GStreamer test * revert changes around seek() * cv_writer_open_with_params * params.warnUnusedParameters * VideoCaptureParameters in GStreamer * open_with_params * params->getUnused * Reduce PSNR threshold 33->32 (other tests use 30) * require FFMPEG 4.0+; PSNR 30 as in other tests * GStreamer AVI-demux plugin not installed in Ubuntu test environment? * fix build on very old ffmpeg * fix build on very old ffmpeg * fix build issues * fix build issues (static_cast) * FFMPEG built on Windows without H264 encoder? * fix for write_nothing test on VAAPI * fix warnings * fix cv_writer_get_prop in plugins * use avcodec_get_hw_frames_parameters; more robust fallback to SW codecs * internal function hw_check_device() for device check/logging * two separate tests for HW read and write * image size 640x480 in encode test * WITH_VA=ON (only .h headers used in OpenCV, no linkage dependency) * exception on VP9 SW encoder? * rebase master; refine info message * videoio: fix FFmpeg standalone plugin build * videoio(ffmpeg): eliminate MSVC build warnings * address review comments * videoio(hw): update videocapture_acceleration.read test - remove parallel decoding by SW code path - check PSNR against the original generated image * videoio: minor fixes * videoio(test): disable unsupported MSMF cases (SW and HW) * videoio(test): update PSNR thresholds for HW acceleration read * videoio(test): update debug messages * "hw_acceleration" whitelisting parameter * little optimization in test * D3D11VA supports decoders, doesn't support encoders * videoio(test): adjust PSNR threshold in write_read_position tests * videoio(ffmpeg): fix rejecting on acceleration device name mismatch * videoio(ffmpeg): fix compilation USE_AV_HW_CODECS=0, add more debug logging * videoio: rework VideoAccelerationType behavior - enum is not a bitset - default value is backend specific - only '_NONE' and '_ANY' may fallback on software processing - specific H/W acceleration doesn't fallback on software processing. It fails if there is no support for specified H/W acceleration. * videoio(test): fix for current FFmpeg wrapper Co-authored-by: Alexander Alekhin <alexander.a.alekhin@gmail.com>
112 lines
3.5 KiB
C++
112 lines
3.5 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
#ifndef __OPENCV_TEST_PRECOMP_HPP__
|
|
#define __OPENCV_TEST_PRECOMP_HPP__
|
|
|
|
#include <sstream>
|
|
|
|
#include "opencv2/ts.hpp"
|
|
#include "opencv2/videoio.hpp"
|
|
#include "opencv2/videoio/registry.hpp"
|
|
#include "opencv2/imgproc/imgproc_c.h"
|
|
|
|
#include "opencv2/core/private.hpp"
|
|
|
|
namespace cv {
|
|
|
|
static inline
|
|
std::ostream& operator<<(std::ostream& out, const VideoCaptureAPIs& api)
|
|
{
|
|
out << cv::videoio_registry::getBackendName(api); return out;
|
|
}
|
|
|
|
static inline
|
|
std::ostream& operator<<(std::ostream& out, const VideoAccelerationType& va_type)
|
|
{
|
|
struct {
|
|
VideoAccelerationType va_type;
|
|
const char* str;
|
|
} va_types[] = {
|
|
{VIDEO_ACCELERATION_ANY, "ANY"},
|
|
{VIDEO_ACCELERATION_NONE, "NONE"},
|
|
{VIDEO_ACCELERATION_D3D11, "D3D11"},
|
|
{VIDEO_ACCELERATION_VAAPI, "VAAPI"},
|
|
{VIDEO_ACCELERATION_MFX, "MFX"},
|
|
};
|
|
for (const auto& va : va_types) {
|
|
if (va_type == va.va_type) {
|
|
out << va.str;
|
|
return out;
|
|
}
|
|
}
|
|
out << cv::format("UNKNOWN(0x%ux)", static_cast<unsigned int>(va_type));
|
|
return out;
|
|
}
|
|
|
|
static inline void PrintTo(const cv::VideoCaptureAPIs& api, std::ostream* os)
|
|
{
|
|
*os << cv::videoio_registry::getBackendName(api);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
|
|
inline std::string fourccToString(int fourcc)
|
|
{
|
|
return cv::format("%c%c%c%c", fourcc & 255, (fourcc >> 8) & 255, (fourcc >> 16) & 255, (fourcc >> 24) & 255);
|
|
}
|
|
|
|
inline int fourccFromString(const std::string &fourcc)
|
|
{
|
|
if (fourcc.size() != 4) return 0;
|
|
return cv::VideoWriter::fourcc(fourcc[0], fourcc[1], fourcc[2], fourcc[3]);
|
|
}
|
|
|
|
inline void generateFrame(int i, int FRAME_COUNT, cv::Mat & frame)
|
|
{
|
|
using namespace cv;
|
|
using namespace std;
|
|
int offset = (((i * 5) % FRAME_COUNT) - FRAME_COUNT / 2) * (frame.cols / 2) / FRAME_COUNT;
|
|
frame(cv::Rect(0, 0, frame.cols / 2 + offset, frame.rows)) = Scalar(255, 255, 255);
|
|
frame(cv::Rect(frame.cols / 2 + offset, 0, frame.cols - frame.cols / 2 - offset, frame.rows)) = Scalar(0, 0, 0);
|
|
ostringstream buf; buf << "Frame " << setw(2) << setfill('0') << i + 1;
|
|
int baseLine = 0;
|
|
Size box = getTextSize(buf.str(), FONT_HERSHEY_COMPLEX, 2, 5, &baseLine);
|
|
putText(frame, buf.str(), Point((frame.cols - box.width) / 2, (frame.rows - box.height) / 2 + baseLine),
|
|
FONT_HERSHEY_COMPLEX, 2, Scalar(0, 0, 255), 5, LINE_AA);
|
|
Point p(i * frame.cols / (FRAME_COUNT - 1), i * frame.rows / (FRAME_COUNT - 1));
|
|
circle(frame, p, 50, Scalar(200, 25, 55), 8, LINE_AA);
|
|
#if 0
|
|
imshow("frame", frame);
|
|
waitKey();
|
|
#endif
|
|
}
|
|
|
|
class BunnyParameters
|
|
{
|
|
public:
|
|
inline static int getWidth() { return 672; };
|
|
inline static int getHeight() { return 384; };
|
|
inline static int getFps() { return 24; };
|
|
inline static double getTime() { return 5.21; };
|
|
inline static int getCount() { return cvRound(getFps() * getTime()); };
|
|
inline static std::string getFilename(const std::string &ext)
|
|
{
|
|
return cvtest::TS::ptr()->get_data_path() + "video/big_buck_bunny" + ext;
|
|
}
|
|
};
|
|
|
|
|
|
static inline bool isBackendAvailable(cv::VideoCaptureAPIs api, const std::vector<cv::VideoCaptureAPIs>& api_list)
|
|
{
|
|
for (size_t i = 0; i < api_list.size(); i++)
|
|
{
|
|
if (api_list[i] == api)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#endif
|