/*
 *  Copyright (c) 2012 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_TEST_VIDEO_SOURCE_H_
#define WEBRTC_MODULES_VIDEO_CODING_TEST_VIDEO_SOURCE_H_

#include <string>

#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/typedefs.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,
              float frameRate,
              webrtc::VideoType type = webrtc::kI420);
  VideoSource(std::string fileName,
              uint16_t width,
              uint16_t height,
              float frameRate = 30,
              webrtc::VideoType type = webrtc::kI420);

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

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

  size_t GetFrameLength() const;

 private:
  std::string _fileName;
  uint16_t _width;
  uint16_t _height;
  webrtc::VideoType _type;
  float _frameRate;
};

#endif  // WEBRTC_MODULES_VIDEO_CODING_TEST_VIDEO_SOURCE_H_
