1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <climits> 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "third_party/googletest/src/include/gtest/gtest.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/codec_factory.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/encode_test_driver.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/i420_video_source.h" 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/util.h" 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace { 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass SuperframeTest : public ::libvpx_test::EncoderTest, 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> { 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang protected: 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SuperframeTest() : EncoderTest(GET_PARAM(0)), modified_buf_(NULL), 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang last_sf_pts_(0) {} 24a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian virtual ~SuperframeTest() {} 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang virtual void SetUp() { 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang InitializeConfig(); 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang SetMode(GET_PARAM(1)); 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sf_count_ = 0; 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sf_count_max_ = INT_MAX; 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang virtual void TearDown() { 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang delete[] modified_buf_; 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video, 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang libvpx_test::Encoder *encoder) { 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (video->frame() == 1) { 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang virtual const vpx_codec_cx_pkt_t * MutateEncoderOutputHook( 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const vpx_codec_cx_pkt_t *pkt) { 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pkt->kind != VPX_CODEC_CX_FRAME_PKT) 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pkt; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t *buffer = reinterpret_cast<uint8_t*>(pkt->data.frame.buf); 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t marker = buffer[pkt->data.frame.sz - 1]; 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int frames = (marker & 0x7) + 1; 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int mag = ((marker >> 3) & 3) + 1; 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned int index_sz = 2 + mag * frames; 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if ((marker & 0xe0) == 0xc0 && 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pkt->data.frame.sz >= index_sz && 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang buffer[pkt->data.frame.sz - index_sz] == marker) { 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // frame is a superframe. strip off the index. 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (modified_buf_) 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang delete[] modified_buf_; 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang modified_buf_ = new uint8_t[pkt->data.frame.sz - index_sz]; 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang memcpy(modified_buf_, pkt->data.frame.buf, 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pkt->data.frame.sz - index_sz); 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang modified_pkt_ = *pkt; 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang modified_pkt_.data.frame.buf = modified_buf_; 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang modified_pkt_.data.frame.sz -= index_sz; 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sf_count_++; 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang last_sf_pts_ = pkt->data.frame.pts; 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return &modified_pkt_; 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Make sure we do a few frames after the last SF 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang abort_ |= sf_count_ > sf_count_max_ && 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pkt->data.frame.pts - last_sf_pts_ >= 5; 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pkt; 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int sf_count_; 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int sf_count_max_; 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_cx_pkt_t modified_pkt_; 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *modified_buf_; 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_codec_pts_t last_sf_pts_; 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(SuperframeTest, TestSuperframeIndexIsOptional) { 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sf_count_max_ = 0; // early exit on successful test. 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cfg_.g_lag_in_frames = 25; 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 30, 1, 0, 40); 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang EXPECT_EQ(sf_count_, 1); 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangVP9_INSTANTIATE_TEST_CASE(SuperframeTest, ::testing::Values( 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ::libvpx_test::kTwoPassGood)); 97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} // namespace 98