From 6ad7fa4606643d382ee7cf91aa90597c2af8cfa4 Mon Sep 17 00:00:00 2001 From: hta Date: Wed, 2 Nov 2016 06:53:19 -0700 Subject: [PATCH] Revert of Remove webrtc::Video from H264 encoder internals (patchset #2 id:20001 of https://codereview.webrtc.org/2468903003/ ) Reason for revert: Landed the wrong patchset. Nothing broken. Original issue's description: > 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 > > Committed: https://crrev.com/2549437b5ccf5aae2e6f1a1491c5f505d1859f9c > Cr-Commit-Position: refs/heads/master@{#14887} TBR=magjed@webrtc.org,stefan@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=600254 Review-Url: https://codereview.webrtc.org/2472673002 Cr-Commit-Position: refs/heads/master@{#14888} --- .../codecs/h264/h264_encoder_impl.cc | 72 +++++++++---------- .../codecs/h264/h264_encoder_impl.h | 12 +--- 2 files changed, 35 insertions(+), 49 deletions(-) diff --git a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc index bda5a98974..2070f22890 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc +++ b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc @@ -203,20 +203,9 @@ int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings, // else WELS_LOG_DEFAULT is used by default. number_of_cores_ = number_of_cores; - // Set internal settings from codec_settings - width_ = codec_settings->width; - height_ = codec_settings->height; - max_frame_rate_ = static_cast(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; + codec_settings_ = *codec_settings; + if (codec_settings_.targetBitrate == 0) + codec_settings_.targetBitrate = codec_settings_.startBitrate; SEncParamExt encoder_params = CreateEncoderParams(); // Initialize. @@ -227,16 +216,16 @@ int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings, return WEBRTC_VIDEO_CODEC_ERROR; } // TODO(pbos): Base init params on these values before submitting. - quality_scaler_.Init(codec_settings->codecType, codec_settings->startBitrate, - codec_settings->width, codec_settings->height, - codec_settings->maxFramerate); + quality_scaler_.Init(codec_settings_.codecType, codec_settings_.startBitrate, + codec_settings_.width, codec_settings_.height, + codec_settings_.maxFramerate); int video_format = EVideoFormatType::videoFormatI420; openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT, &video_format); // Initialize encoded image. Default buffer size: size of unencoded data. - encoded_image_._size = - CalcBufferSize(kI420, codec_settings->width, codec_settings->height); + encoded_image_._size = CalcBufferSize( + kI420, codec_settings_.width, codec_settings_.height); encoded_image_._buffer = new uint8_t[encoded_image_._size]; encoded_image_buffer_.reset(encoded_image_._buffer); encoded_image_._completeFrame = true; @@ -267,17 +256,19 @@ int32_t H264EncoderImpl::SetRates(uint32_t bitrate, uint32_t framerate) { if (bitrate <= 0 || framerate <= 0) { return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; } - target_bits_per_second_ = bitrate * 1000; - max_frame_rate_ = static_cast(framerate); + codec_settings_.targetBitrate = bitrate; + codec_settings_.maxFramerate = framerate; quality_scaler_.ReportFramerate(framerate); SBitrateInfo target_bitrate; memset(&target_bitrate, 0, sizeof(SBitrateInfo)); target_bitrate.iLayer = SPATIAL_LAYER_ALL, - target_bitrate.iBitrate = target_bits_per_second_; + target_bitrate.iBitrate = codec_settings_.targetBitrate * 1000; openh264_encoder_->SetOption(ENCODER_OPTION_BITRATE, &target_bitrate); - openh264_encoder_->SetOption(ENCODER_OPTION_FRAME_RATE, &max_frame_rate_); + float max_framerate = static_cast(codec_settings_.maxFramerate); + openh264_encoder_->SetOption(ENCODER_OPTION_FRAME_RATE, + &max_framerate); return WEBRTC_VIDEO_CODEC_OK; } @@ -302,12 +293,13 @@ int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame, quality_scaler_.OnEncodeFrame(input_frame.width(), input_frame.height()); rtc::scoped_refptr frame_buffer = quality_scaler_.GetScaledBuffer(input_frame.video_frame_buffer()); - if (frame_buffer->width() != width_ || frame_buffer->height() != height_) { - LOG(LS_INFO) << "Encoder reinitialized from " << width_ << "x" << height_ - << " to " << frame_buffer->width() << "x" - << frame_buffer->height(); - width_ = frame_buffer->width(); - height_ = frame_buffer->height(); + if (frame_buffer->width() != codec_settings_.width || + frame_buffer->height() != codec_settings_.height) { + LOG(LS_INFO) << "Encoder reinitialized from " << codec_settings_.width + << "x" << codec_settings_.height << " to " + << frame_buffer->width() << "x" << frame_buffer->height(); + codec_settings_.width = frame_buffer->width(); + codec_settings_.height = frame_buffer->height(); SEncParamExt encoder_params = CreateEncoderParams(); openh264_encoder_->SetOption(ENCODER_OPTION_SVC_ENCODE_PARAM_EXT, &encoder_params); @@ -409,27 +401,31 @@ SEncParamExt H264EncoderImpl::CreateEncoderParams() const { RTC_DCHECK(openh264_encoder_); SEncParamExt encoder_params; openh264_encoder_->GetDefaultParams(&encoder_params); - if (mode_ == kRealtimeVideo) { + if (codec_settings_.mode == kRealtimeVideo) { encoder_params.iUsageType = CAMERA_VIDEO_REAL_TIME; - } else if (mode_ == kScreensharing) { + } else if (codec_settings_.mode == kScreensharing) { encoder_params.iUsageType = SCREEN_CONTENT_REAL_TIME; } else { RTC_NOTREACHED(); } - encoder_params.iPicWidth = width_; - encoder_params.iPicHeight = height_; - encoder_params.iTargetBitrate = target_bits_per_second_; - encoder_params.iMaxBitrate = max_bits_per_second_; + encoder_params.iPicWidth = codec_settings_.width; + encoder_params.iPicHeight = codec_settings_.height; + // |encoder_params| uses bit/s, |codec_settings_| uses kbit/s. + encoder_params.iTargetBitrate = codec_settings_.targetBitrate * 1000; + encoder_params.iMaxBitrate = codec_settings_.maxBitrate * 1000; // Rate Control mode encoder_params.iRCMode = RC_BITRATE_MODE; - encoder_params.fMaxFrameRate = max_frame_rate_; + encoder_params.fMaxFrameRate = + static_cast(codec_settings_.maxFramerate); // The following parameters are extension parameters (they're in SEncParamExt, // not in SEncParamBase). - encoder_params.bEnableFrameSkip = frame_dropping_on_; + encoder_params.bEnableFrameSkip = + codec_settings_.codecSpecific.H264.frameDroppingOn; // |uiIntraPeriod| - multiple of GOP size // |keyFrameInterval| - number of frames - encoder_params.uiIntraPeriod = key_frame_interval_; + encoder_params.uiIntraPeriod = + codec_settings_.codecSpecific.H264.keyFrameInterval; encoder_params.uiMaxNalSize = 0; // Threading model: use auto. // 0: auto (dynamic imp. internal encoder) diff --git a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h index 84db25c5df..3713896a8b 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h +++ b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h @@ -70,17 +70,7 @@ class H264EncoderImpl : public H264Encoder { void ReportError(); ISVCEncoder* openh264_encoder_; - // 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_; - + VideoCodec codec_settings_; int32_t number_of_cores_; EncodedImage encoded_image_;