Skip to content
Draft
2 changes: 2 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,6 @@ fi

[ "${PORTS_COREMARK}" = "y" ] && ./phoenix-rtos-ports/coremark/build.sh

[ "${PORTS_X264}" = "y" ] && ./phoenix-rtos-ports/x264/build.sh

exit 0
60 changes: 60 additions & 0 deletions x264/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env bash

set -e

PREFIX_X264="${PREFIX_PROJECT}/phoenix-rtos-ports/x264"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good to base new ports on this redesign: #78

I hope it will be merged soon @Darchiv

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for that! I didn`t notice this PR. I will wait for that PR to be merged and then redo this script.

PREFIX_X264_BUILD="${PREFIX_BUILD}/x264"
PREFIX_X264_CONFIG="${PREFIX_X264}/patches"
PREFIX_X264_MARKERS="${PREFIX_X264_BUILD}/markers"

PKG_NAME="x264-master.tar.bz2"
PKG_URL="https://code.videolan.org/videolan/x264/-/archive/master"
Comment thread
niewim19 marked this conversation as resolved.
Outdated

b_log "Building x264"

#
# Download archived source code
#
if [ ! -f "$PREFIX_X264/${PKG_NAME}" ]; then
if ! wget "${PKG_URL}/${PKG_NAME}" -O "${PREFIX_X264}/${PKG_NAME}" --no-check-certificate; then
echo "Mirror unavailable"
exit 1
fi
fi

#
# Unpack source code
#
if [ ! -d "${PREFIX_X264_BUILD}" ]; then
tar -xjf "${PREFIX_X264}/${PKG_NAME}" -C "${PREFIX_BUILD}"
(cd "${PREFIX_BUILD}" && mv x264-master x264)
mkdir -p "${PREFIX_X264_MARKERS}"
fi

#
# Apply patches
#
for patchfile in "$PREFIX_X264_CONFIG"/*.patch; do
if [ ! -f "$PREFIX_X264_MARKERS/$(basename "$patchfile").applied" ]; then
echo "applying patch: $patchfile"
patch -d "$PREFIX_X264_BUILD" -p1 < "$patchfile"
touch "$PREFIX_X264_MARKERS/$(basename "$patchfile").applied"
fi
done

#
# Prepare CFLAGS and LDFLAGS for x264 configure & Makefile
#
export LDFLAGS_EXTRA="${CFLAGS} ${LDFLAGS} -Wl,-z,stack-size=65536"
export CFLAGS_EXTRA="${CFLAGS}"
export LDFLAGS=""
export CFLAGS=""

#
# Build and install x264 binary
#
(cd "$PREFIX_X264_BUILD" && ./configure --extra-cflags="$CFLAGS_EXTRA" --extra-ldflags="$LDFLAGS_EXTRA" --cross-prefix="$CROSS" --sysroot="$PREFIX_BUILD/sysroot/" --host=arm-linux --disable-asm --disable-avs --disable-lavf --enable-pic --enable-static --disable-opencl)
Comment thread
niewim19 marked this conversation as resolved.
Outdated
(cd "$PREFIX_X264_BUILD" && make)

cp -a "${PREFIX_X264_BUILD}/x264" "$PREFIX_PROG_STRIPPED"
b_install "$PREFIX_PORTS_INSTALL/x264" /bin/
15 changes: 15 additions & 0 deletions x264/patches/base.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
--- x264_org/common/base.c 2024-08-30 14:07:49.183495538 +0200
+++ x264/common/base.c 2024-08-30 14:14:26.584633533 +0200
@@ -37,6 +37,12 @@

#define X264_ISDIGIT(x) isdigit((unsigned char)(x))

+/* PHOENIX-RTOS patch: memalign is not supported by Phoenix-RTOS, use malloc as placeholder */
+void *memalign(size_t alignment, size_t size)
+{
+ return malloc(size);
Comment thread
niewim19 marked this conversation as resolved.
Outdated
+}
+
/****************************************************************************
* x264_reduce_fraction:
****************************************************************************/
36 changes: 36 additions & 0 deletions x264/patches/cpu.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
--- x264_org/common/cpu.c 2024-08-30 14:07:49.184495508 +0200
+++ x264/common/cpu.c 2024-08-30 14:12:25.631746608 +0200
@@ -516,17 +516,22 @@
// Android NDK does not expose sched_getaffinity
return sysconf( _SC_NPROCESSORS_CONF );
#else
- cpu_set_t p_aff;
- memset( &p_aff, 0, sizeof(p_aff) );
- if( sched_getaffinity( 0, sizeof(p_aff), &p_aff ) )
- return 1;
-#if HAVE_CPU_COUNT
- return CPU_COUNT(&p_aff);
-#else
- int np = 0;
- for( size_t bit = 0; bit < 8 * sizeof(p_aff); bit++ )
- np += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;
- return np;
+ /* Phoenix-RTOS patch - no support for 'cpu_set_t' which is part of GNU extension */
+ /* Return 1 as available processor count */
+ return 1;
+#if 0
Comment thread
niewim19 marked this conversation as resolved.
Outdated
+ cpu_set_t p_aff;
+ memset( &p_aff, 0, sizeof(p_aff) );
+ if( sched_getaffinity( 0, sizeof(p_aff), &p_aff ) )
+ return 1;
+ #if HAVE_CPU_COUNT
+ return CPU_COUNT(&p_aff);
+ #else
+ int np = 0;
+ for( size_t bit = 0; bit < 8 * sizeof(p_aff); bit++ )
+ np += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;
+ return np;
+#endif
#endif
#endif

47 changes: 47 additions & 0 deletions x264/patches/input.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

--- x264_org/input/input.c 2024-09-05 11:57:22.943594154 +0200
+++ x264/input/input.c 2024-09-05 11:57:41.344630765 +0200
@@ -227,6 +227,15 @@
}
#else
size_t padded_size = size + MMAP_PADDING;
+ /**
+ * PHOENIX-RTOS PATCH
+ *
+ * Phoenix implementation of mmap() fails if `size` is not aligned to page size
+ * It is important to remove this patch when this issue is resolved.
+ *
+ * https://github.com/phoenix-rtos/phoenix-rtos-project/issues/1155
+ */
+ padded_size = (1 + padded_size / SIZE_PAGE) * SIZE_PAGE;
Comment thread
nalajcie marked this conversation as resolved.
Outdated
if( (base = mmap( NULL, padded_size, PROT_READ, MAP_PRIVATE, h->fd, offset )) != MAP_FAILED )
{
/* Ask the OS to readahead pages. This improves performance whereas
@@ -241,9 +250,19 @@
/* Remap the file mapping of any padding that crosses a page boundary past the end of
* the file into a copy of the last valid page to prevent reads from invalid memory. */
size_t aligned_size = (padded_size - 1) & ~h->align_mask;
- if( offset + aligned_size >= h->file_size )
- mmap( base + aligned_size, padded_size - aligned_size, PROT_READ, MAP_PRIVATE|MAP_FIXED, h->fd, (offset + size - 1) & ~h->align_mask );
-
+ /**
Comment thread
niewim19 marked this conversation as resolved.
Outdated
+ * PHOENIX-RTOS PATCH
+ *
+ * Phoenix implementation of mmap() fails if `size` is not aligned to page size
+ * It is important to remove this patch when this issue is resolved.
+ *
+ * https://github.com/phoenix-rtos/phoenix-rtos-project/issues/1155
+ */
+ if( offset + aligned_size >= h->file_size ) {
+ size_t paddedMinusAligned_aligned = (padded_size - aligned_size);
+ paddedMinusAligned_aligned = (1 + paddedMinusAligned_aligned / SIZE_PAGE) * SIZE_PAGE;
+ mmap( base + aligned_size, paddedMinusAligned_aligned, PROT_READ, MAP_PRIVATE|MAP_FIXED, h->fd, (offset + size - 1) & ~h->align_mask );
+ }
return base + align;
}
#endif
@@ -272,3 +291,4 @@
CloseHandle( h->map_handle );
#endif
}
+