WIP
This commit is contained in:
@@ -745,6 +745,13 @@ bool MediaCodecAV1Decoder::InitializeMediaCodec() {
|
|||||||
AMediaFormat_setInt32(m_format, AMEDIAFORMAT_KEY_COLOR_FORMAT, 0x7F420888);
|
AMediaFormat_setInt32(m_format, AMEDIAFORMAT_KEY_COLOR_FORMAT, 0x7F420888);
|
||||||
LogInfo("Set MediaCodec output format: COLOR_FormatYUV420Flexible (0x7F420888)");
|
LogInfo("Set MediaCodec output format: COLOR_FormatYUV420Flexible (0x7F420888)");
|
||||||
|
|
||||||
|
// CRITICAL: Set color space parameters for correct YUV interpretation
|
||||||
|
// Most HD videos use BT.709 color standard with studio range (16-235)
|
||||||
|
// COLOR_STANDARD_BT709 = 1, COLOR_RANGE_LIMITED = 2
|
||||||
|
AMediaFormat_setInt32(m_format, "color-standard", 1); // BT.709
|
||||||
|
AMediaFormat_setInt32(m_format, "color-range", 2); // Limited/Studio range
|
||||||
|
LogInfo("Set MediaCodec color space: BT.709 + Limited range");
|
||||||
|
|
||||||
// Set codec specific data (csd-0) - CRITICAL for AV1 decoding
|
// Set codec specific data (csd-0) - CRITICAL for AV1 decoding
|
||||||
// This contains the AV1 sequence header from WebM CodecPrivate
|
// This contains the AV1 sequence header from WebM CodecPrivate
|
||||||
if (!m_codec_private_data.empty()) {
|
if (!m_codec_private_data.empty()) {
|
||||||
|
|||||||
@@ -288,6 +288,35 @@ bool MediaCodecSurfaceManager::CreateVulkanImage(void* vk_device, void* vk_insta
|
|||||||
LogInfo("AHardwareBuffer desc: " + std::to_string(ahb_desc.width) + "x" +
|
LogInfo("AHardwareBuffer desc: " + std::to_string(ahb_desc.width) + "x" +
|
||||||
std::to_string(ahb_desc.height) + " format=" + std::to_string(ahb_desc.format));
|
std::to_string(ahb_desc.height) + " format=" + std::to_string(ahb_desc.format));
|
||||||
|
|
||||||
|
// DEBUG: Lock AHardwareBuffer and read first few pixels to verify data format
|
||||||
|
#ifdef _DEBUG
|
||||||
|
static int debug_frame_count = 0;
|
||||||
|
if (debug_frame_count < 3) { // Only log first 3 frames
|
||||||
|
void* data = nullptr;
|
||||||
|
int ret = AHardwareBuffer_lock(ahb, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &data);
|
||||||
|
if (ret == 0 && data != nullptr) {
|
||||||
|
uint8_t* pixels = static_cast<uint8_t*>(data);
|
||||||
|
|
||||||
|
// Sample pixel at (100, 100) - should be in sky (red in correct image)
|
||||||
|
uint32_t offset_y = 100 * ahb_desc.stride + 100;
|
||||||
|
uint32_t offset_uv = (ahb_desc.width * ahb_desc.height) + (50 * ahb_desc.stride) + 100; // NV12 UV plane
|
||||||
|
|
||||||
|
LogInfo("=== PIXEL DATA DEBUG (frame " + std::to_string(debug_frame_count) + ") ===");
|
||||||
|
LogInfo(" Pixel (100,100) Y plane:");
|
||||||
|
LogInfo(" pixels[" + std::to_string(offset_y) + "] = " + std::to_string((int)pixels[offset_y]));
|
||||||
|
LogInfo(" Pixel (50,50) UV plane (chroma):");
|
||||||
|
LogInfo(" pixels[" + std::to_string(offset_uv) + "] = " + std::to_string((int)pixels[offset_uv]) + " (U)");
|
||||||
|
LogInfo(" pixels[" + std::to_string(offset_uv + 1) + "] = " + std::to_string((int)pixels[offset_uv + 1]) + " (V)");
|
||||||
|
LogInfo(" stride: " + std::to_string(ahb_desc.stride));
|
||||||
|
|
||||||
|
AHardwareBuffer_unlock(ahb, nullptr);
|
||||||
|
debug_frame_count++;
|
||||||
|
} else {
|
||||||
|
LogError("Failed to lock AHardwareBuffer for pixel inspection: " + std::to_string(ret));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Step 2: Query Android Hardware Buffer properties for Vulkan
|
// Step 2: Query Android Hardware Buffer properties for Vulkan
|
||||||
VkAndroidHardwareBufferFormatPropertiesANDROID ahb_format_props = {};
|
VkAndroidHardwareBufferFormatPropertiesANDROID ahb_format_props = {};
|
||||||
ahb_format_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
|
ahb_format_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
|
||||||
|
|||||||
Reference in New Issue
Block a user