diff options
author | Sergey Silkin <ssilkin@webrtc.org> | 2018-05-15 09:12:05 +0200 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2018-05-15 08:14:10 +0000 |
commit | 5702736f7e46383dcb5b5386608a8ad3fbc551c5 (patch) | |
tree | b2c9d52d3c55854a1dd00924db4dfdf371043f7a /test | |
parent | d675e63684b632cf6a18295258f42f40bd2da505 (diff) | |
download | webrtc-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.cc | 38 |
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"; |