1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_TEST_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_TEST_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
143f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdlib.h>
153f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org
16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include <fstream>
17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include <string>
183f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org
19a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h"
20a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CodecTest
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecTest(std::string name, std::string description);
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecTest(std::string name, std::string description,
2748c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org              uint32_t bitRate);
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~CodecTest() {};
29076aa8444d4b002fb083bc08f9dfa6e4ecaf2043mikhal@webrtc.org    virtual void Setup();
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void Perform()=0;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void Print();
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetEncoder(webrtc::VideoEncoder *encoder);
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetDecoder(webrtc::VideoDecoder *decoder);
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetLog(std::fstream* log);
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected:
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void CodecSettings(int width,
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int height,
3948c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org                               uint32_t frameRate=30,
4048c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org                               uint32_t bitRate=0);
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual void Teardown();
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double ActualBitRate(int nFrames);
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual bool PacketLoss(double lossRate, int /*thrown*/);
44bcf0a1019f34cac346bd8349c2206f9d06adbe4epbos@webrtc.org    static double RandUniform() { return (rand() + 1.0)/(RAND_MAX + 1.0); }
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static void VideoEncodedBufferToEncodedImage(
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        webrtc::VideoFrame& videoBuffer,
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        webrtc::EncodedImage &image);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoEncoder*   _encoder;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoDecoder*   _decoder;
5148c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    uint32_t          _bitRate;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int            _lengthSourceFrame;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned char*          _sourceBuffer;
543bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    webrtc::I420VideoFrame  _inputVideoBuffer;
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // TODO(mikhal): For now using VideoFrame for encodedBuffer, should use a
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // designated class.
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoFrame      _encodedVideoBuffer;
583bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    webrtc::I420VideoFrame  _decodedVideoBuffer;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoCodec      _inst;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::fstream*           _log;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string             _inname;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string             _outname;
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string             _encodedName;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int                     _sumEncBytes;
656bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _width;
666bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _halfWidth;
676bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _height;
686bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _halfHeight;
696bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _sizeY;
706bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org    int                     _sizeUv;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string             _name;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string             _description;
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAWEWORK_TEST_H_
78