blob: 96bc6f90b6459cac0b8cf2f73abd533c20318127 [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 SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_
#include <thread>
#include <vector>
#include <ddk/platform-defs.h>
#include "registers.h"
#include "video_decoder.h"
class Mpeg12Decoder : public VideoDecoder {
public:
explicit Mpeg12Decoder(Owner* owner, Client* client)
: VideoDecoder(
// Unspecified because we don't need metrics from this decoder.
media_metrics::StreamProcessorEvents2MetricDimensionImplementation_Unspecified, owner,
client,
/*is_secure=*/false) {
power_ref_ = std::make_unique<PowerReference>(owner_->core());
}
~Mpeg12Decoder() override;
zx_status_t Initialize() override;
void HandleInterrupt() override;
void ReturnFrame(std::shared_ptr<VideoFrame> video_frame) override;
void InitializedFrames(std::vector<CodecFrame> frames, uint32_t width, uint32_t height,
uint32_t stride) override;
void CallErrorHandler() override { exit(-1); }
private:
struct ReferenceFrame {
std::shared_ptr<VideoFrame> frame;
std::unique_ptr<CanvasEntry> y_canvas;
std::unique_ptr<CanvasEntry> uv_canvas;
};
zx_status_t InitializeVideoBuffers();
void ResetHardware();
void TryReturnFrames();
std::unique_ptr<PowerReference> power_ref_;
std::vector<ReferenceFrame> video_frames_;
std::vector<std::shared_ptr<VideoFrame>> returned_frames_;
io_buffer_t workspace_buffer_ = {};
};
#endif // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_