| 219 | vk(vk), info(info), nvidia(is_nvidia(vk.physical_device)) {} |
| 220 | |
| 221 | std::pair<std::string, video_codec> select_encoder(const configuration::encoder & config) |
| 222 | { |
| 223 | if (config.codec == video_codec::raw or config.name == encoder_raw) |
| 224 | return {encoder_raw, video_codec::raw}; |
| 225 | |
| 226 | #if WIVRN_USE_NVENC |
| 227 | if ((nvidia and config.name.empty()) or config.name == encoder_nvenc) |
| 228 | { |
| 229 | for (auto codec: config.codec ? std::vector{*config.codec} : info.supported_codecs) |
| 230 | { |
| 231 | if (check_nvenc(codec)) |
| 232 | return {encoder_nvenc, codec}; |
| 233 | } |
| 234 | } |
| 235 | #endif |
| 236 | |
| 237 | #if WIVRN_USE_VULKAN_ENCODE |
| 238 | if (config.name.empty() or config.name == encoder_vulkan) |
| 239 | { |
| 240 | for (auto codec: config.codec ? std::vector{*config.codec} : info.supported_codecs) |
| 241 | { |
| 242 | if (has_vk(codec)) |
| 243 | return {encoder_vulkan, codec}; |
| 244 | } |
| 245 | } |
| 246 | #endif |
| 247 | |
| 248 | #if WIVRN_USE_VAAPI |
| 249 | if (config.name.empty() or config.name == encoder_vaapi) |
| 250 | { |
| 251 | for (auto codec: config.codec ? std::vector{*config.codec} : info.supported_codecs) |
| 252 | { |
| 253 | if (check_vaapi(codec)) |
| 254 | return {encoder_vaapi, codec}; |
| 255 | } |
| 256 | } |
| 257 | #endif |
| 258 | U_LOG_W("No suitable hardware accelerated codec found"); |
| 259 | #if WIVRN_USE_X264 |
| 260 | if (config.name.empty() or config.name == encoder_x264) |
| 261 | return {encoder_x264, video_codec::h264}; |
| 262 | #endif |
| 263 | |
| 264 | throw std::runtime_error("Failed to find a suitable video encoder"); |
| 265 | } |
| 266 | }; |
| 267 | } // namespace |
| 268 |
no test coverage detected