/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_
#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_

#include <string>
#include "common_video/libyuv/include/libyuv.h"

enum VideoSize
    {
        kUndefined,
        kSQCIF,     // 128*96       = 12 288
        kQQVGA,     // 160*120      = 19 200
        kQCIF,      // 176*144      = 25 344
        kCGA,       // 320*200      = 64 000
        kQVGA,      // 320*240      = 76 800
        kSIF,       // 352*240      = 84 480
        kWQVGA,     // 400*240      = 96 000
        kCIF,       // 352*288      = 101 376
        kW288p,     // 512*288      = 147 456 (WCIF)
        k448p,      // 576*448      = 281 088
        kVGA,       // 640*480      = 307 200
        k432p,      // 720*432      = 311 040
        kW432p,     // 768*432      = 331 776
        k4SIF,      // 704*480      = 337 920
        kW448p,     // 768*448      = 344 064
        kNTSC,		// 720*480      = 345 600
        kFW448p,    // 800*448      = 358 400
        kWVGA,      // 800*480      = 384 000
        k4CIF,      // 704�576      = 405 504
        kSVGA,      // 800*600      = 480 000
        kW544p,     // 960*544      = 522 240
        kW576p,     // 1024*576     = 589 824 (W4CIF)
        kHD,        // 960*720      = 691 200
        kXGA,       // 1024*768     = 786 432
        kWHD,       // 1280*720     = 921 600
        kFullHD,    // 1440*1080    = 1 555 200
        kWFullHD,   // 1920*1080    = 2 073 600

        kNumberOfVideoSizes
    };

class VideoSource
{
public:
    VideoSource();
    VideoSource(std::string fileName, VideoSize size, int frameRate = 30,
        webrtc::VideoType type = webrtc::kI420);
    VideoSource(std::string fileName, int width, int height, int frameRate = 30,
                webrtc::VideoType type = webrtc::kI420);

    std::string GetFileName() const { return _fileName; }
    int GetWidth() const { return _width; }
    int GetHeight() const { return _height; }
    webrtc::VideoType GetType() const { return _type; }
    int GetFrameRate() const { return _frameRate; }

    // Returns the file path without a trailing slash.
    std::string GetFilePath() const;

    // Returns the filename with the path (including the leading slash) removed.
    std::string GetName() const;

    VideoSize GetSize() const;
    static VideoSize GetSize(WebRtc_UWord16 width, WebRtc_UWord16 height);
    unsigned int GetFrameLength() const;

    // Returns a human-readable size string.
    static const char* GetSizeString(VideoSize size);
    const char* GetMySizeString() const;

    // Opens the video source, converting and writing to the specified target.
    // If force is true, the conversion will be done even if the target file
    // already exists.
    void Convert(const VideoSource& target, bool force = false) const;
    static bool FileExists(const char* fileName);
private:
    static int GetWidthHeight( VideoSize size, int& width, int& height);
    std::string _fileName;
    int _width;
    int _height;
    webrtc::VideoType _type;
    int _frameRate;
};

class FrameDropper
{
public:
    FrameDropper();
    bool DropFrame();
    unsigned int DropsBetweenRenders();
    void SetFrameRate(double frameRate, double maxFrameRate);

private:
    unsigned int _dropsBetweenRenders;
    unsigned int _frameCounter;
};


#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_FRAMEWORK_VIDEO_SOURCE_H_

