fixed (hopefully) 0001 patch, added mjpegtools and ffmpeg 4.4
termux-specific patches... also added libbthread source and simple Makefile
(might be useful if i manage to include resulted library in
libzmpeg-related files)



On Wednesday, May 19, 2021, Andrew Randrianasulu <[email protected]>
wrote:

> probably not very complete (mjpegtools had their own problems) but should
> give you some idea where I am
>
> patch 0001 still not fixed.. (as in, it reintroduced ff->video_probe and
> this one still leaks..)
>
> configured with
>
>  $ ./configure  --without-lv2 --without-vdpau --without-vaapi
> --without-firewire --without-nv --without-shuttle --without-shuttle_usb
> --with-single-user --without-libzmpeg --with-clang --with-booby
> --without-dv --without-dvb --without-video4linux2 --disable-dav1d
>
>
>
From 9dbb2ac0d94e8a13f6c4c01f42045db3035b05e4 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 18:00:21 +0300
Subject: [PATCH 02/22] ifdef for DV

---
 cinelerra-5.1/cinelerra/ffmpeg.C | 2 ++
 cinelerra-5.1/cinelerra/record.C | 4 ++++
 2 files changed, 6 insertions(+)

diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index df39763c..55fa668e 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -29,7 +29,9 @@
 #include "ffmpeg.h"
 #include "indexfile.h"
 #include "interlacemodes.h"
+#ifdef HAVE_DV
 #include "libdv.h"
+#endif
 #include "libmjpeg.h"
 #include "mainerror.h"
 #include "mwindow.h"
diff --git a/cinelerra-5.1/cinelerra/record.C b/cinelerra-5.1/cinelerra/record.C
index ad293f7b..f42fe9e1 100644
--- a/cinelerra-5.1/cinelerra/record.C
+++ b/cinelerra-5.1/cinelerra/record.C
@@ -46,7 +46,9 @@
 #include "keys.h"
 #include "language.h"
 #include "localsession.h"
+#ifdef HAVE_DV
 #include "libdv.h"
+#endif
 #include "libmjpeg.h"
 #include "libzmpeg3.h"
 #include "mainmenu.h"
@@ -215,10 +217,12 @@ int Record::load_defaults()
 	case VIDEO4LINUX2JPEG:
 		vcodec = CODEC_TAG_MJPEG;
 		break;
+#ifdef HAVE_DV
 	case CAPTURE_FIREWIRE:
 	case CAPTURE_IEC61883:
 		vcodec = CODEC_TAG_DVSD;
 		break;
+#endif
 	}
 	if( vcodec )
 		strcpy(default_asset->vcodec, vcodec);
-- 
2.31.1

From c7721ddf60656abd40e1128c762296aeaf7f976f Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 17:10:22 +0300
Subject: [PATCH 01/22] constify fileffmpeg.C

---
 cinelerra-5.1/cinelerra/fileffmpeg.C | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/fileffmpeg.C b/cinelerra-5.1/cinelerra/fileffmpeg.C
index a71d692a..853e5839 100644
--- a/cinelerra-5.1/cinelerra/fileffmpeg.C
+++ b/cinelerra-5.1/cinelerra/fileffmpeg.C
@@ -159,7 +159,7 @@ void FFMpegPixelFormat::update_formats()
 	pixfmts.remove_all_objects();
 	char video_codec[BCSTRLEN]; video_codec[0] = 0;
 	const char *vcodec = vid_config->asset->vcodec;
