Files
video-v1/vav2/Vav2Player/Vav2UnitTest/tests/MockVideoRenderer.cpp
2025-09-25 22:43:07 +09:00

198 lines
5.2 KiB
C++

#include "pch.h"
#include "MockVideoRenderer.h"
#include <chrono>
#include <thread>
#include <cstring>
namespace Vav2PlayerUnitTests {
MockVideoRenderer::MockVideoRenderer() {
}
HRESULT MockVideoRenderer::Initialize(uint32_t width, uint32_t height) {
m_initializeCallCount++;
m_lastInitializeWidth = width;
m_lastInitializeHeight = height;
if (FAILED(m_initializeResult)) {
return m_initializeResult;
}
m_width = width;
m_height = height;
m_initialized = true;
return S_OK;
}
void MockVideoRenderer::Shutdown() {
m_initialized = false;
m_width = 0;
m_height = 0;
m_renderedFrames.clear();
}
bool MockVideoRenderer::IsInitialized() const {
return m_initialized;
}
HRESULT MockVideoRenderer::RenderVideoFrame(const Vav2Player::VideoFrame& frame) {
m_renderFrameCallCount++;
if (!m_initialized) {
return E_FAIL;
}
if (FAILED(m_renderFrameResult)) {
return m_renderFrameResult;
}
// Store frame for test verification
Vav2Player::VideoFrame frameCopy;
CopyFrame(frame, frameCopy);
m_renderedFrames.push_back(std::move(frameCopy));
// Simulate rendering delay if configured
SimulateRenderDelay();
return S_OK;
}
bool MockVideoRenderer::TryRenderFrame(const Vav2Player::VideoFrame& frame) {
m_tryRenderFrameCallCount++;
if (!m_initialized || !m_tryRenderFrameResult) {
return false;
}
// Store frame for test verification
Vav2Player::VideoFrame frameCopy;
CopyFrame(frame, frameCopy);
m_renderedFrames.push_back(std::move(frameCopy));
// Simulate rendering delay if configured
SimulateRenderDelay();
return true;
}
HRESULT MockVideoRenderer::Present() {
m_presentCallCount++;
if (!m_initialized) {
return E_FAIL;
}
return m_presentResult;
}
HRESULT MockVideoRenderer::Resize(uint32_t width, uint32_t height) {
m_resizeCallCount++;
if (!m_initialized) {
return E_FAIL;
}
if (FAILED(m_resizeResult)) {
return m_resizeResult;
}
m_width = width;
m_height = height;
return S_OK;
}
uint32_t MockVideoRenderer::GetWidth() const {
return m_width;
}
uint32_t MockVideoRenderer::GetHeight() const {
return m_height;
}
void MockVideoRenderer::SetAspectFitMode(bool enabled) {
m_aspectFitEnabled = enabled;
}
void MockVideoRenderer::UpdateContainerSize(uint32_t container_width, uint32_t container_height) {
m_containerWidth = container_width;
m_containerHeight = container_height;
}
// Mock control methods
void MockVideoRenderer::SetInitializeResult(HRESULT result) {
m_initializeResult = result;
}
void MockVideoRenderer::SetRenderFrameResult(HRESULT result) {
m_renderFrameResult = result;
}
void MockVideoRenderer::SetTryRenderFrameResult(bool success) {
m_tryRenderFrameResult = success;
}
void MockVideoRenderer::SetPresentResult(HRESULT result) {
m_presentResult = result;
}
void MockVideoRenderer::SetResizeResult(HRESULT result) {
m_resizeResult = result;
}
void MockVideoRenderer::SimulateInitializationFailure(bool fail) {
m_initializeResult = fail ? E_FAIL : S_OK;
}
void MockVideoRenderer::SimulateRenderingFailure(bool fail) {
m_renderFrameResult = fail ? E_FAIL : S_OK;
m_tryRenderFrameResult = !fail;
}
// Private helper methods
void MockVideoRenderer::CopyFrame(const Vav2Player::VideoFrame& source, Vav2Player::VideoFrame& dest) {
dest.width = source.width;
dest.height = source.height;
dest.format = source.format;
dest.color_space = source.color_space;
dest.timestamp_ns = source.timestamp_ns;
dest.frame_index = source.frame_index;
// Copy stride information
dest.y_stride = source.y_stride;
dest.u_stride = source.u_stride;
dest.v_stride = source.v_stride;
// Copy Y plane
if (source.y_plane && source.y_stride > 0 && source.height > 0) {
size_t y_size = static_cast<size_t>(source.y_stride) * source.height;
dest.y_plane = std::make_unique<uint8_t[]>(y_size);
std::memcpy(dest.y_plane.get(), source.y_plane.get(), y_size);
}
// Copy U plane
if (source.u_plane && source.u_stride > 0 && source.height > 0) {
size_t u_size = static_cast<size_t>(source.u_stride) * (source.height / 2); // YUV420 assumption
dest.u_plane = std::make_unique<uint8_t[]>(u_size);
std::memcpy(dest.u_plane.get(), source.u_plane.get(), u_size);
}
// Copy V plane
if (source.v_plane && source.v_stride > 0 && source.height > 0) {
size_t v_size = static_cast<size_t>(source.v_stride) * (source.height / 2); // YUV420 assumption
dest.v_plane = std::make_unique<uint8_t[]>(v_size);
std::memcpy(dest.v_plane.get(), source.v_plane.get(), v_size);
}
}
void MockVideoRenderer::SimulateRenderDelay() {
if (m_renderDelayMs > 0) {
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::milliseconds(m_renderDelayMs));
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
m_totalRenderTimeMs += static_cast<uint64_t>(duration.count());
}
}
} // namespace Vav2PlayerUnitTests