webrtc/modules/video_coding/main/test/resampler_test.cc

242 lines
7.0 KiB
C++

/*
* Copyright (c) 2011 The WebRTC 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.
*/
#include "ResamplerTest.h"
#include "video_coding.h"
#include "tick_time.h"
#include "../source/event.h"
#include "VCMSpatialResampler.h"
#include <iostream>
#include <sstream>
using namespace webrtc;
int ResamplerTest()
{
VideoCodingModule* vcm = VideoCodingModule::Create(1);
class ResamplerTest test(vcm);
int ret = test.Perform();
VideoCodingModule::Destroy(vcm);
return ret;
}
ResamplerTest::ResamplerTest(VideoCodingModule* vcm):
_width(0),
_height(0),
_timeStamp(0),
_lengthSourceFrame(0),
_vcmMacrosTests(0),
_vcmMacrosErrors(0),
_vcm(vcm)
{
//
}
ResamplerTest::~ResamplerTest()
{
//
}
void
ResamplerTest::Setup()
{
_inname= "../../../../../codecs_video/testFiles/foreman.yuv";
_width = 352;
_height = 288;
_frameRate = 30;
_lengthSourceFrame = 3*_width*_height/2;
_encodedName = "../ResamplerTest_encoded.yuv";
if ((_sourceFile = fopen(_inname.c_str(), "rb")) == NULL)
{
printf("Cannot read file %s.\n", _inname.c_str());
exit(1);
}
if ((_encodedFile = fopen(_encodedName.c_str(), "wb")) == NULL)
{
printf("Cannot write encoded file.\n");
exit(1);
}
return;
}
WebRtc_Word32 ResamplerTest::Perform()
{
// Make sure this test isn't executed without simulated clocks
#if !defined(TICK_TIME_DEBUG) || !defined(EVENT_DEBUG)
return -1;
#endif
// Setup test
Setup();
ResamplerStandAloneTest();
ResamplerVCMTest();
TearDown();
return 0;
}
void
ResamplerTest::ResamplerVCMTest()
{
// Create the input frame and read a frame from file
VideoFrame sourceFrame;
sourceFrame.VerifyAndAllocate(_lengthSourceFrame);
fread(sourceFrame.Buffer(), 1, _lengthSourceFrame, _sourceFile);
sourceFrame.SetLength(_lengthSourceFrame);
sourceFrame.SetHeight(_height);
sourceFrame.SetWidth(_width);
TEST_EXIT_ON_FAIL(_vcm->InitializeReceiver() == VCM_OK);
TEST_EXIT_ON_FAIL(_vcm->InitializeSender() == VCM_OK);
TEST_EXIT_ON_FAIL(_vcm->EnableInputFrameInterpolation(true) == VCM_OK);
TestSizeVCM(sourceFrame, 128, 80); // Cut, decimation 1x, interpolate
TestSizeVCM(sourceFrame, 352/2, 288/2); // Even decimation
TestSizeVCM(sourceFrame, 352, 288); // No resampling
TestSizeVCM(sourceFrame, 2*352, 2*288); // Upsampling 2x
TestSizeVCM(sourceFrame, 400, 256); // Upsampling 1.5x and cut
TestSizeVCM(sourceFrame, 960, 720); // Upsampling 3.5x and cut
TEST_EXIT_ON_FAIL(_vcm->EnableInputFrameInterpolation(false) == VCM_OK);
TestSizeVCM(sourceFrame, 320, 240); // Cropped
TestSizeVCM(sourceFrame, 1280, 720); // Padded
}
void
ResamplerTest::TestSizeVCM(VideoFrame& sourceFrame, WebRtc_UWord32 targetWidth, WebRtc_UWord32 targetHeight)
{
assert(false);
/*
std::ostringstream filename;
filename << "../VCM_Resampler_" << targetWidth << "x" << targetHeight << "_30Hz_P420.yuv";
std::cout << "Watch " << filename.str() << " and verify that it is okay." << std::endl;
FILE* decodedFile = fopen(filename.str().c_str(), "wb");
_timeStamp += (WebRtc_UWord32)(9e4 / _frameRate);
sourceFrame.SetTimeStamp(_timeStamp);
VCMDecodeCompleteCallback decodeCallback(decodedFile);
VCMEncodeCompleteCallback encodeCompleteCallback(_encodedFile);
TEST_EXIT_ON_FAIL(_vcm->RegisterReceiveCallback(&decodeCallback) == VCM_OK);
TEST_EXIT_ON_FAIL(_vcm->RegisterTransportCallback(&encodeCompleteCallback) == VCM_OK);
encodeCompleteCallback.RegisterReceiverVCM(_vcm);
encodeCompleteCallback.SetCodecType(webrtc::VideoCodecVP8);
RegisterCodec(targetWidth, targetHeight);
encodeCompleteCallback.SetFrameDimensions(targetWidth, targetHeight);
TEST(_vcm->AddVideoFrame(sourceFrame) == VCM_OK);
TEST(_vcm->Decode() == VCM_OK);
fclose(decodedFile);
*/
}
void
ResamplerTest::RegisterCodec(WebRtc_UWord32 width, WebRtc_UWord32 height)
{
// Register codecs
assert(false);
/*
VideoCodec codec;
VideoCodingModule::Codec(webrtc::kVideoCodecVP8, &codec);
codec.width = static_cast<WebRtc_Word16>(width);
codec.height = static_cast<WebRtc_Word16>(height);
TEST(_vcm->RegisterSendCodec(&codec, 1, 1440) == VCM_OK);
TEST(_vcm->RegisterReceiveCodec(&codec, 1) == VCM_OK);
TEST(_vcm->SetChannelParameters(2000, 0, 0) == VCM_OK);
*/
}
WebRtc_Word32
ResamplerTest::ResamplerStandAloneTest()
{
// Create the input frame and read a frame from file
VideoFrame sourceFrame;
sourceFrame.VerifyAndAllocate(_lengthSourceFrame);
fread(sourceFrame.Buffer(), 1, _lengthSourceFrame, _sourceFile);
sourceFrame.SetLength(_lengthSourceFrame);
sourceFrame.SetHeight(_height);
sourceFrame.SetWidth(_width);
TestSize(sourceFrame, 100, 50); // Cut, decimation 1x, interpolate
TestSize(sourceFrame, 352/2, 288/2); // Even decimation
TestSize(sourceFrame, 352, 288); // No resampling
TestSize(sourceFrame, 2*352, 2*288); // Even upsampling
TestSize(sourceFrame, 400, 256); // Upsampling 1.5x and cut
TestSize(sourceFrame, 960, 720); // Upsampling 3.5x and cut
TestSize(sourceFrame, 1280, 720); // Upsampling 4x and cut
sourceFrame.Free();
return 0;
}
void
ResamplerTest::TestSize(VideoFrame& sourceFrame, WebRtc_UWord32 targetWidth, WebRtc_UWord32 targetHeight)
{
VCMSimpleSpatialResampler resampler;
VideoFrame outFrame;
std::ostringstream filename;
filename << "../Resampler_" << targetWidth << "x" << targetHeight << "_30Hz_P420.yuv";
std::cout << "Watch " << filename.str() << " and verify that it is okay." << std::endl;
FILE* standAloneFile = fopen(filename.str().c_str(), "wb");
//resampler.EnableUpSampling(true);
resampler.EnableInterpolation(true);
TEST(resampler.SetTargetFrameSize(targetWidth, targetHeight) == VCM_OK);
TEST(resampler.ResampleFrame(sourceFrame, outFrame) == VCM_OK);
TEST(outFrame.Buffer() != NULL);
TEST(outFrame.Length() == (targetWidth * targetHeight * 3 / 2));
// Write to file for visual inspection
fwrite(outFrame.Buffer(), 1, outFrame.Length(), standAloneFile);
outFrame.Free();
fclose(standAloneFile);
}
void
ResamplerTest::Print()
{
printf("\nVCM Resampler Test: \n\n%i tests completed\n", _vcmMacrosTests);
if (_vcmMacrosErrors > 0)
{
printf("%i FAILED\n\n", _vcmMacrosErrors);
}
else
{
printf("ALL PASSED\n\n");
}
}
void
ResamplerTest::TearDown()
{
fclose(_sourceFile);
fclose(_encodedFile);
return;
}
void
ResamplerTest::IncrementDebugClock(float frameRate)
{
for (int t= 0; t < 1000/frameRate; t++)
{
VCMTickTime::IncrementDebugClock();
}
return;
}