08080f062c
First code on daedalus-decoder per the Phase 1 decisions merged 2026-05-24.
Repo skeleton only — no Vulkan pipeline yet, no shaders, no libavcodec
intercept. Establishes the build shape so subsequent work has a place
to land.
Layout:
LICENSE BSD-2-Clause (matches daedalus-fourier)
.gitignore build/, CMake artefacts, *.spv
CMakeLists.txt top-level — finds daedalus-fourier
≥0.1.0 via pkg-config (per §9.6
decision: find_package, pinned to
tagged release; .pc consumed via
pkg_check_modules until we ship a
CMake config), Vulkan via
find_package, builds static lib
+ smoke test, GNUInstallDirs install
include/daedalus_decoder.h public API surface:
- daedalus_decoder_{create,destroy,
version,has_qpu}
- daedalus_decoder_set_output_format
(NV12 default, RGBA opt-in per §5)
- daedalus_decoder_append_mb +
struct daedalus_decoder_mb_input
(matches §3 per-MB descriptor)
- daedalus_decoder_flush_frame
(per-frame submit + wait)
- daedalus_decoder_export_dmabuf
(Vulkan-native VkImage export per
§9.4 decision)
Dimensions are CODED frame size
(mod-16), not displayed — caller
translates from SPS + crop offsets.
src/internal.h internal mb_desc struct (matches
shader std430 layout, to be nailed
down once shaders exist) + per-ctx
state
src/daedalus_decoder.c stub bodies:
- create/destroy with proper resource
lifecycle
- append_mb validates + writes CPU
staging buffers (no GPU yet)
- flush_frame returns -2 (not
implemented) — Phase 1 work
- export_dmabuf returns -1
- has_qpu / version diagnostics
tests/test_smoke.c link + lifecycle test: bad dims
reject, OOB MB reject, null inputs
reject, raster-order enforcement,
mid-frame format-change reject,
incomplete-frame flush reject.
On hosts without V3D7 Vulkan,
SKIPs gracefully (returns 0).
Verified on hertz (Pi 5 / V3D 7.1 / Mesa V3DV via daedalus-fourier
0.1.0):
$ cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
$ cmake --build build
$ ctest --test-dir build --output-on-failure
Test #1: smoke ... Passed
$ ./build/test_smoke
daedalus-decoder version: 0.0.1
ctx created: 1920x1088, has_qpu=1
smoke OK
Note the coded-vs-displayed dims trap: 1080p H.264 has coded height
1088 with 8 rows cropped via SPS frame_cropping_*. Header docstring
on daedalus_decoder_create() spells this out so future callers don't
hit the multiple-of-16 reject (smoke test caught it during scaffold
write).
Next: Phase 1 implementation begins — IDCT 4×4 / 8×8 frame-scaled
dispatch (reusing daedalus-fourier shaders per Appendix A), intra
prediction wavefront, reconstruct stage, NV12 output via dmabuf
export. Smoke test grows from "ctx lifecycle works" to
"I-frame-only Baseline decode bit-exact vs FFmpeg reference".
69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
/*
|
|
* daedalus-decoder — internal types shared across translation units.
|
|
* Not installed; pure-internal.
|
|
*/
|
|
#ifndef DAEDALUS_DECODER_INTERNAL_H
|
|
#define DAEDALUS_DECODER_INTERNAL_H
|
|
|
|
#include "daedalus_decoder.h"
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
#include <daedalus.h> /* daedalus-fourier public API */
|
|
|
|
/* Per-MB descriptor as the GPU sees it. Bit-laid-out to match the
|
|
* shader's std430 layout. Kept narrow (32 bytes target) so a 1080p
|
|
* frame's 8160 entries fit in ~256 KiB SSBO.
|
|
*
|
|
* TODO once the shaders exist: nail down the exact std430 layout and
|
|
* static_assert sizeof / alignof here. */
|
|
struct daedalus_decoder_mb_desc {
|
|
uint16_t mb_x;
|
|
uint16_t mb_y;
|
|
uint8_t mb_type;
|
|
uint8_t mb_qp_y;
|
|
uint8_t mb_qp_uv;
|
|
uint8_t cbp;
|
|
|
|
uint8_t intra_4x4_modes[16];
|
|
uint8_t intra_16x16_mode;
|
|
uint8_t intra_chroma_mode;
|
|
uint8_t partition_mode;
|
|
uint8_t _pad0;
|
|
|
|
int8_t ref_idx_l0[4];
|
|
int8_t ref_idx_l1[4];
|
|
int16_t mv_l0[4][2];
|
|
int16_t mv_l1[4][2];
|
|
|
|
uint8_t deblock_disable;
|
|
int8_t deblock_alpha_c0;
|
|
int8_t deblock_beta;
|
|
uint8_t _pad1;
|
|
};
|
|
|
|
struct daedalus_decoder {
|
|
/* Geometry. */
|
|
int width;
|
|
int height;
|
|
int mb_width; /* width / 16 */
|
|
int mb_height; /* height / 16 */
|
|
int n_mbs;
|
|
|
|
/* daedalus-fourier context (Vulkan + V3D7 runner). */
|
|
daedalus_ctx *dctx;
|
|
|
|
/* Frame-shaped staging (CPU-side; will move to mapped SSBO once
|
|
* Vulkan plumbing is in place). */
|
|
struct daedalus_decoder_mb_desc *mb_descs; /* n_mbs */
|
|
int16_t *coeffs; /* n_mbs * 384 */
|
|
int mbs_appended; /* per-frame count */
|
|
|
|
/* Output format. */
|
|
daedalus_decoder_output_format output_fmt;
|
|
};
|
|
|
|
#endif /* DAEDALUS_DECODER_INTERNAL_H */
|