Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1881)

Unified Diff: webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc

Issue 1438543002: Revert of Work on flexible mode and screen sharing. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {
« no previous file with comments | « webrtc/modules/video_coding/codecs/vp9/vp9_impl.h ('k') | webrtc/modules/video_coding/main/source/decoding_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698