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:

committed by
Chromium LUCI CQ

parent
e05ae3b16f
commit
6e23de78b4
media/gpu/test/video_encoder
@ -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_;
|
||||
|
Reference in New Issue
Block a user