#ifndef MEDIA_GPU_VP8_DECODER_H_
#define MEDIA_GPU_VP8_DECODER_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "media/gpu/accelerated_video_decoder.h"
#include "media/gpu/vp8_picture.h"
#include "media/gpu/vp8_reference_frame_vector.h"
#include "media/parsers/vp8_parser.h"
namespace media {
class MEDIA_GPU_EXPORT VP8Decoder : public AcceleratedVideoDecoder {
public:
class MEDIA_GPU_EXPORT VP8Accelerator {
public:
VP8Accelerator();
VP8Accelerator(const VP8Accelerator&) = delete;
VP8Accelerator& operator=(const VP8Accelerator&) = delete;
virtual ~VP8Accelerator();
virtual scoped_refptr<VP8Picture> CreateVP8Picture() = 0;
virtual bool SubmitDecode(
scoped_refptr<VP8Picture> pic,
const Vp8ReferenceFrameVector& reference_frames) = 0;
virtual bool OutputPicture(scoped_refptr<VP8Picture> pic) = 0;
};
explicit VP8Decoder(
std::unique_ptr<VP8Accelerator> accelerator,
const VideoColorSpace& container_color_space = VideoColorSpace());
VP8Decoder(const VP8Decoder&) = delete;
VP8Decoder& operator=(const VP8Decoder&) = delete;
~VP8Decoder() override;
void SetStream(int32_t id,
scoped_refptr<DecoderBuffer> decoder_buffer) override;
[[nodiscard]] bool Flush() override;
void Reset() override;
[[nodiscard]] DecodeResult Decode() override;
gfx::Size GetPicSize() const override;
gfx::Rect GetVisibleRect() const override;
VideoCodecProfile GetProfile() const override;
uint8_t GetBitDepth() const override;
VideoChromaSampling GetChromaSampling() const override;
VideoColorSpace GetVideoColorSpace() const override;
std::optional<gfx::HDRMetadata> GetHDRMetadata() const override;
size_t GetRequiredNumOfPictures() const override;
size_t GetNumReferenceFrames() const override;
private:
bool DecodeAndOutputCurrentFrame(scoped_refptr<VP8Picture> pic);
enum State {
kNeedStreamMetadata,
kDecoding,
kAfterReset,
kError,
};
State state_;
scoped_refptr<media::DecoderBuffer> decoder_buffer_;
Vp8Parser parser_;
std::unique_ptr<Vp8FrameHeader> curr_frame_hdr_;
Vp8ReferenceFrameVector ref_frames_;
static constexpr int32_t kInvalidId = -1;
int32_t stream_id_ = kInvalidId;
int32_t last_decoded_stream_id_ = kInvalidId;
size_t size_change_failure_counter_ = 0;
raw_ptr<const uint8_t> curr_frame_start_;
size_t frame_size_ = 0;
gfx::Size pic_size_;
int horizontal_scale_;
int vertical_scale_;
const std::unique_ptr<VP8Accelerator> accelerator_;
const VideoColorSpace container_color_space_;
};
}
#endif