webrtc/modules/video_coding/main/test/media_opt_test.h

134 lines
4.8 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.
*/
// VCM Media Optimization Test
#ifndef WEBRTC_MODULES_VIDEO_CODING_TEST_MEDIA_OPT_TEST_H_
#define WEBRTC_MODULES_VIDEO_CODING_TEST_MEDIA_OPT_TEST_H_
#include "video_coding.h"
#include "test_macros.h"
#include "test_util.h"
#include "video_source.h"
#include <string>
using namespace std;
//
// media optimization test
// This test simulates a complete encode-decode cycle via the RTP module.
// allows error resilience tests, packet loss tests, etc.
// Does not test the media optimization deirectly, but via the VCM API only.
// The test allows two modes:
// 1 - Standard, basic settings, one run
// 2 - Release test - iterates over a number of video sequences, bit rates, packet loss values ,etc.
class VCMTestProtectionCallback: public webrtc::VCMProtectionCallback
{
public:
VCMTestProtectionCallback();
virtual ~VCMTestProtectionCallback();
WebRtc_Word32 ProtectionRequest(const WebRtc_UWord8 deltaFECRate, const WebRtc_UWord8 keyFECRate, const bool nack);
enum webrtc::NACKMethod NACKMethod();
WebRtc_UWord8 FECDeltaRate();
WebRtc_UWord8 FECKeyRate();
private:
WebRtc_UWord8 _deltaFECRate;
WebRtc_UWord8 _keyFECRate;
enum webrtc::NACKMethod _nack;
};
class MediaOptTest
{
public:
MediaOptTest(webrtc::VideoCodingModule* vcm);
~MediaOptTest();
static int RunTest(int testNum, CmdArgs& args);
// perform encode-decode of an entire sequence
WebRtc_Word32 Perform();
// Set up for a single mode test
void Setup(int testType, CmdArgs& args);
// General set up - applicable for both modes
void GeneralSetup();
// Run release testing
void RTTest();
void TearDown();
// mode = 1; will print to screen, otherwise only to log file
void Print(int mode);
private:
webrtc::VideoCodingModule* _vcm;
webrtc::RtpRtcp* _rtp;
std::string _inname;
std::string _outname;
std::string _actualSourcename;
std::fstream _log;
FILE* _sourceFile;
FILE* _decodedFile;
FILE* _actualSourceFile;
FILE* _outputRes;
WebRtc_UWord16 _width;
WebRtc_UWord16 _height;
WebRtc_UWord32 _lengthSourceFrame;
WebRtc_UWord32 _timeStamp;
float _frameRate;
bool _nackEnabled;
bool _fecEnabled;
bool _nackFecEnabled;
WebRtc_UWord8 _rttMS;
float _bitRate;
double _lossRate;
WebRtc_UWord32 _renderDelayMs;
WebRtc_Word32 _frameCnt;
float _sumEncBytes;
WebRtc_Word32 _numFramesDropped;
string _codecName;
webrtc::VideoCodecType _sendCodecType;
WebRtc_Word32 _numberOfCores;
int vcmMacrosTests;
int vcmMacrosErrors;
//for release test#2
FILE* _fpinp;
FILE* _fpout;
FILE* _fpout2;
int _testType;
int _testNum;
int _numParRuns;
}; // end of MediaOptTest class definition
// Feed back from the RTP Module callback
class RTPFeedbackCallback: public webrtc::RtpVideoFeedback
{
public:
RTPFeedbackCallback(webrtc::VideoCodingModule* vcm) {_vcm = vcm;};
void OnReceivedIntraFrameRequest(const WebRtc_Word32 id,
const WebRtc_UWord8 message = 0){};
void OnNetworkChanged(const WebRtc_Word32 id,
const WebRtc_UWord16 bitrateTargetKbit,
const WebRtc_UWord8 fractionLost,
const WebRtc_UWord16 roundTripTimeMs,
const WebRtc_UWord32 jitterMS,
const WebRtc_UWord16 bwEstimateKbitMin,
const WebRtc_UWord16 bwEstimateKbitMax);
private:
webrtc::VideoCodingModule* _vcm;
};
#endif // WEBRTC_MODULES_VIDEO_CODING_TEST_MEDIA_OPT_TEST_H_