// Copyright 2020 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_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_
#define MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_

#include <limits>
#include <memory>
#include <string>

#include "base/files/file_path.h"
#include "media/base/video_bitrate_allocation.h"
#include "media/base/video_codecs.h"
#include "media/gpu/test/video_test_environment.h"
#include "media/video/video_encode_accelerator.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace gpu {
class GpuMemoryBufferFactory;
}

namespace media {
namespace test {
class Video;

// Test environment for video encoder tests. Performs setup and teardown once
// for the entire test run.
class VideoEncoderTestEnvironment : public VideoTestEnvironment {
 public:
  // VideoEncoderTest uses at most 60 frames in the given video file.
  // This limitation is required as a long video stream might not fit in
  // a device's memory or the number of allocatable handles in the system.
  // TODO(hiroh): Streams frames from disk so we can avoid this limitation when
  // encoding long video streams.
  static constexpr size_t kMaxReadFrames = 60;

  static VideoEncoderTestEnvironment* Create(
      const base::FilePath& video_path,
      const base::FilePath& video_metadata_path,
      bool enable_bitstream_validator,
      const base::FilePath& output_folder,
      const std::string& codec,
      size_t num_temporal_layers,
      size_t num_spatial_layers,
      bool save_output_bitstream,
      absl::optional<uint32_t> output_bitrate,
      bool reverse,
      const FrameOutputConfig& frame_output_config = FrameOutputConfig());

  ~VideoEncoderTestEnvironment() override;

  // Get the video the tests will be ran on.
  media::test::Video* Video() const;
  // Generate the nv12 video from |video_| the test will be ran on.
  media::test::Video* GenerateNV12Video();
  // Whether bitstream validation is enabled.
  bool IsBitstreamValidatorEnabled() const;
  // Get the output folder.
  const base::FilePath& OutputFolder() const;
  // Get the output codec profile.
  VideoCodecProfile Profile() const;
  // Get the spatial layers config for SVC. Return empty vector in non SVC mode.
  const std::vector<VideoEncodeAccelerator::Config::SpatialLayer>&
  SpatialLayers() const;
  // Get default bitrate allocation from target bitrate.
  VideoBitrateAllocation GetDefaultVideoBitrateAllocation(
      uint32_t bitrate) const;
  // Get the target bitrate (bits/second).
  VideoBitrateAllocation Bitrate() const;
  // Whether the encoded bitstream is saved to disk.
  bool SaveOutputBitstream() const;
  // True if the video should play backwards at reaching the end of video.
  // Otherwise the video loops. See the comment in AlignedDataHelper for detail.
  bool Reverse() const;
  absl::optional<base::FilePath> OutputBitstreamFilePath() const;
  // Gets the frame output configuration.
  const FrameOutputConfig& ImageOutputConfig() const;

  // Get the GpuMemoryBufferFactory for doing buffer allocations. This needs to
  // survive as long as the process is alive just like in production which is
  // why it's in here as there are threads that won't immediately die when an
  // individual test is completed.
  gpu::GpuMemoryBufferFactory* GetGpuMemoryBufferFactory() const;

  // Returns whether kepler will be used in the test.
  bool IsKeplerUsed() const;

 private:
  VideoEncoderTestEnvironment(std::unique_ptr<media::test::Video> video,
                              bool enable_bitstream_validator,
                              const base::FilePath& output_folder,
                              VideoCodecProfile profile,
                              size_t num_temporal_layers,
                              size_t num_spatial_layers,
                              uint32_t bitrate,
                              bool save_output_bitstream,
                              bool reverse,
                              const FrameOutputConfig& frame_output_config);

  // Video file to be used for testing.
  const std::unique_ptr<media::test::Video> video_;
  // NV12 video file to be used for testing.
  std::unique_ptr<media::test::Video> nv12_video_;
  // Whether bitstream validation should be enabled while testing.
  const bool enable_bitstream_validator_;
  // Output folder to be used to store test artifacts (e.g. perf metrics).
  const base::FilePath output_folder_;
  // VideoCodecProfile to be produced by VideoEncoder.
  const VideoCodecProfile profile_;
  // The number of temporal layers of the stream to be produced by VideoEncoder.
  // This is only for vp9 stream.
  const size_t num_temporal_layers_;
  // The number of spatial layers of the stream to be produced by VideoEncoder.
  // This is only for vp9 stream.
  const size_t num_spatial_layers_;
  // Targeted bitrate (bits/second) of the stream produced by VideoEncoder.
  const VideoBitrateAllocation bitrate_;
  // The spatial layers of the stream which aligned with |num_spatial_layers_|
  // and |num_temporal_layers_|. This is only for vp9 stream.
  std::vector<VideoEncodeAccelerator::Config::SpatialLayer> spatial_layers_;
  // Whether the bitstream produced by VideoEncoder is saved to disk.
  const bool save_output_bitstream_;
  // True if the video should play backwards at reaching the end of video.
  // Otherwise the video loops. See the comment in AlignedDataHelper for detail.
  const bool reverse_;
  // The configuration about saving decoded images of bitstream encoded by
  // VideoEncoder.
  // The configuration used when saving the decoded images of bitstream encoded
  // by VideoEncoder to disk.
  const FrameOutputConfig frame_output_config_;

  std::unique_ptr<gpu::GpuMemoryBufferFactory> gpu_memory_buffer_factory_;
};
}  // namespace test
}  // namespace media

#endif  // MEDIA_GPU_TEST_VIDEO_ENCODER_VIDEO_ENCODER_TEST_ENVIRONMENT_H_
