blob: e13815eb3672b28036df02b3d8a8c8ac9ab6155d [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_H264_DECODER_H_
#define GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_H264_DECODER_H_
#include <ddk/io-buffer.h>
#include <vector>
#include "registers.h"
#include "video_decoder.h"
class H264Decoder : public VideoDecoder {
public:
H264Decoder(Owner* owner) : owner_(owner) {}
~H264Decoder() override;
zx_status_t Initialize() override;
void HandleInterrupt() override;
void SetFrameReadyNotifier(FrameReadyNotifier notifier) override;
void SetInitializeFramesHandler(InitializeFramesHandler handler) override;
// All H264Decoder errors require creating a new H264Decoder to recover.
void SetErrorHandler(fit::closure error_handler) override;
void ReturnFrame(std::shared_ptr<VideoFrame> frame) override;
private:
struct ReferenceFrame {
std::shared_ptr<VideoFrame> frame;
std::unique_ptr<CanvasEntry> y_canvas;
std::unique_ptr<CanvasEntry> uv_canvas;
};
zx_status_t ResetHardware();
zx_status_t LoadSecondaryFirmware(const uint8_t* data,
uint32_t firmware_size);
zx_status_t InitializeFrames(uint32_t frame_count, uint32_t width,
uint32_t height, uint32_t display_width,
uint32_t display_height);
zx_status_t InitializeStream();
void ReceivedFrames(uint32_t frame_count);
void SwitchStreams();
void TryReturnFrames();
void OnFatalError();
Owner* owner_;
io_buffer_t codec_data_ = {};
io_buffer_t sei_data_buffer_ = {};
io_buffer_t reference_mv_buffer_ = {};
io_buffer_t secondary_firmware_ = {};
// All H264Decoder errors require creating a new H264Decoder to recover.
bool fatal_error_ = false;
// TODO(dustingreen): Move these up to the VideoDecoder abstract base class.
FrameReadyNotifier notifier_;
InitializeFramesHandler initialize_frames_handler_;
fit::closure error_handler_;
std::vector<ReferenceFrame> video_frames_;
std::vector<std::shared_ptr<VideoFrame>> returned_frames_;
};
#endif // GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_H264_DECODER_H_