[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:

committed by
Chromium LUCI CQ

parent
faea376037
commit
1f6f12700d
media
gpu
mac
test
video_encoder
windows
mojo
mojom
video
@ -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) {
|
||||
|
Reference in New Issue
Block a user