[x264-devel] [PATCH 08/29] common: Move memory functions to a separate file

Vittorio Giovara vittorio.giovara at gmail.com
Thu Feb 2 10:05:20 CET 2017


While these function do not depend on bit depth size, most of their
callers do, so they need to moved to a self contained module.
---
 Makefile        |   2 +-
 common/common.c | 104 ----------------------------------------------
 common/common.h |   9 +---
 common/mem.c    | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 common/mem.h    |  49 ++++++++++++++++++++++
 5 files changed, 177 insertions(+), 113 deletions(-)
 create mode 100644 common/mem.c
 create mode 100644 common/mem.h

diff --git a/Makefile b/Makefile
index 0718c2c..82df145 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ SRCS = common/mc.c common/predict.c common/pixel.c common/macroblock.c \
        common/common.c common/osdep.c common/rectangle.c \
        common/set.c common/quant.c common/deblock.c common/vlc.c \
        common/mvpred.c common/bitstream.c \
-       common/log.c \
+       common/log.c common/mem.c \
        encoder/analyse.c encoder/me.c encoder/ratecontrol.c \
        encoder/set.c encoder/macroblock.c encoder/cabac.c \
        encoder/cavlc.c encoder/encoder.c encoder/lookahead.c
diff --git a/common/common.c b/common/common.c
index 05a2923..f196cce 100644
--- a/common/common.c
+++ b/common/common.c
@@ -28,13 +28,6 @@
 
 #include <ctype.h>
 
-#if HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#if HAVE_THP
-#include <sys/mman.h>
-#endif
-
 const int x264_bit_depth = BIT_DEPTH;
 
 const int x264_chroma_format = X264_CHROMA_FORMAT;
@@ -1161,61 +1154,6 @@ void x264_picture_clean( x264_picture_t *pic )
     memset( pic, 0, sizeof( x264_picture_t ) );
 }
 
-/****************************************************************************
- * x264_malloc:
- ****************************************************************************/
-void *x264_malloc( int i_size )
-{
-    uint8_t *align_buf = NULL;
-#if HAVE_MALLOC_H
-#if HAVE_THP
-#define HUGE_PAGE_SIZE 2*1024*1024
-#define HUGE_PAGE_THRESHOLD HUGE_PAGE_SIZE*7/8 /* FIXME: Is this optimal? */
-    /* Attempt to allocate huge pages to reduce TLB misses. */
-    if( i_size >= HUGE_PAGE_THRESHOLD )
-    {
-        align_buf = memalign( HUGE_PAGE_SIZE, i_size );
-        if( align_buf )
-        {
-            /* Round up to the next huge page boundary if we are close enough. */
-            size_t madv_size = (i_size + HUGE_PAGE_SIZE - HUGE_PAGE_THRESHOLD) & ~(HUGE_PAGE_SIZE-1);
-            madvise( align_buf, madv_size, MADV_HUGEPAGE );
-        }
-    }
-    else
-#undef HUGE_PAGE_SIZE
-#undef HUGE_PAGE_THRESHOLD
-#endif
-        align_buf = memalign( NATIVE_ALIGN, i_size );
-#else
-    uint8_t *buf = malloc( i_size + (NATIVE_ALIGN-1) + sizeof(void **) );
-    if( buf )
-    {
-        align_buf = buf + (NATIVE_ALIGN-1) + sizeof(void **);
-        align_buf -= (intptr_t) align_buf & (NATIVE_ALIGN-1);
-        *( (void **) ( align_buf - sizeof(void **) ) ) = buf;
-    }
-#endif
-    if( !align_buf )
-        x264_log_internal( X264_LOG_ERROR, "malloc of size %d failed\n", i_size );
-    return align_buf;
-}
-
-/****************************************************************************
- * x264_free:
- ****************************************************************************/
-void x264_free( void *p )
-{
-    if( p )
-    {
-#if HAVE_MALLOC_H
-        free( p );
-#else
-        free( *( ( ( void **) p ) - 1 ) );
-#endif
-    }
-}
-
 /****************************************************************************
  * x264_reduce_fraction:
  ****************************************************************************/
