ObjC: Fix quality scaling for injected encoders
We missed to implement quality scaling in the original CL https://codereview.webrtc.org/2977213002/. This CL implements it. Note that the ObjC interface for scalingSettings is slightly different from the C++ interface in that we require explicit QP thresholds to turn quality scaling on, i.e. we don't provide default values. I think this is more modular as we want to move codec specific knowledge out from the WebRTC core. I would like to update the C++ webrtc::VideoEncoder interface to do the same in another CL. BUG=webrtc:7924 Review-Url: https://codereview.webrtc.org/2991123002 Cr-Commit-Position: refs/heads/master@{#19202}
This commit is contained in:
@ -54,3 +54,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation RTCVideoEncoderQpThresholds
|
||||||
|
|
||||||
|
@synthesize low = _low;
|
||||||
|
@synthesize high = _high;
|
||||||
|
|
||||||
|
- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high {
|
||||||
|
if (self = [super init]) {
|
||||||
|
_low = low;
|
||||||
|
_high = high;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|||||||
@ -27,6 +27,11 @@ const size_t kDefaultPayloadSize = 1440;
|
|||||||
|
|
||||||
const char kHighProfileExperiment[] = "WebRTC-H264HighProfile";
|
const char kHighProfileExperiment[] = "WebRTC-H264HighProfile";
|
||||||
|
|
||||||
|
// These thresholds deviate from the default h264 QP thresholds, as they have been found to work
|
||||||
|
// better on devices that support VideoToolbox
|
||||||
|
const int kLowH264QpThreshold = 28;
|
||||||
|
const int kHighH264QpThreshold = 39;
|
||||||
|
|
||||||
bool IsHighProfileEnabled() {
|
bool IsHighProfileEnabled() {
|
||||||
return webrtc::field_trial::IsEnabled(kHighProfileExperiment);
|
return webrtc::field_trial::IsEnabled(kHighProfileExperiment);
|
||||||
}
|
}
|
||||||
@ -171,6 +176,11 @@ class H264VideoToolboxDecodeCompleteCallback : public webrtc::DecodedImageCallba
|
|||||||
return _videoToolboxEncoder->SetRates(bitrateKbit, framerate) == WEBRTC_VIDEO_CODEC_OK;
|
return _videoToolboxEncoder->SetRates(bitrateKbit, framerate) == WEBRTC_VIDEO_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (RTCVideoEncoderQpThresholds *)scalingSettings {
|
||||||
|
return [[RTCVideoEncoderQpThresholds alloc] initWithThresholdsLow:kLowH264QpThreshold
|
||||||
|
high:kHighH264QpThreshold];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// Decoder.
|
// Decoder.
|
||||||
|
|||||||
@ -757,6 +757,8 @@ void H264VideoToolboxEncoder::OnEncodedFrame(
|
|||||||
bitrate_adjuster_.Update(frame._length);
|
bitrate_adjuster_.Update(frame._length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(magjed): This function is not used by RTCVideoEncoderH264, but this whole file will be
|
||||||
|
// removed soon and inlined as ObjC.
|
||||||
VideoEncoder::ScalingSettings H264VideoToolboxEncoder::GetScalingSettings()
|
VideoEncoder::ScalingSettings H264VideoToolboxEncoder::GetScalingSettings()
|
||||||
const {
|
const {
|
||||||
return VideoEncoder::ScalingSettings(true, internal::kLowH264QpThreshold,
|
return VideoEncoder::ScalingSettings(true, internal::kLowH264QpThreshold,
|
||||||
|
|||||||
@ -111,6 +111,13 @@ class ObjCVideoEncoder : public VideoEncoder {
|
|||||||
|
|
||||||
bool SupportsNativeHandle() const { return true; }
|
bool SupportsNativeHandle() const { return true; }
|
||||||
|
|
||||||
|
VideoEncoder::ScalingSettings GetScalingSettings() const {
|
||||||
|
RTCVideoEncoderQpThresholds* qp_thresholds = [encoder_ scalingSettings];
|
||||||
|
return qp_thresholds ?
|
||||||
|
ScalingSettings(true /* enabled */, qp_thresholds.low, qp_thresholds.high) :
|
||||||
|
ScalingSettings(false /* enabled */);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
id<RTCVideoEncoder> encoder_;
|
id<RTCVideoEncoder> encoder_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -104,6 +104,17 @@ RTC_EXPORT
|
|||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/** QP thresholds for encoder. Corresponds to webrtc::VideoEncoder::QpThresholds. */
|
||||||
|
RTC_EXPORT
|
||||||
|
@interface RTCVideoEncoderQpThresholds : NSObject
|
||||||
|
|
||||||
|
- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high;
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) NSInteger low;
|
||||||
|
@property(nonatomic, readonly) NSInteger high;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
/** Protocol for encoder implementations. */
|
/** Protocol for encoder implementations. */
|
||||||
RTC_EXPORT
|
RTC_EXPORT
|
||||||
@protocol RTCVideoEncoder <NSObject>
|
@protocol RTCVideoEncoder <NSObject>
|
||||||
@ -118,6 +129,13 @@ RTC_EXPORT
|
|||||||
frameTypes:(NSArray<NSNumber *> *)frameTypes;
|
frameTypes:(NSArray<NSNumber *> *)frameTypes;
|
||||||
- (BOOL)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate;
|
- (BOOL)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate;
|
||||||
|
|
||||||
|
/** Returns QP scaling settings for encoder. The quality scaler adjusts the resolution in order to
|
||||||
|
* keep the QP from the encoded images within the given range. Returning nil from this function
|
||||||
|
* disables quality scaling. */
|
||||||
|
- (RTCVideoEncoderQpThresholds *)scalingSettings;
|
||||||
|
|
||||||
|
// TODO(andersc): Add implementationName method.
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
/** Protocol for decoder implementations. */
|
/** Protocol for decoder implementations. */
|
||||||
@ -135,6 +153,8 @@ RTC_EXPORT
|
|||||||
codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info
|
codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info
|
||||||
renderTimeMs:(int64_t)renderTimeMs;
|
renderTimeMs:(int64_t)renderTimeMs;
|
||||||
|
|
||||||
|
// TODO(andersc): Add implementationName method.
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|||||||
Reference in New Issue
Block a user