Skip to content

Commit c2cea14

Browse files
committed
EncoderConfig: introduce GetMaxBFrameCount
The default value for B Frame count is 3 but some implementation does not support B frames. Set the value to the max B Frame count supported by the implementation if it exceeds the value. Signed-off-by: Stéphane Cerveau <scerveau@igalia.com>
1 parent 41a88df commit c2cea14

6 files changed

+13
-0
lines changed

vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfig.h

+2
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,8 @@ struct EncoderConfig : public VkVideoRefCountBase {
618618
virtual int8_t InitDpbCount() { return 16; };
619619

620620
virtual bool InitRateControl();
621+
622+
virtual uint8_t GetMaxBFrameCount() { return 0;}
621623
};
622624

623625
// Create codec configuration for H.264 encoder

vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfigH264.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ VkResult EncoderConfigH264::InitDeviceCapabilities(const VulkanDeviceContext* vk
369369
std::cout << "\t\t\t" << "maxExtent: " << videoCapabilities.maxCodedExtent.width << " x " << videoCapabilities.maxCodedExtent.height << std::endl;
370370
std::cout << "\t\t\t" << "maxDpbSlots: " << videoCapabilities.maxDpbSlots << std::endl;
371371
std::cout << "\t\t\t" << "maxActiveReferencePictures: " << videoCapabilities.maxActiveReferencePictures << std::endl;
372+
std::cout << "\t\t\t" << "maxBPictureL0ReferenceCount: " << h264EncodeCapabilities.maxBPictureL0ReferenceCount << std::endl;
372373
}
373374

374375
return VK_SUCCESS;

vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfigH264.h

+2
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ struct EncoderConfigH264 : public EncoderConfig {
184184
// 2. First h.264 determine the rate control parameters
185185
virtual bool InitRateControl();
186186

187+
virtual uint8_t GetMaxBFrameCount() { return h264EncodeCapabilities.maxBPictureL0ReferenceCount; }
188+
187189
bool GetRateControlParameters(VkVideoEncodeRateControlInfoKHR *rcInfo,
188190
VkVideoEncodeRateControlLayerInfoKHR *pRcLayerInfo,
189191
VkVideoEncodeH264RateControlInfoKHR *rcInfoH264,

vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfigH265.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ VkResult EncoderConfigH265::InitDeviceCapabilities(const VulkanDeviceContext* vk
8989
std::cout << "\t\t\t" << "maxExtent: " << videoCapabilities.maxCodedExtent.width << " x " << videoCapabilities.maxCodedExtent.height << std::endl;
9090
std::cout << "\t\t\t" << "maxDpbSlots: " << videoCapabilities.maxDpbSlots << std::endl;
9191
std::cout << "\t\t\t" << "maxActiveReferencePictures: " << videoCapabilities.maxActiveReferencePictures << std::endl;
92+
std::cout << "\t\t\t" << "maxBPictureL0ReferenceCount: " << h265EncodeCapabilities.maxBPictureL0ReferenceCount << std::endl;
9293
}
9394

9495
return VK_SUCCESS;

vk_video_encoder/libs/VkVideoEncoder/VkEncoderConfigH265.h

+2
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ struct EncoderConfigH265 : public EncoderConfig {
158158
// 2. First h.265 determine the rate control parameters
159159
virtual bool InitRateControl();
160160

161+
virtual uint8_t GetMaxBFrameCount() { return h265EncodeCapabilities.maxBPictureL0ReferenceCount; }
162+
161163
bool GetRateControlParameters(VkVideoEncodeRateControlInfoKHR *rcInfo,
162164
VkVideoEncodeRateControlLayerInfoKHR *pRcLayerInfo,
163165
VkVideoEncodeH265RateControlInfoKHR *rcInfoH265,

vk_video_encoder/libs/VkVideoEncoder/VkVideoEncoder.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,11 @@ VkResult VkVideoEncoder::InitEncoder(VkSharedBaseObj<EncoderConfig>& encoderConf
359359
// specific GOP structure. For example it may not support B-frames.
360360
// gopStructure.Init() should be called after encoderConfig->InitDeviceCapabilities().
361361
m_encoderConfig->gopStructure.Init(m_encoderConfig->numFrames);
362+
if (encoderConfig->GetMaxBFrameCount() < m_encoderConfig->gopStructure.GetConsecutiveBFrameCount()) {
363+
std::cout << "Max consecutive B frames: " << (uint32_t)encoderConfig->GetMaxBFrameCount() << " lower than the configured one: " << (uint32_t)m_encoderConfig->gopStructure.GetConsecutiveBFrameCount() << std::endl;
364+
std::cout << "Fallback to the max value: " << (uint32_t)m_encoderConfig->gopStructure.GetConsecutiveBFrameCount() << std::endl;
365+
m_encoderConfig->gopStructure.SetConsecutiveBFrameCount(encoderConfig->GetMaxBFrameCount());
366+
}
362367
std::cout << std::endl << "GOP frame count: " << (uint32_t)m_encoderConfig->gopStructure.GetGopFrameCount();
363368
std::cout << ", IDR period: " << (uint32_t)m_encoderConfig->gopStructure.GetIdrPeriod();
364369
std::cout << ", Consecutive B frames: " << (uint32_t)m_encoderConfig->gopStructure.GetConsecutiveBFrameCount();

0 commit comments

Comments
 (0)