@@ -1241,48 +1179,6 @@ void name( type *n, type *d )\
 REDUCE_FRACTION( x264_reduce_fraction  , uint32_t )
 REDUCE_FRACTION( x264_reduce_fraction64, uint64_t )
 
-/****************************************************************************
- * x264_slurp_file:
- ****************************************************************************/
-char *x264_slurp_file( const char *filename )
-{
-    int b_error = 0;
-    int64_t i_size;
-    char *buf;
-    FILE *fh = x264_fopen( filename, "rb" );
-    if( !fh )
-        return NULL;
-
-    b_error |= fseek( fh, 0, SEEK_END ) < 0;
-    b_error |= ( i_size = ftell( fh ) ) <= 0;
-    if( WORD_SIZE == 4 )
-        b_error |= i_size > INT32_MAX;
-    b_error |= fseek( fh, 0, SEEK_SET ) < 0;
-    if( b_error )
-        goto error;
-
-    buf = x264_malloc( i_size+2 );
-    if( !buf )
-        goto error;
-
-    b_error |= fread( buf, 1, i_size, fh ) != i_size;
-    fclose( fh );
-    if( b_error )
-    {
-        x264_free( buf );
-        return NULL;
-    }
-
-    if( buf[i_size-1] != '\n' )
-        buf[i_size++] = '\n';
-    buf[i_size] = '\0';
-
-    return buf;
-error:
-    fclose( fh );
-    return NULL;
-}
-
 /****************************************************************************
  * x264_param2string:
  ****************************************************************************/
diff --git a/common/common.h b/common/common.h
index 35a982c..81f0503 100644
--- a/common/common.h
+++ b/common/common.h
@@ -39,7 +39,6 @@
 #define XCHG(type,a,b) do { type t = a; a = b; b = t; } while( 0 )
 #define IS_DISPOSABLE(type) ( type == X264_TYPE_B )
 #define FIX8(f) ((int)(f*(1<<8)+.5))
-#define ALIGN(x,a) (((x)+((a)-1))&~((a)-1))
 #define ARRAY_ELEMS(a) ((sizeof(a))/(sizeof(a[0])))
 
 #define CHECKED_MALLOC( var, size )\
