0

[VEA]Remove redundant temporal_idx for AV1/H265

Since we have SVCGenericMetadata to provide generic svc layer
metadata for video encode accelerator, remove the redundant
definition for codec AV1 and H265.

Bug: 40763991
Change-Id: I342bfd9f83c1a52e7c2a123c5081f7201c1e4903
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5950554
Commit-Queue: Yingying Ma <yingying.ma@intel.com>
Reviewed-by: Alex Gough <ajgo@chromium.org>
Reviewed-by: Eugene Zemtsov <eugene@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1373183}
This commit is contained in:
yingyingma
2024-10-24 07:57:32 +00:00
committed by Chromium LUCI CQ
parent faea376037
commit 1f6f12700d
10 changed files with 18 additions and 129 deletions

@ -854,7 +854,7 @@ void VTVideoEncodeAccelerator::ReturnBitstreamBuffer(
md.h264.emplace().temporal_idx = belongs_to_base_layer ? 0 : 1;
break;
case VideoCodec::kHEVC:
md.h265.emplace().temporal_idx = belongs_to_base_layer ? 0 : 1;
md.svc_generic.emplace().temporal_idx = belongs_to_base_layer ? 0 : 1;
break;
default:
NOTREACHED_IN_MIGRATION();

@ -994,7 +994,7 @@ bool AV1Validator::Validate(const DecoderBuffer* buffer,
LOG(ERROR) << "Don't drop key frame";
return false;
}
if (metadata.av1.has_value()) {
if (metadata.svc_generic.has_value()) {
LOG(ERROR) << "BitstreamBufferMetadata has Av1Metadata on dropped frame";
return false;
}

@ -2682,7 +2682,7 @@ void MediaFoundationVideoEncodeAccelerator::ProcessOutput() {
if (codec_ == VideoCodec::kH264) {
md.h264.emplace().temporal_idx = temporal_id;
} else if (codec_ == VideoCodec::kHEVC) {
md.h265.emplace().temporal_idx = temporal_id;
md.svc_generic.emplace().temporal_idx = temporal_id;
} else if (codec_ == VideoCodec::kVP9) {
Vp9Metadata& vp9 = md.vp9.emplace();
if (keyframe) {

@ -266,10 +266,9 @@ interface VideoEncodeAccelerator {
Flush() => (bool result);
};
// DropFrameMetadata, H264Metadata, H265metadata, Vp8Metadata, Vp9Metadata and
// Av1Metadata define mojo transport formats for media::DropFrameMetadata,
// media::H264Metadata, media::H265Metadata, media::Vp8Metadata,
// media::Vp9Metadata and media::Av1Metadata, respectively. See the structures
// DropFrameMetadata, H264Metadata, Vp8Metadata and Vp9Metadata define mojo
// transport formats for media::DropFrameMetadata, media::H264Metadata,
// media::Vp8Metadata and media::Vp9Metadata, respectively. See the structures
// defined video_encode_accelerator.h for the descriptions of the variables.
// Either of them is filled in GPU process only in the case of temporal/spatial
// SVC encoding. That is, none of them is filled in the case of non
@ -288,10 +287,6 @@ struct H264Metadata {
bool layer_sync;
};
struct H265Metadata {
uint8 temporal_idx;
};
struct Vp8Metadata {
bool non_reference;
uint8 temporal_idx;
@ -312,10 +307,6 @@ struct Vp9Metadata {
array<uint8> p_diffs;
};
struct Av1Metadata {
uint8 temporal_idx;
};
struct SVCGenericMetadata {
bool follow_svc_spec;
uint8 temporal_idx;
@ -328,10 +319,8 @@ struct SVCGenericMetadata {
union OptionalMetadata {
DropFrameMetadata drop;
H264Metadata h264;
H265Metadata h265;
Vp8Metadata vp8;
Vp9Metadata vp9;
Av1Metadata av1;
};
struct BitstreamBufferMetadata {

@ -207,12 +207,6 @@ bool UnionTraits<media::mojom::OptionalMetadataDataView,
case media::mojom::OptionalMetadataDataView::Tag::kVp9: {
return data.ReadVp9(&out->vp9);
}
case media::mojom::OptionalMetadataDataView::Tag::kAv1: {
return data.ReadAv1(&out->av1);
}
case media::mojom::OptionalMetadataDataView::Tag::kH265: {
return data.ReadH265(&out->h265);
}
}
NOTREACHED();
}
@ -260,14 +254,6 @@ bool StructTraits<media::mojom::H264MetadataDataView, media::H264Metadata>::
return true;
}
// static
bool StructTraits<media::mojom::H265MetadataDataView, media::H265Metadata>::
Read(media::mojom::H265MetadataDataView data,
media::H265Metadata* out_metadata) {
out_metadata->temporal_idx = data.temporal_idx();
return true;
}
// static
bool StructTraits<media::mojom::Vp8MetadataDataView, media::Vp8Metadata>::Read(
media::mojom::Vp8MetadataDataView data,
@ -300,14 +286,6 @@ bool StructTraits<media::mojom::Vp9MetadataDataView, media::Vp9Metadata>::Read(
data.ReadPDiffs(&out_metadata->p_diffs);
}
// static
bool StructTraits<media::mojom::Av1MetadataDataView, media::Av1Metadata>::Read(
media::mojom::Av1MetadataDataView data,
media::Av1Metadata* out_metadata) {
out_metadata->temporal_idx = data.temporal_idx();
return true;
}
// static
bool StructTraits<media::mojom::SVCGenericMetadataDataView,
media::SVCGenericMetadata>::

@ -162,17 +162,12 @@ struct UnionTraits<media::mojom::OptionalMetadataDataView,
return media::mojom::OptionalMetadataDataView::Tag::kVp8;
} else if (metadata.vp9) {
return media::mojom::OptionalMetadataDataView::Tag::kVp9;
} else if (metadata.av1) {
return media::mojom::OptionalMetadataDataView::Tag::kAv1;
} else if (metadata.h265) {
return media::mojom::OptionalMetadataDataView::Tag::kH265;
}
NOTREACHED();
}
static bool IsNull(const media::BitstreamBufferMetadata& metadata) {
return !metadata.drop && !metadata.h264 && !metadata.vp8 && !metadata.vp9 &&
!metadata.av1 && !metadata.h265;
return !metadata.drop && !metadata.h264 && !metadata.vp8 && !metadata.vp9;
}
static void SetToNull(media::BitstreamBufferMetadata* metadata) {
@ -180,8 +175,6 @@ struct UnionTraits<media::mojom::OptionalMetadataDataView,
metadata->h264.reset();
metadata->vp8.reset();
metadata->vp9.reset();
metadata->av1.reset();
metadata->h265.reset();
}
static const media::DropFrameMetadata& drop(
@ -203,16 +196,6 @@ struct UnionTraits<media::mojom::OptionalMetadataDataView,
return *metadata.vp9;
}
static const media::Av1Metadata& av1(
const media::BitstreamBufferMetadata& metadata) {
return *metadata.av1;
}
static const media::H265Metadata& h265(
const media::BitstreamBufferMetadata& metadata) {
return *metadata.h265;
}
static bool Read(media::mojom::OptionalMetadataDataView data,
media::BitstreamBufferMetadata* metadata);
};
@ -282,17 +265,6 @@ class StructTraits<media::mojom::H264MetadataDataView, media::H264Metadata> {
media::H264Metadata* out_metadata);
};
template <>
class StructTraits<media::mojom::H265MetadataDataView, media::H265Metadata> {
public:
static uint8_t temporal_idx(const media::H265Metadata& h265) {
return h265.temporal_idx;
}
static bool Read(media::mojom::H265MetadataDataView data,
media::H265Metadata* out_metadata);
};
template <>
class StructTraits<media::mojom::Vp8MetadataDataView, media::Vp8Metadata> {
public:
@ -356,17 +328,6 @@ class StructTraits<media::mojom::Vp9MetadataDataView, media::Vp9Metadata> {
media::Vp9Metadata* out_metadata);
};
template <>
class StructTraits<media::mojom::Av1MetadataDataView, media::Av1Metadata> {
public:
static uint8_t temporal_idx(const media::Av1Metadata& av1) {
return av1.temporal_idx;
}
static bool Read(media::mojom::Av1MetadataDataView data,
media::Av1Metadata* out_metadata);
};
template <>
class StructTraits<media::mojom::SVCGenericMetadataDataView,
media::SVCGenericMetadata> {

@ -20,10 +20,6 @@ Vp9Metadata::Vp9Metadata() = default;
Vp9Metadata::~Vp9Metadata() = default;
Vp9Metadata::Vp9Metadata(const Vp9Metadata&) = default;
Av1Metadata::Av1Metadata() = default;
Av1Metadata::~Av1Metadata() = default;
Av1Metadata::Av1Metadata(const Av1Metadata&) = default;
BitstreamBufferMetadata::BitstreamBufferMetadata()
: payload_size_bytes(0), key_frame(false) {}
BitstreamBufferMetadata::BitstreamBufferMetadata(
@ -289,10 +285,6 @@ bool operator==(const H264Metadata& l, const H264Metadata& r) {
return l.temporal_idx == r.temporal_idx && l.layer_sync == r.layer_sync;
}
bool operator==(const H265Metadata& l, const H265Metadata& r) {
return l.temporal_idx == r.temporal_idx;
}
bool operator==(const Vp8Metadata& l, const Vp8Metadata& r) {
return l.non_reference == r.non_reference &&
l.temporal_idx == r.temporal_idx && l.layer_sync == r.layer_sync;
@ -309,10 +301,6 @@ bool operator==(const Vp9Metadata& l, const Vp9Metadata& r) {
l.p_diffs == r.p_diffs;
}
bool operator==(const Av1Metadata& l, const Av1Metadata& r) {
return l.temporal_idx == r.temporal_idx;
}
bool operator==(const SVCGenericMetadata& l, const SVCGenericMetadata& r) {
return l.follow_svc_spec == r.follow_svc_spec &&
l.temporal_idx == r.temporal_idx && l.spatial_idx == r.spatial_idx &&
@ -325,7 +313,7 @@ bool operator==(const BitstreamBufferMetadata& l,
return l.payload_size_bytes == r.payload_size_bytes &&
l.key_frame == r.key_frame && l.timestamp == r.timestamp &&
l.vp8 == r.vp8 && l.vp9 == r.vp9 && l.h264 == r.h264 &&
l.av1 == r.av1 && l.h265 == r.h265 && l.svc_generic == r.svc_generic;
l.svc_generic == r.svc_generic;
}
bool operator==(const VideoEncodeAccelerator::Config::SpatialLayer& l,

@ -53,12 +53,6 @@ struct MEDIA_EXPORT H264Metadata final {
bool layer_sync = false;
};
// Metadata for H265 bitstream buffer.
// |temporal_idx| indicates the temporal index of this frame.
struct MEDIA_EXPORT H265Metadata final {
uint8_t temporal_idx = 0;
};
// Metadata for a VP8 bitstream buffer.
// |non_reference| is true iff this frame does not update any reference buffer,
// meaning dropping this frame still results in a decodable
@ -119,15 +113,6 @@ struct MEDIA_EXPORT Vp9Metadata final {
std::vector<uint8_t> p_diffs;
};
// Metadata for an AV1 bitstream buffer.
struct MEDIA_EXPORT Av1Metadata final {
Av1Metadata();
~Av1Metadata();
Av1Metadata(const Av1Metadata&);
// The temporal index for this frame.
uint8_t temporal_idx = 0;
};
// Metadata for filling webrtc::CodecSpecificInfo.generic_frame_info.
struct MEDIA_EXPORT SVCGenericMetadata final {
// True iff the reference dependency follows any of the scalability modes
@ -180,15 +165,13 @@ struct MEDIA_EXPORT BitstreamBufferMetadata final {
bool dropped_frame() const;
std::optional<uint8_t> spatial_idx() const;
// |drop|, |h264|, |vp8|, |vp9|, |av1| and |h265| may be set, but not multiple
// of them. Presumably, it's also possible for none of them to be set.
// |drop|, |h264|, |vp8| and |vp9| may be set, but not multiple of them.
// Presumably, it's also possible for none of them to be set.
// |drop| is set if and only if the frame is dropped.
std::optional<DropFrameMetadata> drop;
std::optional<H264Metadata> h264;
std::optional<Vp8Metadata> vp8;
std::optional<Vp9Metadata> vp9;
std::optional<Av1Metadata> av1;
std::optional<H265Metadata> h265;
// Metadata for SVC encoding is expected to be set in |svc_generic|.
// TODO: Deprecate the above legacy codec specific medadata and replace them
@ -536,7 +519,6 @@ MEDIA_EXPORT bool operator==(const VideoEncodeAccelerator::SupportedProfile& l,
const VideoEncodeAccelerator::SupportedProfile& r);
MEDIA_EXPORT bool operator==(const Vp8Metadata& l, const Vp8Metadata& r);
MEDIA_EXPORT bool operator==(const Vp9Metadata& l, const Vp9Metadata& r);
MEDIA_EXPORT bool operator==(const Av1Metadata& l, const Av1Metadata& r);
MEDIA_EXPORT bool operator==(const BitstreamBufferMetadata& l,
const BitstreamBufferMetadata& r);
MEDIA_EXPORT bool operator==(

@ -826,10 +826,10 @@ void VideoEncodeAcceleratorAdapter::BitstreamBufferReady(
result.temporal_id = metadata.vp9.value().temporal_idx;
else if (metadata.vp8.has_value())
result.temporal_id = metadata.vp8.value().temporal_idx;
else if (metadata.av1.has_value())
result.temporal_id = metadata.av1.value().temporal_idx;
else if (metadata.h265.has_value())
result.temporal_id = metadata.h265.value().temporal_idx;
if (metadata.svc_generic.has_value()) {
result.temporal_id = metadata.svc_generic->temporal_idx;
}
if (metadata.encoded_size)
result.encoded_size = metadata.encoded_size;

@ -300,8 +300,6 @@ TEST_F(VideoEncodeAcceleratorAdapterTest, TemporalSvc) {
EXPECT_EQ(output.temporal_id, 2);
else if (output.timestamp == base::Milliseconds(4))
EXPECT_EQ(output.temporal_id, 2);
else
EXPECT_EQ(output.temporal_id, 2);
EXPECT_EQ(output.color_space, expected_color_space);
outputs_count++;
@ -320,11 +318,8 @@ TEST_F(VideoEncodeAcceleratorAdapterTest, TemporalSvc) {
result.vp9 = Vp9Metadata();
result.vp9->temporal_idx = 2;
} else if (frame->timestamp() == base::Milliseconds(4)) {
result.av1 = Av1Metadata();
result.av1->temporal_idx = 2;
} else {
result.h265 = H265Metadata();
result.h265->temporal_idx = 2;
result.svc_generic = SVCGenericMetadata();
result.svc_generic->temporal_idx = 2;
}
return result;
}));
@ -339,8 +334,7 @@ TEST_F(VideoEncodeAcceleratorAdapterTest, TemporalSvc) {
CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(3));
auto frame4 =
CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(4));
auto frame5 =
CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(5));
adapter()->Encode(frame1, VideoEncoder::EncodeOptions(true),
ValidatingStatusCB());
RunUntilIdle();
@ -353,10 +347,7 @@ TEST_F(VideoEncodeAcceleratorAdapterTest, TemporalSvc) {
adapter()->Encode(frame4, VideoEncoder::EncodeOptions(true),
ValidatingStatusCB());
RunUntilIdle();
adapter()->Encode(frame5, VideoEncoder::EncodeOptions(true),
ValidatingStatusCB());
RunUntilIdle();
EXPECT_EQ(outputs_count, 5);
EXPECT_EQ(outputs_count, 4);
}
TEST_F(VideoEncodeAcceleratorAdapterTest, FlushDuringInitialize) {