| Index: webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc
|
| diff --git a/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc b/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc
|
| index 4dd59b268d997c2ead2d893d7024ac0995e6813a..7ebe1a275dff5b3807ab424d1845081b914c33c5 100644
|
| --- a/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc
|
| +++ b/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc
|
| @@ -27,7 +27,6 @@
|
| #include "webrtc/common.h"
|
| #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
|
| #include "webrtc/modules/include/module_common_types.h"
|
| -#include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h"
|
| #include "webrtc/system_wrappers/include/logging.h"
|
| #include "webrtc/system_wrappers/include/tick_util.h"
|
|
|
| @@ -77,12 +76,9 @@
|
| raw_(NULL),
|
| input_image_(NULL),
|
| tl0_pic_idx_(0),
|
| - frames_since_kf_(0),
|
| + gof_idx_(0),
|
| num_temporal_layers_(0),
|
| - num_spatial_layers_(0),
|
| - frames_encoded_(0),
|
| - // Use two spatial when screensharing with flexible mode.
|
| - spatial_layer_(new ScreenshareLayersVP9(2)) {
|
| + num_spatial_layers_(0) {
|
| memset(&codec_, 0, sizeof(codec_));
|
| uint32_t seed = static_cast<uint32_t>(TickTime::MillisecondTimestamp());
|
| srand(seed);
|
| @@ -212,7 +208,6 @@
|
| }
|
| config_->rc_target_bitrate = new_bitrate_kbit;
|
| codec_.maxFramerate = new_framerate;
|
| - spatial_layer_->ConfigureBitrate(new_bitrate_kbit, 0);
|
|
|
| if (!SetSvcRates()) {
|
| return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
|
| @@ -251,7 +246,6 @@
|
| if (inst->codecSpecific.VP9.numberOfSpatialLayers > 2) {
|
| return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
|
| }
|
| -
|
| int retVal = Release();
|
| if (retVal < 0) {
|
| return retVal;
|
| @@ -330,13 +324,7 @@
|
|
|
| // TODO(asapersson): Check configuration of temporal switch up and increase
|
| // pattern length.
|
| - is_flexible_mode_ = inst->codecSpecific.VP9.flexibleMode;
|
| - if (is_flexible_mode_) {
|
| - config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
|
| - config_->ts_number_layers = num_temporal_layers_;
|
| - if (codec_.mode == kScreensharing)
|
| - spatial_layer_->ConfigureBitrate(inst->startBitrate, 0);
|
| - } else if (num_temporal_layers_ == 1) {
|
| + if (num_temporal_layers_ == 1) {
|
| gof_.SetGofInfoVP9(kTemporalStructureMode1);
|
| config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_NOLAYERING;
|
| config_->ts_number_layers = 1;
|
| @@ -407,8 +395,7 @@
|
| // 1:2 scaling in each dimension.
|
| svc_internal_.svc_params.scaling_factor_num[i] = scaling_factor_num;
|
| svc_internal_.svc_params.scaling_factor_den[i] = 256;
|
| - if (codec_.mode != kScreensharing)
|
| - scaling_factor_num /= 2;
|
| + scaling_factor_num /= 2;
|
| }
|
| }
|
|
|
| @@ -508,35 +495,12 @@
|
| raw_->stride[VPX_PLANE_U] = input_image.stride(kUPlane);
|
| raw_->stride[VPX_PLANE_V] = input_image.stride(kVPlane);
|
|
|
| - vpx_enc_frame_flags_t flags = 0;
|
| + int flags = 0;
|
| bool send_keyframe = (frame_type == kVideoFrameKey);
|
| if (send_keyframe) {
|
| // Key frame request from caller.
|
| flags = VPX_EFLAG_FORCE_KF;
|
| }
|
| -
|
| - if (is_flexible_mode_) {
|
| - SuperFrameRefSettings settings;
|
| -
|
| - // These structs are copied when calling vpx_codec_control,
|
| - // therefore it is ok for them to go out of scope.
|
| - vpx_svc_ref_frame_config enc_layer_conf;
|
| - vpx_svc_layer_id layer_id;
|
| -
|
| - if (codec_.mode == kRealtimeVideo) {
|
| - // Real time video not yet implemented in flexible mode.
|
| - RTC_NOTREACHED();
|
| - } else {
|
| - settings = spatial_layer_->GetSuperFrameSettings(input_image.timestamp(),
|
| - send_keyframe);
|
| - }
|
| - enc_layer_conf = GenerateRefsAndFlags(settings);
|
| - layer_id.temporal_layer_id = 0;
|
| - layer_id.spatial_layer_id = settings.start_layer;
|
| - vpx_codec_control(encoder_, VP9E_SET_SVC_LAYER_ID, &layer_id);
|
| - vpx_codec_control(encoder_, VP9E_SET_SVC_REF_FRAME_CONFIG, &enc_layer_conf);
|
| - }
|
| -
|
| assert(codec_.maxFramerate > 0);
|
| uint32_t duration = 90000 / codec_.maxFramerate;
|
| if (vpx_codec_encode(encoder_, raw_, timestamp_, duration, flags,
|
| @@ -562,8 +526,9 @@
|
| !codec_.codecSpecific.VP9.flexibleMode)
|
| ? true
|
| : false;
|
| - if (pkt.data.frame.flags & VPX_FRAME_IS_KEY)
|
| - frames_since_kf_ = 0;
|
| + if (pkt.data.frame.flags & VPX_FRAME_IS_KEY) {
|
| + gof_idx_ = 0;
|
| + }
|
|
|
| vpx_svc_layer_id_t layer_id = {0};
|
| vpx_codec_control(encoder_, VP9E_GET_SVC_LAYER_ID, &layer_id);
|
| @@ -586,18 +551,17 @@
|
| vp9_info->ss_data_available = false;
|
| }
|
|
|
| + if (vp9_info->flexible_mode) {
|
| + vp9_info->gof_idx = kNoGofIdx;
|
| + } else {
|
| + vp9_info->gof_idx =
|
| + static_cast<uint8_t>(gof_idx_++ % gof_.num_frames_in_gof);
|
| + }
|
| +
|
| // TODO(asapersson): this info has to be obtained from the encoder.
|
| vp9_info->temporal_up_switch = true;
|
|
|
| - bool is_first_frame = false;
|
| - if (is_flexible_mode_) {
|
| - is_first_frame =
|
| - layer_id.spatial_layer_id == spatial_layer_->GetStartLayer();
|
| - } else {
|
| - is_first_frame = layer_id.spatial_layer_id == 0;
|
| - }
|
| -
|
| - if (is_first_frame) {
|
| + if (layer_id.spatial_layer_id == 0) {
|
| picture_id_ = (picture_id_ + 1) & 0x7FFF;
|
| // TODO(asapersson): this info has to be obtained from the encoder.
|
| vp9_info->inter_layer_predicted = false;
|
| @@ -618,20 +582,6 @@
|
| // Always populate this, so that the packetizer can properly set the marker
|
| // bit.
|
| vp9_info->num_spatial_layers = num_spatial_layers_;
|
| -
|
| - vp9_info->num_ref_pics = 0;
|
| - if (vp9_info->flexible_mode) {
|
| - vp9_info->gof_idx = kNoGofIdx;
|
| - vp9_info->num_ref_pics = num_ref_pics_[layer_id.spatial_layer_id];
|
| - for (int i = 0; i < num_ref_pics_[layer_id.spatial_layer_id]; ++i) {
|
| - vp9_info->p_diff[i] = p_diff_[layer_id.spatial_layer_id][i];
|
| - }
|
| - } else {
|
| - vp9_info->gof_idx =
|
| - static_cast<uint8_t>(frames_since_kf_ % gof_.num_frames_in_gof);
|
| - }
|
| - ++frames_since_kf_;
|
| -
|
| if (vp9_info->ss_data_available) {
|
| vp9_info->spatial_layer_resolution_present = true;
|
| for (size_t i = 0; i < vp9_info->num_spatial_layers; ++i) {
|
| @@ -667,14 +617,6 @@
|
| frag_info.fragmentationPlType[part_idx] = 0;
|
| frag_info.fragmentationTimeDiff[part_idx] = 0;
|
| encoded_image_._length += static_cast<uint32_t>(pkt->data.frame.sz);
|
| -
|
| - vpx_svc_layer_id_t layer_id = {0};
|
| - vpx_codec_control(encoder_, VP9E_GET_SVC_LAYER_ID, &layer_id);
|
| - if (is_flexible_mode_ && codec_.mode == kScreensharing)
|
| - spatial_layer_->LayerFrameEncoded(
|
| - static_cast<unsigned int>(encoded_image_._length),
|
| - layer_id.spatial_layer_id);
|
| -
|
| assert(encoded_image_._length <= encoded_image_._size);
|
|
|
| // End of frame.
|
| @@ -694,108 +636,6 @@
|
| &frag_info);
|
| }
|
| return WEBRTC_VIDEO_CODEC_OK;
|
| -}
|
| -
|
| -vpx_svc_ref_frame_config VP9EncoderImpl::GenerateRefsAndFlags(
|
| - const SuperFrameRefSettings& settings) {
|
| - static const vpx_enc_frame_flags_t kAllFlags =
|
| - VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_LAST |
|
| - VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF;
|
| - vpx_svc_ref_frame_config sf_conf = {};
|
| - if (settings.is_keyframe) {
|
| - // Used later on to make sure we don't make any invalid references.
|
| - memset(buffer_updated_at_frame_, -1, sizeof(buffer_updated_at_frame_));
|
| - for (int layer = settings.start_layer; layer <= settings.stop_layer;
|
| - ++layer) {
|
| - num_ref_pics_[layer] = 0;
|
| - buffer_updated_at_frame_[settings.layer[layer].upd_buf] = frames_encoded_;
|
| - // When encoding a keyframe only the alt_fb_idx is used
|
| - // to specify which layer ends up in which buffer.
|
| - sf_conf.alt_fb_idx[layer] = settings.layer[layer].upd_buf;
|
| - }
|
| - } else {
|
| - for (int layer_idx = settings.start_layer; layer_idx <= settings.stop_layer;
|
| - ++layer_idx) {
|
| - vpx_enc_frame_flags_t layer_flags = kAllFlags;
|
| - num_ref_pics_[layer_idx] = 0;
|
| - int8_t refs[3] = {settings.layer[layer_idx].ref_buf1,
|
| - settings.layer[layer_idx].ref_buf2,
|
| - settings.layer[layer_idx].ref_buf3};
|
| -
|
| - for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
|
| - if (refs[ref_idx] == -1)
|
| - continue;
|
| -
|
| - RTC_DCHECK_GE(refs[ref_idx], 0);
|
| - RTC_DCHECK_LE(refs[ref_idx], 7);
|
| - // Easier to remove flags from all flags rather than having to
|
| - // build the flags from 0.
|
| - switch (num_ref_pics_[layer_idx]) {
|
| - case 0: {
|
| - sf_conf.lst_fb_idx[layer_idx] = refs[ref_idx];
|
| - layer_flags &= ~VP8_EFLAG_NO_REF_LAST;
|
| - break;
|
| - }
|
| - case 1: {
|
| - sf_conf.gld_fb_idx[layer_idx] = refs[ref_idx];
|
| - layer_flags &= ~VP8_EFLAG_NO_REF_GF;
|
| - break;
|
| - }
|
| - case 2: {
|
| - sf_conf.alt_fb_idx[layer_idx] = refs[ref_idx];
|
| - layer_flags &= ~VP8_EFLAG_NO_REF_ARF;
|
| - break;
|
| - }
|
| - }
|
| - // Make sure we don't reference a buffer that hasn't been
|
| - // used at all or hasn't been used since a keyframe.
|
| - RTC_DCHECK_NE(buffer_updated_at_frame_[refs[ref_idx]], -1);
|
| -
|
| - p_diff_[layer_idx][num_ref_pics_[layer_idx]] =
|
| - frames_encoded_ - buffer_updated_at_frame_[refs[ref_idx]];
|
| - num_ref_pics_[layer_idx]++;
|
| - }
|
| -
|
| - bool upd_buf_same_as_a_ref = false;
|
| - if (settings.layer[layer_idx].upd_buf != -1) {
|
| - for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
|
| - if (settings.layer[layer_idx].upd_buf == refs[ref_idx]) {
|
| - switch (ref_idx) {
|
| - case 0: {
|
| - layer_flags &= ~VP8_EFLAG_NO_UPD_LAST;
|
| - break;
|
| - }
|
| - case 1: {
|
| - layer_flags &= ~VP8_EFLAG_NO_UPD_GF;
|
| - break;
|
| - }
|
| - case 2: {
|
| - layer_flags &= ~VP8_EFLAG_NO_UPD_ARF;
|
| - break;
|
| - }
|
| - }
|
| - upd_buf_same_as_a_ref = true;
|
| - break;
|
| - }
|
| - }
|
| - if (!upd_buf_same_as_a_ref) {
|
| - // If we have three references and a buffer is specified to be
|
| - // updated, then that buffer must be the same as one of the
|
| - // three references.
|
| - RTC_CHECK_LT(num_ref_pics_[layer_idx], kMaxVp9RefPics);
|
| -
|
| - sf_conf.alt_fb_idx[layer_idx] = settings.layer[layer_idx].upd_buf;
|
| - layer_flags ^= VP8_EFLAG_NO_UPD_ARF;
|
| - }
|
| -
|
| - int updated_buffer = settings.layer[layer_idx].upd_buf;
|
| - buffer_updated_at_frame_[updated_buffer] = frames_encoded_;
|
| - sf_conf.frame_flags[layer_idx] = layer_flags;
|
| - }
|
| - }
|
| - }
|
| - ++frames_encoded_;
|
| - return sf_conf;
|
| }
|
|
|
| int VP9EncoderImpl::SetChannelParameters(uint32_t packet_loss, int64_t rtt) {
|
|
|