shithub: libvpx

Download patch

ref: 96727b95628c1f7727e5ab7b9d72a58aceea46c6
parent: 9be46e4565f553460a1bbbf58d9f99067d3242ce
author: Jim Bankoski <jimbankoski@google.com>
date: Mon Jun 23 04:37:18 EDT 2014

Add Check for Peek Stream validity to decoder test.


Change-Id: I9b745670a9f842582c47e6001dc77480b31fb6a1

--- 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 @@
   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))
--- a/test/decode_test_driver.h
+++ b/test/decode_test_driver.h
@@ -49,6 +49,9 @@
     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() {
@@ -83,6 +86,10 @@
     InitOnce();
     return vpx_codec_set_frame_buffer_functions(
         &decoder_, cb_get, cb_release, user_priv);
+  }
+
+  const char* GetDecoderName() {
+    return vpx_codec_iface_name(CodecInterface());
   }
 
  protected: