Calculate chain_diff for DependencyDescriptor from GenericFrameInfo
Bug: webrtc:10342 Change-Id: Ic88d58dc011c641a3b251eef74064066975296fa Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175652 Reviewed-by: Björn Terelius <terelius@webrtc.org> Reviewed-by: Philip Eliasson <philipel@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31331}
This commit is contained in:

committed by
Commit Bot

parent
430951a0d4
commit
4b860c1fb3
@ -171,6 +171,7 @@ rtc_library("rtp_sender") {
|
||||
"../modules/rtp_rtcp:rtp_rtcp_format",
|
||||
"../modules/rtp_rtcp:rtp_video_header",
|
||||
"../modules/utility",
|
||||
"../modules/video_coding:chain_diff_calculator",
|
||||
"../modules/video_coding:codec_globals_headers",
|
||||
"../modules/video_coding:frame_dependencies_calculator",
|
||||
"../modules/video_coding:video_codec_interface",
|
||||
|
@ -261,6 +261,8 @@ RtpPayloadParams::GenericDescriptorFromFrameInfo(
|
||||
generic.frame_id = frame_id;
|
||||
generic.dependencies = dependencies_calculator_.FromBuffersUsage(
|
||||
frame_type, frame_id, frame_info.encoder_buffers);
|
||||
generic.chain_diffs =
|
||||
chains_calculator_.From(frame_id, frame_info.part_of_chain);
|
||||
generic.spatial_index = frame_info.spatial_id;
|
||||
generic.temporal_index = frame_info.temporal_id;
|
||||
generic.decode_target_indications = frame_info.decode_target_indications;
|
||||
@ -273,6 +275,11 @@ void RtpPayloadParams::SetGeneric(const CodecSpecificInfo* codec_specific_info,
|
||||
RTPVideoHeader* rtp_video_header) {
|
||||
if (codec_specific_info && codec_specific_info->generic_frame_info &&
|
||||
!codec_specific_info->generic_frame_info->encoder_buffers.empty()) {
|
||||
if (is_keyframe) {
|
||||
// Key frame resets all chains it is in.
|
||||
chains_calculator_.Reset(
|
||||
codec_specific_info->generic_frame_info->part_of_chain);
|
||||
}
|
||||
rtp_video_header->generic =
|
||||
GenericDescriptorFromFrameInfo(*codec_specific_info->generic_frame_info,
|
||||
frame_id, rtp_video_header->frame_type);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "call/rtp_config.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_video_header.h"
|
||||
#include "modules/video_coding/chain_diff_calculator.h"
|
||||
#include "modules/video_coding/frame_dependencies_calculator.h"
|
||||
#include "modules/video_coding/include/video_codec_interface.h"
|
||||
|
||||
@ -88,6 +89,7 @@ class RtpPayloadParams final {
|
||||
RTPVideoHeader::GenericDescriptorInfo* generic);
|
||||
|
||||
FrameDependenciesCalculator dependencies_calculator_;
|
||||
ChainDiffCalculator chains_calculator_;
|
||||
// TODO(bugs.webrtc.org/10242): Remove once all encoder-wrappers are updated.
|
||||
// Holds the last shared frame id for a given (spatial, temporal) layer.
|
||||
std::array<std::array<int64_t, RtpGenericFrameDescriptor::kMaxTemporalLayers>,
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
using ::testing::ElementsAre;
|
||||
using ::testing::IsEmpty;
|
||||
using ::testing::SizeIs;
|
||||
|
||||
namespace webrtc {
|
||||
namespace {
|
||||
@ -388,6 +389,7 @@ TEST(RtpPayloadParamsTest, SetsGenericFromGenericFrameInfo) {
|
||||
GenericFrameInfo::Builder().S(1).T(0).Dtis("S").Build();
|
||||
codec_info.generic_frame_info->encoder_buffers = {
|
||||
{/*id=*/0, /*referenced=*/false, /*updated=*/true}};
|
||||
codec_info.generic_frame_info->part_of_chain = {true, false};
|
||||
RTPVideoHeader key_header =
|
||||
params.GetRtpVideoHeader(encoded_image, &codec_info, /*frame_id=*/1);
|
||||
|
||||
@ -398,12 +400,14 @@ TEST(RtpPayloadParamsTest, SetsGenericFromGenericFrameInfo) {
|
||||
EXPECT_THAT(key_header.generic->dependencies, IsEmpty());
|
||||
EXPECT_THAT(key_header.generic->decode_target_indications,
|
||||
ElementsAre(DecodeTargetIndication::kSwitch));
|
||||
EXPECT_THAT(key_header.generic->chain_diffs, SizeIs(2));
|
||||
|
||||
encoded_image._frameType = VideoFrameType::kVideoFrameDelta;
|
||||
codec_info.generic_frame_info =
|
||||
GenericFrameInfo::Builder().S(2).T(3).Dtis("D").Build();
|
||||
codec_info.generic_frame_info->encoder_buffers = {
|
||||
{/*id=*/0, /*referenced=*/true, /*updated=*/false}};
|
||||
codec_info.generic_frame_info->part_of_chain = {false, false};
|
||||
RTPVideoHeader delta_header =
|
||||
params.GetRtpVideoHeader(encoded_image, &codec_info, /*frame_id=*/3);
|
||||
|
||||
@ -414,6 +418,7 @@ TEST(RtpPayloadParamsTest, SetsGenericFromGenericFrameInfo) {
|
||||
EXPECT_THAT(delta_header.generic->dependencies, ElementsAre(1));
|
||||
EXPECT_THAT(delta_header.generic->decode_target_indications,
|
||||
ElementsAre(DecodeTargetIndication::kDiscardable));
|
||||
EXPECT_THAT(delta_header.generic->chain_diffs, SizeIs(2));
|
||||
}
|
||||
|
||||
class RtpPayloadParamsVp8ToGenericTest : public ::testing::Test {
|
||||
|
@ -12,6 +12,7 @@
|
||||
#define COMMON_VIDEO_GENERIC_FRAME_DESCRIPTOR_GENERIC_FRAME_INFO_H_
|
||||
|
||||
#include <initializer_list>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/container/inlined_vector.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
@ -41,6 +42,7 @@ struct GenericFrameInfo : public FrameDependencyTemplate {
|
||||
~GenericFrameInfo();
|
||||
|
||||
absl::InlinedVector<CodecBufferUsage, kMaxEncoderBuffers> encoder_buffers;
|
||||
std::vector<bool> part_of_chain;
|
||||
};
|
||||
|
||||
class GenericFrameInfo::Builder {
|
||||
|
Reference in New Issue
Block a user