// 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_VAAPI_TEST_VIDEO_DECODER_H_
#define MEDIA_GPU_VAAPI_TEST_VIDEO_DECODER_H_

#include "media/gpu/vaapi/test/shared_va_surface.h"

namespace media {

class IvfParser;

namespace vaapi_test {

class VaapiDevice;

// VideoDecoder specifies an interface for frame-by-frame libva-based decoding
// with different profiles.
class VideoDecoder {
 public:
  // Result of decoding the current frame.
  enum Result {
    kOk,
    kEOStream,
  };

  VideoDecoder(std::unique_ptr<IvfParser> ivf_parser,
               const VaapiDevice& va_device,
               SharedVASurface::FetchPolicy fetch_policy);
  // Implementations of VideoDecoder are expected to handle the destruction of
  // |last_decoded_surface_| and in particular ensure it is done in the right
  // order with respect to the other VAAPI objects.
  virtual ~VideoDecoder();

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

  // Decodes the next frame in this decoder. Errors are fatal.
  virtual Result DecodeNextFrame() = 0;

  // Outputs the last decoded frame to a PNG at the given |path|.
  // "Last decoded" includes frames specified not to be shown as well as
  // frames referring to already existing/previously decoded frames.
  // It is therefore possible that the images outputted do not exactly match
  // what is displayed by playing the video stream directly.
  void LastDecodedFrameToPNG(const std::string& path) const {
    last_decoded_surface_->SaveAsPNG(fetch_policy_, path);
  }

  // Computes the MD5 sum of the last decoded frame and returns a human-readable
  // representation.
  std::string LastDecodedFrameMD5Sum() const {
    return last_decoded_surface_->GetMD5Sum(fetch_policy_);
  }

  // Returns whether the last decoded frame was visible.
  bool LastDecodedFrameVisible() const { return last_decoded_frame_visible_; }

 protected:
  // Parser for the IVF stream to decode.
  const std::unique_ptr<IvfParser> ivf_parser_;

  // VA handles.
  const VaapiDevice& va_device_;
  scoped_refptr<SharedVASurface> last_decoded_surface_;

  // Whether the last decoded frame was visible.
  bool last_decoded_frame_visible_ = false;

  // How to fetch image data from VASurfaces decoded into by this decoder.
  const SharedVASurface::FetchPolicy fetch_policy_;
};

}  // namespace vaapi_test
}  // namespace media

#endif  // MEDIA_GPU_VAAPI_TEST_VIDEO_DECODER_H_
