TestVP9Decode.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <LibVideo/Containers/Matroska/Reader.h>
  8. #include <LibVideo/VP9/Decoder.h>
  9. static void decode_video(StringView path, size_t expected_frame_count)
  10. {
  11. auto matroska_reader = MUST(Video::Matroska::Reader::from_file(path));
  12. u64 video_track = 0;
  13. MUST(matroska_reader.for_each_track_of_type(Video::Matroska::TrackEntry::TrackType::Video, [&](Video::Matroska::TrackEntry const& track_entry) -> Video::DecoderErrorOr<IterationDecision> {
  14. video_track = track_entry.track_number();
  15. return IterationDecision::Break;
  16. }));
  17. VERIFY(video_track != 0);
  18. auto iterator = MUST(matroska_reader.create_sample_iterator(video_track));
  19. size_t frame_count = 0;
  20. Video::VP9::Decoder vp9_decoder;
  21. while (frame_count <= expected_frame_count) {
  22. auto block_result = iterator.next_block();
  23. if (block_result.is_error() && block_result.error().category() == Video::DecoderErrorCategory::EndOfStream) {
  24. VERIFY(frame_count == expected_frame_count);
  25. return;
  26. }
  27. auto block = block_result.release_value();
  28. for (auto const& frame : block.frames()) {
  29. MUST(vp9_decoder.receive_sample(frame));
  30. frame_count++;
  31. }
  32. }
  33. VERIFY_NOT_REACHED();
  34. }
  35. TEST_CASE(webm_in_vp9)
  36. {
  37. decode_video("./vp9_in_webm.webm"sv, 25);
  38. }
  39. BENCHMARK_CASE(vp9_4k)
  40. {
  41. decode_video("./vp9_4k.webm"sv, 2);
  42. }