mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-09-13 02:54:26 +08:00
perf(video): 新增 RKMPP DMA 采集编码通路并完善恢复逻辑
支持原生 HDMI 和 UVC 缓冲区导出,增加同步 RKMPP 编码及可选 MJPEG 硬件转码。 校验帧布局和缓冲区租约,在 DMA 不可用或编码失败时回退到复制通路。 保留自定义码率和 GOP 策略,重开采集时同步 HDMI 源帧率,并区分 UVC 超时状态。 验证:88 个视频测试通过(含 4 个新增回归测试);ARM64 cargo check --tests 通过。
This commit is contained in:
31
libs/hwcodec/cpp/ffmpeg_hw/rkmpp_dmabuf_ffi.h
Normal file
31
libs/hwcodec/cpp/ffmpeg_hw/rkmpp_dmabuf_ffi.h
Normal file
@@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct RkmppDmaEncoder RkmppDmaEncoder;
|
||||
// format: 0=NV12, 1=BGR24, 2=YUYV, 3=RGB24 (byte stride), 4=MJPEG (stride ignored).
|
||||
// codec: 0=H264, 1=HEVC. MJPEG is decoded to hardware NV12, then encoded.
|
||||
RkmppDmaEncoder *rkmpp_dma_new(int width, int height, int stride, int format,
|
||||
int codec, int fps, int kbps, int gop,
|
||||
const int *fds, const size_t *sizes, size_t count);
|
||||
// Synchronous input-completion boundary. On failure the encoder is destroyed
|
||||
// internally BEFORE returning, so it cannot keep reading the capture buffer.
|
||||
// Output is borrowed until the next call or destruction; copy before reusing it.
|
||||
// bytes_used must be the actual captured payload. MJPEG needs 64 bytes of
|
||||
// readable allocation headroom; never pass sizeimage as the compressed length.
|
||||
// fresh_fd=-1 reuses the original import (native HDMI). UVC supplies a new
|
||||
// export of this dequeued slot. Keep it open until replacement/free; the old
|
||||
// export can be closed AFTER this call, including on failure.
|
||||
int rkmpp_dma_encode(RkmppDmaEncoder *encoder, size_t index, size_t bytes_used, int fresh_fd, int64_t pts_us,
|
||||
int force_idr, const uint8_t **data, size_t *size);
|
||||
int rkmpp_dma_reconfigure(RkmppDmaEncoder *encoder, int kbps, int gop);
|
||||
void rkmpp_dma_free(RkmppDmaEncoder *encoder);
|
||||
const char *rkmpp_dma_error(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user