Skip to content

Commit bef5b93

Browse files
committed
Compile nvidia headers
1 parent 60185c8 commit bef5b93

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

.github/workflows/build-ffmpeg.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ jobs:
6363
- name: Build FFmpeg
6464
env:
6565
CIBW_ARCHS: ${{ matrix.arch }}
66-
CIBW_BEFORE_BUILD: python scripts/build-ffmpeg.py /tmp/vendor --commercial
66+
CIBW_BEFORE_BUILD: python scripts/build-ffmpeg.py /tmp/vendor --commercial --enable-cuda
6767
CIBW_BEFORE_BUILD_WINDOWS: python scripts\build-ffmpeg.py C:\cibw\vendor --commercial
6868
CIBW_BUILD: cp39-*
6969
CIBW_REPAIR_WHEEL_COMMAND_LINUX: LD_LIBRARY_PATH=/tmp/vendor/lib:$LD_LIBRARY_PATH auditwheel repair -w {dest_dir} {wheel}

scripts/build-ffmpeg.py

+27-5
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
source_url="https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.13.tar.xz",
3838
build_arguments=["--without-python"],
3939
community=True,
40-
)
40+
),
4141
]
4242

4343
gnutls_group = [
@@ -187,7 +187,9 @@
187187
build_arguments=(
188188
[r"-DOPENSSL_ROOT_DIR=C:\Program Files\OpenSSL"]
189189
if plat == "Windows"
190-
else ["-DENABLE_ENCRYPTION=OFF"] if plat == "Darwin" else [""]
190+
else ["-DENABLE_ENCRYPTION=OFF"]
191+
if plat == "Darwin"
192+
else [""]
191193
),
192194
community=True,
193195
),
@@ -201,15 +203,21 @@
201203
build_system="meson",
202204
)
203205

206+
nvheaders = Package(
207+
name="nv-codec-headers",
208+
source_url="https://github.com/FFmpeg/nv-codec-headers/archive/refs/tags/n13.0.19.0.tar.gz",
209+
build_system="make",
210+
)
211+
204212
ffmpeg_package = Package(
205213
name="ffmpeg",
206214
source_url="https://ffmpeg.org/releases/ffmpeg-7.1.tar.xz",
207215
build_arguments=[],
208-
build_parallel= plat != "Windows",
216+
build_parallel=plat != "Windows",
209217
)
210218

211219

212-
def download_tars(use_gnutls):
220+
def download_tars(use_gnutls: bool, community: bool) -> None:
213221
# Try to download all tars at the start.
214222
# If there is an curl error, do nothing, then try again in `main()`
215223

@@ -218,6 +226,8 @@ def download_tars(use_gnutls):
218226
local_libs += gnutls_group
219227

220228
for package in local_libs + codec_group:
229+
if not community and package.community:
230+
continue
221231
tarball = os.path.join(
222232
os.path.abspath("source"),
223233
package.source_filename or package.source_url.split("/")[-1],
@@ -236,6 +246,9 @@ def main():
236246
parser.add_argument("destination")
237247
parser.add_argument("--community", action="store_true")
238248
parser.add_argument("--commercial", action="store_true")
249+
parser.add_argument(
250+
"--enable-cuda", action="store_true", help="Enable NVIDIA CUDA support"
251+
)
239252

240253
args = parser.parse_args()
241254

@@ -244,6 +257,7 @@ def main():
244257

245258
dest_dir = args.destination
246259
community = args.community
260+
enable_cuda = args.enable_cuda and plat == "Linux"
247261
del args
248262

249263
output_dir = os.path.abspath("output")
@@ -261,7 +275,7 @@ def main():
261275
builder = Builder(dest_dir=dest_dir)
262276
builder.create_directories()
263277

264-
download_tars(use_gnutls)
278+
download_tars(use_gnutls, community)
265279

266280
# install packages
267281
available_tools = set()
@@ -329,6 +343,12 @@ def main():
329343
"--enable-zlib",
330344
"--enable-version3",
331345
]
346+
347+
if enable_cuda:
348+
ffmpeg_package.build_arguments.extend(["--enable-nvenc", "--enable-nvdec"])
349+
# NVIDIA codecs require nonfree
350+
ffmpeg_package.build_arguments.append("--enable-nonfree")
351+
332352
if not community:
333353
ffmpeg_package.build_arguments.extend(
334354
["--enable-libopenh264", "--disable-libx264"]
@@ -349,6 +369,8 @@ def main():
349369

350370
if use_gnutls:
351371
library_group += gnutls_group
372+
if enable_cuda:
373+
library_group += [nvheaders]
352374

353375
package_groups = [library_group + codec_group, [ffmpeg_package]]
354376
packages = [p for p_list in package_groups for p in p_list]

scripts/cibuildpkg.py

+32-3
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ def build(self, package: Package, *, for_builder: bool = False):
165165
self._build_with_cmake(package, for_builder=for_builder)
166166
elif package.build_system == "meson":
167167
self._build_with_meson(package, for_builder=for_builder)
168+
elif package.build_system == "make":
169+
self._build_with_make(package, for_builder=for_builder)
168170
else:
169171
self._build_with_autoconf(package, for_builder=for_builder)
170172

@@ -196,6 +198,33 @@ def create_directories(self) -> None:
196198
separator=os.pathsep,
197199
)
198200

201+
def _build_with_make(self, package: Package, for_builder: bool) -> None:
202+
assert package.build_system == "make"
203+
package_path = os.path.join(self.build_dir, package.name)
204+
package_source_path = os.path.join(package_path, package.source_dir)
205+
206+
# Get environment and prefix
207+
env = self._environment(for_builder=for_builder)
208+
prefix = self._prefix(for_builder=for_builder)
209+
210+
# Build package
211+
with chdir(package_source_path):
212+
make_command = ["make"] + make_args(parallel=package.build_parallel)
213+
install_command = ["make", "install"]
214+
215+
# Add PREFIX to both make and install commands
216+
prefix_arg = f"PREFIX={self._mangle_path(prefix)}"
217+
make_command.append(prefix_arg)
218+
install_command.append(prefix_arg)
219+
220+
# Add any additional build arguments
221+
make_command.extend(package.build_arguments)
222+
install_command.extend(package.build_arguments)
223+
224+
# Run build and install
225+
run(make_command, env=env)
226+
run(install_command, env=env)
227+
199228
def _build_with_autoconf(self, package: Package, for_builder: bool) -> None:
200229
assert package.build_system == "autoconf"
201230
package_path = os.path.join(self.build_dir, package.name)
@@ -405,9 +434,9 @@ def _extract(self, package: Package) -> None:
405434
prefixes = set()
406435
for name in tar.getnames():
407436
prefixes.add(name.split("/")[0])
408-
assert (
409-
len(prefixes) == 1
410-
), "cannot strip path components, multiple prefixes found"
437+
assert len(prefixes) == 1, (
438+
"cannot strip path components, multiple prefixes found"
439+
)
411440
prefix = list(prefixes)[0]
412441
else:
413442
prefix = ""

0 commit comments

Comments
 (0)