diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index bdda38e5e2..d618874c4a 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -268,6 +268,7 @@ enum VideoAccelerationType VIDEO_ACCELERATION_D3D11 = 2, //!< DirectX 11 VIDEO_ACCELERATION_VAAPI = 3, //!< VAAPI VIDEO_ACCELERATION_MFX = 4, //!< libmfx (Intel MediaSDK/oneVPL) + VIDEO_ACCELERATION_DRM = 5, //!< Raspberry Pi V4 }; //! @} Hardware acceleration support diff --git a/modules/videoio/src/cap_ffmpeg_hw.hpp b/modules/videoio/src/cap_ffmpeg_hw.hpp index 0998ee9f48..65045a2bc7 100644 --- a/modules/videoio/src/cap_ffmpeg_hw.hpp +++ b/modules/videoio/src/cap_ffmpeg_hw.hpp @@ -57,6 +57,9 @@ extern "C" { #ifdef HAVE_MFX // dependency only on MFX header files, no linkage dependency #include #endif +#ifdef HAVE_DRM +#include +#endif } #define HW_DEFAULT_POOL_SIZE 32 @@ -81,6 +84,7 @@ const char* getVideoAccelerationName(VideoAccelerationType va_type) case VIDEO_ACCELERATION_D3D11: return "d3d11"; case VIDEO_ACCELERATION_VAAPI: return "vaapi"; case VIDEO_ACCELERATION_MFX: return "mfx"; + case VIDEO_ACCELERATION_DRM : return "drm"; } return "unknown"; } @@ -119,6 +123,7 @@ std::string getDecoderConfiguration(VideoAccelerationType va_type, AVDictionary case VIDEO_ACCELERATION_D3D11: return ""; case VIDEO_ACCELERATION_VAAPI: return "vaapi.iHD"; case VIDEO_ACCELERATION_MFX: return "qsv.iHD"; + case VIDEO_ACCELERATION_DRM: return "drm"; } return ""; #endif @@ -158,6 +163,8 @@ std::string getEncoderConfiguration(VideoAccelerationType va_type, AVDictionary case VIDEO_ACCELERATION_D3D11: return ""; case VIDEO_ACCELERATION_VAAPI: return "vaapi.iHD"; case VIDEO_ACCELERATION_MFX: return "qsv.iHD"; + case VIDEO_ACCELERATION_DRM: return ""; + // Raspberry Pi 5 has no encoders, so we don't support it } return "unknown"; #endif @@ -236,6 +243,18 @@ bool hw_check_device(AVBufferRef* ctx, AVHWDeviceType hw_type, const std::string dxgiDevice->Release(); } } +#endif +#if defined(HAVE_DRM) + if (hw_device_ctx->type == AV_HWDEVICE_TYPE_DRM) { + AVDRMDeviceContext *drm_ctx = (AVDRMDeviceContext *)hw_device_ctx->hwctx; + if (drm_ctx->fd >= 0) { + drmVersionPtr drm_version = drmGetVersion(drm_ctx->fd); + if (drm_version) { + device_name = drm_version->name; + drmFreeVersion(drm_version); + } + } + } #endif if (hw_device_ctx->type == AV_HWDEVICE_TYPE_VAAPI) { #if defined(HAVE_VA) && (VA_MAJOR_VERSION >= 1) @@ -908,6 +927,7 @@ VideoAccelerationType hw_type_to_va_type(AVHWDeviceType hw_type) { { AV_HWDEVICE_TYPE_VAAPI, VIDEO_ACCELERATION_VAAPI }, { AV_HWDEVICE_TYPE_QSV, VIDEO_ACCELERATION_MFX }, { AV_HWDEVICE_TYPE_CUDA, (VideoAccelerationType)(1 << 11) }, + { AV_HWDEVICE_TYPE_DRM, VIDEO_ACCELERATION_DRM } }; for (const HWTypeFFMPEG& hw : known_hw_types) { if (hw_type == hw.hw_type) diff --git a/modules/videoio/src/cap_interface.hpp b/modules/videoio/src/cap_interface.hpp index a1924f5682..58cada06d3 100644 --- a/modules/videoio/src/cap_interface.hpp +++ b/modules/videoio/src/cap_interface.hpp @@ -417,6 +417,7 @@ std::ostream& operator<<(std::ostream& out, const VideoAccelerationType& va_type case VIDEO_ACCELERATION_D3D11: out << "D3D11"; return out; case VIDEO_ACCELERATION_VAAPI: out << "VAAPI"; return out; case VIDEO_ACCELERATION_MFX: out << "MFX"; return out; + case VIDEO_ACCELERATION_DRM: out << "DRM"; return out; } out << cv::format("UNKNOWN(0x%ux)", static_cast(va_type)); return out; diff --git a/modules/videoio/test/test_precomp.hpp b/modules/videoio/test/test_precomp.hpp index 205d8f92bd..323f407c68 100644 --- a/modules/videoio/test/test_precomp.hpp +++ b/modules/videoio/test/test_precomp.hpp @@ -35,6 +35,7 @@ std::ostream& operator<<(std::ostream& out, const VideoAccelerationType& va_type {VIDEO_ACCELERATION_D3D11, "D3D11"}, {VIDEO_ACCELERATION_VAAPI, "VAAPI"}, {VIDEO_ACCELERATION_MFX, "MFX"}, + {VIDEO_ACCELERATION_DRM, "DRM"}, }; for (const auto& va : va_types) { if (va_type == va.va_type) { diff --git a/modules/videoio/test/test_video_io.cpp b/modules/videoio/test/test_video_io.cpp index 03d69dfe5b..0a631d8a04 100644 --- a/modules/videoio/test/test_video_io.cpp +++ b/modules/videoio/test/test_video_io.cpp @@ -871,6 +871,7 @@ static const VideoAccelerationType hw_types[] = { VIDEO_ACCELERATION_D3D11, #else VIDEO_ACCELERATION_VAAPI, + VIDEO_ACCELERATION_DRM, #endif }; diff --git a/samples/tapi/video_acceleration.cpp b/samples/tapi/video_acceleration.cpp index 5169236c29..b0d0e5be5d 100644 --- a/samples/tapi/video_acceleration.cpp +++ b/samples/tapi/video_acceleration.cpp @@ -42,6 +42,7 @@ struct { { VIDEO_ACCELERATION_D3D11, "d3d11" }, { VIDEO_ACCELERATION_VAAPI, "vaapi" }, { VIDEO_ACCELERATION_MFX, "mfx" }, + { VIDEO_ACCELERATION_DRM, "drm" }, }; class FPSCounter {