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/video_source.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::VideoSource()
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_fileName(webrtc::test::ProjectRootPath() + "resources/foreman_cif.yuv"),
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_width(352),
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_height(288),
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_type(webrtc::kI420),
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_frameRate(30)
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::VideoSource(std::string fileName, VideoSize size,
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int frameRate /*= 30*/, webrtc::VideoType type /*=  webrtc::kI420*/)
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_fileName(fileName),
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_type(type),
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_frameRate(frameRate)
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(size != kUndefined && size != kNumberOfVideoSizes);
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(type != webrtc::kUnknown);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(frameRate > 0);
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (GetWidthHeight(size, _width, _height) != 0) {
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        assert(false);
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::VideoSource(std::string fileName, int width, int height,
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int frameRate /*= 30*/,  webrtc::VideoType type /*=  webrtc::kI420*/)
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_fileName(fileName),
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_width(width),
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_height(height),
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_type(type),
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_frameRate(frameRate)
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(width > 0);
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(height > 0);
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(type != webrtc::kUnknown);
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    assert(frameRate > 0);
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSize
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetSize() const
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return GetSize(_width, _height);
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSize
6548c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.orgVideoSource::GetSize(uint16_t width, uint16_t height)
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(width == 128 && height == 96)
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kSQCIF;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 160 && height == 120)
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kQQVGA;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 176 && height == 144)
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kQCIF;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 320 && height == 240)
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kQVGA;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 352 && height == 288)
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kCIF;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 640 && height == 480)
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kVGA;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 720 && height == 480)
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kNTSC;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 704 && height == 576)
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return k4CIF;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 800 && height == 600)
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kSVGA;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 960 && height == 720)
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kHD;
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 1024 && height == 768)
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kXGA;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 1440 && height == 1080)
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kFullHD;
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 400 && height == 240)
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kWQVGA;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 800 && height == 480)
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kWVGA;
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 1280 && height == 720)
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kWHD;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }else if(width == 1920 && height == 1080)
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return kWFullHD;
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return kUndefined;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgunsigned int
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetFrameLength() const
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return webrtc::CalcBufferSize(_type, _width, _height);
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char*
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetMySizeString() const
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return VideoSource::GetSizeString(GetSize());
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst char*
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetSizeString(VideoSize size)
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    switch (size)
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kSQCIF:
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "SQCIF";
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kQQVGA:
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "QQVGA";
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kQCIF:
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "QCIF";
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kQVGA:
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "QVGA";
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kCIF:
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "CIF";
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kVGA:
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "VGA";
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kNTSC:
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "NTSC";
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case k4CIF:
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "4CIF";
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kSVGA:
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "SVGA";
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kHD:
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "HD";
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kXGA:
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "XGA";
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kFullHD:
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "Full_HD";
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kWQVGA:
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "WQVGA";
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kWHD:
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "WHD";
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case kWFullHD:
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "WFull_HD";
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        default:
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return "Undefined";
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetFilePath() const
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t slashPos = _fileName.find_last_of("/\\");
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (slashPos == std::string::npos)
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return ".";
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return _fileName.substr(0, slashPos);
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetName() const
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Remove path.
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t slashPos = _fileName.find_last_of("/\\");
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (slashPos == std::string::npos)
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slashPos = 0;
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        slashPos++;
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Remove extension and underscored suffix if it exists.
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return _fileName.substr(slashPos, std::min(_fileName.find_last_of("_"),
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _fileName.find_last_of(".")) - slashPos);
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::Convert(const VideoSource &target, bool force /* = false */) const
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Ensure target rate is less than or equal to source
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // (i.e. we are only temporally downsampling).
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(target.GetFrameRate() <= _frameRate);
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Only supports YUV420 currently.
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(_type == webrtc::kI420 && target.GetType() == webrtc::kI420);
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!force && (FileExists(target.GetFileName().c_str()) ||
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (target.GetWidth() == _width && target.GetHeight() == _height && target.GetFrameRate() == _frameRate)))
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Assume that the filename uniquely defines the content.
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // If the file already exists, it is the correct file.
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return;
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FILE *inFile = NULL;
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FILE *outFile = NULL;
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    inFile = fopen(_fileName.c_str(), "rb");
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(inFile != NULL);
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    outFile = fopen(target.GetFileName().c_str(), "wb");
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(outFile != NULL);
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FrameDropper fd;
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fd.SetFrameRate(target.GetFrameRate(), _frameRate);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const size_t lengthOutFrame = webrtc::CalcBufferSize(target.GetType(),
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        target.GetWidth(), target.GetHeight());
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(lengthOutFrame > 0);
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned char *outFrame = new unsigned char[lengthOutFrame];
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const size_t lengthInFrame = webrtc::CalcBufferSize(_type, _width, _height);
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ASSERT_TRUE(lengthInFrame > 0);
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned char *inFrame = new unsigned char[lengthInFrame];
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (fread(inFrame, 1, lengthInFrame, inFile) == lengthInFrame)
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (!fd.DropFrame())
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            ASSERT_TRUE(target.GetWidth() == _width &&
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   target.GetHeight() == _height);
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            // Add video interpolator here!
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (fwrite(outFrame, 1, lengthOutFrame,
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                       outFile) !=  lengthOutFrame) {
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              return;
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete inFrame;
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete outFrame;
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fclose(inFile);
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fclose(outFile);
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VideoSource::FileExists(const char* fileName)
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FILE* fp = NULL;
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    fp = fopen(fileName, "rb");
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if(fp != NULL)
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        fclose(fp);
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return true;
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoSource::GetWidthHeight( VideoSize size, int & width, int& height)
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    switch(size)
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kSQCIF:
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 128;
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 96;
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kQQVGA:
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 160;
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 120;
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kQCIF:
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 176;
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 144;
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kCGA:
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 320;
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 200;
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kQVGA:
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 320;
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 240;
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kSIF:
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 352;
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 240;
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kWQVGA:
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 400;
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 240;
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kCIF:
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 352;
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 288;
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kW288p:
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 512;
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 288;
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case k448p:
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 576;
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 448;
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kVGA:
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 640;
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 480;
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case k432p:
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 720;
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 432;
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kW432p:
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 768;
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 432;
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case k4SIF:
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 704;
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 480;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kW448p:
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 768;
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 448;
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNTSC:
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 720;
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 480;
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kFW448p:
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 800;
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 448;
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kWVGA:
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 800;
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 480;
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case k4CIF:
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 704;
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 576;
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kSVGA:
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 800;
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 600;
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kW544p:
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 960;
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 544;
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kW576p:
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 1024;
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 576;
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kHD:
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 960;
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 720;
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kXGA:
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 1024;
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 768;
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kFullHD:
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 1440;
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 1080;
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kWHD:
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 1280;
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 720;
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kWFullHD:
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        width = 1920;
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        height = 1080;
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return 0;
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    default:
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFrameDropper::FrameDropper()
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org:
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_dropsBetweenRenders(0),
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_frameCounter(0)
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFrameDropper::DropFrame()
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _frameCounter++;
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_frameCounter > _dropsBetweenRenders)
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _frameCounter = 0;
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return false;
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return true;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgunsigned int
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFrameDropper::DropsBetweenRenders()
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return _dropsBetweenRenders;
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgFrameDropper::SetFrameRate(double frameRate, double maxFrameRate)
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (frameRate >= 1.0)
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _dropsBetweenRenders = static_cast<unsigned int>(maxFrameRate / frameRate + 0.5) - 1;
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _dropsBetweenRenders = 0;
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
426