From d76f574169db5e45168f850a4d988685323d3cba Mon Sep 17 00:00:00 2001 From: Good Guy Date: Mon, 23 Feb 2026 18:21:42 -0700 Subject: [PATCH] Credit Andrew - Vulkan mod for ffmpeg, update termux bld, djbfft patch needed by termux, new Vulkan and avi render formats --- cinelerra-5.1/blds/termux.bld | 2 +- cinelerra-5.1/cinelerra/ffmpeg.C | 41 ++++++++++++++--- cinelerra-5.1/ffmpeg/video/av1_vulkan.mkv | 5 +++ cinelerra-5.1/ffmpeg/video/h264_vulkan.mkv | 3 ++ cinelerra-5.1/ffmpeg/video/h264_vulkan.mp4 | 3 ++ cinelerra-5.1/ffmpeg/video/hevc_vulkan.mkv | 4 ++ cinelerra-5.1/ffmpeg/video/magicyuv.avi | 5 +++ cinelerra-5.1/ffmpeg/video/speedhq.avi | 4 ++ .../thirdparty/src/djbfft-0.76.patch8 | 44 +++++++++++++++++++ 9 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 cinelerra-5.1/ffmpeg/video/av1_vulkan.mkv create mode 100644 cinelerra-5.1/ffmpeg/video/h264_vulkan.mkv create mode 100644 cinelerra-5.1/ffmpeg/video/h264_vulkan.mp4 create mode 100644 cinelerra-5.1/ffmpeg/video/hevc_vulkan.mkv create mode 100644 cinelerra-5.1/ffmpeg/video/magicyuv.avi create mode 100644 cinelerra-5.1/ffmpeg/video/speedhq.avi create mode 100644 cinelerra-5.1/thirdparty/src/djbfft-0.76.patch8 diff --git a/cinelerra-5.1/blds/termux.bld b/cinelerra-5.1/blds/termux.bld index e30f5750..0e48e767 100755 --- a/cinelerra-5.1/blds/termux.bld +++ b/cinelerra-5.1/blds/termux.bld @@ -1,6 +1,6 @@ #!/bin/bash # Produced, tested, and used by Andrew-R on an Android tablet export FFMPEG_EXTRA_CFG="--disable-debug --target-os=android --enable-mediacodec --enable-jni --enable-opencl --disable-doc --disable-ffprobe --enable-libdav1d" -export EXTRA_LIBS="-ldav1d -lOpenCL -landroid -landroid-posix-semaphore" +export EXTRA_LIBS="-ldav1d -lOpenCL -landroid -landroid-posix-semaphore -lmediandk" ./configure --with-lv2 --disable-lv2 --disable-sord --disable-serd --disable-suil --disable-sratom --disable-lilv --without-vdpau --without-vaapi --without-ladspa-build \ --without-nv --with-single-user --with-clang --without-gl --disable-dav1d diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C index 1e0ad84b..28872851 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.C +++ b/cinelerra-5.1/cinelerra/ffmpeg.C @@ -1210,18 +1210,20 @@ AVHWDeviceType FFVideoStream::encode_hw_activate(const char *hw_dev, const char AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE; if( strcmp(_("none"), hw_dev) ) { type = av_hwdevice_find_type_by_name(hw_dev); - if( type != AV_HWDEVICE_TYPE_VAAPI ) { - fprintf(stderr, "currently, only vaapi hw encode is supported\n"); + if( !((type == AV_HWDEVICE_TYPE_VAAPI) || (type == AV_HWDEVICE_TYPE_VULKAN ))) { + fprintf(stderr, "currently, only vaapi/vulkan hw encode is supported\n"); type = AV_HWDEVICE_TYPE_NONE; } } + if( type != AV_HWDEVICE_TYPE_NONE ) { int ret = 0; if (drm_node_enc) { ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, drm_node_enc, 0, 0); } else { - ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, 0, 0, 0); + ret = av_hwdevice_ctx_create(&hw_device_ctx, type, 0, 0, 0); } + if( ret < 0 ) { ff_err(ret, "Failed to create a HW device.\n"); type = AV_HWDEVICE_TYPE_NONE; @@ -1237,8 +1239,14 @@ AVHWDeviceType FFVideoStream::encode_hw_activate(const char *hw_dev, const char if( type != AV_HWDEVICE_TYPE_NONE ) { AVHWFramesContext *frames_ctx = (AVHWFramesContext *)(hw_frames_ref->data); frames_ctx->format = AV_PIX_FMT_VAAPI; + + if (type == AV_HWDEVICE_TYPE_VULKAN) + frames_ctx->format = AV_PIX_FMT_VULKAN; + frames_ctx->sw_format = AV_PIX_FMT_NV12; if (strcmp(hw_sformat, "vaapi")) frames_ctx->sw_format = av_get_pix_fmt(hw_sformat); + if (strcmp(hw_sformat, "vulkan")) frames_ctx->sw_format = av_get_pix_fmt(hw_sformat); + frames_ctx->width = width; frames_ctx->height = height; frames_ctx->initial_pool_size = 0; // 200; @@ -1262,6 +1270,7 @@ int FFVideoStream::encode_hw_write(FFrame *picture) AVFrame *hw_frm = 0; switch( avctx->pix_fmt ) { case AV_PIX_FMT_VAAPI: + case AV_PIX_FMT_VULKAN: hw_frm = av_frame_alloc(); if( !hw_frm ) { ret = AVERROR(ENOMEM); break; } ret = av_hwframe_get_buffer(avctx->hw_frames_ctx, hw_frm, 0); @@ -1413,6 +1422,9 @@ int FFVideoStream::init_frame(AVFrame *picture) case AV_PIX_FMT_VAAPI: picture->format = AV_PIX_FMT_NV12; break; + case AV_PIX_FMT_VULKAN: + picture->format = avctx->sw_pix_fmt; + break; default: picture->format = avctx->pix_fmt; break; @@ -1506,6 +1518,7 @@ int FFVideoStream::encode(VFrame *vframe) frame->pts = curr_pos; ret = convert_pixfmt(vframe, frame); } + if( ret >= 0 && avctx->hw_frames_ctx ) encode_hw_write(picture); if( ret >= 0 ) { @@ -1538,7 +1551,7 @@ int FFVideoStream::encode_frame(AVFrame *frame) frame->flags |= AV_FRAME_FLAG_INTERLACED; #endif } - if( frame && frame->format == AV_PIX_FMT_VAAPI ) { // ugly + if( frame && (frame->format == AV_PIX_FMT_VAAPI || frame->format == AV_PIX_FMT_VULKAN)) { // ugly int ret = avcodec_send_frame(avctx, frame); for( int retry=MAX_RETRY; !ret && --retry>=0; ) { FFPacket pkt; av_init_packet(pkt); @@ -1661,6 +1674,7 @@ int FFVideoConvert::convert_picture_vframe(VFrame *frame, AVFrame *ip, AVFrame * AVPixelFormat pix_fmt = (AVPixelFormat)ip->format; FFVideoStream *vid =(FFVideoStream *)this; + if( pix_fmt == vid->hw_pixfmt ) { int ret = 0; if( !sw_frame && !(sw_frame=av_frame_alloc()) ) @@ -3093,12 +3107,27 @@ int FFMPEG::open_encoder(const char *type, const char *spec) case BC_COLORS_BT2020_CL: ctx->colorspace = AVCOL_SPC_BT2020_CL; break; } AVPixelFormat pix_fmt = av_get_pix_fmt(asset->ff_pixel_format); - if( opt_hw_dev != 0 ) { - AVHWDeviceType hw_type = vid->encode_hw_activate(opt_hw_dev, asset->ff_pixel_format); + AVHWDeviceType hw_type; + + int vulkan = 0; + if(!strcmp(codec_name, "h264_vulkan") || + !strcmp(codec_name, "h265_vulkan") || + !strcmp(codec_name, "ffv1_vulkan") || + !strcmp(codec_name, "av1_vulkan")) + vulkan = 1; + + if( opt_hw_dev != 0 || vulkan == 1) { + if(opt_hw_dev) + hw_type = vid->encode_hw_activate(opt_hw_dev, asset->ff_pixel_format); + if(vulkan == 1) + hw_type = vid->encode_hw_activate("vulkan", asset->ff_pixel_format); switch( hw_type ) { case AV_HWDEVICE_TYPE_VAAPI: pix_fmt = AV_PIX_FMT_VAAPI; break; + case AV_HWDEVICE_TYPE_VULKAN: + pix_fmt = AV_PIX_FMT_VULKAN; + break; case AV_HWDEVICE_TYPE_NONE: default: break; } diff --git a/cinelerra-5.1/ffmpeg/video/av1_vulkan.mkv b/cinelerra-5.1/ffmpeg/video/av1_vulkan.mkv new file mode 100644 index 00000000..5b2480cb --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/av1_vulkan.mkv @@ -0,0 +1,5 @@ +matroska av1_vulkan + +cin_pix_fmt=nv12 +cin_hw_device=vulkan + diff --git a/cinelerra-5.1/ffmpeg/video/h264_vulkan.mkv b/cinelerra-5.1/ffmpeg/video/h264_vulkan.mkv new file mode 100644 index 00000000..2f7f7cd6 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/h264_vulkan.mkv @@ -0,0 +1,3 @@ +matroska h264_vulkan +cin_pix_fmt=nv12 +cin_hw_device=vulkan diff --git a/cinelerra-5.1/ffmpeg/video/h264_vulkan.mp4 b/cinelerra-5.1/ffmpeg/video/h264_vulkan.mp4 new file mode 100644 index 00000000..be86b888 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/h264_vulkan.mp4 @@ -0,0 +1,3 @@ +mp4 h264_vulkan +cin_pix_fmt=nv12 +cin_hw_device=vulkan diff --git a/cinelerra-5.1/ffmpeg/video/hevc_vulkan.mkv b/cinelerra-5.1/ffmpeg/video/hevc_vulkan.mkv new file mode 100644 index 00000000..00b07db9 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/hevc_vulkan.mkv @@ -0,0 +1,4 @@ +matroska h265_vulkan + +cin_pix_fmt=nv12 +cin_hw_device=vulkan diff --git a/cinelerra-5.1/ffmpeg/video/magicyuv.avi b/cinelerra-5.1/ffmpeg/video/magicyuv.avi new file mode 100644 index 00000000..aac3823a --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/magicyuv.avi @@ -0,0 +1,5 @@ +avi magicyuv +# A high-performance, ultra-fast, mathematically lossless video codec for recording, archiving, +# video post-production and uncompressed-quality playout at high resolutions. +cin_pix_fmt yuv444p +threads=2 diff --git a/cinelerra-5.1/ffmpeg/video/speedhq.avi b/cinelerra-5.1/ffmpeg/video/speedhq.avi new file mode 100644 index 00000000..ee953980 --- /dev/null +++ b/cinelerra-5.1/ffmpeg/video/speedhq.avi @@ -0,0 +1,4 @@ +avi speedhq +# NewTek SpeedHQ +cin_pix_fmt yuv444p +threads=2 diff --git a/cinelerra-5.1/thirdparty/src/djbfft-0.76.patch8 b/cinelerra-5.1/thirdparty/src/djbfft-0.76.patch8 new file mode 100644 index 00000000..21410597 --- /dev/null +++ b/cinelerra-5.1/thirdparty/src/djbfft-0.76.patch8 @@ -0,0 +1,44 @@ +--- ./substdo.c.orig 2026-02-22 04:04:08.657744551 +0300 ++++ ./substdo.c 2026-02-22 04:04:34.817744532 +0300 +@@ -4,7 +4,7 @@ + #include "error.h" + + static int allwrite(op,fd,buf,len) +-register int (*op)(); ++register ssize_t (*op)(); + register int fd; + register char *buf; + register int len; +--- ./substdi.c.orig 2026-02-22 04:02:46.717744610 +0300 ++++ ./substdi.c 2026-02-22 04:03:26.921744581 +0300 +@@ -3,7 +3,7 @@ + #include "error.h" + + static int oneread(op,fd,buf,len) +-register int (*op)(); ++register ssize_t (*op)(); + register int fd; + register char *buf; + register int len; +--- ./substdio.h.orig 2026-02-22 03:56:48.945744866 +0300 ++++ ./substdio.h 2026-02-22 03:58:36.741744789 +0300 +@@ -9,7 +9,7 @@ + int p; + int n; + int fd; +- int (*op)(); ++ ssize_t (*op)(); + } substdio; + + #define SUBSTDIO_FDBUF(op,fd,buf,len) { (buf), 0, (len), (fd), (op) } +--- ./substdio.c.orig 2026-02-22 04:01:02.893744684 +0300 ++++ ./substdio.c 2026-02-22 04:01:43.749744655 +0300 +@@ -2,7 +2,7 @@ + + void substdio_fdbuf(s,op,fd,buf,len) + register substdio *s; +-register int (*op)(); ++register ssize_t (*op)(); + register int fd; + register char *buf; + register int len; -- 2.34.1