diff --git a/test/decode_test_driver.cc b/test/decode_test_driver.cc index 2defacc46..778c9a3c4 100644 --- a/test/decode_test_driver.cc +++ b/test/decode_test_driver.cc @@ -15,6 +15,14 @@ namespace libvpx_test { +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); +} + vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) { vpx_codec_err_t res_dec; InitOnce(); @@ -29,10 +37,32 @@ void DecoderTest::RunLoop(CompressedVideoSource *video) { vpx_codec_dec_cfg_t dec_cfg = {0}; Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0); ASSERT_TRUE(decoder != NULL); + const char *codec_name = decoder->GetDecoderName(); + const bool is_vp8 = strncmp(kVP8Name, codec_name, sizeof(kVP8Name) - 1) == 0; // Decode frames. for (video->Begin(); video->cxdata(); video->Next()) { PreDecodeFrameHook(*video, decoder); + + 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); + } + vpx_codec_err_t res_dec = decoder->DecodeFrame(video->cxdata(), video->frame_size()); if (!HandleDecodeResult(res_dec, *video, decoder)) diff --git a/test/decode_test_driver.h b/test/decode_test_driver.h index 4f7294cda..ada2946c8 100644 --- a/test/decode_test_driver.h +++ b/test/decode_test_driver.h @@ -49,6 +49,9 @@ class Decoder { vpx_codec_destroy(&decoder_); } + vpx_codec_err_t PeekStream(const uint8_t *cxdata, size_t size, + vpx_codec_stream_info_t *stream_info); + vpx_codec_err_t DecodeFrame(const uint8_t *cxdata, size_t size); DxDataIterator GetDxData() { @@ -85,6 +88,10 @@ class Decoder { &decoder_, cb_get, cb_release, user_priv); } + const char* GetDecoderName() { + return vpx_codec_iface_name(CodecInterface()); + } + protected: virtual vpx_codec_iface_t* CodecInterface() const = 0;