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:
parent
2b7d969599
commit
37120ab59d
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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_;
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user