| // 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_ |