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_FRAMEWORK_VIDEO_SOURCE_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string>
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum VideoSize
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kUndefined,
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kSQCIF,     // 128*96       = 12 288
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kQQVGA,     // 160*120      = 19 200
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kQCIF,      // 176*144      = 25 344
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kCGA,       // 320*200      = 64 000
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kQVGA,      // 320*240      = 76 800
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kSIF,       // 352*240      = 84 480
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWQVGA,     // 400*240      = 96 000
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kCIF,       // 352*288      = 101 376
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kW288p,     // 512*288      = 147 456 (WCIF)
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        k448p,      // 576*448      = 281 088
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kVGA,       // 640*480      = 307 200
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        k432p,      // 720*432      = 311 040
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kW432p,     // 768*432      = 331 776
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        k4SIF,      // 704*480      = 337 920
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kW448p,     // 768*448      = 344 064
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kNTSC,		// 720*480      = 345 600
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kFW448p,    // 800*448      = 358 400
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWVGA,      // 800*480      = 384 000
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        k4CIF,      // 704�576      = 405 504
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kSVGA,      // 800*600      = 480 000
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kW544p,     // 960*544      = 522 240
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kW576p,     // 1024*576     = 589 824 (W4CIF)
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kHD,        // 960*720      = 691 200
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kXGA,       // 1024*768     = 786 432
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWHD,       // 1280*720     = 921 600
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kFullHD,    // 1440*1080    = 1 555 200
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kWFullHD,   // 1920*1080    = 2 073 600
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        kNumberOfVideoSizes
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoSource
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoSource();
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoSource(std::string fileName, VideoSize size, int frameRate = 30,
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        webrtc::VideoType type = webrtc::kI420);
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoSource(std::string fileName, int width, int height, int frameRate = 30,
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                webrtc::VideoType type = webrtc::kI420);
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string GetFileName() const { return _fileName; }
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int GetWidth() const { return _width; }
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int GetHeight() const { return _height; }
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoType GetType() const { return _type; }
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int GetFrameRate() const { return _frameRate; }
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Returns the file path without a trailing slash.
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string GetFilePath() const;
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Returns the filename with the path (including the leading slash) removed.
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string GetName() const;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoSize GetSize() const;
7348c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    static VideoSize GetSize(uint16_t width, uint16_t height);
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int GetFrameLength() const;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Returns a human-readable size string.
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static const char* GetSizeString(VideoSize size);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const char* GetMySizeString() const;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Opens the video source, converting and writing to the specified target.
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // If force is true, the conversion will be done even if the target file
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // already exists.
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void Convert(const VideoSource& target, bool force = false) const;
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static bool FileExists(const char* fileName);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static int GetWidthHeight( VideoSize size, int& width, int& height);
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string _fileName;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int _width;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int _height;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoType _type;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int _frameRate;
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass FrameDropper
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FrameDropper();
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool DropFrame();
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int DropsBetweenRenders();
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void SetFrameRate(double frameRate, double maxFrameRate);
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int _dropsBetweenRenders;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    unsigned int _frameCounter;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
109