1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_UNIT_TEST_H_ 12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_UNIT_TEST_H_ 13 14 #include "webrtc/modules/video_coding/codecs/test_framework/test.h" 15 #include "webrtc/system_wrappers/interface/event_wrapper.h" 16 17 // Disable "conditional expression is constant" warnings on the perfectly 18 // acceptable 19 // do { ... } while (0) constructions below. 20 // Refer to http://stackoverflow.com/questions/1946445/ 21 // is-there-better-way-to-write-do-while0-construct-to-avoid-compiler-warnings 22 // for some discussion of the issue. 23 #ifdef _WIN32 24 #pragma warning(disable : 4127) 25 #endif 26 27 class VideoSource; 28 class UnitTestEncodeCompleteCallback; 29 class UnitTestDecodeCompleteCallback; 30 31 class UnitTest : public CodecTest 32 { 33 public: 34 UnitTest(); 35 virtual ~UnitTest(); 36 virtual void Setup(); 37 virtual void Perform(); 38 virtual void Print(); 39 40 protected: 41 UnitTest(std::string name, std::string description); 42 virtual uint32_t CodecSpecific_SetBitrate( 43 uint32_t bitRate, 44 uint32_t /* frameRate */); 45 virtual void Teardown(); 46 virtual void RateControlTests(); 47 virtual int Decode(); 48 virtual int DecodeWithoutAssert(); SetCodecSpecificParameters()49 virtual int SetCodecSpecificParameters() {return 0;}; 50 51 virtual bool CheckIfBitExact(const void *ptrA, unsigned int aLengthBytes, 52 const void *ptrB, unsigned int bLengthBytes); 53 54 uint32_t WaitForEncodedFrame() const; 55 uint32_t WaitForDecodedFrame() const; 56 57 int _tests; 58 int _errors; 59 60 VideoSource* _source; 61 unsigned char* _refFrame; 62 unsigned char* _refEncFrame; 63 unsigned char* _refDecFrame; 64 unsigned int _refEncFrameLength; 65 FILE* _sourceFile; 66 bool is_key_frame_; 67 68 UnitTestEncodeCompleteCallback* _encodeCompleteCallback; 69 UnitTestDecodeCompleteCallback* _decodeCompleteCallback; 70 enum { kMaxWaitEncTimeMs = 100 }; 71 enum { kMaxWaitDecTimeMs = 25 }; 72 }; 73 74 class UnitTestEncodeCompleteCallback : public webrtc::EncodedImageCallback 75 { 76 public: 77 UnitTestEncodeCompleteCallback(webrtc::VideoFrame* buffer, 78 uint32_t decoderSpecificSize = 0, 79 void* decoderSpecificInfo = NULL) : _encodedVideoBuffer(buffer)80 _encodedVideoBuffer(buffer), 81 _encodeComplete(false) {} 82 int32_t Encoded(webrtc::EncodedImage& encodedImage, 83 const webrtc::CodecSpecificInfo* codecSpecificInfo, 84 const webrtc::RTPFragmentationHeader* fragmentation = NULL); 85 bool EncodeComplete(); 86 // Note that this only makes sense if an encode has been completed 87 webrtc::VideoFrameType EncodedFrameType() const; 88 private: 89 webrtc::VideoFrame* _encodedVideoBuffer; 90 bool _encodeComplete; 91 webrtc::VideoFrameType _encodedFrameType; 92 }; 93 94 class UnitTestDecodeCompleteCallback : public webrtc::DecodedImageCallback 95 { 96 public: UnitTestDecodeCompleteCallback(webrtc::I420VideoFrame * buffer)97 UnitTestDecodeCompleteCallback(webrtc::I420VideoFrame* buffer) : 98 _decodedVideoBuffer(buffer), _decodeComplete(false) {} 99 int32_t Decoded(webrtc::I420VideoFrame& image); 100 bool DecodeComplete(); 101 private: 102 webrtc::I420VideoFrame* _decodedVideoBuffer; 103 bool _decodeComplete; 104 }; 105 106 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_UNIT_TEST_H_ 107