// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_GPU_TEST_VIDEO_H_
#define MEDIA_GPU_TEST_VIDEO_H_

#include <limits>
#include <string>
#include <vector>

#include "base/files/file_path.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/waitable_event.h"
#include "base/time/time.h"
#include "media/base/video_codecs.h"
#include "media/base/video_types.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"

namespace media {

class VideoFrame;

namespace test {

// The video class provides functionality to load video files and manage their
// properties such as video codec, number of frames, frame checksums,...
// TODO(@dstaessens):
// * Use a file stream rather than loading potentially huge files into memory.
class Video {
 public:
  Video(const base::FilePath& file_path,
        const base::FilePath& metadata_file_path);

  Video(const Video&) = delete;
  Video& operator=(const Video&) = delete;

  ~Video();

  // Create a new Video instance by copying and converting |data_| to NV12.
  std::unique_ptr<Video> ConvertToNV12() const;
  // Create a new Video instance by copying the content to |visible_rect_| area
  // and expanding the resolution to |resolution_|. This is only supported for
  // raw videos in the NV12 format.
  std::unique_ptr<Video> Expand(const gfx::Size& resolution,
                                const gfx::Rect& visible_rect) const;

  // Load the video file from disk. |max_frames| is the maximum number of
  // frames to be read from disk.
  bool Load(const size_t max_frames = std::numeric_limits<size_t>::max());
  // Returns true if the video file was loaded.
  bool IsLoaded() const;

  // Get the video file path.
  const base::FilePath& FilePath() const;
  // Get the video data, will be empty if the video hasn't been loaded yet.
  const std::vector<uint8_t>& Data() const;
  std::vector<uint8_t>& Data();

  // Decode the video, replacing the video stream data in |data_| with raw video
  // data. This is currently only supported for VP9 videos. Returns whether
  // decoding was successful.
  bool Decode();

  // Get the video's codec.
  VideoCodec Codec() const;
  // Get the video's codec profile.
  VideoCodecProfile Profile() const;
  // Get the video's color bit depth.
  uint8_t BitDepth() const;
  // Get the video's pixel format.
  VideoPixelFormat PixelFormat() const;
  // Get the video frame rate.
  uint32_t FrameRate() const;
  // Get the number of frames in the video.
  uint32_t NumFrames() const;
  // Get the number of fragments in the video.
  uint32_t NumFragments() const;
  // Get the video resolution.
  gfx::Size Resolution() const;
  // Get the video visible rectangle.
  gfx::Rect VisibleRect() const;
  // Get the video duration.
  base::TimeDelta GetDuration() const;

  // Get the list of frame checksums.
  const std::vector<std::string>& FrameChecksums() const;

  // Set the default path to the test video data.
  static void SetTestDataPath(const base::FilePath& test_data_path);

 private:
  // Return the profile associated with the |profile| string.
  static absl::optional<VideoCodecProfile> ConvertStringtoProfile(
      const std::string& profile);
  // Return the codec associated with the |profile|.
  static absl::optional<VideoCodec> ConvertProfileToCodec(
      VideoCodecProfile profile);
  // Return the pixel format associated with the |pixel_format| string.
  static absl::optional<VideoPixelFormat> ConvertStringtoPixelFormat(
      const std::string& pixel_format);

  // Load metadata from the JSON file associated with the video file.
  bool LoadMetadata();
  // Return true if video metadata is already loaded.
  bool IsMetadataLoaded() const;

  // Resolve the specified |file_path|. The path can be absolute, relative to
  // the current directory, or relative to the test data path. Returns the
  // resolved path if resolving to an existing file was successful.
  absl::optional<base::FilePath> ResolveFilePath(
      const base::FilePath& file_path);

  // Decode the video on a separate thread. The |resolution| needs to be
  // specified here as the resolution of the decoded frames might differ due to
  // the software decoder alignment.
  static void DecodeTask(const std::vector<uint8_t> data,
                         const gfx::Size& resolution,
                         const size_t num_frames,
                         std::vector<uint8_t>* decompressed_data,
                         bool* success,
                         base::WaitableEvent* done);
  // Called each time a |frame| is decoded while decoding a video. The area
  // specified by |resolution| of the decoded frame will be appended to the
  // |data|.
  static void OnFrameDecoded(const gfx::Size& resolution,
                             std::vector<uint8_t>* data,
                             scoped_refptr<VideoFrame> frame);

  // The path where all test video files are stored.
  // TODO(dstaessens@) Avoid using a static data path here.
  static base::FilePath test_data_path_;
  // The video file path, can be relative to the test data path.
  base::FilePath file_path_;
  // Video metadata file path, can be relative to the test data path.
  base::FilePath metadata_file_path_;

  // The video's data stream.
  std::vector<uint8_t> data_;

  // Ordered list of video frame checksums.
  std::vector<std::string> frame_checksums_;

  // Video codec, profile and bit depth for encoded videos.
  VideoCodecProfile profile_ = VIDEO_CODEC_PROFILE_UNKNOWN;
  VideoCodec codec_ = VideoCodec::kUnknown;
  uint8_t bit_depth_ = 0u;

  // Pixel format for raw videos.
  VideoPixelFormat pixel_format_ = VideoPixelFormat::PIXEL_FORMAT_UNKNOWN;

  uint32_t frame_rate_ = 0;
  uint32_t num_frames_ = 0;
  uint32_t num_fragments_ = 0;
  gfx::Size resolution_;
  gfx::Rect visible_rect_;
};

}  // namespace test
}  // namespace media

#endif  // MEDIA_GPU_TEST_VIDEO_H_
