OrangePi3588Media/include/hw/rk3588_defaults.h
2026-01-16 20:19:09 +08:00

98 lines
2.7 KiB
C++

#pragma once
#include <memory>
#include <mutex>
#include <string>
#include <vector>
#include "hw/i_decoder.h"
#include "hw/i_encoder.h"
#include "hw/i_image_processor.h"
#include "hw/i_infer_backend.h"
#include "utils/simple_json.h"
#include "utils/result.h"
namespace rk3588 {
class RknnInferBackend : public IInferBackend {
public:
ModelHandle LoadModel(const std::string& model_path, std::string& err) override {
return AiScheduler::Instance().LoadModel(model_path, err);
}
void UnloadModel(ModelHandle handle) override {
AiScheduler::Instance().UnloadModel(handle);
}
bool GetModelInfo(ModelHandle handle, ModelInfo& info) const override {
return AiScheduler::Instance().GetModelInfo(handle, info);
}
InferResult Infer(ModelHandle handle, const InferInput& input) override {
return AiScheduler::Instance().Infer(handle, input);
}
AiScheduler::BorrowedInferResult InferBorrowed(ModelHandle handle, const InferInput& input) override {
{
std::lock_guard<std::mutex> lock(mu_);
last_borrowed_input_ = input;
}
return AiScheduler::Instance().InferBorrowed(handle, input);
}
InferInput GetLastBorrowedInput() const {
std::lock_guard<std::mutex> lock(mu_);
return last_borrowed_input_;
}
private:
mutable std::mutex mu_;
InferInput last_borrowed_input_;
};
using Rk3588InferBackend = RknnInferBackend;
class Rk3588ImageProcessor : public IImageProcessor {
public:
explicit Rk3588ImageProcessor(const SimpleJson& config);
Status Resize(const Frame& src, Frame& dst) override;
Status CvtColor(const Frame& src, Frame& dst, PixelFormat dst_format) override;
Status Normalize(const Frame& src, std::vector<float>& out,
const std::vector<float>& mean,
const std::vector<float>& std) override;
bool IsUsingRga() const;
int RgaMaxInflight() const;
std::string RgaGateKey() const;
private:
std::shared_ptr<IImageProcessor> impl_;
bool use_rga_ = true;
};
class Rk3588Decoder : public IDecoder {
public:
Status Open(const SimpleJson& config) override;
Status Send(const DecodePacket& packet) override;
Result<std::shared_ptr<Frame>> Receive() override;
void Close() override;
private:
std::unique_ptr<IDecoder> impl_;
};
class Rk3588Encoder : public IEncoder {
public:
Status Open(const SimpleJson& config) override;
Status Send(const std::shared_ptr<Frame>& frame) override;
Result<EncodePacket> Receive() override;
std::vector<uint8_t> ExtraData() const override;
void Close() override;
private:
std::unique_ptr<IEncoder> impl_;
};
} // namespace rk3588