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
11a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/test_framework/normal_test.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <sstream>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include <time.h>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
19a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::NormalTest()
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCodecTest("Normal Test 1", "A test of normal execution of the codec"),
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_testNo(1),
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lengthEncFrame(0),
266bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org_appendNext(false)
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::NormalTest(std::string name, std::string description,
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                       unsigned int testNo)
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCodecTest(name, description),
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_requestKeyFrame(false),
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_testNo(testNo),
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lengthEncFrame(0),
376bbb5554f3a5037af9bdf323fcfffad60579b267mikhal@webrtc.org_appendNext(false)
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::NormalTest(std::string name, std::string description,
4248c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org                       uint32_t bitRate, unsigned int testNo)
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCodecTest(name, description, bitRate),
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_requestKeyFrame(false),
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_testNo(testNo),
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_lengthEncFrame(0),
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_appendNext(false)
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::Setup()
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecTest::Setup();
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::stringstream ss;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string strTestNo;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ss << _testNo;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ss >> strTestNo;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Check if settings exist. Otherwise use defaults.
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_outname == "")
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _outname = webrtc::test::OutputPath() + "out_normaltest" + strTestNo +
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            ".yuv";
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_encodedName == "")
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _encodedName = webrtc::test::OutputPath() + "encoded_normaltest" +
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            strTestNo + ".yuv";
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((_sourceFile = fopen(_inname.c_str(), "rb")) == NULL)
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        printf("Cannot read file %s.\n", _inname.c_str());
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        exit(1);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((_encodedFile = fopen(_encodedName.c_str(), "wb")) == NULL)
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        printf("Cannot write encoded file.\n");
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        exit(1);
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char mode[3] = "wb";
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_appendNext)
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        strncpy(mode, "ab", 3);
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((_decodedFile = fopen(_outname.c_str(), mode)) == NULL)
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        printf("Cannot write file %s.\n", _outname.c_str());
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        exit(1);
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _appendNext = true;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::Teardown()
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecTest::Teardown();
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fclose(_sourceFile);
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fclose(_decodedFile);
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::Perform()
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
1123bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _width = 352;
1133bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _halfWidth = (_width + 1) / 2;
1143bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _height = 288;
1153bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _halfHeight = (_height + 1) / 2;
1163bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _sizeY = _width * _height;
1173bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _sizeUv = _halfWidth * _halfHeight;
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _inname = webrtc::test::ProjectRootPath() + "resources/foreman_cif.yuv";
1193bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    CodecSettings(_width, _height, 30, _bitRate);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    Setup();
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1223bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _inputVideoBuffer.CreateEmptyFrame(_width, _height,
1233bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                       _width, _halfWidth, _halfWidth);
1243bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _decodedVideoBuffer.CreateEmptyFrame(_width, _height,
1253bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                         _width, _halfWidth, _halfWidth);
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encodedVideoBuffer.VerifyAndAllocate(_lengthSourceFrame);
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encoder->InitEncode(&_inst, 1, 1460);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecSpecific_InitBitrate();
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _decoder->InitDecode(&_inst,1);
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _totalEncodeTime = _totalDecodeTime = 0;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _framecnt = 0;
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _sumEncBytes = 0;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _lengthEncFrame = 0;
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int decodeLength = 0;
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (!Encode())
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        DoPacketLoss();
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _encodedVideoBuffer.SetLength(_encodedVideoBuffer.Length());
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (fwrite(_encodedVideoBuffer.Buffer(), 1,
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   _encodedVideoBuffer.Length(),
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   _encodedFile) !=  _encodedVideoBuffer.Length()) {
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return;
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        decodeLength = Decode();
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (decodeLength < 0)
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fprintf(stderr,"\n\nError in decoder: %d\n\n", decodeLength);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            exit(EXIT_FAILURE);
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1523bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        if (PrintI420VideoFrame(_decodedVideoBuffer, _decodedFile) < 0) {
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return;
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        CodecSpecific_InitBitrate();
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _framecnt++;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Ensure we empty the decoding queue.
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (decodeLength > 0)
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        decodeLength = Decode();
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (decodeLength < 0)
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fprintf(stderr,"\n\nError in decoder: %d\n\n", decodeLength);
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            exit(EXIT_FAILURE);
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
1683bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        if (PrintI420VideoFrame(_decodedVideoBuffer, _decodedFile) < 0) {
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double actualBitRate = ActualBitRate(_framecnt) / 1000.0;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double avgEncTime = _totalEncodeTime / _framecnt;
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double avgDecTime = _totalDecodeTime / _framecnt;
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Actual bitrate: %f kbps\n", actualBitRate);
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Average encode time: %f s\n", avgEncTime);
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Average decode time: %f s\n", avgDecTime);
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (*_log) << "Actual bitrate: " << actualBitRate << " kbps\tTarget: " << _bitRate << " kbps" << std::endl;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (*_log) << "Average encode time: " << avgEncTime << " s" << std::endl;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    (*_log) << "Average decode time: " << avgDecTime << " s" << std::endl;
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encoder->Release();
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _decoder->Release();
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    Teardown();
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::Encode()
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _lengthEncFrame = 0;
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_GT(fread(_sourceBuffer, 1, _lengthSourceFrame, _sourceFile), 0u);
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (feof(_sourceFile) != 0)
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return true;
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1983bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        _inputVideoBuffer.CreateFrame(_sizeY, _sourceBuffer,
1993bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                      _sizeUv, _sourceBuffer + _sizeY,
2003bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                      _sizeUv, _sourceBuffer + _sizeY +
2013bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                      _sizeUv,
2023bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                      _width, _height,
2033bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org                                      _width, _halfWidth, _halfWidth);
2043bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org    _inputVideoBuffer.set_timestamp(_framecnt);
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // This multiple attempt ridiculousness is to accomodate VP7:
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // 1. The wrapper can unilaterally reduce the framerate for low bitrates.
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // 2. The codec inexplicably likes to reject some frames. Perhaps there
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //    is a good reason for this...
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int encodingAttempts = 0;
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double starttime = 0;
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    double endtime = 0;
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (_lengthEncFrame == 0)
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        starttime = clock()/(double)CLOCKS_PER_SEC;
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
2173bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        _inputVideoBuffer.set_width(_inst.width);
2183bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org        _inputVideoBuffer.set_height(_inst.height);
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        endtime = clock()/(double)CLOCKS_PER_SEC;
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _encodedVideoBuffer.SetHeight(_inst.height);
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _encodedVideoBuffer.SetWidth(_inst.width);
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_lengthEncFrame < 0)
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            (*_log) << "Error in encoder: " << _lengthEncFrame << std::endl;
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fprintf(stderr,"\n\nError in encoder: %d\n\n", _lengthEncFrame);
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            exit(EXIT_FAILURE);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _sumEncBytes += _lengthEncFrame;
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        encodingAttempts++;
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (encodingAttempts > 50)
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            (*_log) << "Unable to encode frame: " << _framecnt << std::endl;
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fprintf(stderr,"\n\nUnable to encode frame: %d\n\n", _framecnt);
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            exit(EXIT_FAILURE);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _totalEncodeTime += endtime - starttime;
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (encodingAttempts > 1)
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (*_log) << encodingAttempts << " attempts required to encode frame: " <<
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _framecnt + 1 << std::endl;
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fprintf(stderr,"\n%d attempts required to encode frame: %d\n", encodingAttempts,
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            _framecnt + 1);
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgNormalTest::Decode(int lossValue)
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encodedVideoBuffer.SetWidth(_inst.width);
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encodedVideoBuffer.SetHeight(_inst.height);
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int lengthDecFrame = 0;
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (lengthDecFrame < 0)
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return lengthDecFrame;
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _encodedVideoBuffer.SetLength(0);
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return lengthDecFrame;
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
265