@@ -116,6 +115,7 @@ do {\
  ****************************************************************************/
 #include "osdep.h"
 #include "log.h"
+#include "mem.h"
 #include <stdarg.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -250,13 +250,6 @@ static const uint8_t x264_scan8[16*3 + 3] =
 /****************************************************************************
  * General functions
  ****************************************************************************/
-/* x264_malloc : will do or emulate a memalign
- * you have to use x264_free for buffers allocated with x264_malloc */
-void *x264_malloc( int );
-void  x264_free( void * );
-
-/* x264_slurp_file: malloc space for the whole file and read it */
-char *x264_slurp_file( const char *filename );
 
 /* x264_param2string: return a (malloced) string containing most of
  * the encoding options */
diff --git a/common/mem.c b/common/mem.c
new file mode 100644
index 0000000..82cc08c
--- /dev/null
+++ b/common/mem.c
@@ -0,0 +1,126 @@
+/*****************************************************************************
+ * mem.c: memory functions
+ *****************************************************************************
+ * Copyright (C) 2003-2017 x264 project
+ *
+ * Authors: Loren Merritt <lorenm at u.washington.edu>
+ *          Laurent Aimar <fenrir at via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at licensing at x264.com.
+ *****************************************************************************/
+
+#include "mem.h"
+#include "log.h"
+#include "x264.h"
+
+/****************************************************************************
+ * x264_malloc:
+ ****************************************************************************/
+void *x264_malloc( int i_size )
+{
+    uint8_t *align_buf = NULL;
+#if HAVE_MALLOC_H
+#if HAVE_THP
+#define HUGE_PAGE_SIZE 2*1024*1024
+#define HUGE_PAGE_THRESHOLD HUGE_PAGE_SIZE*7/8 /* FIXME: Is this optimal? */
+    /* Attempt to allocate huge pages to reduce TLB misses. */
+    if( i_size >= HUGE_PAGE_THRESHOLD )
+    {
+        align_buf = memalign( HUGE_PAGE_SIZE, i_size );
+        if( align_buf )
+        {
+            /* Round up to the next huge page boundary if we are close enough. */
+            size_t madv_size = (i_size + HUGE_PAGE_SIZE - HUGE_PAGE_THRESHOLD) & ~(HUGE_PAGE_SIZE-1);
+            madvise( align_buf, madv_size, MADV_HUGEPAGE );
+        }
+    }
+    else
+#undef HUGE_PAGE_SIZE
+#undef HUGE_PAGE_THRESHOLD
+#endif
+        align_buf = memalign( NATIVE_ALIGN, i_size );
+#else
+    uint8_t *buf = malloc( i_size + (NATIVE_ALIGN-1) + sizeof(void **) );
+    if( buf )
+    {
+        align_buf = buf + (NATIVE_ALIGN-1) + sizeof(void **);
+        align_buf -= (intptr_t) align_buf & (NATIVE_ALIGN-1);
+        *( (void **) ( align_buf - sizeof(void **) ) ) = buf;
+    }
+#endif
+    if( !align_buf )
+        x264_log_internal( X264_LOG_ERROR, "malloc of size %d failed\n", i_size );
+    return align_buf;
+}
+
+/****************************************************************************
+ * x264_free:
+ ****************************************************************************/
+void x264_free( void *p )
+{
+    if( p )
+    {
+#if HAVE_MALLOC_H
+        free( p );
+#else
+        free( *( ( ( void **) p ) - 1 ) );
+#endif
+    }
+}
+
+/****************************************************************************
+ * x264_slurp_file:
+ ****************************************************************************/
+char *x264_slurp_file( const char *filename )
+{
+    int b_error = 0;
+    int64_t i_size;
+    char *buf;
+    FILE *fh = x264_fopen( filename, "rb" );
+    if( !fh )
+        return NULL;
+
+    b_error |= fseek( fh, 0, SEEK_END ) < 0;
+    b_error |= ( i_size = ftell( fh ) ) <= 0;
+    if( WORD_SIZE == 4 )
+        b_error |= i_size > INT32_MAX;
+    b_error |= fseek( fh, 0, SEEK_SET ) < 0;
+    if( b_error )
+        goto error;
+
+    buf = x264_malloc( i_size+2 );
+    if( !buf )
+        goto error;
+
+    b_error |= fread( buf, 1, i_size, fh ) != i_size;
+    fclose( fh );
+    if( b_error )
+    {
+        x264_free( buf );
+        return NULL;
+    }
+
+    if( buf[i_size-1] != '\n' )
+        buf[i_size++] = '\n';
+    buf[i_size] = '\0';
+
+    return buf;
+error:
+    fclose( fh );
+    return NULL;
+}
diff --git a/common/mem.h b/common/mem.h
new file mode 100644
index 0000000..a89316e
--- /dev/null
+++ b/common/mem.h
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ * mem.h: memory functions
+ *****************************************************************************
+ * Copyright (C) 2003-2017 x264 project
+ *
+ * Authors: Loren Merritt <lorenm at u.washington.edu>
+ *          Laurent Aimar <fenrir at via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at licensing at x264.com.
+ *****************************************************************************/
+
+#ifndef COMMON_MEM_H
+#define COMMON_MEM_H
+
+#include "osdep.h"
+
+#if HAVE_MALLOC_H
+#include <malloc.h>
+#endif
+#if HAVE_THP
+#include <sys/mman.h>
+#endif
+
+#define ALIGN(x,a) (((x)+((a)-1))&~((a)-1))
+
+/* x264_malloc : will do or emulate a memalign
+ * you have to use x264_free for buffers allocated with x264_malloc */
+void *x264_malloc( int );
+void  x264_free( void * );
+
+/* x264_slurp_file: malloc space for the whole file and read it */
+char *x264_slurp_file( const char *filename );
+
+#endif
-- 
2.10.0



More information about the x264-devel mailing list