TestVP9Decode.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. while (true) {
  31. auto frame_result = vp9_decoder.get_decoded_frame();
  32. if (frame_result.is_error()) {
  33. if (frame_result.error().category() == Video::DecoderErrorCategory::NeedsMoreInput) {
  34. break;
  35. }
  36. VERIFY_NOT_REACHED();
  37. }
  38. }
  39. frame_count++;
  40. }
  41. }
  42. VERIFY_NOT_REACHED();
  43. }
  44. TEST_CASE(webm_in_vp9)
  45. {
  46. decode_video("./vp9_in_webm.webm"sv, 25);
  47. }
  48. TEST_CASE(vp9_oob_blocks)
  49. {
  50. decode_video("./vp9_oob_blocks.webm"sv, 240);
  51. }
  52. BENCHMARK_CASE(vp9_4k)
  53. {
  54. decode_video("./vp9_4k.webm"sv, 2);
  55. }
  56. BENCHMARK_CASE(vp9_clamp_reference_mvs)
  57. {
  58. decode_video("./vp9_clamp_reference_mvs.webm"sv, 92);
  59. }