| /* |
| * 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; |
| } |
| |