decode_test_driver.cc (4121B)
1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include "gtest/gtest.h" 13 14 #include "test/codec_factory.h" 15 #include "test/decode_test_driver.h" 16 #include "test/register_state_check.h" 17 #include "test/video_source.h" 18 19 namespace libaom_test { 20 21 const char kAV1Name[] = "AOMedia Project AV1 Decoder"; 22 23 aom_codec_err_t Decoder::PeekStream(const uint8_t *cxdata, size_t size, 24 aom_codec_stream_info_t *stream_info) { 25 return aom_codec_peek_stream_info(CodecInterface(), cxdata, size, 26 stream_info); 27 } 28 29 aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) { 30 return DecodeFrame(cxdata, size, nullptr); 31 } 32 33 aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size, 34 void *user_priv) { 35 aom_codec_err_t res_dec; 36 InitOnce(); 37 API_REGISTER_STATE_CHECK( 38 res_dec = aom_codec_decode(&decoder_, cxdata, size, user_priv)); 39 return res_dec; 40 } 41 42 bool Decoder::IsAV1() const { 43 const char *codec_name = GetDecoderName(); 44 return strncmp(kAV1Name, codec_name, sizeof(kAV1Name) - 1) == 0; 45 } 46 47 void DecoderTest::HandlePeekResult(Decoder *const /*decoder*/, 48 CompressedVideoSource * /*video*/, 49 const aom_codec_err_t res_peek) { 50 /* The Av1 implementation of PeekStream returns an error only if the 51 * data passed to it isn't a valid Av1 chunk. */ 52 ASSERT_EQ(AOM_CODEC_OK, res_peek) 53 << "Peek return failed: " << aom_codec_err_to_string(res_peek); 54 } 55 56 void DecoderTest::RunLoop(CompressedVideoSource *video, 57 const aom_codec_dec_cfg_t &dec_cfg) { 58 Decoder *const decoder = codec_->CreateDecoder(dec_cfg, flags_); 59 ASSERT_NE(decoder, nullptr); 60 bool end_of_file = false; 61 bool peeked_stream = false; 62 63 // Decode frames. 64 for (video->Begin(); !::testing::Test::HasFailure() && !end_of_file; 65 video->Next()) { 66 PreDecodeFrameHook(*video, decoder); 67 68 aom_codec_stream_info_t stream_info; 69 stream_info.is_annexb = 0; 70 71 if (video->cxdata() != nullptr) { 72 if (!peeked_stream) { 73 // TODO(yaowu): PeekStream returns error for non-sequence_header_obu, 74 // therefore should only be tried once per sequence, this shall be fixed 75 // once PeekStream is updated to properly operate on other obus. 76 const aom_codec_err_t res_peek = decoder->PeekStream( 77 video->cxdata(), video->frame_size(), &stream_info); 78 HandlePeekResult(decoder, video, res_peek); 79 ASSERT_FALSE(::testing::Test::HasFailure()); 80 peeked_stream = true; 81 } 82 83 aom_codec_err_t res_dec = 84 decoder->DecodeFrame(video->cxdata(), video->frame_size()); 85 if (!HandleDecodeResult(res_dec, *video, decoder)) break; 86 } else { 87 // Signal end of the file to the decoder. 88 const aom_codec_err_t res_dec = decoder->DecodeFrame(nullptr, 0); 89 ASSERT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); 90 end_of_file = true; 91 } 92 93 DxDataIterator dec_iter = decoder->GetDxData(); 94 const aom_image_t *img = nullptr; 95 96 // Get decompressed data 97 while (!::testing::Test::HasFailure() && (img = dec_iter.Next())) 98 DecompressedFrameHook(*img, video->frame_number()); 99 } 100 delete decoder; 101 } 102 103 void DecoderTest::RunLoop(CompressedVideoSource *video) { 104 aom_codec_dec_cfg_t dec_cfg = aom_codec_dec_cfg_t(); 105 RunLoop(video, dec_cfg); 106 } 107 108 void DecoderTest::set_cfg(const aom_codec_dec_cfg_t &dec_cfg) { 109 cfg_ = dec_cfg; 110 } 111 112 void DecoderTest::set_flags(const aom_codec_flags_t flags) { flags_ = flags; } 113 114 } // namespace libaom_test