Commit 7018f324 authored by David Staessens's avatar David Staessens Committed by Commit Bot

media/gpu/test: Add additional checks when parsing VP8/9 video files in tests.

This CL adds additional checks to the simple IVF video file parser used by the
video_decode_accelerator_(perf_)tests, to make sure we are reading a valid IVF
video file.

TEST=./video_decode_accelerator_tests \
  vda_sanity-vp90_2_17_show_existing_frame_20190109.vp9

BUG=b:140538436

Cq-Depend: chromium:1789955
Change-Id: I3bab044f9382f10c0926078c4afd0483b3443c26
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1787660
Commit-Queue: David Staessens <dstaessens@chromium.org>
Reviewed-by: default avatarHirokazu Honda <hiroh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#695022}
parent ecbdfabc
...@@ -150,16 +150,33 @@ bool EncodedDataHelper::LookForSPS(size_t* skipped_fragments_count) { ...@@ -150,16 +150,33 @@ bool EncodedDataHelper::LookForSPS(size_t* skipped_fragments_count) {
std::string EncodedDataHelper::GetBytesForNextFrame() { std::string EncodedDataHelper::GetBytesForNextFrame() {
// Helpful description: http://wiki.multimedia.cx/index.php?title=IVF // Helpful description: http://wiki.multimedia.cx/index.php?title=IVF
constexpr size_t kIVFHeaderSize = 32;
constexpr size_t kIVFFrameHeaderSize = 12;
size_t pos = next_pos_to_decode_; size_t pos = next_pos_to_decode_;
std::string bytes; std::string bytes;
if (pos == 0)
pos = 32; // Skip IVF header.
// Only IVF video files are supported. The first 4bytes of an IVF video file's
// header should be "DKIF".
if (pos == 0) {
if ((data_.size() < kIVFHeaderSize) || strncmp(&data_[0], "DKIF", 4) != 0) {
LOG(ERROR) << "Unexpected data encountered while parsing IVF header";
return bytes;
}
pos = kIVFHeaderSize; // Skip IVF header.
}
// Read VP8/9 frame size from IVF header.
if (pos + kIVFFrameHeaderSize > data_.size()) {
LOG(ERROR) << "Unexpected data encountered while parsing IVF frame header";
return bytes;
}
uint32_t frame_size = *reinterpret_cast<uint32_t*>(&data_[pos]); uint32_t frame_size = *reinterpret_cast<uint32_t*>(&data_[pos]);
pos += 12; // Skip frame header. pos += kIVFFrameHeaderSize; // Skip IVF frame header.
// Make sure we are not reading out of bounds. // Make sure we are not reading out of bounds.
if (pos + frame_size > data_.size()) { if (pos + frame_size > data_.size()) {
LOG(ERROR) << "Unexpected data encountered while parsing frame"; LOG(ERROR) << "Unexpected data encountered while parsing IVF frame header";
next_pos_to_decode_ = data_.size(); next_pos_to_decode_ = data_.size();
return bytes; return bytes;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment