Remove webrtc::Video from H264 encoder internals
This CL replaces the use of webrtc::Video as an internal variable in the H.264 encoder with the specific fields that are used by this encoder. In support of refactorings discussed around: BUG=600254 Review-Url: https://codereview.webrtc.org/2468903003 Cr-Commit-Position: refs/heads/master@{#14887}
This commit is contained in:
@ -203,9 +203,20 @@ int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings,
|
|||||||
// else WELS_LOG_DEFAULT is used by default.
|
// else WELS_LOG_DEFAULT is used by default.
|
||||||
|
|
||||||
number_of_cores_ = number_of_cores;
|
number_of_cores_ = number_of_cores;
|
||||||
codec_settings_ = *codec_settings;
|
// Set internal settings from codec_settings
|
||||||
if (codec_settings_.targetBitrate == 0)
|
width_ = codec_settings->width;
|
||||||
codec_settings_.targetBitrate = codec_settings_.startBitrate;
|
height_ = codec_settings->height;
|
||||||
|
max_frame_rate_ = static_cast<float>(codec_settings->maxFramerate);
|
||||||
|
mode_ = codec_settings->mode;
|
||||||
|
frame_dropping_on_ = codec_settings->H264().frameDroppingOn;
|
||||||
|
key_frame_interval_ = codec_settings->H264().keyFrameInterval;
|
||||||
|
|
||||||
|
// Codec_settings uses kbits/second; encoder uses bits/second.
|
||||||
|
max_bits_per_second_ = codec_settings->maxBitrate * 1000;
|
||||||
|
if (codec_settings->targetBitrate == 0)
|
||||||
|
target_bits_per_second_ = codec_settings->startBitrate * 1000;
|
||||||
|
else
|
||||||
|
target_bits_per_second_ = codec_settings->targetBitrate * 1000;
|
||||||
|
|
||||||
SEncParamExt encoder_params = CreateEncoderParams();
|
SEncParamExt encoder_params = CreateEncoderParams();
|
||||||
// Initialize.
|
// Initialize.
|
||||||
@ -216,16 +227,16 @@ int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings,
|
|||||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
// TODO(pbos): Base init params on these values before submitting.
|
// TODO(pbos): Base init params on these values before submitting.
|
||||||
quality_scaler_.Init(codec_settings_.codecType, codec_settings_.startBitrate,
|
quality_scaler_.Init(codec_settings->codecType, codec_settings->startBitrate,
|
||||||
codec_settings_.width, codec_settings_.height,
|
codec_settings->width, codec_settings->height,
|
||||||
codec_settings_.maxFramerate);
|
codec_settings->maxFramerate);
|
||||||
int video_format = EVideoFormatType::videoFormatI420;
|
int video_format = EVideoFormatType::videoFormatI420;
|
||||||
openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT,
|
openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT,
|
||||||
&video_format);
|
&video_format);
|
||||||
|
|
||||||
// Initialize encoded image. Default buffer size: size of unencoded data.
|
// Initialize encoded image. Default buffer size: size of unencoded data.
|
||||||
encoded_image_._size = CalcBufferSize(
|
encoded_image_._size =
|
||||||
kI420, codec_settings_.width, codec_settings_.height);
|
CalcBufferSize(kI420, codec_settings->width, codec_settings->height);
|
||||||
encoded_image_._buffer = new uint8_t[encoded_image_._size];
|
encoded_image_._buffer = new uint8_t[encoded_image_._size];
|
||||||
encoded_image_buffer_.reset(encoded_image_._buffer);
|
encoded_image_buffer_.reset(encoded_image_._buffer);
|
||||||
encoded_image_._completeFrame = true;
|
encoded_image_._completeFrame = true;
|
||||||
@ -256,19 +267,17 @@ int32_t H264EncoderImpl::SetRates(uint32_t bitrate, uint32_t framerate) {
|
|||||||
if (bitrate <= 0 || framerate <= 0) {
|
if (bitrate <= 0 || framerate <= 0) {
|
||||||
return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
|
return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
|
||||||
}
|
}
|
||||||
codec_settings_.targetBitrate = bitrate;
|
target_bits_per_second_ = bitrate * 1000;
|
||||||
codec_settings_.maxFramerate = framerate;
|
max_frame_rate_ = static_cast<float>(framerate);
|
||||||
quality_scaler_.ReportFramerate(framerate);
|
quality_scaler_.ReportFramerate(framerate);
|
||||||
|
|
||||||
SBitrateInfo target_bitrate;
|
SBitrateInfo target_bitrate;
|
||||||
memset(&target_bitrate, 0, sizeof(SBitrateInfo));
|
memset(&target_bitrate, 0, sizeof(SBitrateInfo));
|
||||||
target_bitrate.iLayer = SPATIAL_LAYER_ALL,
|
target_bitrate.iLayer = SPATIAL_LAYER_ALL,
|
||||||
target_bitrate.iBitrate = codec_settings_.targetBitrate * 1000;
|
target_bitrate.iBitrate = target_bits_per_second_;
|
||||||
openh264_encoder_->SetOption(ENCODER_OPTION_BITRATE,
|
openh264_encoder_->SetOption(ENCODER_OPTION_BITRATE,
|
||||||
&target_bitrate);
|
&target_bitrate);
|
||||||
float max_framerate = static_cast<float>(codec_settings_.maxFramerate);
|
openh264_encoder_->SetOption(ENCODER_OPTION_FRAME_RATE, &max_frame_rate_);
|
||||||
openh264_encoder_->SetOption(ENCODER_OPTION_FRAME_RATE,
|
|
||||||
&max_framerate);
|
|
||||||
return WEBRTC_VIDEO_CODEC_OK;
|
return WEBRTC_VIDEO_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,13 +302,12 @@ int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame,
|
|||||||
quality_scaler_.OnEncodeFrame(input_frame.width(), input_frame.height());
|
quality_scaler_.OnEncodeFrame(input_frame.width(), input_frame.height());
|
||||||
rtc::scoped_refptr<const VideoFrameBuffer> frame_buffer =
|
rtc::scoped_refptr<const VideoFrameBuffer> frame_buffer =
|
||||||
quality_scaler_.GetScaledBuffer(input_frame.video_frame_buffer());
|
quality_scaler_.GetScaledBuffer(input_frame.video_frame_buffer());
|
||||||
if (frame_buffer->width() != codec_settings_.width ||
|
if (frame_buffer->width() != width_ || frame_buffer->height() != height_) {
|
||||||
frame_buffer->height() != codec_settings_.height) {
|
LOG(LS_INFO) << "Encoder reinitialized from " << width_ << "x" << height_
|
||||||
LOG(LS_INFO) << "Encoder reinitialized from " << codec_settings_.width
|
<< " to " << frame_buffer->width() << "x"
|
||||||
<< "x" << codec_settings_.height << " to "
|
<< frame_buffer->height();
|
||||||
<< frame_buffer->width() << "x" << frame_buffer->height();
|
width_ = frame_buffer->width();
|
||||||
codec_settings_.width = frame_buffer->width();
|
height_ = frame_buffer->height();
|
||||||
codec_settings_.height = frame_buffer->height();
|
|
||||||
SEncParamExt encoder_params = CreateEncoderParams();
|
SEncParamExt encoder_params = CreateEncoderParams();
|
||||||
openh264_encoder_->SetOption(ENCODER_OPTION_SVC_ENCODE_PARAM_EXT,
|
openh264_encoder_->SetOption(ENCODER_OPTION_SVC_ENCODE_PARAM_EXT,
|
||||||
&encoder_params);
|
&encoder_params);
|
||||||
@ -401,31 +409,27 @@ SEncParamExt H264EncoderImpl::CreateEncoderParams() const {
|
|||||||
RTC_DCHECK(openh264_encoder_);
|
RTC_DCHECK(openh264_encoder_);
|
||||||
SEncParamExt encoder_params;
|
SEncParamExt encoder_params;
|
||||||
openh264_encoder_->GetDefaultParams(&encoder_params);
|
openh264_encoder_->GetDefaultParams(&encoder_params);
|
||||||
if (codec_settings_.mode == kRealtimeVideo) {
|
if (mode_ == kRealtimeVideo) {
|
||||||
encoder_params.iUsageType = CAMERA_VIDEO_REAL_TIME;
|
encoder_params.iUsageType = CAMERA_VIDEO_REAL_TIME;
|
||||||
} else if (codec_settings_.mode == kScreensharing) {
|
} else if (mode_ == kScreensharing) {
|
||||||
encoder_params.iUsageType = SCREEN_CONTENT_REAL_TIME;
|
encoder_params.iUsageType = SCREEN_CONTENT_REAL_TIME;
|
||||||
} else {
|
} else {
|
||||||
RTC_NOTREACHED();
|
RTC_NOTREACHED();
|
||||||
}
|
}
|
||||||
encoder_params.iPicWidth = codec_settings_.width;
|
encoder_params.iPicWidth = width_;
|
||||||
encoder_params.iPicHeight = codec_settings_.height;
|
encoder_params.iPicHeight = height_;
|
||||||
// |encoder_params| uses bit/s, |codec_settings_| uses kbit/s.
|
encoder_params.iTargetBitrate = target_bits_per_second_;
|
||||||
encoder_params.iTargetBitrate = codec_settings_.targetBitrate * 1000;
|
encoder_params.iMaxBitrate = max_bits_per_second_;
|
||||||
encoder_params.iMaxBitrate = codec_settings_.maxBitrate * 1000;
|
|
||||||
// Rate Control mode
|
// Rate Control mode
|
||||||
encoder_params.iRCMode = RC_BITRATE_MODE;
|
encoder_params.iRCMode = RC_BITRATE_MODE;
|
||||||
encoder_params.fMaxFrameRate =
|
encoder_params.fMaxFrameRate = max_frame_rate_;
|
||||||
static_cast<float>(codec_settings_.maxFramerate);
|
|
||||||
|
|
||||||
// The following parameters are extension parameters (they're in SEncParamExt,
|
// The following parameters are extension parameters (they're in SEncParamExt,
|
||||||
// not in SEncParamBase).
|
// not in SEncParamBase).
|
||||||
encoder_params.bEnableFrameSkip =
|
encoder_params.bEnableFrameSkip = frame_dropping_on_;
|
||||||
codec_settings_.codecSpecific.H264.frameDroppingOn;
|
|
||||||
// |uiIntraPeriod| - multiple of GOP size
|
// |uiIntraPeriod| - multiple of GOP size
|
||||||
// |keyFrameInterval| - number of frames
|
// |keyFrameInterval| - number of frames
|
||||||
encoder_params.uiIntraPeriod =
|
encoder_params.uiIntraPeriod = key_frame_interval_;
|
||||||
codec_settings_.codecSpecific.H264.keyFrameInterval;
|
|
||||||
encoder_params.uiMaxNalSize = 0;
|
encoder_params.uiMaxNalSize = 0;
|
||||||
// Threading model: use auto.
|
// Threading model: use auto.
|
||||||
// 0: auto (dynamic imp. internal encoder)
|
// 0: auto (dynamic imp. internal encoder)
|
||||||
|
|||||||
@ -70,7 +70,17 @@ class H264EncoderImpl : public H264Encoder {
|
|||||||
void ReportError();
|
void ReportError();
|
||||||
|
|
||||||
ISVCEncoder* openh264_encoder_;
|
ISVCEncoder* openh264_encoder_;
|
||||||
VideoCodec codec_settings_;
|
// Settings that are used by this encoder.
|
||||||
|
int width_;
|
||||||
|
int height_;
|
||||||
|
float max_frame_rate_;
|
||||||
|
unsigned int target_bits_per_second_;
|
||||||
|
unsigned int max_bits_per_second_;
|
||||||
|
VideoCodecMode mode_;
|
||||||
|
// H.264 specifc parameters
|
||||||
|
bool frame_dropping_on_;
|
||||||
|
int key_frame_interval_;
|
||||||
|
|
||||||
int32_t number_of_cores_;
|
int32_t number_of_cores_;
|
||||||
|
|
||||||
EncodedImage encoded_image_;
|
EncodedImage encoded_image_;
|
||||||
|
|||||||
Reference in New Issue
Block a user