diff --git a/vav2/Vav2Player/Vav2Player/Vav2Player.vcxproj b/vav2/Vav2Player/Vav2Player/Vav2Player.vcxproj index 55a74a0..4e2faf7 100644 --- a/vav2/Vav2Player/Vav2Player/Vav2Player.vcxproj +++ b/vav2/Vav2Player/Vav2Player/Vav2Player.vcxproj @@ -149,8 +149,7 @@ - - + @@ -180,8 +179,7 @@ - - + diff --git a/vav2/Vav2Player/Vav2Player/VideoPlayerControl.xaml.cpp b/vav2/Vav2Player/Vav2Player/VideoPlayerControl.xaml.cpp index 80ddd20..bce4a96 100644 --- a/vav2/Vav2Player/Vav2Player/VideoPlayerControl.xaml.cpp +++ b/vav2/Vav2Player/Vav2Player/VideoPlayerControl.xaml.cpp @@ -11,7 +11,7 @@ #include #include #include -#include "headless/AV1Decoder_Headless.h" +#include "src/Decoder/AV1Decoder.h" #include "src/Rendering/SimpleGPURenderer.h" #include "src/Common/VideoTypes.h" #include "src/FileIO/WebMFileReader.h" diff --git a/vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.cpp b/vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.cpp similarity index 88% rename from vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.cpp rename to vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.cpp index 797f6d8..f2a684c 100644 --- a/vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.cpp +++ b/vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.cpp @@ -1,5 +1,5 @@ #include "pch.h" -#include "AV1Decoder_Headless.h" +#include "AV1Decoder.h" #include #include @@ -10,7 +10,7 @@ static void DummyFreeCallback(const uint8_t* data, void* user_data) { // Do nothing - packet data is managed externally } -AV1Decoder_Headless::AV1Decoder_Headless() +AV1Decoder::AV1Decoder() : m_dav1d_context(nullptr) , m_initialized(false) { // Initialize default AV1 settings @@ -20,11 +20,11 @@ AV1Decoder_Headless::AV1Decoder_Headless() m_av1_settings.all_layers = false; } -AV1Decoder_Headless::~AV1Decoder_Headless() { +AV1Decoder::~AV1Decoder() { Cleanup(); } -bool AV1Decoder_Headless::Initialize(const VideoMetadata& metadata) { +bool AV1Decoder::Initialize(const VideoMetadata& metadata) { if (m_initialized) { LogError("Decoder already initialized"); return false; @@ -61,7 +61,7 @@ bool AV1Decoder_Headless::Initialize(const VideoMetadata& metadata) { return true; } -void AV1Decoder_Headless::Cleanup() { +void AV1Decoder::Cleanup() { if (m_dav1d_context) { dav1d_close(&m_dav1d_context); m_dav1d_context = nullptr; @@ -69,11 +69,11 @@ void AV1Decoder_Headless::Cleanup() { m_initialized = false; } -bool AV1Decoder_Headless::IsInitialized() const { +bool AV1Decoder::IsInitialized() const { return m_initialized; } -bool AV1Decoder_Headless::DecodeFrame(const VideoPacket& input_packet, VideoFrame& output_frame) { +bool AV1Decoder::DecodeFrame(const VideoPacket& input_packet, VideoFrame& output_frame) { if (!input_packet.IsValid()) { LogError("Invalid input packet"); return false; @@ -82,7 +82,7 @@ bool AV1Decoder_Headless::DecodeFrame(const VideoPacket& input_packet, VideoFram return DecodeFrame(input_packet.data.get(), input_packet.size, output_frame); } -bool AV1Decoder_Headless::DecodeFrame(const uint8_t* packet_data, size_t packet_size, VideoFrame& output_frame) { +bool AV1Decoder::DecodeFrame(const uint8_t* packet_data, size_t packet_size, VideoFrame& output_frame) { if (!m_initialized || !packet_data || packet_size == 0) { LogError("Invalid parameters or decoder not initialized"); return false; @@ -134,7 +134,7 @@ bool AV1Decoder_Headless::DecodeFrame(const uint8_t* packet_data, size_t packet_ return true; } -bool AV1Decoder_Headless::DecodeFrameZeroCopy(const uint8_t* packet_data, size_t packet_size, VideoFrame& output_frame) { +bool AV1Decoder::DecodeFrameZeroCopy(const uint8_t* packet_data, size_t packet_size, VideoFrame& output_frame) { if (!m_initialized || !packet_data || packet_size == 0) { LogError("Invalid parameters or decoder not initialized"); return false; @@ -184,7 +184,7 @@ bool AV1Decoder_Headless::DecodeFrameZeroCopy(const uint8_t* packet_data, size_t return true; } -bool AV1Decoder_Headless::Reset() { +bool AV1Decoder::Reset() { if (!m_initialized) { return false; } @@ -193,7 +193,7 @@ bool AV1Decoder_Headless::Reset() { return true; } -bool AV1Decoder_Headless::Flush() { +bool AV1Decoder::Flush() { if (!m_initialized) { return false; } @@ -202,7 +202,7 @@ bool AV1Decoder_Headless::Flush() { return true; } -bool AV1Decoder_Headless::ConvertDav1dPicture(const Dav1dPicture& dav1d_picture, VideoFrame& output_frame) { +bool AV1Decoder::ConvertDav1dPicture(const Dav1dPicture& dav1d_picture, VideoFrame& output_frame) { // Allocate YUV420P frame if (!output_frame.AllocateYUV420P(dav1d_picture.p.w, dav1d_picture.p.h)) { LogError("Failed to allocate VideoFrame"); @@ -240,17 +240,17 @@ bool AV1Decoder_Headless::ConvertDav1dPicture(const Dav1dPicture& dav1d_picture, return true; } -void AV1Decoder_Headless::UpdateDecodingStats(double decode_time_ms, size_t packet_size) { +void AV1Decoder::UpdateDecodingStats(double decode_time_ms, size_t packet_size) { m_stats.total_frames_decoded++; m_stats.total_bytes_processed += packet_size; m_stats.total_decode_time_ms += decode_time_ms; } -void AV1Decoder_Headless::LogError(const std::string& message) { +void AV1Decoder::LogError(const std::string& message) { std::cout << "[AV1Decoder_Headless ERROR] " << message << std::endl; } -void AV1Decoder_Headless::ApplyOptimalSettingsForResolution(uint32_t width, uint32_t height) { +void AV1Decoder::ApplyOptimalSettingsForResolution(uint32_t width, uint32_t height) { // Apply resolution-based optimizations AV1Settings settings = m_av1_settings; diff --git a/vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.h b/vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.h similarity index 89% rename from vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.h rename to vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.h index 9070dc6..f804c08 100644 --- a/vav2/Vav2Player/Vav2Player/headless/AV1Decoder_Headless.h +++ b/vav2/Vav2Player/Vav2Player/src/Decoder/AV1Decoder.h @@ -1,20 +1,20 @@ #pragma once -#include "../src/Decoder/IVideoDecoder.h" +#include "IVideoDecoder.h" #include #include #include namespace Vav2Player { -// Headless version of AV1Decoder with GPU methods removed -class AV1Decoder_Headless : public IVideoDecoder { +// AV1 decoder using dav1d library +class AV1Decoder : public IVideoDecoder { public: - AV1Decoder_Headless(); - ~AV1Decoder_Headless() override; + AV1Decoder(); + ~AV1Decoder() override; // Prevent copying - AV1Decoder_Headless(const AV1Decoder_Headless&) = delete; - AV1Decoder_Headless& operator=(const AV1Decoder_Headless&) = delete; + AV1Decoder(const AV1Decoder&) = delete; + AV1Decoder& operator=(const AV1Decoder&) = delete; // IVideoDecoder interface implementation bool Initialize(const VideoMetadata& metadata) override; diff --git a/vav2/Vav2Player/Vav2Player/src/Decoder/VideoDecoderFactory.cpp b/vav2/Vav2Player/Vav2Player/src/Decoder/VideoDecoderFactory.cpp index 3b6eb78..f4fc0de 100644 --- a/vav2/Vav2Player/Vav2Player/src/Decoder/VideoDecoderFactory.cpp +++ b/vav2/Vav2Player/Vav2Player/src/Decoder/VideoDecoderFactory.cpp @@ -1,6 +1,6 @@ #include "pch.h" #include "VideoDecoderFactory.h" -#include "../../headless/AV1Decoder_Headless.h" +#include "AV1Decoder.h" #include "MediaFoundationAV1Decoder.h" // #include "VP9Decoder.h" // TODO: activate when VP9 implemented @@ -52,7 +52,7 @@ std::unique_ptr VideoDecoderFactory::CreateAV1Decoder(DecoderType case DecoderType::SOFTWARE: if (s_av1_available) { OutputDebugStringA("[VideoDecoderFactory] Creating software AV1 decoder (dav1d)\n"); - return std::make_unique(); + return std::make_unique(); } break; @@ -69,7 +69,7 @@ std::unique_ptr VideoDecoderFactory::CreateAV1Decoder(DecoderType // Fallback to dav1d when Media Foundation fails if (s_av1_available) { OutputDebugStringA("[VideoDecoderFactory] Auto mode: falling back to software AV1 decoder (dav1d)\n"); - return std::make_unique(); + return std::make_unique(); } break; }