Set Framerate in RTCVideoEncoderH264
This CL utilizes the input frame rate in the RTCVideoEncoderH264, by setting it into VT Property. The main purpose is to guide VT encoder to make correct decision of the encoded frame size. Bug: webrtc:10015 Change-Id: Id5c89f2876539f3181030f49b546326fc40b8ea3 Reviewed-on: https://webrtc-review.googlesource.com/c/111420 Commit-Queue: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25724}
This commit is contained in:
@ -284,6 +284,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
RTCVideoCodecInfo *_codecInfo;
|
RTCVideoCodecInfo *_codecInfo;
|
||||||
std::unique_ptr<webrtc::BitrateAdjuster> _bitrateAdjuster;
|
std::unique_ptr<webrtc::BitrateAdjuster> _bitrateAdjuster;
|
||||||
uint32_t _targetBitrateBps;
|
uint32_t _targetBitrateBps;
|
||||||
|
uint32_t _encoderFrameRate;
|
||||||
uint32_t _encoderBitrateBps;
|
uint32_t _encoderBitrateBps;
|
||||||
RTCH264PacketizationMode _packetizationMode;
|
RTCH264PacketizationMode _packetizationMode;
|
||||||
CFStringRef _profile;
|
CFStringRef _profile;
|
||||||
@ -333,6 +334,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
// We can only set average bitrate on the HW encoder.
|
// We can only set average bitrate on the HW encoder.
|
||||||
_targetBitrateBps = settings.startBitrate * 1000; // startBitrate is in kbps.
|
_targetBitrateBps = settings.startBitrate * 1000; // startBitrate is in kbps.
|
||||||
_bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
|
_bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
|
||||||
|
_encoderFrameRate = settings.maxFramerate;
|
||||||
|
|
||||||
// TODO(tkchin): Try setting payload size via
|
// TODO(tkchin): Try setting payload size via
|
||||||
// kVTCompressionPropertyKey_MaxH264SliceBytes.
|
// kVTCompressionPropertyKey_MaxH264SliceBytes.
|
||||||
@ -432,7 +434,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
encodeParams->codecSpecificInfo.packetizationMode = _packetizationMode;
|
encodeParams->codecSpecificInfo.packetizationMode = _packetizationMode;
|
||||||
|
|
||||||
// Update the bitrate if needed.
|
// Update the bitrate if needed.
|
||||||
[self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()];
|
[self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps() frameRate:_encoderFrameRate];
|
||||||
|
|
||||||
OSStatus status = VTCompressionSessionEncodeFrame(_compressionSession,
|
OSStatus status = VTCompressionSessionEncodeFrame(_compressionSession,
|
||||||
pixelBuffer,
|
pixelBuffer,
|
||||||
@ -468,7 +470,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate {
|
- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate {
|
||||||
_targetBitrateBps = 1000 * bitrateKbit;
|
_targetBitrateBps = 1000 * bitrateKbit;
|
||||||
_bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
|
_bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
|
||||||
[self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()];
|
[self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps() frameRate:framerate];
|
||||||
return WEBRTC_VIDEO_CODEC_OK;
|
return WEBRTC_VIDEO_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -616,7 +618,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_RealTime, true);
|
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_RealTime, true);
|
||||||
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_ProfileLevel, _profile);
|
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_ProfileLevel, _profile);
|
||||||
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AllowFrameReordering, false);
|
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AllowFrameReordering, false);
|
||||||
[self setEncoderBitrateBps:_targetBitrateBps];
|
[self setEncoderBitrateBps:_targetBitrateBps frameRate:_encoderFrameRate];
|
||||||
// TODO(tkchin): Look at entropy mode and colorspace matrices.
|
// TODO(tkchin): Look at entropy mode and colorspace matrices.
|
||||||
// TODO(tkchin): Investigate to see if there's any way to make this work.
|
// TODO(tkchin): Investigate to see if there's any way to make this work.
|
||||||
// May need it to interop with Android. Currently this call just fails.
|
// May need it to interop with Android. Currently this call just fails.
|
||||||
@ -644,15 +646,17 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
return @"VideoToolbox";
|
return @"VideoToolbox";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setBitrateBps:(uint32_t)bitrateBps {
|
- (void)setBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate {
|
||||||
if (_encoderBitrateBps != bitrateBps) {
|
if (_encoderBitrateBps != bitrateBps || _encoderFrameRate != frameRate) {
|
||||||
[self setEncoderBitrateBps:bitrateBps];
|
[self setEncoderBitrateBps:bitrateBps frameRate:frameRate];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setEncoderBitrateBps:(uint32_t)bitrateBps {
|
- (void)setEncoderBitrateBps:(uint32_t)bitrateBps frameRate:(uint32_t)frameRate {
|
||||||
if (_compressionSession) {
|
if (_compressionSession) {
|
||||||
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AverageBitRate, bitrateBps);
|
SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AverageBitRate, bitrateBps);
|
||||||
|
SetVTSessionProperty(
|
||||||
|
_compressionSession, kVTCompressionPropertyKey_ExpectedFrameRate, frameRate);
|
||||||
|
|
||||||
// TODO(tkchin): Add a helper method to set array value.
|
// TODO(tkchin): Add a helper method to set array value.
|
||||||
int64_t dataLimitBytesPerSecondValue =
|
int64_t dataLimitBytesPerSecondValue =
|
||||||
@ -680,6 +684,7 @@ CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_encoderBitrateBps = bitrateBps;
|
_encoderBitrateBps = bitrateBps;
|
||||||
|
_encoderFrameRate = frameRate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user