Files
video-v1/vav2/Vav2Player/VavCore/src/Decoder/AdaptiveNVDECDecoder.h
2025-09-26 18:50:10 +09:00

101 lines
3.6 KiB
C++

#pragma once
#include "../Common/AdaptiveTypes.h"
#include <queue>
#include "NVDECAV1Decoder.h"
namespace VavCore {
// Enhanced NVDEC decoder with adaptive quality adjustment
class AdaptiveNVDECDecoder : public NVDECAV1Decoder {
public:
AdaptiveNVDECDecoder();
~AdaptiveNVDECDecoder() override;
// Enhanced initialization with adaptive features
bool Initialize(const VideoMetadata& metadata) override;
bool Initialize(const VideoMetadata& metadata, const AdaptiveConfig& config);
// Override decode with adaptive logic
bool DecodeFrame(const uint8_t* packet_data, size_t packet_size, VideoFrame& output_frame) override;
// Adaptive quality control
void SetQualityLevel(QualityLevel level);
QualityLevel GetCurrentQualityLevel() const { return m_currentQuality; }
// Performance monitoring
PerformanceMetrics GetPerformanceMetrics() const;
void UpdatePerformanceMetrics(double decode_time, double render_time);
// Manual override controls
void EnableAdaptiveMode(bool enable) { m_adaptiveEnabled = enable; }
void SetTargetFrameRate(double fps);
void ForceQualityAdjustment(); // Immediate adjustment trigger
// Configuration management
void UpdateConfig(const AdaptiveConfig& config) { m_config = config; }
AdaptiveConfig GetConfig() const { return m_config; }
private:
// Adaptive control state
QualityLevel m_currentQuality = QualityLevel::ULTRA;
QualityLevel m_targetQuality = QualityLevel::ULTRA;
AdaptiveConfig m_config;
// Performance monitoring
mutable std::mutex m_metricsMutex;
PerformanceMetrics m_metrics;
std::queue<double> m_recentDecodeTimes;
std::queue<double> m_recentRenderTimes;
// Adaptive decision making
std::atomic<bool> m_adaptiveEnabled{true};
uint32_t m_stableFrameCount = 0;
bool m_needsReconfiguration = false;
// Original video properties for scaling calculations
uint32_t m_originalWidth = 0;
uint32_t m_originalHeight = 0;
// Current scaled properties
uint32_t m_currentScaledWidth = 0;
uint32_t m_currentScaledHeight = 0;
// Adaptive logic methods
void AnalyzePerformanceAndAdjust();
bool ShouldAdjustQuality(double avgDecodeTime, double avgRenderTime);
QualityLevel DetermineOptimalQuality(double totalFrameTime);
// NVDEC reconfiguration methods
bool ReconfigureDecoder(uint32_t newWidth, uint32_t newHeight);
bool UpdateDecodeSurfaces(uint32_t newCount);
void CalculateScaledDimensions(QualityLevel quality, uint32_t& width, uint32_t& height);
// Performance calculation helpers
void UpdateMovingAverage(std::queue<double>& queue, double newValue, size_t maxSize = 30);
double CalculateMovingAverage(const std::queue<double>& queue) const;
// Quality level utilities
static double GetQualityScaleFactor(QualityLevel level);
static std::string QualityLevelToString(QualityLevel level);
};
// Utility functions for adaptive decoding
namespace AdaptiveUtils {
// Performance estimation
double EstimateOptimalFrameRate(const PerformanceMetrics& metrics);
QualityLevel RecommendQualityForTargetFPS(double targetFPS, double currentFPS);
// System resource monitoring
double GetCurrentCPUUsage();
double GetCurrentGPUUsage();
size_t GetAvailableGPUMemory();
// Configuration presets
AdaptiveConfig CreateConfigForTarget(double targetFPS);
AdaptiveConfig GetConservativeConfig(); // Aggressive quality reduction
AdaptiveConfig GetBalancedConfig(); // Balanced performance/quality
AdaptiveConfig GetQualityConfig(); // Prioritize quality over performance
}
} // namespace VavCore