Bug 1765898. Expose GetEncoderInfo() for out of tree encoders. r=bwc

The Qp thresholds are taken from h264_encoder_impl.cc

Adding a ScalingSettings for WebrtcGmpVideoEncoder will enable the quality
scaler for WebrtcGmpVideoEncoder which will fix the resolution not being
changed at low bitrates.

Differential Revision: https://phabricator.services.mozilla.com/D144485
This commit is contained in:
Jeff Muizelaar 2022-04-27 19:35:13 +00:00
parent 09a4cd7a93
commit 00d62a96a1
4 changed files with 34 additions and 0 deletions

View File

@ -24,6 +24,10 @@
namespace mozilla {
// QP scaling thresholds.
static const int kLowH264QpThreshold = 24;
static const int kHighH264QpThreshold = 37;
// Encoder.
WebrtcGmpVideoEncoder::WebrtcGmpVideoEncoder(std::string aPCHandle)
: mGMP(nullptr),
@ -459,6 +463,18 @@ int32_t WebrtcGmpVideoEncoder::SetRates(
return WEBRTC_VIDEO_CODEC_OK;
}
WebrtcVideoEncoder::EncoderInfo WebrtcGmpVideoEncoder::GetEncoderInfo() const {
WebrtcVideoEncoder::EncoderInfo info;
info.supports_native_handle = false;
info.implementation_name = "GMPOpenH264";
info.scaling_settings =
WebrtcVideoEncoder::ScalingSettings(kLowH264QpThreshold, kHighH264QpThreshold);
info.is_hardware_accelerated = false;
info.supports_simulcast = false;
return info;
}
/* static */
int32_t WebrtcGmpVideoEncoder::SetRates_g(RefPtr<WebrtcGmpVideoEncoder> aThis,
uint32_t aNewBitRateKbps,

View File

@ -145,6 +145,8 @@ class RefCountedWebrtcVideoEncoder {
virtual MediaEventSource<uint64_t>* ReleasePluginEvent() = 0;
virtual WebrtcVideoEncoder::EncoderInfo GetEncoderInfo() const = 0;
protected:
virtual ~RefCountedWebrtcVideoEncoder() = default;
};
@ -171,6 +173,8 @@ class WebrtcGmpVideoEncoder : public GMPVideoEncoderCallbackProxy,
int32_t SetRates(
const webrtc::VideoEncoder::RateControlParameters& aParameters) override;
WebrtcVideoEncoder::EncoderInfo GetEncoderInfo() const override;
MediaEventSource<uint64_t>* InitPluginEvent() override {
return &mInitPluginEvent;
}
@ -341,6 +345,10 @@ class WebrtcVideoEncoderProxy : public WebrtcVideoEncoder {
mEncoderImpl->SetRates(aParameters);
}
EncoderInfo GetEncoderInfo() const override {
return mEncoderImpl->GetEncoderInfo();
}
private:
const RefPtr<RefCountedWebrtcVideoEncoder> mEncoderImpl;
};

View File

@ -261,6 +261,15 @@ already_AddRefed<MediaDataEncoder> WebrtcMediaDataEncoder::CreateEncoder(
return mFactory->CreateEncoder(params);
}
WebrtcVideoEncoder::EncoderInfo WebrtcMediaDataEncoder::GetEncoderInfo() const {
WebrtcVideoEncoder::EncoderInfo info;
info.supports_native_handle = false;
info.implementation_name = "MediaDataEncoder";
info.is_hardware_accelerated = false;
info.supports_simulcast = false;
return info;
}
int32_t WebrtcMediaDataEncoder::RegisterEncodeCompleteCallback(
webrtc::EncodedImageCallback* aCallback) {
MutexAutoLock lock(mCallbackMutex);

View File

@ -41,6 +41,7 @@ class WebrtcMediaDataEncoder : public RefCountedWebrtcVideoEncoder {
int32_t SetRates(
const webrtc::VideoEncoder::RateControlParameters& aParameters) override;
WebrtcVideoEncoder::EncoderInfo GetEncoderInfo() const override;
MediaEventSource<uint64_t>* InitPluginEvent() override { return nullptr; }
MediaEventSource<uint64_t>* ReleasePluginEvent() override { return nullptr; }