AMF
AMF copied to clipboard
[Bug]: RX Vega HEVC encoder responds that it supports PreAnalysis but fails when set.
Describe the bug
When AMF_VIDEO_ENCODER_HEVC_CAP_PRE_ANALYSIS is queried from AMFVideoEncoder_HEVC component to the GetCaps object, TRUE is returned.
AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE operation on the AMFVideoEncoder_HEVC component returns AMF_INVALID_ARG.
To Reproduce Steps to reproduce the behavior:
- Apply the following patches
diff --git a/amf/public/samples/CPPSamples/CapabilityManager/CapabilityManager.cpp b/amf/public/samples/CPPSamples/CapabilityManager/CapabilityManager.cpp
index 1da0a16..f2ccb96 100644
--- a/amf/public/samples/CPPSamples/CapabilityManager/CapabilityManager.cpp
+++ b/amf/public/samples/CPPSamples/CapabilityManager/CapabilityManager.cpp
@@ -341,6 +341,18 @@ bool QueryEncoderForCodecHEVC(const wchar_t *componentID, amf::AMFContext* pCont
encoderCaps->GetProperty(AMF_VIDEO_ENCODER_HEVC_CAP_NUM_OF_STREAMS, &maxNumOfStreams);
std::wcout << L"\t\tMax Number of streams supported:" << maxNumOfStreams << std::endl;
+ amf_bool supportPreAnalysis;
+ encoderCaps->GetProperty(AMF_VIDEO_ENCODER_HEVC_CAP_PRE_ANALYSIS, &supportPreAnalysis);
+ std::wcout << L"\t\tPreAnalysis supported:";
+ if (supportPreAnalysis)
+ {
+ std::wcout << L"Yes" << std::endl;
+ }
+ else
+ {
+ std::wcout << L"No" << std::endl;
+ }
+
std::wcout << L"\t\tEncoder input:\n";
amf::AMFIOCapsPtr inputCaps;
if (encoderCaps->GetInputCaps(&inputCaps) == AMF_OK)
diff --git a/amf/public/samples/CPPSamples/SimpleEncoder/SimpleEncoder.cpp b/amf/public/samples/CPPSamples/SimpleEncoder/SimpleEncoder.cpp
index 3cbda9f..25bc814 100644
--- a/amf/public/samples/CPPSamples/SimpleEncoder/SimpleEncoder.cpp
+++ b/amf/public/samples/CPPSamples/SimpleEncoder/SimpleEncoder.cpp
@@ -65,7 +65,7 @@ static const amf::AMF_SURFACE_FORMAT efcSurfaceFormat[] = {
amf::AMF_SURFACE_R10G10B10A2,
amf::AMF_SURFACE_RGBA_F16 };
-static const int codecIndex = 0; // set to 0 for AVC, 1 for HEVC, 2 for AV1
+static const int codecIndex = 1; // set to 0 for AVC, 1 for HEVC, 2 for AV1
static_assert(!bEnable10bit || codecIndex != 0, "HEVC or AV1 required for 10 bit");
static const wchar_t* pCodecNames[] = { AMFVideoEncoderVCE_AVC, AMFVideoEncoder_HEVC, AMFVideoEncoder_AV1 };
static const wchar_t* fileNames[] = { L"./output.h264", L"./output.h265", L"./output.av1" };
diff --git a/amf/public/samples/CPPSamples/common/MiscHelpers.cpp b/amf/public/samples/CPPSamples/common/MiscHelpers.cpp
index cfc923e..af4cce5 100644
--- a/amf/public/samples/CPPSamples/common/MiscHelpers.cpp
+++ b/amf/public/samples/CPPSamples/common/MiscHelpers.cpp
@@ -178,6 +178,8 @@ AMF_RESULT SetEncoderDefaultsHEVC(amf::AMFComponent* pEncoder, amf_int64 bitRate
res = pEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_LOWLATENCY_MODE, true);
AMF_RETURN_IF_FAILED(res, L"SetProperty(AMF_VIDEO_ENCODER_HEVC_LOWLATENCY_MODE, true) failed");
}
+ res = pEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE, true);
+ AMF_RETURN_IF_FAILED(res, L"SetProperty(AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE, true) failed");
return AMF_OK;
}
- Build amf/public/samples/CPPSamples_vs2019.sln
- Run
CapabilityManager.exeand checkAMFVideoEncoderHW_HEVCoutput. - Run
SimpleEncoder.exe
Setup (please complete the following information):
- OS: Windows 11 22H2
- Driver Version 23.8.2
- GPU RX Vega
- Which component has the issue Encoder
Debug Log (please upload or paste):
2023-09-06 15:19:19.240 8BE0 [AMFEncoderHEVC] Warning: SetProperty HevcEnablePreAnalysis not found
2023-09-06 15:19:19.240 8BE0 [MiscHelpers] Error: D:\src\AMF\amf\public\samples\CPPSamples\common\MiscHelpers.cpp(182):AMF_ERROR 4 : AMF_INVALID_ARG: SetProperty(AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE, true) failed
Expected behavior Capability returns the correct result. Probably unsupported.