Populate generic descriptor based on GenericFrameInfo when available.
Bug: webrtc:10342 Change-Id: Iff769d2604fd79784bcb09874d2803793d20bde5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167000 Reviewed-by: Philip Eliasson <philipel@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30505}
This commit is contained in:

committed by
Commit Bot

parent
546a9e4350
commit
02d71fb882
@ -167,6 +167,7 @@ rtc_library("rtp_sender") {
|
|||||||
"../modules/rtp_rtcp:rtp_video_header",
|
"../modules/rtp_rtcp:rtp_video_header",
|
||||||
"../modules/utility",
|
"../modules/utility",
|
||||||
"../modules/video_coding:codec_globals_headers",
|
"../modules/video_coding:codec_globals_headers",
|
||||||
|
"../modules/video_coding:frame_dependencies_calculator",
|
||||||
"../modules/video_coding:video_codec_interface",
|
"../modules/video_coding:video_codec_interface",
|
||||||
"../rtc_base",
|
"../rtc_base",
|
||||||
"../rtc_base:checks",
|
"../rtc_base:checks",
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "absl/algorithm/container.h"
|
||||||
#include "absl/container/inlined_vector.h"
|
#include "absl/container/inlined_vector.h"
|
||||||
#include "absl/types/variant.h"
|
#include "absl/types/variant.h"
|
||||||
#include "api/video/video_timing.h"
|
#include "api/video/video_timing.h"
|
||||||
@ -21,6 +22,7 @@
|
|||||||
#include "modules/video_coding/codecs/interface/common_constants.h"
|
#include "modules/video_coding/codecs/interface/common_constants.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"
|
||||||
|
#include "modules/video_coding/frame_dependencies_calculator.h"
|
||||||
#include "rtc_base/arraysize.h"
|
#include "rtc_base/arraysize.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
@ -248,10 +250,36 @@ void RtpPayloadParams::SetCodecSpecific(RTPVideoHeader* rtp_video_header,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTPVideoHeader::GenericDescriptorInfo
|
||||||
|
RtpPayloadParams::GenericDescriptorFromFrameInfo(
|
||||||
|
const GenericFrameInfo& frame_info,
|
||||||
|
int64_t frame_id,
|
||||||
|
VideoFrameType frame_type) {
|
||||||
|
RTPVideoHeader::GenericDescriptorInfo generic;
|
||||||
|
generic.frame_id = frame_id;
|
||||||
|
generic.dependencies = dependencies_calculator_.FromBuffersUsage(
|
||||||
|
frame_type, frame_id, frame_info.encoder_buffers);
|
||||||
|
generic.spatial_index = frame_info.spatial_id;
|
||||||
|
generic.temporal_index = frame_info.temporal_id;
|
||||||
|
generic.decode_target_indications = frame_info.decode_target_indications;
|
||||||
|
generic.discardable =
|
||||||
|
absl::c_linear_search(frame_info.decode_target_indications,
|
||||||
|
DecodeTargetIndication::kDiscardable);
|
||||||
|
return generic;
|
||||||
|
}
|
||||||
|
|
||||||
void RtpPayloadParams::SetGeneric(const CodecSpecificInfo* codec_specific_info,
|
void RtpPayloadParams::SetGeneric(const CodecSpecificInfo* codec_specific_info,
|
||||||
int64_t frame_id,
|
int64_t frame_id,
|
||||||
bool is_keyframe,
|
bool is_keyframe,
|
||||||
RTPVideoHeader* rtp_video_header) {
|
RTPVideoHeader* rtp_video_header) {
|
||||||
|
if (codec_specific_info && codec_specific_info->generic_frame_info &&
|
||||||
|
!codec_specific_info->generic_frame_info->encoder_buffers.empty()) {
|
||||||
|
rtp_video_header->generic =
|
||||||
|
GenericDescriptorFromFrameInfo(*codec_specific_info->generic_frame_info,
|
||||||
|
frame_id, rtp_video_header->frame_type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (rtp_video_header->codec) {
|
switch (rtp_video_header->codec) {
|
||||||
case VideoCodecType::kVideoCodecGeneric:
|
case VideoCodecType::kVideoCodecGeneric:
|
||||||
GenericToGeneric(frame_id, is_keyframe, rtp_video_header);
|
GenericToGeneric(frame_id, is_keyframe, rtp_video_header);
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "call/rtp_config.h"
|
#include "call/rtp_config.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
|
#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
|
||||||
#include "modules/rtp_rtcp/source/rtp_video_header.h"
|
#include "modules/rtp_rtcp/source/rtp_video_header.h"
|
||||||
|
#include "modules/video_coding/frame_dependencies_calculator.h"
|
||||||
#include "modules/video_coding/include/video_codec_interface.h"
|
#include "modules/video_coding/include/video_codec_interface.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -43,6 +44,10 @@ class RtpPayloadParams final {
|
|||||||
private:
|
private:
|
||||||
void SetCodecSpecific(RTPVideoHeader* rtp_video_header,
|
void SetCodecSpecific(RTPVideoHeader* rtp_video_header,
|
||||||
bool first_frame_in_picture);
|
bool first_frame_in_picture);
|
||||||
|
RTPVideoHeader::GenericDescriptorInfo GenericDescriptorFromFrameInfo(
|
||||||
|
const GenericFrameInfo& frame_info,
|
||||||
|
int64_t frame_id,
|
||||||
|
VideoFrameType frame_type);
|
||||||
void SetGeneric(const CodecSpecificInfo* codec_specific_info,
|
void SetGeneric(const CodecSpecificInfo* codec_specific_info,
|
||||||
int64_t frame_id,
|
int64_t frame_id,
|
||||||
bool is_keyframe,
|
bool is_keyframe,
|
||||||
@ -79,6 +84,7 @@ class RtpPayloadParams final {
|
|||||||
bool layer_sync,
|
bool layer_sync,
|
||||||
RTPVideoHeader::GenericDescriptorInfo* generic);
|
RTPVideoHeader::GenericDescriptorInfo* generic);
|
||||||
|
|
||||||
|
FrameDependenciesCalculator dependencies_calculator_;
|
||||||
// TODO(bugs.webrtc.org/10242): Remove once all encoder-wrappers are updated.
|
// TODO(bugs.webrtc.org/10242): Remove once all encoder-wrappers are updated.
|
||||||
// Holds the last shared frame id for a given (spatial, temporal) layer.
|
// Holds the last shared frame id for a given (spatial, temporal) layer.
|
||||||
std::array<std::array<int64_t, RtpGenericFrameDescriptor::kMaxTemporalLayers>,
|
std::array<std::array<int64_t, RtpGenericFrameDescriptor::kMaxTemporalLayers>,
|
||||||
|
@ -371,6 +371,50 @@ TEST(RtpPayloadParamsTest, GenericDescriptorForGenericCodec) {
|
|||||||
EXPECT_THAT(header.generic->dependencies, ElementsAre(0));
|
EXPECT_THAT(header.generic->dependencies, ElementsAre(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(RtpPayloadParamsTest, SetsGenericFromGenericFrameInfo) {
|
||||||
|
test::ScopedFieldTrials generic_picture_id(
|
||||||
|
"WebRTC-GenericDescriptor/Enabled/");
|
||||||
|
RtpPayloadState state;
|
||||||
|
EncodedImage encoded_image;
|
||||||
|
CodecSpecificInfo codec_info;
|
||||||
|
|
||||||
|
RtpPayloadParams params(kSsrc1, &state);
|
||||||
|
|
||||||
|
encoded_image._frameType = VideoFrameType::kVideoFrameKey;
|
||||||
|
codec_info.generic_frame_info =
|
||||||
|
GenericFrameInfo::Builder().S(1).T(0).Dtis("S").Build();
|
||||||
|
codec_info.generic_frame_info->encoder_buffers = {
|
||||||
|
{/*id=*/0, /*referenced=*/false, /*updated=*/true}};
|
||||||
|
RTPVideoHeader key_header =
|
||||||
|
params.GetRtpVideoHeader(encoded_image, &codec_info, /*frame_id=*/1);
|
||||||
|
|
||||||
|
ASSERT_TRUE(key_header.generic);
|
||||||
|
EXPECT_EQ(key_header.generic->spatial_index, 1);
|
||||||
|
EXPECT_EQ(key_header.generic->temporal_index, 0);
|
||||||
|
EXPECT_EQ(key_header.generic->frame_id, 1);
|
||||||
|
EXPECT_THAT(key_header.generic->dependencies, IsEmpty());
|
||||||
|
EXPECT_THAT(key_header.generic->decode_target_indications,
|
||||||
|
ElementsAre(DecodeTargetIndication::kSwitch));
|
||||||
|
EXPECT_FALSE(key_header.generic->discardable);
|
||||||
|
|
||||||
|
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}};
|
||||||
|
RTPVideoHeader delta_header =
|
||||||
|
params.GetRtpVideoHeader(encoded_image, &codec_info, /*frame_id=*/3);
|
||||||
|
|
||||||
|
ASSERT_TRUE(delta_header.generic);
|
||||||
|
EXPECT_EQ(delta_header.generic->spatial_index, 2);
|
||||||
|
EXPECT_EQ(delta_header.generic->temporal_index, 3);
|
||||||
|
EXPECT_EQ(delta_header.generic->frame_id, 3);
|
||||||
|
EXPECT_THAT(delta_header.generic->dependencies, ElementsAre(1));
|
||||||
|
EXPECT_THAT(delta_header.generic->decode_target_indications,
|
||||||
|
ElementsAre(DecodeTargetIndication::kDiscardable));
|
||||||
|
EXPECT_TRUE(delta_header.generic->discardable);
|
||||||
|
}
|
||||||
|
|
||||||
class RtpPayloadParamsVp8ToGenericTest : public ::testing::Test {
|
class RtpPayloadParamsVp8ToGenericTest : public ::testing::Test {
|
||||||
public:
|
public:
|
||||||
enum LayerSync { kNoSync, kSync };
|
enum LayerSync { kNoSync, kSync };
|
||||||
|
@ -46,8 +46,6 @@ rtc_library("frame_dependencies_calculator") {
|
|||||||
"../../common_video/generic_frame_descriptor",
|
"../../common_video/generic_frame_descriptor",
|
||||||
"../../rtc_base:checks",
|
"../../rtc_base:checks",
|
||||||
"../../rtc_base:logging",
|
"../../rtc_base:logging",
|
||||||
"../../rtc_base:macromagic",
|
|
||||||
"../../rtc_base/synchronization:sequence_checker",
|
|
||||||
"//third_party/abseil-cpp/absl/algorithm:container",
|
"//third_party/abseil-cpp/absl/algorithm:container",
|
||||||
"//third_party/abseil-cpp/absl/container:inlined_vector",
|
"//third_party/abseil-cpp/absl/container:inlined_vector",
|
||||||
"//third_party/abseil-cpp/absl/types:optional",
|
"//third_party/abseil-cpp/absl/types:optional",
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#include "api/video/video_frame_type.h"
|
#include "api/video/video_frame_type.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
#include "rtc_base/synchronization/sequence_checker.h"
|
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
@ -28,8 +27,6 @@ absl::InlinedVector<int64_t, 5> FrameDependenciesCalculator::FromBuffersUsage(
|
|||||||
VideoFrameType frame_type,
|
VideoFrameType frame_type,
|
||||||
int64_t frame_id,
|
int64_t frame_id,
|
||||||
rtc::ArrayView<const CodecBufferUsage> buffers_usage) {
|
rtc::ArrayView<const CodecBufferUsage> buffers_usage) {
|
||||||
RTC_DCHECK_RUN_ON(&checker_);
|
|
||||||
|
|
||||||
absl::InlinedVector<int64_t, 5> dependencies;
|
absl::InlinedVector<int64_t, 5> dependencies;
|
||||||
RTC_DCHECK_GT(buffers_usage.size(), 0);
|
RTC_DCHECK_GT(buffers_usage.size(), 0);
|
||||||
for (const CodecBufferUsage& buffer_usage : buffers_usage) {
|
for (const CodecBufferUsage& buffer_usage : buffers_usage) {
|
||||||
|
@ -20,16 +20,15 @@
|
|||||||
#include "api/array_view.h"
|
#include "api/array_view.h"
|
||||||
#include "api/video/video_frame_type.h"
|
#include "api/video/video_frame_type.h"
|
||||||
#include "common_video/generic_frame_descriptor/generic_frame_info.h"
|
#include "common_video/generic_frame_descriptor/generic_frame_info.h"
|
||||||
#include "rtc_base/synchronization/sequence_checker.h"
|
|
||||||
#include "rtc_base/thread_annotations.h"
|
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
|
// This class is thread compatible.
|
||||||
class FrameDependenciesCalculator {
|
class FrameDependenciesCalculator {
|
||||||
public:
|
public:
|
||||||
FrameDependenciesCalculator() = default;
|
FrameDependenciesCalculator() = default;
|
||||||
FrameDependenciesCalculator(FrameDependenciesCalculator&&) = default;
|
FrameDependenciesCalculator(const FrameDependenciesCalculator&) = default;
|
||||||
FrameDependenciesCalculator& operator=(FrameDependenciesCalculator&&) =
|
FrameDependenciesCalculator& operator=(const FrameDependenciesCalculator&) =
|
||||||
default;
|
default;
|
||||||
|
|
||||||
// Calculates frame dependencies based on previous encoder buffer usage.
|
// Calculates frame dependencies based on previous encoder buffer usage.
|
||||||
@ -44,8 +43,7 @@ class FrameDependenciesCalculator {
|
|||||||
absl::InlinedVector<int64_t, 4> dependencies;
|
absl::InlinedVector<int64_t, 4> dependencies;
|
||||||
};
|
};
|
||||||
|
|
||||||
SequenceChecker checker_;
|
absl::InlinedVector<BufferUsage, 4> buffers_;
|
||||||
absl::InlinedVector<BufferUsage, 4> buffers_ RTC_GUARDED_BY(checker_);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
Reference in New Issue
Block a user