in RtpSenderVideo propagate chain_diffs into dependency descriptor

Bug: webrtc:10342
Change-Id: I14644c38792616a2002d1420770640d9b6f5099a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175085
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31263}
This commit is contained in:
Danil Chapovalov 2020-05-14 16:35:23 +02:00 committed by Commit Bot
parent 2b7d969599
commit 37120ab59d
5 changed files with 47 additions and 5 deletions

View File

@ -71,8 +71,13 @@ GenericFrameInfo::Builder& GenericFrameInfo::Builder::Dtis(
GenericFrameInfo::Builder& GenericFrameInfo::Builder::Fdiffs( GenericFrameInfo::Builder& GenericFrameInfo::Builder::Fdiffs(
std::initializer_list<int> frame_diffs) { std::initializer_list<int> frame_diffs) {
info_.frame_diffs.insert(info_.frame_diffs.end(), frame_diffs.begin(), info_.frame_diffs.assign(frame_diffs.begin(), frame_diffs.end());
frame_diffs.end()); return *this;
}
GenericFrameInfo::Builder& GenericFrameInfo::Builder::ChainDiffs(
std::initializer_list<int> chain_diffs) {
info_.chain_diffs.assign(chain_diffs.begin(), chain_diffs.end());
return *this; return *this;
} }

View File

@ -54,6 +54,7 @@ class GenericFrameInfo::Builder {
Builder& S(int spatial_id); Builder& S(int spatial_id);
Builder& Dtis(absl::string_view indication_symbols); Builder& Dtis(absl::string_view indication_symbols);
Builder& Fdiffs(std::initializer_list<int> frame_diffs); Builder& Fdiffs(std::initializer_list<int> frame_diffs);
Builder& ChainDiffs(std::initializer_list<int> chain_diffs);
private: private:
GenericFrameInfo info_; GenericFrameInfo info_;

View File

@ -251,8 +251,6 @@ void RTPSenderVideo::SetVideoStructureUnderLock(
video_structure_ = video_structure_ =
std::make_unique<FrameDependencyStructure>(*video_structure); std::make_unique<FrameDependencyStructure>(*video_structure);
video_structure_->structure_id = structure_id; video_structure_->structure_id = structure_id;
// TODO(bugs.webrtc.org/10342): Support chains.
video_structure_->num_chains = 0;
} }
void RTPSenderVideo::AddRtpHeaderExtensions( void RTPSenderVideo::AddRtpHeaderExtensions(
@ -336,6 +334,8 @@ void RTPSenderVideo::AddRtpHeaderExtensions(
descriptor.frame_dependencies.frame_diffs.push_back( descriptor.frame_dependencies.frame_diffs.push_back(
video_header.generic->frame_id - dep); video_header.generic->frame_id - dep);
} }
descriptor.frame_dependencies.chain_diffs =
video_header.generic->chain_diffs;
descriptor.frame_dependencies.decode_target_indications = descriptor.frame_dependencies.decode_target_indications =
video_header.generic->decode_target_indications; video_header.generic->decode_target_indications;
RTC_DCHECK_EQ( RTC_DCHECK_EQ(

View File

@ -45,6 +45,7 @@ namespace webrtc {
namespace { namespace {
using ::testing::_; using ::testing::_;
using ::testing::ContainerEq;
using ::testing::ElementsAre; using ::testing::ElementsAre;
using ::testing::ElementsAreArray; using ::testing::ElementsAreArray;
using ::testing::IsEmpty; using ::testing::IsEmpty;
@ -606,6 +607,40 @@ TEST_P(RtpSenderVideoTest, SendsDependencyDescriptorWhenVideoStructureIsSet) {
ElementsAre(1, 501)); ElementsAre(1, 501));
} }
TEST_P(RtpSenderVideoTest, PropagatesChainDiffsIntoDependencyDescriptor) {
const int64_t kFrameId = 100000;
uint8_t kFrame[100];
rtp_module_->RegisterRtpHeaderExtension(
RtpDependencyDescriptorExtension::kUri, kDependencyDescriptorId);
FrameDependencyStructure video_structure;
video_structure.num_decode_targets = 2;
video_structure.num_chains = 1;
// First decode target is protected by the only chain, second one - is not.
video_structure.decode_target_protected_by_chain = {0, 1};
video_structure.templates = {
GenericFrameInfo::Builder().S(0).T(0).Dtis("SS").ChainDiffs({1}).Build(),
};
rtp_sender_video_.SetVideoStructure(&video_structure);
RTPVideoHeader hdr;
RTPVideoHeader::GenericDescriptorInfo& generic = hdr.generic.emplace();
generic.frame_id = kFrameId;
generic.decode_target_indications = {DecodeTargetIndication::kSwitch,
DecodeTargetIndication::kSwitch};
generic.chain_diffs = {2};
hdr.frame_type = VideoFrameType::kVideoFrameKey;
rtp_sender_video_.SendVideo(kPayload, kType, kTimestamp, 0, kFrame, nullptr,
hdr, kDefaultExpectedRetransmissionTimeMs);
ASSERT_EQ(transport_.packets_sent(), 1);
DependencyDescriptor descriptor_key;
ASSERT_TRUE(transport_.last_sent_packet()
.GetExtension<RtpDependencyDescriptorExtension>(
nullptr, &descriptor_key));
EXPECT_THAT(descriptor_key.frame_dependencies.chain_diffs,
ContainerEq(generic.chain_diffs));
}
TEST_P(RtpSenderVideoTest, TEST_P(RtpSenderVideoTest,
SetDiffentVideoStructureAvoidsCollisionWithThePreviousStructure) { SetDiffentVideoStructureAvoidsCollisionWithThePreviousStructure) {
const int64_t kFrameId = 100000; const int64_t kFrameId = 100000;

View File

@ -23,7 +23,7 @@
#include "api/video/video_frame_type.h" #include "api/video/video_frame_type.h"
#include "api/video/video_rotation.h" #include "api/video/video_rotation.h"
#include "api/video/video_timing.h" #include "api/video/video_timing.h"
#include "common_types.h" // NOLINT(build/include) #include "common_types.h" // NOLINT(build/include_directory)
#include "modules/video_coding/codecs/h264/include/h264_globals.h" #include "modules/video_coding/codecs/h264/include/h264_globals.h"
#include "modules/video_coding/codecs/vp8/include/vp8_globals.h" #include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
#include "modules/video_coding/codecs/vp9/include/vp9_globals.h" #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
@ -53,6 +53,7 @@ struct RTPVideoHeader {
int temporal_index = 0; int temporal_index = 0;
absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications; absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications;
absl::InlinedVector<int64_t, 5> dependencies; absl::InlinedVector<int64_t, 5> dependencies;
absl::InlinedVector<int, 4> chain_diffs;
}; };
RTPVideoHeader(); RTPVideoHeader();