0

media/gpu/test: Don't de-reference invalid pointer on dropped frame

This CL fixes the issue that DecoderBufferValidator de-references an
invalid pointer in case of dropped frame.

Bug: None
Test: video_encode_accelerator_tests --codec=vp9
Change-Id: I983aa86ccfa8c10fa1256294534d81cb85370971
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5428278
Reviewed-by: Justin Green <greenjustin@google.com>
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1284134}
This commit is contained in:
Hirokazu Honda
2024-04-08 22:29:19 +00:00
committed by Chromium LUCI CQ
parent e05ae3b16f
commit 6e23de78b4
2 changed files with 22 additions and 10 deletions

@ -83,8 +83,10 @@ DecoderBufferValidator::~DecoderBufferValidator() = default;
void DecoderBufferValidator::ProcessBitstream(
scoped_refptr<BitstreamRef> bitstream,
size_t frame_index) {
if (!Validate(*bitstream->buffer, bitstream->metadata))
CHECK(bitstream);
if (!Validate(bitstream->buffer.get(), bitstream->metadata)) {
num_errors_++;
}
}
bool DecoderBufferValidator::WaitUntilDone() {
@ -102,7 +104,7 @@ H264Validator::H264Validator(VideoCodecProfile profile,
H264Validator::~H264Validator() = default;
bool H264Validator::Validate(const DecoderBuffer& decoder_buffer,
bool H264Validator::Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) {
if (metadata.dropped_frame()) {
LOG(ERROR)
@ -115,6 +117,8 @@ bool H264Validator::Validate(const DecoderBuffer& decoder_buffer,
return false;
}
CHECK(buffer);
const DecoderBuffer& decoder_buffer = *buffer;
parser_.SetStream(decoder_buffer.data(), decoder_buffer.data_size());
if (num_temporal_layers_ > 1) {
@ -302,7 +306,7 @@ VP8Validator::VP8Validator(const gfx::Rect& visible_rect,
VP8Validator::~VP8Validator() = default;
bool VP8Validator::Validate(const DecoderBuffer& decoder_buffer,
bool VP8Validator::Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) {
if (metadata.dropped_frame()) {
if (metadata.key_frame) {
@ -321,6 +325,9 @@ bool VP8Validator::Validate(const DecoderBuffer& decoder_buffer,
return false;
}
CHECK(buffer);
const DecoderBuffer& decoder_buffer = *buffer;
// TODO(hiroh): We could be getting more frames in the buffer, but there is
// no simple way to detect this. We'd need to parse the frames and go through
// partition numbers/sizes. For now assume one frame per buffer.
@ -453,7 +460,7 @@ VP9Validator::VP9Validator(VideoCodecProfile profile,
VP9Validator::~VP9Validator() = default;
bool VP9Validator::Validate(const DecoderBuffer& decoder_buffer,
bool VP9Validator::Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) {
if (metadata.dropped_frame()) {
if (metadata.key_frame) {
@ -487,6 +494,9 @@ bool VP9Validator::Validate(const DecoderBuffer& decoder_buffer,
return false;
}
CHECK(buffer);
const DecoderBuffer& decoder_buffer = *buffer;
// See Annex B "Superframes" in VP9 spec.
constexpr uint8_t kSuperFrameMarkerMask = 0b11100000;
constexpr uint8_t kSuperFrameMarker = 0b11000000;
@ -966,7 +976,7 @@ AV1Validator::AV1Validator(const gfx::Rect& visible_rect)
// TODO(b/268487938): Add more robust testing here. Currently we only perform
// the most basic validation that the bitstream parses correctly and has the
// right dimensions.
bool AV1Validator::Validate(const DecoderBuffer& decoder_buffer,
bool AV1Validator::Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) {
if (metadata.dropped_frame()) {
if (metadata.key_frame) {
@ -984,6 +994,8 @@ bool AV1Validator::Validate(const DecoderBuffer& decoder_buffer,
return false;
}
CHECK(buffer);
const DecoderBuffer& decoder_buffer = *buffer;
libgav1::ObuParser av1_parser(decoder_buffer.data(),
decoder_buffer.data_size(), 0, &buffer_pool_,
&decoder_state_);

@ -52,7 +52,7 @@ class DecoderBufferValidator : public BitstreamProcessor {
size_t num_temporal_layers);
// Returns true if decoder_buffer is valid and expected, otherwise false.
virtual bool Validate(const DecoderBuffer& decoder_buffer,
virtual bool Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) = 0;
// The expected visible rectangle that |decoder_buffer| has.
@ -76,7 +76,7 @@ class H264Validator : public DecoderBufferValidator {
~H264Validator() override;
private:
bool Validate(const DecoderBuffer& decoder_buffer,
bool Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) override;
// Returns whether the |slice_hdr| is the first slice of a new frame.
@ -112,7 +112,7 @@ class VP8Validator : public DecoderBufferValidator {
~VP8Validator() override;
private:
bool Validate(const DecoderBuffer& decoder_buffer,
bool Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) override;
Vp8Parser parser_;
@ -137,7 +137,7 @@ class VP9Validator : public DecoderBufferValidator {
uint8_t temporal_id = 0;
};
bool Validate(const DecoderBuffer& decoder_buffer,
bool Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) override;
// Validate DecoderBuffer for a vanilla stream.
@ -183,7 +183,7 @@ class AV1Validator : public DecoderBufferValidator {
~AV1Validator() override = default;
private:
bool Validate(const DecoderBuffer& decoder_buffer,
bool Validate(const DecoderBuffer* buffer,
const BitstreamBufferMetadata& metadata) override;
libgav1::InternalFrameBufferList buffer_list_;