refactor video surface conversion slightly
Some checks are pending
ContinuousDelivery / linux-ubuntu (push) Waiting to run
ContinuousDelivery / linux-debian12 (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Waiting to run
ContinuousDelivery / windows (windows-2022, ) (push) Waiting to run
ContinuousDelivery / windows (windows-2022, asan) (push) Waiting to run
ContinuousDelivery / dumpsyms (push) Blocked by required conditions
ContinuousDelivery / release (push) Blocked by required conditions
ContinuousIntegration / on ubuntu-24.04-arm (push) Waiting to run
ContinuousIntegration / asan on ubuntu-24.04-arm (push) Waiting to run
ContinuousIntegration / on ubuntu-latest (push) Waiting to run
ContinuousIntegration / asan on ubuntu-latest (push) Waiting to run
ContinuousIntegration / linux-debian12 (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Waiting to run
ContinuousIntegration / macos (push) Waiting to run
ContinuousIntegration / windows (push) Waiting to run
Some checks are pending
ContinuousDelivery / linux-ubuntu (push) Waiting to run
ContinuousDelivery / linux-debian12 (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Waiting to run
ContinuousDelivery / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Waiting to run
ContinuousDelivery / windows (windows-2022, ) (push) Waiting to run
ContinuousDelivery / windows (windows-2022, asan) (push) Waiting to run
ContinuousDelivery / dumpsyms (push) Blocked by required conditions
ContinuousDelivery / release (push) Blocked by required conditions
ContinuousIntegration / on ubuntu-24.04-arm (push) Waiting to run
ContinuousIntegration / asan on ubuntu-24.04-arm (push) Waiting to run
ContinuousIntegration / on ubuntu-latest (push) Waiting to run
ContinuousIntegration / asan on ubuntu-latest (push) Waiting to run
ContinuousIntegration / linux-debian12 (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Waiting to run
ContinuousIntegration / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Waiting to run
ContinuousIntegration / macos (push) Waiting to run
ContinuousIntegration / windows (push) Waiting to run
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include <chrono> // meh
|
//#include <chrono> // meh
|
||||||
#include <iostream> // meh
|
#include <iostream> // meh
|
||||||
|
|
||||||
template<typename RealStream>
|
template<typename RealStream>
|
||||||
@@ -20,52 +20,53 @@ struct PushConversionVideoStream : public RealStream {
|
|||||||
bool push(const SDLVideoFrame& value) override {
|
bool push(const SDLVideoFrame& value) override {
|
||||||
assert(value.surface);
|
assert(value.surface);
|
||||||
SDL_Surface* surf = value.surface.get();
|
SDL_Surface* surf = value.surface.get();
|
||||||
if (surf->format != _forced_format) {
|
|
||||||
//std::cerr << "PCVS: need to convert from " << SDL_GetPixelFormatName(surf->format) << " to " << SDL_GetPixelFormatName(_forced_format) << "\n";
|
|
||||||
//const auto start = std::chrono::steady_clock::now();
|
|
||||||
if ((surf = SDL_ConvertSurface(surf, _forced_format)) == nullptr) {
|
|
||||||
surf = value.surface.get(); // reset ptr
|
|
||||||
//std::cerr << "PCVS warning: default conversion failed: " << SDL_GetError() << "\n";
|
|
||||||
|
|
||||||
// sdl hardcodes BT709_LIMITED
|
if (surf->format == _forced_format) {
|
||||||
if ((surf = SDL_ConvertSurfaceAndColorspace(surf, _forced_format, nullptr, SDL_GetSurfaceColorspace(surf), 0)) == nullptr) {
|
|
||||||
//if ((surf = SDL_ConvertSurfaceAndColorspace(surf, _forced_format, nullptr, SDL_COLORSPACE_BT709_LIMITED, 0)) == nullptr) {
|
|
||||||
surf = value.surface.get(); // reset ptr
|
|
||||||
//std::cerr << "PCVS warning: default conversion with same colorspace failed: " << SDL_GetError() << "\n";
|
|
||||||
// simple convert failed, fall back to ->rgb->yuv
|
|
||||||
//SDL_Surface* tmp_conv_surf = SDL_ConvertSurfaceAndColorspace(surf, SDL_PIXELFORMAT_RGB24, nullptr, SDL_COLORSPACE_RGB_DEFAULT, 0);
|
|
||||||
SDL_Surface* tmp_conv_surf = SDL_ConvertSurface(surf, SDL_PIXELFORMAT_RGB24);
|
|
||||||
if (tmp_conv_surf == nullptr) {
|
|
||||||
std::cerr << "PCVS error: conversion to RGB failed: " << SDL_GetError() << "\n";
|
|
||||||
} else {
|
|
||||||
//surf = SDL_ConvertSurfaceAndColorspace(tmp_conv_surf, _forced_format, nullptr, SDL_COLORSPACE_YUV_DEFAULT, 0);
|
|
||||||
surf = SDL_ConvertSurface(tmp_conv_surf, _forced_format);
|
|
||||||
//surf = SDL_ConvertSurfaceAndColorspace(tmp_conv_surf, _forced_format, nullptr, SDL_COLORSPACE_BT601_LIMITED, 0);
|
|
||||||
SDL_DestroySurface(tmp_conv_surf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//const auto end = std::chrono::steady_clock::now();
|
|
||||||
//std::cerr << "PCVS: conversion took " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << "ms\n";
|
|
||||||
|
|
||||||
if (surf == nullptr) {
|
|
||||||
// oh god
|
|
||||||
std::cerr << "PCVS error: failed to convert surface to " << SDL_GetPixelFormatName(_forced_format) << ": " << SDL_GetError() << "\n";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
assert(surf != nullptr);
|
|
||||||
|
|
||||||
// TODO: add ctr with uptr
|
|
||||||
SDLVideoFrame new_value{value.timestampUS, nullptr};
|
|
||||||
new_value.surface = {
|
|
||||||
surf,
|
|
||||||
&SDL_DestroySurface
|
|
||||||
};
|
|
||||||
|
|
||||||
return RealStream::push(std::move(new_value));
|
|
||||||
} else {
|
|
||||||
return RealStream::push(value);
|
return RealStream::push(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//std::cerr << "PCVS: need to convert from " << SDL_GetPixelFormatName(surf->format) << " to " << SDL_GetPixelFormatName(_forced_format) << "\n";
|
||||||
|
//const auto start = std::chrono::steady_clock::now();
|
||||||
|
if ((surf = SDL_ConvertSurface(surf, _forced_format)) == nullptr) {
|
||||||
|
surf = value.surface.get(); // reset ptr
|
||||||
|
//std::cerr << "PCVS warning: default conversion failed: " << SDL_GetError() << "\n";
|
||||||
|
|
||||||
|
// sdl hardcodes BT709_LIMITED
|
||||||
|
if ((surf = SDL_ConvertSurfaceAndColorspace(surf, _forced_format, nullptr, SDL_GetSurfaceColorspace(surf), 0)) == nullptr) {
|
||||||
|
//if ((surf = SDL_ConvertSurfaceAndColorspace(surf, _forced_format, nullptr, SDL_COLORSPACE_BT709_LIMITED, 0)) == nullptr) {
|
||||||
|
surf = value.surface.get(); // reset ptr
|
||||||
|
//std::cerr << "PCVS warning: default conversion with same colorspace failed: " << SDL_GetError() << "\n";
|
||||||
|
// simple convert failed, fall back to ->rgb->yuv
|
||||||
|
//SDL_Surface* tmp_conv_surf = SDL_ConvertSurfaceAndColorspace(surf, SDL_PIXELFORMAT_RGB24, nullptr, SDL_COLORSPACE_RGB_DEFAULT, 0);
|
||||||
|
SDL_Surface* tmp_conv_surf = SDL_ConvertSurface(surf, SDL_PIXELFORMAT_RGB24);
|
||||||
|
if (tmp_conv_surf == nullptr) {
|
||||||
|
std::cerr << "PCVS error: conversion to RGB failed: " << SDL_GetError() << "\n";
|
||||||
|
} else {
|
||||||
|
//surf = SDL_ConvertSurfaceAndColorspace(tmp_conv_surf, _forced_format, nullptr, SDL_COLORSPACE_YUV_DEFAULT, 0);
|
||||||
|
surf = SDL_ConvertSurface(tmp_conv_surf, _forced_format);
|
||||||
|
//surf = SDL_ConvertSurfaceAndColorspace(tmp_conv_surf, _forced_format, nullptr, SDL_COLORSPACE_BT601_LIMITED, 0);
|
||||||
|
SDL_DestroySurface(tmp_conv_surf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//const auto end = std::chrono::steady_clock::now();
|
||||||
|
//std::cerr << "PCVS: conversion took " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << "ms\n";
|
||||||
|
|
||||||
|
if (surf == nullptr) {
|
||||||
|
// oh god
|
||||||
|
std::cerr << "PCVS error: failed to convert surface to " << SDL_GetPixelFormatName(_forced_format) << ": " << SDL_GetError() << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
assert(surf != nullptr);
|
||||||
|
|
||||||
|
// TODO: add ctr with uptr
|
||||||
|
SDLVideoFrame new_value{value.timestampUS, nullptr};
|
||||||
|
new_value.surface = {
|
||||||
|
surf,
|
||||||
|
&SDL_DestroySurface
|
||||||
|
};
|
||||||
|
|
||||||
|
return RealStream::push(std::move(new_value));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user