The previous patch_decklink.py mixed v14_2_1 versioned types (Fix 1 renamed the allocator class) with no-ops for SetVideoInputFrameMemoryAllocator + QueryInterface-around-GetBytes (Fixes 2 & 3). That inconsistency compiled but silently dropped every video frame: VideoInputFrameArrived saw _v14_2_1 allocator output but tried to read it via the SDK 16 unversioned IDeckLinkVideoBuffer path, and the SDK released the buffer before FFmpeg could consume it.
Bisected with the BMD-provided Capture sample at SDK 16 mode 5 (Hp29) which got frames cleanly, confirming the signal was fine and the bug was in FFmpegs decklink demuxer.
Fix: pull libavdevice/decklink_{enc,dec,common}{.cpp,.h} from upstream FFmpeg master (commits past 7.1 that fully rename every decklink interface to its _v14_2_1 versioned form) and apply that diff in reverse during build. Now build is internally consistent and frames flow.
Verified: SDI1 recorder on zampp2 hits 423 frames in 14s @ 29 fps, ProRes HQ at 91 Mbps.
21 lines
1 KiB
Python
21 lines
1 KiB
Python
#!/usr/bin/env python3
|
|
# Apply the upstream FFmpeg master decklink SDK-16 compatibility patch on top
|
|
# of the release/7.1 source. The patch renames every IDeckLink* interface and
|
|
# helper to its _v14_2_1 versioned form so the call sites keep working against
|
|
# SDK 16's headers (which only retain the versioned aliases). Cherry-picking
|
|
# individual replacements like the previous regex patch produced inconsistent
|
|
# code that compiled but silently dropped every video frame.
|
|
import subprocess, sys, pathlib
|
|
patch = pathlib.Path('/decklink-sdk16.patch')
|
|
if not patch.exists():
|
|
print('FATAL: /decklink-sdk16.patch not found in build context', file=sys.stderr)
|
|
sys.exit(1)
|
|
# Patch was produced as `git diff HEAD FETCH_HEAD` where HEAD=release/7.1 and
|
|
# FETCH_HEAD=master, so we apply it in REVERSE to move 7.1 → master.
|
|
result = subprocess.run(
|
|
['git', 'apply', '-R', '--verbose', str(patch)],
|
|
cwd='/ffmpeg', capture_output=True, text=True,
|
|
)
|
|
print(result.stdout)
|
|
print(result.stderr, file=sys.stderr)
|
|
sys.exit(result.returncode)
|