fix(deltacast-bridge): pin BUFFER_PACKING to YUV422_8; guard frame size
Relying on the SDK default for VHD_CORE_SP_BUFFER_PACKING caused the board
to deliver raw slot buffers whose byte size did not match the width*height*2
contract declared to ffmpeg (pix_fmt=uyvy422). ffmpeg consumed frames at the
wrong stride, causing every frame to shift progressively, rolling and
shearing the picture ("bounces and bends").
Fix: explicitly set VHD_BUFPACK_VIDEO_YUV422_8 on the video stream before
StartStream so the board always delivers tightly-packed 8-bit UYVY.
Safety net: video thread now asserts sz==width*height*2 and skips+warns on
any mismatch so a future packing divergence is immediately visible in logs
rather than silently corrupting video.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
22853da023
commit
3ac685ed3b
1 changed files with 11 additions and 0 deletions
|
|
@ -320,6 +320,13 @@ static void *video_thread(void *arg) {
|
||||||
BYTE *buf = NULL;
|
BYTE *buf = NULL;
|
||||||
ULONG sz = 0;
|
ULONG sz = 0;
|
||||||
if (VHD_GetSlotBuffer(slot, VHD_SDI_BT_VIDEO, &buf, &sz) == VHDERR_NOERROR) {
|
if (VHD_GetSlotBuffer(slot, VHD_SDI_BT_VIDEO, &buf, &sz) == VHDERR_NOERROR) {
|
||||||
|
ULONG expected = (ULONG)ps->vi.width * (ULONG)ps->vi.height * 2;
|
||||||
|
if (sz != expected) {
|
||||||
|
fprintf(stderr, "[video:%u] WARN: slot sz=%lu != expected %lu (w=%d h=%d) -- packing mismatch; skipping frame\n",
|
||||||
|
ps->port, sz, expected, ps->vi.width, ps->vi.height);
|
||||||
|
VHD_UnlockSlotHandle(slot);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (write_all(fd, buf, sz) < 0) {
|
if (write_all(fd, buf, sz) < 0) {
|
||||||
/* EPIPE: sidecar died (session stop/restart).
|
/* EPIPE: sidecar died (session stop/restart).
|
||||||
* Break to outer loop — reopen for next session. */
|
* Break to outer loop — reopen for next session. */
|
||||||
|
|
@ -568,6 +575,10 @@ int main(int argc, char *argv[]) {
|
||||||
VHD_SetStreamProperty(vs, VHD_SDI_SP_CLOCK_SYSTEM, p->clock_div);
|
VHD_SetStreamProperty(vs, VHD_SDI_SP_CLOCK_SYSTEM, p->clock_div);
|
||||||
VHD_SetStreamProperty(vs, VHD_CORE_SP_TRANSFER_SCHEME, VHD_TRANSFER_SLAVED);
|
VHD_SetStreamProperty(vs, VHD_CORE_SP_TRANSFER_SCHEME, VHD_TRANSFER_SLAVED);
|
||||||
VHD_SetStreamProperty(vs, VHD_CORE_SP_BUFFERQUEUE_DEPTH, 8);
|
VHD_SetStreamProperty(vs, VHD_CORE_SP_BUFFERQUEUE_DEPTH, 8);
|
||||||
|
/* Pin to tightly-packed 8-bit UYVY. Relying on SDK default caused
|
||||||
|
* the board to deliver frames whose size != width*height*2,
|
||||||
|
* producing rolled/sheared ("bouncing and bending") video. */
|
||||||
|
VHD_SetStreamProperty(vs, VHD_CORE_SP_BUFFER_PACKING, VHD_BUFPACK_VIDEO_YUV422_8);
|
||||||
p->video_stream = vs;
|
p->video_stream = vs;
|
||||||
|
|
||||||
if (VHD_StartStream(vs) != VHDERR_NOERROR) {
|
if (VHD_StartStream(vs) != VHDERR_NOERROR) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue