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