2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #ifndef TEST_DECODE_TEST_DRIVER_H_
12 #define TEST_DECODE_TEST_DRIVER_H_
14 #include "third_party/googletest/src/include/gtest/gtest.h"
15 #include "./vpx_config.h"
16 #include "vpx/vpx_decoder.h"
18 namespace libvpx_test
{
21 class CompressedVideoSource
;
23 // Provides an object to handle decoding output
24 class DxDataIterator
{
26 explicit DxDataIterator(vpx_codec_ctx_t
*decoder
)
27 : decoder_(decoder
), iter_(NULL
) {}
29 const vpx_image_t
*Next() {
30 return vpx_codec_get_frame(decoder_
, &iter_
);
34 vpx_codec_ctx_t
*decoder_
;
35 vpx_codec_iter_t iter_
;
38 // Provides a simplified interface to manage one video decoding.
39 // Similar to Encoder class, the exact services should be added
40 // as more tests are added.
43 Decoder(vpx_codec_dec_cfg_t cfg
, unsigned long deadline
)
44 : cfg_(cfg
), flags_(0), deadline_(deadline
), init_done_(false) {
45 memset(&decoder_
, 0, sizeof(decoder_
));
48 Decoder(vpx_codec_dec_cfg_t cfg
, const vpx_codec_flags_t flag
,
49 unsigned long deadline
) // NOLINT
50 : cfg_(cfg
), flags_(flag
), deadline_(deadline
), init_done_(false) {
51 memset(&decoder_
, 0, sizeof(decoder_
));
55 vpx_codec_destroy(&decoder_
);
58 vpx_codec_err_t
PeekStream(const uint8_t *cxdata
, size_t size
,
59 vpx_codec_stream_info_t
*stream_info
);
61 vpx_codec_err_t
DecodeFrame(const uint8_t *cxdata
, size_t size
);
63 vpx_codec_err_t
DecodeFrame(const uint8_t *cxdata
, size_t size
,
66 DxDataIterator
GetDxData() {
67 return DxDataIterator(&decoder_
);
70 void set_deadline(unsigned long deadline
) {
74 void Control(int ctrl_id
, int arg
) {
75 Control(ctrl_id
, arg
, VPX_CODEC_OK
);
78 void Control(int ctrl_id
, const void *arg
) {
80 const vpx_codec_err_t res
= vpx_codec_control_(&decoder_
, ctrl_id
, arg
);
81 ASSERT_EQ(VPX_CODEC_OK
, res
) << DecodeError();
84 void Control(int ctrl_id
, int arg
, vpx_codec_err_t expected_value
) {
86 const vpx_codec_err_t res
= vpx_codec_control_(&decoder_
, ctrl_id
, arg
);
87 ASSERT_EQ(expected_value
, res
) << DecodeError();
90 const char* DecodeError() {
91 const char *detail
= vpx_codec_error_detail(&decoder_
);
92 return detail
? detail
: vpx_codec_error(&decoder_
);
95 // Passes the external frame buffer information to libvpx.
96 vpx_codec_err_t
SetFrameBufferFunctions(
97 vpx_get_frame_buffer_cb_fn_t cb_get
,
98 vpx_release_frame_buffer_cb_fn_t cb_release
, void *user_priv
) {
100 return vpx_codec_set_frame_buffer_functions(
101 &decoder_
, cb_get
, cb_release
, user_priv
);
104 const char* GetDecoderName() const {
105 return vpx_codec_iface_name(CodecInterface());
110 vpx_codec_ctx_t
* GetDecoder() {
115 virtual vpx_codec_iface_t
* CodecInterface() const = 0;
119 const vpx_codec_err_t res
= vpx_codec_dec_init(&decoder_
,
122 ASSERT_EQ(VPX_CODEC_OK
, res
) << DecodeError();
127 vpx_codec_ctx_t decoder_
;
128 vpx_codec_dec_cfg_t cfg_
;
129 vpx_codec_flags_t flags_
;
130 unsigned int deadline_
;
134 // Common test functionality for all Decoder tests.
137 // Main decoding loop
138 virtual void RunLoop(CompressedVideoSource
*video
);
139 virtual void RunLoop(CompressedVideoSource
*video
,
140 const vpx_codec_dec_cfg_t
&dec_cfg
);
142 virtual void set_cfg(const vpx_codec_dec_cfg_t
&dec_cfg
);
143 virtual void set_flags(const vpx_codec_flags_t flags
);
145 // Hook to be called before decompressing every frame.
146 virtual void PreDecodeFrameHook(const CompressedVideoSource
& /*video*/,
147 Decoder
* /*decoder*/) {}
149 // Hook to be called to handle decode result. Return true to continue.
150 virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec
,
151 const CompressedVideoSource
& /*video*/,
153 EXPECT_EQ(VPX_CODEC_OK
, res_dec
) << decoder
->DecodeError();
154 return VPX_CODEC_OK
== res_dec
;
157 // Hook to be called on every decompressed frame.
158 virtual void DecompressedFrameHook(const vpx_image_t
& /*img*/,
159 const unsigned int /*frame_number*/) {}
161 // Hook to be called on peek result
162 virtual void HandlePeekResult(Decoder
* const decoder
,
163 CompressedVideoSource
*video
,
164 const vpx_codec_err_t res_peek
);
167 explicit DecoderTest(const CodecFactory
*codec
)
172 virtual ~DecoderTest() {}
174 const CodecFactory
*codec_
;
175 vpx_codec_dec_cfg_t cfg_
;
176 vpx_codec_flags_t flags_
;
179 } // namespace libvpx_test
181 #endif // TEST_DECODE_TEST_DRIVER_H_