blob: ee9ed45eccf47f8cd39d0766a6f5d6d43cf0afaa [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 <lib/ddk/platform-defs.h>
#include <string_view>
#include <thread>
#include <vector>
#include "registers.h"
#include "video_decoder.h"
namespace amlogic_decoder {
class Mpeg12Decoder : public VideoDecoder {
public:
explicit Mpeg12Decoder(Owner* owner, Client* client)
: VideoDecoder(
// Unspecified because we don't need metrics from this decoder.
media_metrics::StreamProcessorEvents2MigratedMetricDimensionImplementation_Unspecified,
owner, client,
/*is_secure=*/false) {
power_ref_ = std::make_unique<PowerReference>(owner_->core());
}
void ForceStopDuringRemoveLocked() override;
~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_ = {};
};
} // namespace amlogic_decoder
#endif // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_MPEG12_DECODER_H_