-	AVCodec *av_codec = !FFMPEG::get_codec(video_codec, "video", vcodec) ?
+	const AVCodec *av_codec = !FFMPEG::get_codec(video_codec, "video", vcodec) ?
 		avcodec_find_encoder_by_name(video_codec) : 0;
 	const AVPixelFormat *pix_fmts = av_codec ? av_codec->pix_fmts : 0;
 	if( pix_fmts ) {
@@ -190,7 +190,7 @@ void FFMpegSampleFormat::update_formats()
 	samplefmts.remove_all_objects();
 	char audio_codec[BCSTRLEN]; audio_codec[0] = 0;
 	const char *acodec = aud_config->asset->acodec;
-	AVCodec *av_codec = !FFMPEG::get_codec(audio_codec, "audio", acodec) ?
+	const AVCodec *av_codec = !FFMPEG::get_codec(audio_codec, "audio", acodec) ?
 		avcodec_find_encoder_by_name(audio_codec) : 0;
 	const AVSampleFormat *sample_fmts = av_codec ? av_codec->sample_fmts : 0;
 	if( sample_fmts ) {
@@ -345,7 +345,7 @@ int FileFFMPEG::open_file(int rd, int wr)
 				asset->aspect_ratio = ff->ff_aspect_ratio(0);
 				if (!asset->interlace_mode) asset->interlace_mode = ff->ff_interlace(0);
 				if ( ff->ff_video_frames(0) > 1 ) {
-//				ff->video_probe(1);
+				ff->video_probe(1);
 				 if (!asset->interlace_mode && (ff->interlace_from_codec) ) asset->interlace_mode = ff->video_probe(1); 
 				}
 				if( !asset->layers ) asset->layers = video_layers;
@@ -1844,7 +1844,7 @@ int FFOptionsViewAudio::handle_event()
 	const char *name = asset->acodec;
 	char audio_format[BCSTRLEN];  audio_format[0] = 0;
 	char audio_codec[BCSTRLEN];   audio_codec[0] = 0;
-	AVCodec *codec = !ret &&
+	const AVCodec *codec = !ret &&
 	    !FFMPEG::get_format(audio_format, "audio", name) &&
 	    !FFMPEG::get_codec(audio_codec, "audio", name) ?
 		avcodec_find_encoder_by_name(audio_codec) : 0;
@@ -1882,7 +1882,7 @@ int FFOptionsViewVideo::handle_event()
 	const char *name = asset->vcodec;
 	char video_format[BCSTRLEN];  video_format[0] = 0;
 	char video_codec[BCSTRLEN];   video_codec[0] = 0;
-	AVCodec *codec = !ret &&
+	const AVCodec *codec = !ret &&
 	    !FFMPEG::get_format(video_format, "video", name) &&
 	    !FFMPEG::get_codec(video_codec, "video", name) ?
 		avcodec_find_encoder_by_name(video_codec) : 0;
-- 
2.31.1

From 794d3a552090aca0aab92834635afc6cb4329568 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 20:14:27 +0300
Subject: [PATCH 03/22] TERMUX ifdefs in guicast

---
 cinelerra-5.1/guicast/Makefile     |  7 +++++++
 cinelerra-5.1/guicast/bthread.h    | 31 ++++++++++++++++++++++++++++++
 cinelerra-5.1/guicast/filesystem.C |  3 ++-
 cinelerra-5.1/guicast/thread.C     |  5 +++++
 cinelerra-5.1/guicast/thread.h     |  4 +++-
 cinelerra-5.1/guicast/vframe.C     | 10 +++++-----
 cinelerra-5.1/guicast/vframe.h     |  3 ++-
 7 files changed, 55 insertions(+), 8 deletions(-)
 create mode 100644 cinelerra-5.1/guicast/bthread.h

diff --git a/cinelerra-5.1/guicast/Makefile b/cinelerra-5.1/guicast/Makefile
index cf189dea..fc086f92 100644
--- a/cinelerra-5.1/guicast/Makefile
+++ b/cinelerra-5.1/guicast/Makefile
@@ -12,6 +12,11 @@ ifeq ($(OBJDIR), amd64)
 BOOTSTRAPFLAGS := -DBOOTSTRAP="\"objcopy -B i386 -I binary -O elf64-x86-64\""
 endif
 
+ifeq ($(OBJDIR), armv8l)
+BOOTSTRAPFLAGS := -DBOOTSTRAP="\"objcopy -B arm -I binary -O elf32-littlearm\""
+endif
+
+
 $(shell mkdir -p $(OBJDIR) )
 
 OBJS = \
@@ -83,6 +88,7 @@ OBJS = \
 	$(OBJDIR)/vicon.o \
 	$(OBJDIR)/workarounds.o
 
+
 OUTPUT = $(OBJDIR)/libguicast.a
 
 UTILS = $(OBJDIR)/bootstrap $(OBJDIR)/pngtoh $(OBJDIR)/pngtoraw
@@ -90,6 +96,7 @@ BCXFER = xfer/$(OBJDIR)/xfer.stamp
 
 CFLAGS += $(static_incs)
 
+
 $(shell echo $(CFLAGS) > $(OBJDIR)/c_flags)
 $(shell echo $(OBJS) > $(OBJDIR)/objs)
 
diff --git a/cinelerra-5.1/guicast/bthread.h b/cinelerra-5.1/guicast/bthread.h
new file mode 100644
index 00000000..57a0c492
--- /dev/null
+++ b/cinelerra-5.1/guicast/bthread.h
@@ -0,0 +1,31 @@
+/* BThread main header
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+# define PTHREAD_CANCEL_ENABLE    	 0x00000010
+# define PTHREAD_CANCEL_DISABLE   	 0x00000000
+
+# define PTHREAD_CANCEL_ASYNCHRONOUS 0x00000020
+# define PTHREAD_CANCEL_DEFERRED     0x00000000
+
+#define PTHREAD_CANCELED ((void *) -1)
+
+int pthread_setcancelstate (int , int *);
+int pthread_setcanceltype (int , int *);
+void pthread_testcancel (void);
+int pthread_cancel (pthread_t t);
diff --git a/cinelerra-5.1/guicast/filesystem.C b/cinelerra-5.1/guicast/filesystem.C
index 6017f6ea..b1ace6fd 100644
--- a/cinelerra-5.1/guicast/filesystem.C
+++ b/cinelerra-5.1/guicast/filesystem.C
@@ -536,7 +536,7 @@ int FileSystem::parse_tildas(char *new_dir)
 				new_user[j] = new_dir[i];
 			}
 			new_user[j] = 0;
-
+#if !defined(__TERMUX__)
 			setpwent();
 			while( (pw = getpwent()) != 0 )
 			{
@@ -550,6 +550,7 @@ int FileSystem::parse_tildas(char *new_dir)
       			}
 			}
 			endpwent();
+#endif
 			return 0;
 		}
 	}
diff --git a/cinelerra-5.1/guicast/thread.C b/cinelerra-5.1/guicast/thread.C
index 50b52a47..9908a628 100644
--- a/cinelerra-5.1/guicast/thread.C
+++ b/cinelerra-5.1/guicast/thread.C
@@ -28,6 +28,9 @@
 #include <string.h>
 #include <typeinfo>
 #include "thread.h"
+#if defined(__TERMUX__)
+#include "bthread.h"
+#endif
 
 
 Thread::Thread(int synchronous, int realtime, int autodelete)
@@ -102,8 +105,10 @@ void Thread::start()
 			perror("Thread::start pthread_attr_setschedparam");
 	}
 	else {
+#if !defined(__TERMUX__)
 		if(pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED) < 0)
 			perror("Thread::start pthread_attr_setinheritsched");
+#endif
 	}
 
 // autodelete may delete this immediately after create
diff --git a/cinelerra-5.1/guicast/thread.h b/cinelerra-5.1/guicast/thread.h
index 79f3e713..e701a8f4 100644
--- a/cinelerra-5.1/guicast/thread.h
+++ b/cinelerra-5.1/guicast/thread.h
@@ -29,13 +29,15 @@
 #ifndef NO_TID
 #include <sys/syscall.h>
 
+#if !defined(__TERMUX__)
 // glibc >= 2.30 provides gettid() in unistd
 #if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 30)
 static inline int gettid() { return syscall(SYS_gettid, 0, 0, 0); }
-#endif
 #else
 static inline long gettid() { return (long)pthread_self(); }
 #endif
+#endif // TERMUX
+#endif //no_tid
 
 // The thread does not autodelete by default.
 // If autodelete is 1 the thread autodeletes.
diff --git a/cinelerra-5.1/guicast/vframe.C b/cinelerra-5.1/guicast/vframe.C
index af0e52a8..44d7f97e 100644
--- a/cinelerra-5.1/guicast/vframe.C
+++ b/cinelerra-5.1/guicast/vframe.C
@@ -334,7 +334,7 @@ if( memory_type != VFrame::SHARED )
 			shmid = -1;
 			break;
 
-		case VFrame::SHMGET:
+		case VFrame::SHM_GET:
 			if(data)
 				shmdt(data);
 			data = 0;
@@ -510,7 +510,7 @@ int VFrame::allocate_data(unsigned char *data, int shmid,
 		this->v_offset = v_offset;
 	}
 	else if( shmid >= 0 ) {
-		memory_type = VFrame::SHMGET;
+		memory_type = VFrame::SHM_GET;
 		this->data = (unsigned char*)shmat(shmid, NULL, 0);
 		if( this->data == (unsigned char*)-1 ) {
 			printf("VFrame::allocate_data %d could not attach"
@@ -593,7 +593,7 @@ void VFrame::set_memory(unsigned char *data,
 	else
 	if(shmid >= 0)
 	{
-		memory_type = VFrame::SHMGET;
+		memory_type = VFrame::SHM_GET;
 		this->data = (unsigned char*)shmat(shmid, NULL, 0);
 		this->shmid = shmid;
 	}
@@ -635,7 +635,7 @@ void VFrame::set_compressed_memory(unsigned char *data,
 	else
 	if(shmid >= 0)
 	{
-		memory_type = VFrame::SHMGET;
+		memory_type = VFrame::SHM_GET;
 		this->data = (unsigned char*)shmat(shmid, NULL, 0);
 		this->shmid = shmid;
 	}
@@ -713,7 +713,7 @@ UNBUFFER(data);
 			else
 				free(data);
 		}
-		else if( memory_type == VFrame::SHMGET ) {
+		else if( memory_type == VFrame::SHM_GET ) {
 			if( data ) shmdt(data);
 		}
 
diff --git a/cinelerra-5.1/guicast/vframe.h b/cinelerra-5.1/guicast/vframe.h
index 589fce1c..55590bda 100644
--- a/cinelerra-5.1/guicast/vframe.h
+++ b/cinelerra-5.1/guicast/vframe.h
@@ -31,6 +31,7 @@
 #include "bccmodels.h"
 #include "vframe.inc"
 
+
 // Maximum number of prev or next effects to be pushed onto the stacks.
 #define MAX_STACK_ELEMENTS 255
 #define SHM_MIN_SIZE 2048
@@ -417,7 +418,7 @@ private:
 	{
 		PRIVATE,
 		SHARED,
-		SHMGET
+		SHM_GET
 	};
 
 // Data pointer is pointing to someone else's buffer.
-- 
2.31.1

From 4ead9a1bd5b84aadc0805975b3daa5fe2fd83495 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 20:27:37 +0300
Subject: [PATCH 04/22] libzmpeg TERMUX ifdefs

---
 cinelerra-5.1/libzmpeg3/bthread.h   | 31 +++++++++++++++++++++++++++++
 cinelerra-5.1/libzmpeg3/libzmpeg3.h |  2 ++
 cinelerra-5.1/libzmpeg3/zio.C       |  3 +++
 3 files changed, 36 insertions(+)
 create mode 100644 cinelerra-5.1/libzmpeg3/bthread.h

diff --git a/cinelerra-5.1/libzmpeg3/bthread.h b/cinelerra-5.1/libzmpeg3/bthread.h
new file mode 100644
index 00000000..57a0c492
--- /dev/null
+++ b/cinelerra-5.1/libzmpeg3/bthread.h
@@ -0,0 +1,31 @@
+/* BThread main header
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+# define PTHREAD_CANCEL_ENABLE    	 0x00000010
+# define PTHREAD_CANCEL_DISABLE   	 0x00000000
+
+# define PTHREAD_CANCEL_ASYNCHRONOUS 0x00000020
+# define PTHREAD_CANCEL_DEFERRED     0x00000000
+
+#define PTHREAD_CANCELED ((void *) -1)
+
+int pthread_setcancelstate (int , int *);
+int pthread_setcanceltype (int , int *);
+void pthread_testcancel (void);
+int pthread_cancel (pthread_t t);
diff --git a/cinelerra-5.1/libzmpeg3/libzmpeg3.h b/cinelerra-5.1/libzmpeg3/libzmpeg3.h
index 430ebb4d..8993aed4 100644
--- a/cinelerra-5.1/libzmpeg3/libzmpeg3.h
+++ b/cinelerra-5.1/libzmpeg3/libzmpeg3.h
@@ -5,7 +5,9 @@
 /* for quicktime build */
 #define MAXFRAMESAMPLES 65536
 #define ZDVB
+#if defined(__i386__) || defined(__x86-64__)
 #define USE_FUTEX
+#endif
 
 #ifndef __STDC_LIMIT_MACROS
 #define __STDC_LIMIT_MACROS
diff --git a/cinelerra-5.1/libzmpeg3/zio.C b/cinelerra-5.1/libzmpeg3/zio.C
index cb6ce15d..2f6f6c58 100644
--- a/cinelerra-5.1/libzmpeg3/zio.C
+++ b/cinelerra-5.1/libzmpeg3/zio.C
@@ -1,4 +1,7 @@
 #include "libzmpeg3.h"
+#if defined(__TERMUX__)
+#include "bthread.h"
+#endif
 
 #ifdef USE_FUTEX
 typedef zmpeg3_t::zloc_t zzloc_t;
-- 
2.31.1

From 4131ef4f95f4dceb1684d67335f4eda35b77f99c Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 21:05:21 +0300
Subject: [PATCH 05/22] Add libzmpeg ifdef in fileac3, move fireware objects
 into their own group in Makefile in cinelerra/

---
 cinelerra-5.1/cinelerra/Makefile  | 22 ++++++++++++++--------
 cinelerra-5.1/cinelerra/fileac3.C |  3 ++-
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/Makefile b/cinelerra-5.1/cinelerra/Makefile
index 81d1acee..d5145d7d 100644
--- a/cinelerra-5.1/cinelerra/Makefile
+++ b/cinelerra-5.1/cinelerra/Makefile
@@ -56,7 +56,6 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/assets.o \
 	$(OBJDIR)/atrack.o \
 	$(OBJDIR)/attachmentpoint.o \
-	$(OBJDIR)/audio1394.o \
 	$(OBJDIR)/audioalsa.o \
 	$(OBJDIR)/audiodevice.o \
 	$(OBJDIR)/audiodvb.o \
@@ -70,8 +69,6 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/automation.o \
 	$(OBJDIR)/auto.o \
 	$(OBJDIR)/autos.o \
-	$(OBJDIR)/avc1394control.o \
-	$(OBJDIR)/avc1394transport.o \
 	$(OBJDIR)/awindowgui.o \
 	$(OBJDIR)/awindow.o \
 	$(OBJDIR)/batch.o \
@@ -112,8 +109,6 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/cwindowtool.o \
 	$(OBJDIR)/dcoffset.o \
 	$(OBJDIR)/deleteallindexes.o \
-	$(OBJDIR)/device1394input.o \
-	$(OBJDIR)/device1394output.o \
 	$(OBJDIR)/devicedvbinput.o \
 	$(OBJDIR)/devicev4l2base.o \
 	$(OBJDIR)/devicev4l2input.o \
@@ -170,8 +165,6 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/garbage.o \
 	$(OBJDIR)/gwindowgui.o \
 	$(OBJDIR)/gwindow.o \
-	$(OBJDIR)/iec61883input.o \
-	$(OBJDIR)/iec61883output.o \
 	$(OBJDIR)/indexable.o \
 	$(OBJDIR)/indexfile.o \
 	$(OBJDIR)/indexstate.o \
@@ -339,7 +332,6 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/undostack.o \
 	$(OBJDIR)/vattachmentpoint.o \
 	$(OBJDIR)/vautomation.o \
-	$(OBJDIR)/vdevice1394.o \
 	$(OBJDIR)/vdevicebase.o \
 	$(OBJDIR)/vdevicedvb.o \
 	$(OBJDIR)/vdeviceprefs.o \
@@ -378,6 +370,19 @@ OBJS := $(OVERLAYS) \
 	$(OBJDIR)/zwindow.o \
 	$(OBJDIR)/zwindowgui.o \
 
+ifneq ($(WANT_FIREWARE),no)
+OBJ += \
+	$(OBJDIR)/audio1394.o \
+	$(OBJDIR)/avc1394control.o \
+	$(OBJDIR)/avc1394transport.o \
+	$(OBJDIR)/vdevice1394.o \
+	$(OBJDIR)/device1394input.o \
+	$(OBJDIR)/device1394output.o \
+	$(OBJDIR)/iec61883input.o \
+	$(OBJDIR)/iec61883output.o \
+
+endif
+
 ifneq ($(WANT_LIBZMPEG),no)
 OBJS += \
 	$(OBJDIR)/audiompeg.o \
@@ -426,6 +431,7 @@ LIBRARIES += \
 
 endif
 
+
 LIBS := $(LIBRARIES)
 
 ifeq ($(WANT_CIN_3RDPARTY),no)
diff --git a/cinelerra-5.1/cinelerra/fileac3.C b/cinelerra-5.1/cinelerra/fileac3.C
index c6a94161..be62f2b7 100644
--- a/cinelerra-5.1/cinelerra/fileac3.C
+++ b/cinelerra-5.1/cinelerra/fileac3.C
@@ -18,7 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */
-
+#if HAVE_LIBZMPEG
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -421,3 +421,4 @@ int AC3ConfigAudioBitrate::handle_event()
 }
 
 #endif
+#endif //libzmpeg
\ No newline at end of file
-- 
2.31.1

From 3b6a576bc6a02d064b2746659808777938909fe2 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sat, 15 May 2021 21:14:35 +0300
Subject: [PATCH 06/22] more ifdefs for file.C (ac3 demand libzmpeg)

---
 cinelerra-5.1/cinelerra/file.C | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/cinelerra-5.1/cinelerra/file.C b/cinelerra-5.1/cinelerra/file.C
index 9828d6ec..b8a5ed3d 100644
--- a/cinelerra-5.1/cinelerra/file.C
+++ b/cinelerra-5.1/cinelerra/file.C
@@ -173,10 +173,12 @@ int File::get_options(FormatTools *format,
 	format_completion->lock("File::get_options");
 	switch( asset->format ) {
 #ifdef HAVE_CIN_3RDPARTY
+#ifdef HAVE_LIBZMPEG
 	case FILE_AC3: FileAC3::get_parameters(parent_window, asset, format_window,
 			audio_options, video_options, edl);
 		break;
 #endif
+#endif
 #ifdef HAVE_DV
 	case FILE_RAWDV:
 		FileDV::get_parameters(parent_window, asset, format_window,
@@ -542,9 +544,11 @@ int File::open_file(Preferences *preferences,
 		break; }
 // format already determined
 #ifdef HAVE_CIN_3RDPARTY
+#ifdef HAVE_LIBZMPEG
 	case FILE_AC3:
 		file = new FileAC3(this->asset, this);
 		break;
+#endif
 #endif
 	case FILE_SCENE:
 		file = new FileScene(this->asset, this);
-- 
2.31.1

From e9afc7199f2701f293428203f05b526fe8ad4814 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 12:19:49 +0300
Subject: [PATCH 07/22] configure.ac update for libaom 3.1.0

---
 cinelerra-5.1/configure.ac | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index ceddac2a..f9362edf 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -409,7 +409,7 @@ PKG_3RD([suil],[auto],
   [ usr/local/include ])
 
 PKG_3RD([libaom],[auto],
-  [libaom-v3.0.0],
+  [libaom-v3.1.0],
   [ usr/local/lib*/libaom*.a ],
   [ usr/local/include ])
 
-- 
2.31.1

From b2e5bfdf7ebdccca73e81cc1ef34524b5408edb6 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 13:00:24 +0300
Subject: [PATCH 10/22] libaom 3.1.0 and libwebp 1.1.0 patches for thirdparty

---
 .../thirdparty/src/libaom-v3.1.0.patch1       | 21 +++++++++++++++++
 .../thirdparty/src/libwebp-1.1.0.patch1       | 23 +++++++++++++++++++
 .../thirdparty/src/libwebp-1.1.0.patch2       | 18 +++++++++++++++
 3 files changed, 62 insertions(+)
 create mode 100644 cinelerra-5.1/thirdparty/src/libaom-v3.1.0.patch1
 create mode 100644 cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch1
 create mode 100644 cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch2

diff --git a/cinelerra-5.1/thirdparty/src/libaom-v3.1.0.patch1 b/cinelerra-5.1/thirdparty/src/libaom-v3.1.0.patch1
new file mode 100644
index 00000000..befe1c14
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/libaom-v3.1.0.patch1
@@ -0,0 +1,21 @@
+--- libaom-v3.0.0/aom_ports/arm_cpudetect.c	2020-07-10 02:32:42.000000000 +0300
++++ libaom-v3.0.0_1/aom_ports/arm_cpudetect.c	2021-05-08 05:18:23.404156362 +0300
+@@ -87,7 +87,7 @@
+   return flags & mask;
+ }
+ 
+-#elif defined(__ANDROID__) /* end _MSC_VER */
++#elif (defined(__ANDROID__) && !defined(__TERMUX__))/* end _MSC_VER */
+ #include <cpu-features.h>
+ 
+ int aom_arm_cpu_caps(void) {
+@@ -106,8 +106,7 @@
+   return flags & mask;
+ }
+ 
+-#elif defined(__linux__) /* end __ANDROID__ */
+-
++#elif defined(__LINUX__) || defined(__TERMUX__)/* end __ANDROID__ */
+ #include <stdio.h>
+ 
+ int aom_arm_cpu_caps(void) {
diff --git a/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch1 b/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch1
new file mode 100644
index 00000000..9cab9ed5
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch1
@@ -0,0 +1,23 @@
+--- libwebp-1.1.0/CMakeLists.txt	2019-12-21 16:37:43.000000000 +0300
++++ libwebp-1.1.0/CMakeLists.txt	2021-05-08 09:02:20.884388273 +0300
+@@ -75,20 +75,6 @@
+ 
+ # ##############################################################################
+ # Android only.
+-if(ANDROID)
+-  include_directories(${ANDROID_NDK}/sources/android/cpufeatures)
+-  add_library(cpufeatures STATIC
+-              ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
+-  list(APPEND INSTALLED_LIBRARIES cpufeatures)
+-  target_link_libraries(cpufeatures dl)
+-  set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures)
+-  set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS}
+-      ${ANDROID_NDK}/sources/android/cpufeatures)
+-  add_definitions(-DHAVE_CPU_FEATURES_H=1)
+-  set(HAVE_CPU_FEATURES_H 1)
+-else()
+-  set(HAVE_CPU_FEATURES_H 0)
+-endif()
+ 
+ function(configure_pkg_config FILE)
+   configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.in"
diff --git a/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch2 b/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch2
new file mode 100644
index 00000000..47bb0f18
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/libwebp-1.1.0.patch2
@@ -0,0 +1,18 @@
+--- libwebp-1.1.0/cmake/cpu.cmake	2019-12-21 16:37:43.000000000 +0300
++++ _libwebp-1.1.0/cmake/cpu.cmake	2021-05-08 10:55:09.056074195 +0300
+@@ -46,14 +46,7 @@
+ set(WEBP_SIMD_FILES_TO_INCLUDE)
+ set(WEBP_SIMD_FLAGS_TO_INCLUDE)
+ 
+-if(${ANDROID})
+-  if(${ANDROID_ABI} STREQUAL "armeabi-v7a")
+-    # This is because Android studio uses the configuration "-march=armv7-a
+-    # -mfloat-abi=softfp -mfpu=vfpv3-d16" that does not trigger neon
+-    # optimizations but should (as this configuration does not exist anymore).
+-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon ")
+-  endif()
+-endif()
++
+ 
+ list(LENGTH WEBP_SIMD_FLAGS WEBP_SIMD_FLAGS_LENGTH)
+ math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1")
-- 
2.31.1

From bf4d26eaa6bc1be9a6cc4a4cbda10b22318b8e8e Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 12:44:22 +0300
Subject: [PATCH 09/22] configure.ac change for non-x86 cflags

---
 cinelerra-5.1/configure.ac | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index 8e910529..f3fe0297 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -476,6 +476,10 @@ if test "x$I86$X86" != "x00" ; then
   REQUIRE_PROG(YASM, [yasm])
 fi
 
+if test "x$I86$X86" == "x00"; then
+   CFG_CFLAGS+=" -DNO_CTX -DNO_GDB -DNO_BTRACE"
+fi
+
 ## end arch dep tests
 
 REQUIRE_PROG(OBJCOPY, [objcopy])
-- 
2.31.1

From 9980d156ce85a7b312f509c5be46c778c291a701 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 13:18:59 +0300
Subject: [PATCH 13/22] configure.ac ifdef for mjpegtools on non-x86

---
 cinelerra-5.1/configure.ac | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index f3fe0297..cab8d509 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -317,6 +317,13 @@ PKG_3RD([libvorbis],[auto],
     lib/.libs/libvorbisfile.a ],
   [ include . ])
 
+## arch dep tests
+ARCH=[`uname -m`]
+I86=[`expr "x$ARCH" : 'xi[346]86.*'`]
+X86=[`expr "x$ARCH" : 'x..._64*'`]
+
+if test "x$I86$X86" != "x00" ; then
+
 PKG_3RD([mjpegtools],[yes],
   [mjpegtools-2.1.0],
   [ utils/mmxsse/.libs/libmmxsse.a \
@@ -328,6 +335,20 @@ PKG_3RD([mjpegtools],[yes],
     mpeg2enc/.libs/libmpeg2encpp.a ],
   [ .  lavtools utils ])
 
+else
+
+PKG_3RD([mjpegtools],[yes],
+  [mjpegtools-2.1.0],
+  [ utils/.libs/libmjpegutils.a \
+    lavtools/.libs/liblavfile.a \
+    lavtools/.libs/liblavjpeg.a \
+    mplex/.libs/libmplex2.a \
+    yuvfilters/.libs/libyuvfilters.a \
+    mpeg2enc/.libs/libmpeg2encpp.a ],
+  [ .  lavtools utils ])
+
+fi
+
 PKG_3RD([openexr],[auto],
   [openexr-2.4.1],
   [ usr/local/lib/libHalf.a \
-- 
2.31.1

From 4b9ef303d65b5c8da480738efffe6aed792f8185 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 12:21:26 +0300
Subject: [PATCH 08/22] configure.ac update for ffmpeg-4.4

---
 cinelerra-5.1/configure.ac | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index f9362edf..8e910529 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -189,7 +189,7 @@ PKG_3RD([esound],[no],
   [ . ])
 
 PKG_3RD([ffmpeg],[yes],
-  [ffmpeg-4.3],
+  [ffmpeg-4.4],
   [ libavutil/libavutil.a \
     libavcodec/libavcodec.a \
     libpostproc/libpostproc.a \
-- 
2.31.1

From a812c03413dacacaaa08cbcb8a9f9f24fec44413 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 13:36:16 +0300
Subject: [PATCH 14/22] ifdef commercials db only for x86

---
 cinelerra-5.1/cinelerra/commercials.h | 2 ++
 cinelerra-5.1/cinelerra/dbwindow.h    | 2 ++
 cinelerra-5.1/cinelerra/mediadb.h     | 2 ++
 cinelerra-5.1/cinelerra/mwindow.C     | 2 ++
 cinelerra-5.1/db/tdb.h                | 2 ++
 5 files changed, 10 insertions(+)

diff --git a/cinelerra-5.1/cinelerra/commercials.h b/cinelerra-5.1/cinelerra/commercials.h
index b7b815c4..123ce480 100644
--- a/cinelerra-5.1/cinelerra/commercials.h
+++ b/cinelerra-5.1/cinelerra/commercials.h
@@ -1,3 +1,4 @@
+#ifdef (__I386__) || (__x86-64__)
 #ifndef _COMMERCIALS_H_
 #define _COMMERCIALS_H_
 
@@ -202,3 +203,4 @@ public:
 
 
 #endif
+#endif /* x86 */
\ No newline at end of file
diff --git a/cinelerra-5.1/cinelerra/dbwindow.h b/cinelerra-5.1/cinelerra/dbwindow.h
index 24a40df8..e2507945 100644
--- a/cinelerra-5.1/cinelerra/dbwindow.h
+++ b/cinelerra-5.1/cinelerra/dbwindow.h
@@ -1,3 +1,4 @@
+#ifdef (__I386__) || (__x86-64__)
 #ifndef _DBWINDOW_H_
 #define _DBWINDOW_H_
 
@@ -296,3 +297,4 @@ public:
 
 
 #endif
+#endif /* x86 */
\ No newline at end of file
diff --git a/cinelerra-5.1/cinelerra/mediadb.h b/cinelerra-5.1/cinelerra/mediadb.h
index 9bb970ee..04d1d2aa 100644
--- a/cinelerra-5.1/cinelerra/mediadb.h
+++ b/cinelerra-5.1/cinelerra/mediadb.h
@@ -1,3 +1,4 @@
+#ifdef (__I386__) || (__x86-64__)
 #ifndef _MEDIA_DB_H_
 #define _MEDIA_DB_H_
 
@@ -239,3 +240,4 @@ public:
 };
 
 #endif
+#endif /* x86 */
\ No newline at end of file
diff --git a/cinelerra-5.1/cinelerra/mwindow.C b/cinelerra-5.1/cinelerra/mwindow.C
index e5d4bc69..c4371646 100644
--- a/cinelerra-5.1/cinelerra/mwindow.C
+++ b/cinelerra-5.1/cinelerra/mwindow.C
@@ -283,8 +283,10 @@ MWindow::~MWindow()
 	delete convert_render;  convert_render = 0;
 	delete render;          render = 0;
 	delete mixers_align;    mixers_align = 0;
+#ifdef HAVE_COMMERCIALS
 	commit_commercial();
 	if( commercials && !commercials->remove_user() ) commercials = 0;
+#endif
 	close_mixers();
 	if( speed_edl ) { speed_edl->remove_user();  speed_edl = 0; }
 // Save defaults for open plugins
diff --git a/cinelerra-5.1/db/tdb.h b/cinelerra-5.1/db/tdb.h
index 8ee88002..4e9d25a5 100644
--- a/cinelerra-5.1/db/tdb.h
+++ b/cinelerra-5.1/db/tdb.h
@@ -1,3 +1,4 @@
+#ifdef (__I386__) || (__x86-64__)
 #ifndef __DB_H__
 #define __DB_H__
 #include <cstring>
@@ -1514,3 +1515,4 @@ public:
 };
 
 #endif
+#endif /* x86 */
\ No newline at end of file
-- 
2.31.1

From 6ae426c3352821e49bfe7c4565d110e6390e5dd9 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 14:08:01 +0300
Subject: [PATCH 15/22] fixed x86 ifdefs

---
 cinelerra-5.1/cinelerra/commercials.h | 2 +-
 cinelerra-5.1/cinelerra/dbwindow.h    | 2 +-
 cinelerra-5.1/cinelerra/mediadb.h     | 2 +-
 cinelerra-5.1/db/tdb.h                | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/commercials.h b/cinelerra-5.1/cinelerra/commercials.h
index 123ce480..7869c3c3 100644
--- a/cinelerra-5.1/cinelerra/commercials.h
+++ b/cinelerra-5.1/cinelerra/commercials.h
@@ -1,4 +1,4 @@
-#ifdef (__I386__) || (__x86-64__)
+#ifdef __I386__ || __x86-64__
 #ifndef _COMMERCIALS_H_
 #define _COMMERCIALS_H_
 
diff --git a/cinelerra-5.1/cinelerra/dbwindow.h b/cinelerra-5.1/cinelerra/dbwindow.h
index e2507945..c8a12f66 100644
--- a/cinelerra-5.1/cinelerra/dbwindow.h
+++ b/cinelerra-5.1/cinelerra/dbwindow.h
@@ -1,4 +1,4 @@
-#ifdef (__I386__) || (__x86-64__)
+#ifdef __I386__ || __x86-64__
 #ifndef _DBWINDOW_H_
 #define _DBWINDOW_H_
 
diff --git a/cinelerra-5.1/cinelerra/mediadb.h b/cinelerra-5.1/cinelerra/mediadb.h
index 04d1d2aa..71e96bfb 100644
--- a/cinelerra-5.1/cinelerra/mediadb.h
+++ b/cinelerra-5.1/cinelerra/mediadb.h
@@ -1,4 +1,4 @@
-#ifdef (__I386__) || (__x86-64__)
+#ifdef __I386__ || __x86-64__
 #ifndef _MEDIA_DB_H_
 #define _MEDIA_DB_H_
 
diff --git a/cinelerra-5.1/db/tdb.h b/cinelerra-5.1/db/tdb.h
index 4e9d25a5..e4a08565 100644
--- a/cinelerra-5.1/db/tdb.h
+++ b/cinelerra-5.1/db/tdb.h
@@ -1,4 +1,4 @@
-#ifdef (__I386__) || (__x86-64__)
+#ifdef __I386__ || __x86-64__
 #ifndef __DB_H__
 #define __DB_H__
 #include <cstring>
-- 
2.31.1

From 2d32b503f581a7cad1d741d95ce66e6f7477c677 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 13:03:38 +0300
Subject: [PATCH 11/22] add ffmpeg-4.4 patches into thirdparty/src

---
 .../thirdparty/src/ffmpeg-4.4.patch0          | 12 +++
 .../thirdparty/src/ffmpeg-4.4.patch1          | 13 ++++
 .../thirdparty/src/ffmpeg-4.4.patch3          | 74 +++++++++++++++++++
 .../thirdparty/src/ffmpeg-4.4.patch5          | 30 ++++++++
 .../thirdparty/src/ffmpeg-4.4.patch6          | 12 +++
 .../thirdparty/src/ffmpeg-4.4.patch7          | 13 ++++
 .../thirdparty/src/ffmpeg-4.4.patch8          | 16 ++++
 .../thirdparty/src/ffmpeg-4.4.patch9          | 36 +++++++++
 .../thirdparty/src/ffmpeg-4.4.patchA          | 24 ++++++
 9 files changed, 230 insertions(+)
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch0
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch1
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch3
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch5
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch6
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch7
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch8
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch9
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patchA

diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch0 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch0
new file mode 100644
index 00000000..f9760935
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch0
@@ -0,0 +1,12 @@
+diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
+index 88fdbeaf1e..f39d2e7cc4 100644
+--- a/fftools/cmdutils.c
++++ b/fftools/cmdutils.c
+@@ -1184,6 +1184,7 @@ static void print_buildconf(int flags, int level)
+ 
+ void show_banner(int argc, char **argv, const OptionDef *options)
+ {
++    return;
+     int idx = locate_option(argc, argv, options, "version");
+     if (hide_banner || idx)
+         return;
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch1 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch1
new file mode 100644
index 00000000..88631302
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch1
@@ -0,0 +1,13 @@
+diff --git a/libavformat/bluray.c b/libavformat/bluray.c
+index 635c4f1b87..80a2e2c3d2 100644
+--- a/libavformat/bluray.c
++++ b/libavformat/bluray.c
+@@ -28,7 +28,7 @@
+ #include "libavutil/opt.h"
+ 
+ #define BLURAY_PROTO_PREFIX     "bluray:"
+-#define MIN_PLAYLIST_LENGTH     180     /* 3 min */
++#define MIN_PLAYLIST_LENGTH     0
+ 
+ typedef struct {
+     const AVClass *class;
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch3 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch3
new file mode 100644
index 00000000..28d3876f
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch3
@@ -0,0 +1,74 @@
+diff --git a/libavformat/avformat.h b/libavformat/avformat.h
+index e91e7f1d33..0f9b26a6d3 100644
+--- a/libavformat/avformat.h
++++ b/libavformat/avformat.h
+@@ -480,6 +480,9 @@ typedef struct AVProbeData {
+                                         The user or muxer can override this through
+                                         AVFormatContext.avoid_negative_ts
+                                         */
++#define AVFMT_SEEK_NOSTREAMS  0x80000 /**< Stream index ignored by seek,
++                                           or some streams fail to seek
++                                           */
+ 
+ #define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */
+ 
+@@ -650,7 +653,8 @@ typedef struct AVInputFormat {
+     /**
+      * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
+      * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+-     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
++     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS,
++     * AVFMT_SEEK_NOSTREAMS
+      */
+     int flags;
+ 
+diff --git a/libavformat/dv.c b/libavformat/dv.c
+index e99422d4b5..58ce1bbb5f 100644
+--- a/libavformat/dv.c
++++ b/libavformat/dv.c
+@@ -642,6 +642,7 @@ static int dv_probe(const AVProbeData *p)
+ AVInputFormat ff_dv_demuxer = {
+     .name           = "dv",
+     .long_name      = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
++    .flags          = AVFMT_SEEK_NOSTREAMS,
+     .priv_data_size = sizeof(RawDVContext),
+     .read_probe     = dv_probe,
+     .read_header    = dv_read_header,
+diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
+index cff7f0cb54..8b6d22aff2 100644
+--- a/libavformat/matroskadec.c
++++ b/libavformat/matroskadec.c
+@@ -4251,6 +4251,7 @@ static const AVClass webm_dash_class = {
+ AVInputFormat ff_matroska_demuxer = {
+     .name           = "matroska,webm",
+     .long_name      = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
++    .flags          = AVFMT_SEEK_NOSTREAMS,
+     .extensions     = "mkv,mk3d,mka,mks,webm",
+     .priv_data_size = sizeof(MatroskaDemuxContext),
+     .read_probe     = matroska_probe,
+@@ -4264,6 +4265,7 @@ AVInputFormat ff_matroska_demuxer = {
+ AVInputFormat ff_webm_dash_manifest_demuxer = {
+     .name           = "webm_dash_manifest",
+     .long_name      = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
++    .flags          = AVFMT_SEEK_NOSTREAMS,
+     .priv_data_size = sizeof(MatroskaDemuxContext),
+     .read_header    = webm_dash_manifest_read_header,
+     .read_packet    = webm_dash_manifest_read_packet,
+diff --git a/libavformat/utils.c b/libavformat/utils.c
+index 807d9f10cb..55a444e7b6 100644
+--- a/libavformat/utils.c
++++ b/libavformat/utils.c
+@@ -2486,6 +2486,13 @@ static int seek_frame_internal(AVFormatContext *s, int stream_index,
+         return seek_frame_byte(s, stream_index, timestamp, flags);
+     }
+ 
++    if (stream_index != -1 && (s->iformat->flags & AVFMT_SEEK_NOSTREAMS)) {
++            timestamp = av_rescale_q(timestamp,
++                    s->streams[stream_index]->time_base,
++                    AV_TIME_BASE_Q);
++            stream_index = -1;
++    }
++
+     if (stream_index < 0) {
+         stream_index = av_find_default_stream_index(s);
+         if (stream_index < 0)
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch5 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch5
new file mode 100644
index 00000000..32e7fe11
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch5
@@ -0,0 +1,30 @@
+diff --git a/libavfilter/formats.c b/libavfilter/formats.c
+index de4315369d..f430908343 100644
+--- a/libavfilter/formats.c
++++ b/libavfilter/formats.c
+@@ -107,11 +107,13 @@ AVFilterFormats *ff_merge_formats(AVFilterFormats *a, AVFilterFormats *b,
+        possibly causing a lossy conversion elsewhere in the graph.
+        To avoid that, pretend that there are no common formats to force the
+        insertion of a conversion filter. */
+-    if (type == AVMEDIA_TYPE_VIDEO)
+-        for (i = 0; i < a->nb_formats; i++)
++    if (type == AVMEDIA_TYPE_VIDEO) {
++        for (i = 0; i < a->nb_formats; i++) {
++            const AVPixFmtDescriptor *adesc = av_pix_fmt_desc_get(a->formats[i]);
++            if( !adesc ) continue;
+             for (j = 0; j < b->nb_formats; j++) {
+-                const AVPixFmtDescriptor *adesc = av_pix_fmt_desc_get(a->formats[i]);
+                 const AVPixFmtDescriptor *bdesc = av_pix_fmt_desc_get(b->formats[j]);
++                if( !bdesc ) continue;
+                 alpha2 |= adesc->flags & bdesc->flags & AV_PIX_FMT_FLAG_ALPHA;
+                 chroma2|= adesc->nb_components > 1 && bdesc->nb_components > 1;
+                 if (a->formats[i] == b->formats[j]) {
+@@ -119,6 +121,8 @@ AVFilterFormats *ff_merge_formats(AVFilterFormats *a, AVFilterFormats *b,
+                     chroma1|= adesc->nb_components > 1;
+                 }
+             }
++        }
++    }
+ 
+     // If chroma or alpha can be lost through merging then do not merge
+     if (alpha2 > alpha1 || chroma2 > chroma1)
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch6 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch6
new file mode 100644
index 00000000..e59a17cc
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch6
@@ -0,0 +1,12 @@
+diff --git a/libavcodec/vdpau_mpeg12.c b/libavcodec/vdpau_mpeg12.c
+index 72220ffb4e..5687c416c9 100644
+--- a/libavcodec/vdpau_mpeg12.c
++++ b/libavcodec/vdpau_mpeg12.c
+@@ -114,6 +114,7 @@ const AVHWAccel ff_mpeg1_vdpau_hwaccel = {
+     .frame_priv_data_size = sizeof(struct vdpau_picture_context),
+     .init           = vdpau_mpeg1_init,
+     .uninit         = ff_vdpau_common_uninit,
++    .frame_params   = ff_vdpau_common_frame_params,
+     .priv_data_size = sizeof(VDPAUContext),
+     .caps_internal  = HWACCEL_CAP_ASYNC_SAFE,
+ };
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch7 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch7
new file mode 100644
index 00000000..05d3b1d0
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch7
@@ -0,0 +1,13 @@
+diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
+index 3b29a189e9..681a4187c5 100644
+--- a/libavcodec/h263dec.c
++++ b/libavcodec/h263dec.c
+@@ -684,7 +684,7 @@ frame_end:
+     if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4)
+         ff_mpeg4_frame_end(avctx, buf, buf_size);
+ 
+-    if (!s->divx_packed && avctx->hwaccel)
++    if (s->divx_packed && avctx->hwaccel)
+         ff_thread_finish_setup(avctx);
+ 
+     av_assert1(s->current_picture.f->pict_type == s->current_picture_ptr->f->pict_type);
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch8 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch8
new file mode 100644
index 00000000..51bc09e3
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch8
@@ -0,0 +1,16 @@
+diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
+index 9bd0a555d4..111a9f3a46 100644
+--- a/libavformat/mpegenc.c
++++ b/libavformat/mpegenc.c
+@@ -976,9 +976,9 @@ static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr)
+         PacketDesc *pkt_desc;
+ 
+         while ((pkt_desc = stream->predecode_packet) &&
++               pkt_desc != stream->premux_packet &&
+                scr > pkt_desc->dts) { // FIXME: > vs >=
+-            if (stream->buffer_index < pkt_desc->size ||
+-                stream->predecode_packet == stream->premux_packet) {
++            if (stream->buffer_index < pkt_desc->size) {
+                 av_log(ctx, AV_LOG_ERROR,
+                        "buffer underflow st=%d bufi=%d size=%d\n",
+                        i, stream->buffer_index, pkt_desc->size);
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch9 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch9
new file mode 100644
index 00000000..0cf24e74
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch9
@@ -0,0 +1,36 @@
+diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c
+index 718a449b6e..84685fe1d9 100644
+--- a/libavutil/hwcontext_cuda.c
++++ b/libavutil/hwcontext_cuda.c
+@@ -269,9 +269,11 @@ static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
+         CudaFunctions *cu = hwctx->internal->cuda_dl;
+ 
+         if (hwctx->internal->is_allocated && hwctx->cuda_ctx) {
++#ifdef CUDA_PRIMARY_CTX
+             if (hwctx->internal->flags & AV_CUDA_USE_PRIMARY_CONTEXT)
+                 CHECK_CU(cu->cuDevicePrimaryCtxRelease(hwctx->internal->cuda_device));
+             else
++#endif
+                 CHECK_CU(cu->cuCtxDestroy(hwctx->cuda_ctx));
+ 
+             hwctx->cuda_ctx = NULL;
+@@ -321,7 +323,7 @@ static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags) {
+     cu = hwctx->internal->cuda_dl;
+ 
+     hwctx->internal->flags = flags;
+-
++#ifdef CUDA_PRIMARY_CTX
+     if (flags & AV_CUDA_USE_PRIMARY_CONTEXT) {
+         ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device,
+                        &dev_flags, &dev_active));
+@@ -342,7 +344,9 @@ static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags) {
+                                                     hwctx->internal->cuda_device));
+         if (ret < 0)
+             return ret;
+-    } else {
++    } else
++#endif
++    {
+         ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags,
+                                        hwctx->internal->cuda_device));
+         if (ret < 0)
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patchA b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patchA
new file mode 100644
index 00000000..6d181e3c
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patchA
@@ -0,0 +1,24 @@
+diff --git a/libavutil/hwcontext_vdpau.c b/libavutil/hwcontext_vdpau.c
+index dbef5495af..fba06d8ccf 100644
+--- a/libavutil/hwcontext_vdpau.c
++++ b/libavutil/hwcontext_vdpau.c
+@@ -68,6 +68,11 @@ static const VDPAUPixFmtMap pix_fmts_420[] = {
+     { 0,                     AV_PIX_FMT_NONE,   },
+ };
+ 
++static const VDPAUPixFmtMap pix_fmts_420j[] = {
++    { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUVJ420P },
++    { 0,                     AV_PIX_FMT_NONE,   },
++};
++
+ static const VDPAUPixFmtMap pix_fmts_422[] = {
+     { VDP_YCBCR_FORMAT_NV12, AV_PIX_FMT_NV16    },
+     { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV422P },
+@@ -92,6 +97,7 @@ static const struct {
+     const VDPAUPixFmtMap *map;
+ } vdpau_pix_fmts[] = {
+     { VDP_CHROMA_TYPE_420, AV_PIX_FMT_YUV420P, pix_fmts_420 },
++    { VDP_CHROMA_TYPE_420, AV_PIX_FMT_YUVJ420P, pix_fmts_420j },
+     { VDP_CHROMA_TYPE_422, AV_PIX_FMT_YUV422P, pix_fmts_422 },
+     { VDP_CHROMA_TYPE_444, AV_PIX_FMT_YUV444P, pix_fmts_444 },
+ #ifdef VDP_YCBCR_FORMAT_P016
-- 
2.31.1

From 1855b532a3a3bbff5ec9aab3ff1f10de55a12e2e Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Fri, 21 May 2021 09:46:32 +0300
Subject: [PATCH 18/22] attempt to fix _probe function memory leak

---
 cinelerra-5.1/cinelerra/ffmpeg.C | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index 55fa668e..96a5c385 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -1245,6 +1245,7 @@ int FFVideoStream::probe(int64_t pos)
 		ret = -1;
 
 	ret = ret > 0 ? 1 : ret < 0 ? -1 : 0;
+	av_frame_free(&frame);
 	return ret;
 }
 
-- 
2.31.1

From 8c6c700209b3cf42202b2b38b6713a765494c89f Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 13:07:44 +0300
Subject: [PATCH 12/22] libaom and libopus cfg fixes for termux/arm

---
 cinelerra-5.1/thirdparty/Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/cinelerra-5.1/thirdparty/Makefile b/cinelerra-5.1/thirdparty/Makefile
index 27f13c65..2dd2867e 100644
--- a/cinelerra-5.1/thirdparty/Makefile
+++ b/cinelerra-5.1/thirdparty/Makefile
@@ -199,7 +199,7 @@ lame.cfg_vars?= CFLAGS+=" -O"
 lame.cfg_params?=--enable-shared=no
 lame.mak_params?= ; cd $(call bld_path,lame,include); ln -sf . lame
 libaom.cfg_vars?= mkdir aom.build && cd aom.build && $(call cmake_config,..)
-libaom.cfg_params?= -DENABLE_SHARED=no -DCMAKE_INSTALL_LIBDIR=lib \
+libaom.cfg_params?= -DENABLE_DOCS=no -DENABLE_SHARED=no -DCMAKE_INSTALL_LIBDIR=lib \
  -DCMAKE_INSTALL_PREFIX=$(call bld_path,libaom)/usr/local
 libaom.mak_params?= ; $(MAKE) -C libaom*/aom.build install
 dav1d.cfg_vars?=echo "echo dav1d custom make" >> configure; chmod +x ./configure;
@@ -242,6 +242,7 @@ opencv.cfg_vars?=$(call cmake_config,.)
 opencv.cfg_params?= -DBUILD_SHARED_LIBS:BOOL=OFF
 openexr.cfg_vars?=true; \#
 openexr.mak_vars?=true; \#
+opus.cfg_vars?= --disable-extra-programs
 speech_tools.mak_params?=-j1
 tiff.cfg_vars+=LIBS+=" -lpthread"
 tiff.cfg_params+= --enable-shared=no --disable-zstd $(call if_pkg,libwebp,\
-- 
2.31.1

From 52b961525c705b2bf10fd2b22d02250234f9095a Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sun, 23 May 2021 10:48:19 +0300
Subject: [PATCH 21/22] libbthread source and Makefile patch (not integrated
 into buildsystem ye

---
 cinelerra-5.1/thirdparty/src/libbthread.patch1 |   8 ++++++++
 cinelerra-5.1/thirdparty/src/libbthread.tar.gz | Bin 0 -> 14695 bytes
 2 files changed, 8 insertions(+)
 create mode 100644 cinelerra-5.1/thirdparty/src/libbthread.patch1
 create mode 100644 cinelerra-5.1/thirdparty/src/libbthread.tar.gz

diff --git a/cinelerra-5.1/thirdparty/src/libbthread.patch1 b/cinelerra-5.1/thirdparty/src/libbthread.patch1
new file mode 100644
index 00000000..cf373a71
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/libbthread.patch1
@@ -0,0 +1,8 @@
+--- /dev/null	2021-05-22 06:52:04.572000000 +0300
++++ libbthread-master/Makefile	2021-05-23 10:18:06.719050843 +0300
+@@ -0,0 +1,4 @@
++all:
++	cat `ls *.c` > just-pt.c 
++	g++ -c -o jpt.o just-pt.c -I. 
++	ar crs jpt.a jpt.o 
+\ No newline at end of file
diff --git a/cinelerra-5.1/thirdparty/src/libbthread.tar.gz b/cinelerra-5.1/thirdparty/src/libbthread.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..e642e36624a4fc15936cef34bef64bf69080eaba
GIT binary patch
literal 14695
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
z%0A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

literal 0
HcmV?d00001

-- 
2.31.1

From 4a29c3b8a02cb00404a0974331693393bbf0484e Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sun, 23 May 2021 10:03:09 +0300
Subject: [PATCH 20/22] change type of j variable in virtualanode.C to int64_t

---
 cinelerra-5.1/cinelerra/virtualanode.C | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cinelerra-5.1/cinelerra/virtualanode.C b/cinelerra-5.1/cinelerra/virtualanode.C
index a1ad5235..55a79d35 100644
--- a/cinelerra-5.1/cinelerra/virtualanode.C
+++ b/cinelerra-5.1/cinelerra/virtualanode.C
@@ -475,11 +475,11 @@ int VirtualANode::render_pan(double *input, // start of input fragment
 			}
 		}
 		else if( EQUIV(intercept, 1) ) {
-			for(int j = 0; j < slope_len; j++, i++)
+			for(int64_t j = 0; j < slope_len; j++, i++)
 				output[i] += input[i];
 		}
 		else if( !EQUIV(intercept, 0) ) {
-			for(int j = 0; j < slope_len; j++, i++)
+			for(int64_t j = 0; j < slope_len; j++, i++)
 				output[i] += input[i] * intercept;
 		}
 		else
-- 
2.31.1

From 11a8a15f0cdbda794ff545883070ba278828528a Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 14:21:05 +0300
Subject: [PATCH 17/22] configure.ac - add -liconv for termux

---
 cinelerra-5.1/configure.ac | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index 534f444d..be18c243 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -1042,6 +1042,9 @@ if test "x$WANT_BOOBY" != "xno"; then
   CFG_CFLAGS+=" -DBOOBY"
 fi
 
+# termux
+EXTRA_LIBS+=' -liconv'
+
 # intel lock elision bugs
 if test "x$WANT_NOELISION" != "xno"; then
   CFG_RPATH=`ls -1fd 2> /dev/null \
-- 
2.31.1

From e4ec33bbf002c3f4c56ef2d797102d2a8b237574 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Wed, 19 May 2021 14:08:57 +0300
Subject: [PATCH 16/22] add termux-specific include path

---
 cinelerra-5.1/configure.ac | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/cinelerra-5.1/configure.ac b/cinelerra-5.1/configure.ac
index cab8d509..534f444d 100644
--- a/cinelerra-5.1/configure.ac
+++ b/cinelerra-5.1/configure.ac
@@ -26,7 +26,9 @@ CFG_CFLAGS+=" -DPNG_SKIP_SETJMP_CHECK=1"
 CFG_CFLAGS+=" -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
 CFG_CFLAGS+=" -I/usr/include -I/usr/local/include"
 CFG_CFLAGS+=" -I/usr/include/freetype2 -I/usr/local/include/freetype2"
+CFG_CFLAGS+=" -I/data/data/com.termux/files/usr/include/freetype2"
 CFG_CFLAGS+=" -I/usr/include/uuid -I/usr/local/include/uuid"
+CFG_CFLAGS+=" -I/data/data/com.termux/files/usr/include/uuid -I/usr/local/include/uuid"
 CFG_CFLAGS+=" -I/usr/include/mjpegtools -I/usr/local/include/mjpegtools"
 
 AC_DEFUN([CHECK_WITH], [
-- 
2.31.1

From 5e0a8d8e82540511f068aae58138a5955fe4f51c Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sun, 23 May 2021 09:58:39 +0300
Subject: [PATCH 19/22] additional XOpenIM call in bcwindowbase.C

---
 cinelerra-5.1/guicast/bcwindowbase.C | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C
index 93279934..5a29eaa2 100644
--- a/cinelerra-5.1/guicast/bcwindowbase.C
+++ b/cinelerra-5.1/guicast/bcwindowbase.C
@@ -2527,10 +2527,15 @@ void BC_WindowBase::init_im()
 	XIMStyles *xim_styles;
 	XIMStyle xim_style;
 
+
 	if(!(input_method = XOpenIM(display, NULL, NULL, NULL)))
 	{
 		printf("BC_WindowBase::init_im: Could not open input method.\n");
+		XSetLocaleModifiers("@im=local");
+		if(!(input_method = XOpenIM(display, NULL, NULL, NULL))) {
+		printf("BC_WindowBase::init_im: Could not open input method local.\n");
 		exit(1);
+		}
 	}
 	if(XGetIMValues(input_method, XNQueryInputStyle, &xim_styles, NULL) ||
 			xim_styles == NULL)
@@ -2540,6 +2545,7 @@ void BC_WindowBase::init_im()
 		exit(1);
 	}
 
+
 	xim_style = 0;
 	for(int z = 0;  z < xim_styles->count_styles;  z++)
 	{
-- 
2.31.1

From 8a9d1e42fefe88d8046ca41c87b05c7eb244f53c Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sun, 23 May 2021 10:51:34 +0300
Subject: [PATCH 22/22] Additonal mjpegtools patches for termux (not ifdefed)

---
 .../thirdparty/src/mjpegtools-2.1.0.patch4    | 17 ++++++++++
 .../thirdparty/src/mjpegtools-2.1.0.patch5    | 11 ++++++
 .../thirdparty/src/mjpegtools-2.1.0.patch6    | 10 ++++++
 .../thirdparty/src/mjpegtools-2.1.0.patch7    | 34 +++++++++++++++++++
 4 files changed, 72 insertions(+)
 create mode 100644 cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch4
 create mode 100644 cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch5
 create mode 100644 cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch6
 create mode 100644 cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch7

diff --git a/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch4 b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch4
new file mode 100644
index 00000000..5312f19b
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch4
@@ -0,0 +1,17 @@
+--- mjpegtools-2.1.0/y4mdenoise/newdenoise.cc	2009-04-26 21:40:20.000000000 +0400
++++ mjpegtools-2.1.0/y4mdenoise/newdenoise.cc.new	2021-05-23 09:27:12.071050661 +0300
+@@ -1853,12 +1853,14 @@
+ 		mjpeg_error_exit1 ("pthread_attr_init() failed: %s",
+ 			strerror (nErr));
+ 
++#if !defined(__TERMUX__)
+ 	// Inherit scheduling parameters from the main thread.
+ 	nErr = pthread_attr_setinheritsched (&sThreadAttributes,
+ 		PTHREAD_INHERIT_SCHED);
+ 	if (nErr != 0)
+ 		mjpeg_error_exit1 ("pthread_attr_setinheritsched() failed: %s",
+ 			strerror (nErr));
++#endif /* termux */
+ 	
+ 	// Create the thread.
+ 	nErr = pthread_create (&m_oThreadInfo,
diff --git a/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch5 b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch5
new file mode 100644
index 00000000..14ee272e
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch5
@@ -0,0 +1,11 @@
+--- mjpegtools-2.1.0/mpeg2enc/Makefile.am.orig	2010-09-11 23:46:04.000000000 +0400
++++ mjpegtools-2.1.0/mpeg2enc/Makefile.am	2021-05-23 09:39:14.731050704 +0300
+@@ -3,7 +3,7 @@
+ # and mpeg2enc command line wrapper.
+ #
+ 
+-bin_PROGRAMS = mpeg2enc 
++#bin_PROGRAMS = mpeg2enc 
+ 
+ mpeg2encpp_MMXSSE_INLINE = \
+ 	fdct_x86.c \
diff --git a/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch6 b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch6
new file mode 100644
index 00000000..42fed77d
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch6
@@ -0,0 +1,10 @@
+--- mjpegtools-2.1.0/mpeg2enc/seqencoder.cc	2010-10-17 19:19:48.000000000 +0400
++++ mjpegtools-2.1.0/mpeg2enc/seqencoder.cc	2021-05-23 09:24:18.791050651 +0300
+@@ -56,6 +56,7 @@
+ #include "ratectl.hh"
+ #include "tables.h"
+ #include "channel.hh"
++#include "bthread.h"
+ 
+ 
+ // --------------------------------------------------------------------------------
diff --git a/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch7 b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch7
new file mode 100644
index 00000000..71eede47
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/mjpegtools-2.1.0.patch7
@@ -0,0 +1,34 @@
+--- /dev/null	2021-05-22 06:52:04.572000000 +0300
++++ mjpegtools-2.1.0/mpeg2enc/bthread.h	2021-05-23 10:38:11.073808915 +0300
+@@ -0,0 +1,31 @@
++/* BThread main header
++   Copyright (C) 2002 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++# define PTHREAD_CANCEL_ENABLE    	 0x00000010
++# define PTHREAD_CANCEL_DISABLE   	 0x00000000
++
++# define PTHREAD_CANCEL_ASYNCHRONOUS 0x00000020
++# define PTHREAD_CANCEL_DEFERRED     0x00000000
++
++#define PTHREAD_CANCELED ((void *) -1)
++
++int pthread_setcancelstate (int , int *);
++int pthread_setcanceltype (int , int *);
++void pthread_testcancel (void);
++int pthread_cancel (pthread_t t);
-- 
2.31.1

From cc8fa3042ef9d8207c53fee10895984136e5b5a5 Mon Sep 17 00:00:00 2001
From: Andrew Randrianasulu <[email protected]>
Date: Sun, 23 May 2021 11:29:57 +0300
Subject: [PATCH 23/23] More ffmpeg-4.4 patches renaming B0 to B0_ due to
 termux-specific includes defining macro in termbits.h

---
 .../thirdparty/src/ffmpeg-4.4.patch_1         |  35 +++++
 .../thirdparty/src/ffmpeg-4.4.patch_2         | 139 ++++++++++++++++++
 .../thirdparty/src/ffmpeg-4.4.patch_3         | 104 +++++++++++++
 3 files changed, 278 insertions(+)
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_1
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_2
 create mode 100644 cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_3

diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_1 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_1
new file mode 100644
index 00000000..36643f41
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_1
@@ -0,0 +1,35 @@
+--- ffmpeg-4.4/libavcodec/aaccoder.c.orig	2021-05-08 11:52:41.824074401 +0300
++++ ffmpeg-4.4/libavcodec/aaccoder.c	2021-05-08 11:55:06.868074410 +0300
+@@ -800,7 +800,7 @@
+ 
+                 for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) {
+                     float dist1 = 0.0f, dist2 = 0.0f;
+-                    int B0 = 0, B1 = 0;
++                    int B0_ = 0, B1 = 0;
+                     int minidx;
+                     int mididx, sididx;
+                     int midcb, sidcb;
+@@ -862,12 +862,12 @@
+                                                     sididx,
+                                                     sidcb,
+                                                     mslambda / (minthr * bmax), INFINITY, &b4, NULL, 0);
+-                        B0 += b1+b2;
++                        B0_ += b1+b2;
+                         B1 += b3+b4;
+                         dist1 -= b1+b2;
+                         dist2 -= b3+b4;
+                     }
+-                    cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0;
++                    cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0_;
+                     if (cpe->ms_mask[w*16+g]) {
+                         if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) {
+                             sce0->sf_idx[w*16+g] = mididx;
+@@ -879,7 +879,7 @@
+                             cpe->ms_mask[w*16+g] = 0;
+                         }
+                         break;
+-                    } else if (B1 > B0) {
++                    } else if (B1 > B0_) {
+                         /* More boost won't fix this */
+                         break;
+                     }
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_2 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_2
new file mode 100644
index 00000000..45adca97
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_2
@@ -0,0 +1,139 @@
+--- ffmpeg-4.4/libavcodec/hevc_mvs.c.orig	2021-05-08 12:22:19.580985429 +0300
++++ ffmpeg-4.4/libavcodec/hevc_mvs.c	2021-05-08 12:29:05.340985454 +0300
+@@ -307,8 +307,8 @@
+     const int xB1    = x0 + nPbW - 1;
+     const int yB1    = y0 - 1;
+ 
+-    const int xB0    = x0 + nPbW;
+-    const int yB0    = y0 - 1;
++    const int xB0_    = x0 + nPbW;
++    const int yB0_    = y0 - 1;
+ 
+     const int xA0    = x0 - 1;
+     const int yA0    = y0 + nPbH;
+@@ -365,14 +365,14 @@
+     }
+ 
+     // above right spatial merge candidate
+-    is_available_b0 = AVAILABLE(cand_up_right, B0) &&
+-                      xB0 < s->ps.sps->width &&
+-                      PRED_BLOCK_AVAILABLE(B0) &&
+-                      !is_diff_mer(s, xB0, yB0, x0, y0);
++    is_available_b0 = AVAILABLE(cand_up_right, B0_) &&
++                      xB0_ < s->ps.sps->width &&
++                      PRED_BLOCK_AVAILABLE(B0_) &&
++                      !is_diff_mer(s, xB0_, yB0_, x0, y0);
+ 
+     if (is_available_b0 &&
+-        !(is_available_b1 && COMPARE_MV_REFIDX(B0, B1))) {
+-        mergecandlist[nb_merge_cand] = TAB_MVF_PU(B0);
++        !(is_available_b1 && COMPARE_MV_REFIDX(B0_, B1))) {
++        mergecandlist[nb_merge_cand] = TAB_MVF_PU(B0_);
+         if (merge_idx == nb_merge_cand)
+             return;
+         nb_merge_cand++;
+@@ -588,7 +588,7 @@
+     MvField *tab_mvf = s->ref->tab_mvf;
+     int isScaledFlag_L0 = 0;
+     int availableFlagLXA0 = 1;
+-    int availableFlagLXB0 = 1;
++    int availableFlagLXB0_ = 1;
+     int numMVPCandLX = 0;
+     int min_pu_width = s->ps.sps->min_pu_width;
+ 
+@@ -596,7 +596,7 @@
+     int is_available_a0;
+     int xA1, yA1;
+     int is_available_a1;
+-    int xB0, yB0;
++    int xB0_, yB0_;
+     int is_available_b0;
+     int xB1, yB1;
+     int is_available_b1;
+@@ -677,12 +677,12 @@
+ b_candidates:
+     // B candidates
+     // above right spatial merge candidate
+-    xB0    = x0 + nPbW;
+-    yB0    = y0 - 1;
++    xB0_    = x0 + nPbW;
++    yB0_    = y0 - 1;
+ 
+-    is_available_b0 =  AVAILABLE(cand_up_right, B0) &&
+-                       xB0 < s->ps.sps->width &&
+-                       PRED_BLOCK_AVAILABLE(B0);
++    is_available_b0 =  AVAILABLE(cand_up_right, B0_) &&
++                       xB0_ < s->ps.sps->width &&
++                       PRED_BLOCK_AVAILABLE(B0_);
+ 
+     // above spatial merge candidate
+     xB1    = x0 + nPbW - 1;
+@@ -696,10 +696,10 @@
+ 
+     // above right spatial merge candidate
+     if (is_available_b0) {
+-        if (MP_MX(B0, pred_flag_index_l0, mxB)) {
++        if (MP_MX(B0_, pred_flag_index_l0, mxB)) {
+             goto scalef;
+         }
+-        if (MP_MX(B0, pred_flag_index_l1, mxB)) {
++        if (MP_MX(B0_, pred_flag_index_l1, mxB)) {
+             goto scalef;
+         }
+     }
+@@ -723,40 +723,40 @@
+             goto scalef;
+         }
+     }
+-    availableFlagLXB0 = 0;
++    availableFlagLXB0_ = 0;
+ 
+ scalef:
+     if (!isScaledFlag_L0) {
+-        if (availableFlagLXB0) {
++        if (availableFlagLXB0_) {
+             availableFlagLXA0 = 1;
+             mxA = mxB;
+         }
+-        availableFlagLXB0 = 0;
++        availableFlagLXB0_ = 0;
+ 
+         // XB0 and L1
+         if (is_available_b0) {
+-            availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l0, mxB);
+-            if (!availableFlagLXB0)
+-                availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l1, mxB);
++            availableFlagLXB0_ = MP_MX_LT(B0_, pred_flag_index_l0, mxB);
++            if (!availableFlagLXB0_)
++                availableFlagLXB0_ = MP_MX_LT(B0_, pred_flag_index_l1, mxB);
+         }
+ 
+-        if (is_available_b1 && !availableFlagLXB0) {
+-            availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l0, mxB);
+-            if (!availableFlagLXB0)
+-                availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l1, mxB);
++        if (is_available_b1 && !availableFlagLXB0_) {
++            availableFlagLXB0_ = MP_MX_LT(B1, pred_flag_index_l0, mxB);
++            if (!availableFlagLXB0_)
++                availableFlagLXB0_ = MP_MX_LT(B1, pred_flag_index_l1, mxB);
+         }
+ 
+-        if (is_available_b2 && !availableFlagLXB0) {
+-            availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l0, mxB);
+-            if (!availableFlagLXB0)
+-                availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l1, mxB);
++        if (is_available_b2 && !availableFlagLXB0_) {
++            availableFlagLXB0_ = MP_MX_LT(B2, pred_flag_index_l0, mxB);
++            if (!availableFlagLXB0_)
++                availableFlagLXB0_ = MP_MX_LT(B2, pred_flag_index_l1, mxB);
+         }
+     }
+ 
+     if (availableFlagLXA0)
+         mvpcand_list[numMVPCandLX++] = mxA;
+ 
+-    if (availableFlagLXB0 && (!availableFlagLXA0 || mxA.x != mxB.x || mxA.y != mxB.y))
++    if (availableFlagLXB0_ && (!availableFlagLXA0 || mxA.x != mxB.x || mxA.y != mxB.y))
+         mvpcand_list[numMVPCandLX++] = mxB;
+ 
+     //temporal motion vector prediction candidate
diff --git a/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_3 b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_3
new file mode 100644
index 00000000..4442402c
--- /dev/null
+++ b/cinelerra-5.1/thirdparty/src/ffmpeg-4.4.patch_3
@@ -0,0 +1,104 @@
+--- ffmpeg-4.4/libavcodec/opus_pvq.c.orig	2021-05-08 12:19:49.996985421 +0300
++++ ffmpeg-4.4/libavcodec/opus_pvq.c	2021-05-08 12:21:12.440985425 +0300
+@@ -495,12 +495,12 @@
+     uint32_t N0 = N;
+     int N_B = N / blocks;
+     int N_B0 = N_B;
+-    int B0 = blocks;
++    int B0_ = blocks;
+     int time_divide = 0;
+     int recombine = 0;
+     int inv = 0;
+     float mid = 0, side = 0;
+-    int longblocks = (B0 == 1);
++    int longblocks = (B0_ == 1);
+     uint32_t cm = 0;
+ 
+     if (N == 1) {
+@@ -532,7 +532,7 @@
+         /* Band recombining to increase frequency resolution */
+ 
+         if (lowband &&
+-            (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0 > 1)) {
++            (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0_ > 1)) {
+             for (i = 0; i < N; i++)
+                 lowband_scratch[i] = lowband[i];
+             lowband = lowband_scratch;
+@@ -556,13 +556,13 @@
+             time_divide++;
+             tf_change++;
+         }
+-        B0 = blocks;
++        B0_ = blocks;
+         N_B0 = N_B;
+ 
+         /* Reorganize the samples in time order instead of frequency order */
+-        if (B0 > 1 && (quant || lowband))
++        if (B0_ > 1 && (quant || lowband))
+             celt_deinterleave_hadamard(pvq->hadamard_tmp, quant ? X : lowband,
+-                                       N_B >> recombine, B0 << recombine,
++                                       N_B >> recombine, B0_ << recombine,
+                                        longblocks);
+     }
+ 
+@@ -604,7 +604,7 @@
+             if (quant) {
+                 if (stereo && N > 2)
+                     ff_opus_rc_enc_uint_step(rc, itheta, qn / 2);
+-                else if (stereo || B0 > 1)
++                else if (stereo || B0_ > 1)
+                     ff_opus_rc_enc_uint(rc, itheta, qn + 1);
+                 else
+                     ff_opus_rc_enc_uint_tri(rc, itheta, qn);
+@@ -619,7 +619,7 @@
+             } else {
+                 if (stereo && N > 2)
+                     itheta = ff_opus_rc_dec_uint_step(rc, qn / 2);
+-                else if (stereo || B0 > 1)
++                else if (stereo || B0_ > 1)
+                     itheta = ff_opus_rc_dec_uint(rc, qn+1);
+                 else
+                     itheta = ff_opus_rc_dec_uint_tri(rc, qn);
+@@ -725,7 +725,7 @@
+ 
+             /* Give more bits to low-energy MDCTs than they would
+              * otherwise deserve */
+-            if (B0 > 1 && !stereo && (itheta & 0x3fff)) {
++            if (B0_ > 1 && !stereo && (itheta & 0x3fff)) {
+                 if (itheta > 8192)
+                     /* Rough approximation for pre-echo masking */
+                     delta -= delta >> (4 - duration);
+@@ -764,14 +764,14 @@
+                 cmt = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
+                                       next_lowband2, duration, NULL, next_level,
+                                       gain * side, NULL, fill >> blocks);
+-                cm |= cmt << ((B0 >> 1) & (stereo - 1));
++                cm |= cmt << ((B0_ >> 1) & (stereo - 1));
+             } else {
+                 /* For a stereo split, the high bits of fill are always zero,
+                  * so no folding will be done to the side. */
+                 cm = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks,
+                                      next_lowband2, duration, NULL, next_level,
+                                      gain * side, NULL, fill >> blocks);
+-                cm <<= ((B0 >> 1) & (stereo - 1));
++                cm <<= ((B0_ >> 1) & (stereo - 1));
+                 rebalance = sbits - (rebalance - f->remaining2);
+                 if (rebalance > 3 << 3 && itheta != 16384)
+                     mbits += rebalance - (3 << 3);
+@@ -842,13 +842,13 @@
+         int k;
+ 
+         /* Undo the sample reorganization going from time order to frequency order */
+-        if (B0 > 1)
++        if (B0_ > 1)
+             celt_interleave_hadamard(pvq->hadamard_tmp, X, N_B >> recombine,
+-                                     B0 << recombine, longblocks);
++                                     B0_ << recombine, longblocks);
+ 
+         /* Undo time-freq changes that we did earlier */
+         N_B = N_B0;
+-        blocks = B0;
++        blocks = B0_;
+         for (k = 0; k < time_divide; k++) {
+             blocks >>= 1;
+             N_B <<= 1;
-- 
2.31.1

-- 
Cin mailing list
[email protected]
https://lists.cinelerra-gg.org/mailman/listinfo/cin

Reply via email to