aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSergey Silkin <ssilkin@webrtc.org>2018-05-15 09:12:05 +0200
committerCommit Bot <commit-bot@chromium.org>2018-05-15 08:14:10 +0000
commit5702736f7e46383dcb5b5386608a8ad3fbc551c5 (patch)
treeb2c9d52d3c55854a1dd00924db4dfdf371043f7a /test
parentd675e63684b632cf6a18295258f42f40bd2da505 (diff)
downloadwebrtc-5702736f7e46383dcb5b5386608a8ad3fbc551c5.tar.gz
Control inter-layer prediction mode in test apps.
Vp9 encoder supports several inter-layer prediction modes. This adds possibility to control and test them in video/ss/sv loopback. Filtering of sent packets has been modified. In addition to high spatial and temporal layers it now filters out packets of low spatial layers where non_ref_for_inter_layer_pred bit is set to true. Bug: none Change-Id: I17b1ee8f1ac1d70a6914eb86d153790ef2da9679 Reviewed-on: https://webrtc-review.googlesource.com/76540 Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23233}
Diffstat (limited to 'test')
-rw-r--r--test/layer_filtering_transport.cc38
1 files changed, 28 insertions, 10 deletions
diff --git a/test/layer_filtering_transport.cc b/test/layer_filtering_transport.cc
index c28110ca04..ebaf827fa7 100644
--- a/test/layer_filtering_transport.cc
+++ b/test/layer_filtering_transport.cc
@@ -141,20 +141,38 @@ bool LayerFilteringTransport::SendRtp(const uint8_t* packet,
const int spatial_idx = static_cast<int>(
is_vp8 ? kNoSpatialIdx
: parsed_payload.type.Video.codecHeader.VP9.spatial_idx);
+ const bool non_ref_for_inter_layer_pred =
+ is_vp8 ? false
+ : parsed_payload.type.Video.codecHeader.VP9
+ .non_ref_for_inter_layer_pred;
if (selected_sl_ >= 0 && spatial_idx == selected_sl_ &&
parsed_payload.type.Video.codecHeader.VP9.end_of_frame) {
// This layer is now the last in the superframe.
set_marker_bit = true;
- } else if ((selected_tl_ >= 0 && temporal_idx != kNoTemporalIdx &&
- temporal_idx > selected_tl_) ||
- (selected_sl_ >= 0 && spatial_idx != kNoSpatialIdx &&
- spatial_idx > selected_sl_)) {
- // Truncate packet to a padding packet.
- length = header.headerLength + 1;
- temp_buffer[0] |= (1 << 5); // P = 1.
- temp_buffer[1] &= 0x7F; // M = 0.
- discarded_last_packet_ = true;
- temp_buffer[header.headerLength] = 1; // One byte of padding.
+ } else {
+ const bool higher_temporal_layer =
+ (selected_tl_ >= 0 && temporal_idx != kNoTemporalIdx &&
+ temporal_idx > selected_tl_);
+
+ const bool higher_spatial_layer =
+ (selected_sl_ >= 0 && spatial_idx != kNoSpatialIdx &&
+ spatial_idx > selected_sl_);
+
+ // Filter out non-reference lower spatial layers since they are not
+ // needed for decoding of target spatial layer.
+ const bool lower_non_ref_spatial_layer =
+ (selected_sl_ >= 0 && spatial_idx != kNoSpatialIdx &&
+ spatial_idx < selected_sl_ && non_ref_for_inter_layer_pred);
+
+ if (higher_temporal_layer || higher_spatial_layer ||
+ lower_non_ref_spatial_layer) {
+ // Truncate packet to a padding packet.
+ length = header.headerLength + 1;
+ temp_buffer[0] |= (1 << 5); // P = 1.
+ temp_buffer[1] &= 0x7F; // M = 0.
+ discarded_last_packet_ = true;
+ temp_buffer[header.headerLength] = 1; // One byte of padding.
+ }
}
} else {
RTC_NOTREACHED() << "Parse error";