Files
cuframes-composer/include/cuframes_composer/cugrid.h
T
gx 1e2b5d4e16 Phase 2: composer + libcugrid (N источников → 2x2 grid в NV12 буфер)
Multi-source композитор работает на 4K @ 25fps стабильно. Live-тест с
4 камерами (parking, back_yard, front_yard, gate_lpr): все 4 active,
350 кадров за 14с, 27.6 МБ H.264 файл, кадр декодируется ffmpeg'ом
с корректным 2x2 layout'ом.

Содержимое:

- include/cuframes_composer/cugrid.h — публичный API libcugrid:
  cfc_cugrid_fill_nv12 (region fill с alpha blend),
  cfc_cugrid_resize_nv12 (bilinear scale в rect).
- src/cugrid/cugrid.cu — извлечённые из vf_cuda_grid kernel'ы
  (Y+UV fill + bilinear resize), объединены с C launcher'ом в одном
  .cu файле, под LGPL-2.1+.
- include/cuframes_composer/composer.h — публичный API композитора:
  cfc_composer_cell_t для layout, get_health для observability.
- src/composer.c — manager N cfc_source_t + единый NV12 output buffer
  (cuMemAlloc, переиспользуется на каждом compose'е). compose_clear
  fillит фон BT.709-чёрным, compose_cell делает resize ACTIVE
  источника или оставляет blackout для DEAD/STALE/CONNECTING.
- examples/grid_record — Phase 2 smoke test: N --cell ключ,x,y,w,h
  → grid composer → NVENC → file.

Сборка: добавлен LANGUAGES CUDA и CMAKE_CUDA_ARCHITECTURES 89;120
(Ada + Blackwell). Compile options раздельные для C и CUDA
(-Wpedantic не подходит для .cu).

Phase 2 RTSP push отложен на отдельный commit — будет через pipe-out
к локальному ffmpeg'у, который публикует в mediamtx (вариант
утверждён в Q2 дизайн-документа).
2026-06-03 05:01:49 +01:00

82 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* cuframes-composer — CUDA kernels для grid-композиции NV12 кадров.
*
* Извлечено из vf_cuda_grid (FFmpeg out-of-tree filter), под LGPL-2.1+.
* Все операции работают на NV12-кадрах:
* - Y plane: full resolution, 1 byte per pixel
* - UV plane: half resolution, 2 bytes per pixel (interleaved U,V)
*
* Все операции:
* - Принимают CUstream (NULL = default stream)
* - Не аллоцируют память (caller выделяет dst буфер заранее)
* - Idempotent для re-use (composer вызывает на каждом кадре)
*
* Lifecycle:
* cfc_cugrid_init() один раз при старте композитора (no-op для CUDA, но
* резервирован под cuModuleLoad если перейдём на PTX)
*
* Лицензия: LGPL-2.1+
*/
#ifndef CUFRAMES_COMPOSER_CUGRID_H
#define CUFRAMES_COMPOSER_CUGRID_H
#include <cuda.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Lazy init (no-op в текущей реализации; зарезервировано под future PTX module). */
int cfc_cugrid_init(void);
/* Заполнить прямоугольник на NV12 кадре solid color'ом с alpha-блендингом.
*
* dst_y, dst_uv — указатели на Y и UV plane соответственно.
* pitch_y, pitch_uv — pitch в bytes (для NV12 обычно равны и кратны 256).
* x, y, w, h — прямоугольник в full-res пикселях (chroma usually пишется
* автоматически на половинном rastr'е).
* w и h должны быть чётными (требование 4:2:0 subsampling'а).
* color_y/u/v — компоненты цвета в BT.709 limited range (Y: 16-235, UV: 16-240).
* Для чёрного: Y=16, U=128, V=128.
* alpha — 0..255 (0 = transparent, 255 = opaque).
*
* Возвращает 0 при успехе.
*/
int cfc_cugrid_fill_nv12(
CUstream stream,
CUdeviceptr dst_y, int pitch_y,
CUdeviceptr dst_uv, int pitch_uv,
int x, int y, int w, int h,
int color_y, int color_u, int color_v, int alpha
);
/* Resize NV12 src → rect (dst_x, dst_y, dst_w, dst_h) на NV12 dst.
*
* Bilinear interpolation на Y и UV. Y и UV plane src'а должны быть одним
* allocation'ом (NV12 layout) или хотя бы иметь корректные указатели каждый.
*
* src_y, src_uv — src указатели.
* src_w, src_h — размер src в full-res пикселях.
* src_pitch_y/uv — pitch'ы (для NV12 cuframes pitch_y == pitch_uv).
* dst_y, dst_uv — dst указатели.
* dst_pitch_y/uv — pitch'ы dst NV12 кадра.
* dst_x, dst_y_off, — координата top-left прямоугольника на dst (full-res пиксели).
* dst_w, dst_h dst_x и dst_y_off, dst_w, dst_h ДОЛЖНЫ быть чётными
* (для UV/chroma subsampling'а).
*/
int cfc_cugrid_resize_nv12(
CUstream stream,
CUdeviceptr src_y, int src_w, int src_h, int src_pitch_y,
CUdeviceptr src_uv, int src_pitch_uv,
CUdeviceptr dst_y, int dst_pitch_y,
CUdeviceptr dst_uv, int dst_pitch_uv,
int dst_x, int dst_y_off, int dst_w, int dst_h
);
#ifdef __cplusplus
}
#endif
#endif /* CUFRAMES_COMPOSER_CUGRID_H */