| Index: remoting/codec/webrtc_video_encoder_vpx.cc
|
| diff --git a/remoting/codec/webrtc_video_encoder_vpx.cc b/remoting/codec/webrtc_video_encoder_vpx.cc
|
| index 8f076bee562bf277d65fbf698a110217bfcea960..658a7bcc7ac66f95b6871ec41337e17c74bfe32a 100644
|
| --- a/remoting/codec/webrtc_video_encoder_vpx.cc
|
| +++ b/remoting/codec/webrtc_video_encoder_vpx.cc
|
| @@ -276,33 +276,18 @@ void WebrtcVideoEncoderVpx::SetLosslessColor(bool want_lossless) {
|
| }
|
| }
|
|
|
| -void WebrtcVideoEncoderVpx::UpdateTargetBitrate(int new_bitrate_kbps) {
|
| - target_bitrate_kbps_ = new_bitrate_kbps;
|
| - // Configuration not initialized.
|
| - if (config_.g_timebase.den == 0)
|
| - return;
|
| -
|
| - if (config_.rc_target_bitrate == static_cast<unsigned int>(new_bitrate_kbps))
|
| - return;
|
| - config_.rc_target_bitrate = new_bitrate_kbps;
|
| -
|
| - // Update encoder context.
|
| - if (vpx_codec_enc_config_set(codec_.get(), &config_))
|
| - NOTREACHED() << "Unable to set encoder config";
|
| -
|
| - VLOG(1) << "New rc_target_bitrate: " << new_bitrate_kbps << " kbps";
|
| -}
|
| -
|
| -std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| +std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> WebrtcVideoEncoderVpx::Encode(
|
| const webrtc::DesktopFrame& frame,
|
| - uint32_t flags) {
|
| + const FrameParams& params) {
|
| DCHECK_LE(32, frame.size().width());
|
| DCHECK_LE(32, frame.size().height());
|
|
|
| // Based on information fetching active map, we return here if there is
|
| // nothing to top-off.
|
| - if (frame.updated_region().is_empty() && !encode_unchanged_frame_)
|
| + if (frame.updated_region().is_empty() && !encode_unchanged_frame_ &&
|
| + !params.key_frame) {
|
| return nullptr;
|
| + }
|
|
|
| // Create or reconfigure the codec to match the size of |frame|.
|
| if (!codec_ ||
|
| @@ -311,6 +296,8 @@ std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| Configure(frame.size());
|
| }
|
|
|
| + UpdateTargetBitrate(params.bitrate_kbps);
|
| +
|
| vpx_active_map_t act_map;
|
| act_map.rows = active_map_size_.height();
|
| act_map.cols = active_map_size_.width();
|
| @@ -331,12 +318,9 @@ std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| }
|
| }
|
|
|
| - // Frame rate is adapted based on how well the encoder meets the target
|
| - // bandwidth requirement. We specify a target rate of 1 / 15 fps here.
|
| - // TODO(isheriff): Investigate if it makes sense to increase the target FPS.
|
| vpx_codec_err_t ret = vpx_codec_encode(
|
| - codec_.get(), image_.get(), 0, 66666,
|
| - (flags & REQUEST_KEY_FRAME) ? VPX_EFLAG_FORCE_KF : 0, VPX_DL_REALTIME);
|
| + codec_.get(), image_.get(), 0, params.duration.InMicroseconds(),
|
| + (params.key_frame) ? VPX_EFLAG_FORCE_KF : 0, VPX_DL_REALTIME);
|
| DCHECK_EQ(ret, VPX_CODEC_OK)
|
| << "Encoding error: " << vpx_codec_err_to_string(ret) << "\n"
|
| << "Details: " << vpx_codec_error(codec_.get()) << "\n"
|
| @@ -366,11 +350,8 @@ std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| vpx_codec_iter_t iter = nullptr;
|
| bool got_data = false;
|
|
|
| - // TODO(hclam): Make sure we get exactly one frame from the packet.
|
| - // TODO(hclam): We should provide the output buffer to avoid one copy.
|
| - std::unique_ptr<VideoPacket> packet(
|
| - helper_.CreateVideoPacketWithUpdatedRegion(frame, updated_region));
|
| - packet->mutable_format()->set_encoding(VideoPacketFormat::ENCODING_VP8);
|
| + std::unique_ptr<EncodedFrame> encoded_frame(new EncodedFrame());
|
| + encoded_frame->size = frame.size();
|
|
|
| while (!got_data) {
|
| const vpx_codec_cx_pkt_t* vpx_packet =
|
| @@ -381,8 +362,12 @@ std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| switch (vpx_packet->kind) {
|
| case VPX_CODEC_CX_FRAME_PKT: {
|
| got_data = true;
|
| - packet->set_data(vpx_packet->data.frame.buf, vpx_packet->data.frame.sz);
|
| - packet->set_key_frame(vpx_packet->data.frame.flags & VPX_FRAME_IS_KEY);
|
| + // TODO(sergeyu): Avoid copying the data here..
|
| + encoded_frame->data.assign(
|
| + reinterpret_cast<const char*>(vpx_packet->data.frame.buf),
|
| + vpx_packet->data.frame.sz);
|
| + encoded_frame->key_frame =
|
| + vpx_packet->data.frame.flags & VPX_FRAME_IS_KEY;
|
| int quantizer = -1;
|
| CHECK_EQ(vpx_codec_control(codec_.get(), VP8E_GET_LAST_QUANTIZER_64,
|
| &quantizer),
|
| @@ -397,7 +382,7 @@ std::unique_ptr<VideoPacket> WebrtcVideoEncoderVpx::Encode(
|
| }
|
| }
|
|
|
| - return packet;
|
| + return encoded_frame;
|
| }
|
|
|
| WebrtcVideoEncoderVpx::WebrtcVideoEncoderVpx(bool use_vp9)
|
| @@ -467,6 +452,24 @@ void WebrtcVideoEncoderVpx::Configure(const webrtc::DesktopSize& size) {
|
| }
|
| }
|
|
|
| +void WebrtcVideoEncoderVpx::UpdateTargetBitrate(int new_bitrate_kbps) {
|
| + target_bitrate_kbps_ = new_bitrate_kbps;
|
| +
|
| + // Configuration not initialized.
|
| + if (config_.g_timebase.den == 0)
|
| + return;
|
| +
|
| + if (config_.rc_target_bitrate == static_cast<unsigned int>(new_bitrate_kbps))
|
| + return;
|
| + config_.rc_target_bitrate = new_bitrate_kbps;
|
| +
|
| + // Update encoder context.
|
| + if (vpx_codec_enc_config_set(codec_.get(), &config_))
|
| + NOTREACHED() << "Unable to set encoder config";
|
| +
|
| + VLOG(1) << "New rc_target_bitrate: " << new_bitrate_kbps << " kbps";
|
| +}
|
| +
|
| void WebrtcVideoEncoderVpx::PrepareImage(
|
| const webrtc::DesktopFrame& frame,
|
| webrtc::DesktopRegion* updated_region) {
|
|
|