decode_test_driver.cc 3.06 KB
Newer Older
1
2
3
4
5
6
7
8
9
/*
 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
10
#include "test/codec_factory.h"
11
12
#include "test/decode_test_driver.h"
#include "third_party/googletest/src/include/gtest/gtest.h"
13
#include "test/register_state_check.h"
14
#include "test/video_source.h"
15
16
17

namespace libvpx_test {

18
19
20
21
22
23
24
25
const char kVP8Name[] = "WebM Project VP8";

vpx_codec_err_t Decoder::PeekStream(const uint8_t *cxdata, size_t size,
                                    vpx_codec_stream_info_t *stream_info) {
  return vpx_codec_peek_stream_info(CodecInterface(), cxdata, size,
                                    stream_info);
}

26
vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) {
27
  vpx_codec_err_t res_dec;
28
  InitOnce();
29
30
31
32
  REGISTER_STATE_CHECK(
      res_dec = vpx_codec_decode(&decoder_,
                                 cxdata, static_cast<unsigned int>(size),
                                 NULL, 0));
33
  return res_dec;
34
}
35
36
37

void DecoderTest::RunLoop(CompressedVideoSource *video) {
  vpx_codec_dec_cfg_t dec_cfg = {0};
38
39
  Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0);
  ASSERT_TRUE(decoder != NULL);
40
41
  const char *codec_name = decoder->GetDecoderName();
  const bool is_vp8 = strncmp(kVP8Name, codec_name, sizeof(kVP8Name) - 1) == 0;
42
43
44

  // Decode frames.
  for (video->Begin(); video->cxdata(); video->Next()) {
45
    PreDecodeFrameHook(*video, decoder);
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

    vpx_codec_stream_info_t stream_info;
    stream_info.sz = sizeof(stream_info);
    const vpx_codec_err_t res_peek = decoder->PeekStream(video->cxdata(),
                                                         video->frame_size(),
                                                         &stream_info);
    if (is_vp8) {
      /* Vp8's implementation of PeekStream returns an error if the frame you
       * pass it is not a keyframe, so we only expect VPX_CODEC_OK on the first
       * frame, which must be a keyframe. */
      if (video->frame_number() == 0)
        ASSERT_EQ(VPX_CODEC_OK, res_peek) << "Peek return failed: "
            << vpx_codec_err_to_string(res_peek);
    } else {
      /* The Vp9 implementation of PeekStream returns an error only if the
       * data passed to it isn't a valid Vp9 chunk. */
      ASSERT_EQ(VPX_CODEC_OK, res_peek) << "Peek return failed: "
          << vpx_codec_err_to_string(res_peek);
    }

66
67
    vpx_codec_err_t res_dec = decoder->DecodeFrame(video->cxdata(),
                                                   video->frame_size());
68
69
    if (!HandleDecodeResult(res_dec, *video, decoder))
      break;
70

71
    DxDataIterator dec_iter = decoder->GetDxData();
72
73
74
75
76
77
    const vpx_image_t *img = NULL;

    // Get decompressed data
    while ((img = dec_iter.Next()))
      DecompressedFrameHook(*img, video->frame_number());
  }
78
79

  delete decoder;
80
}
81
}  // namespace libvpx_test