diff common.h @ 129:ccae53673692 libavutil

Fix ASF format parser's broken UTF-16 string handling 1. Add a PUT_UTF8 macro to common.h; code borrowed from libavcodec/flacenc.c. 2. Make use of the macro in flacenc.c Patch by Zuxy Meng % zuxy P meng A gmail P com % Original thread: Date: Nov 5, 2006 9:56 AM Subject: [Ffmpeg-devel] PUT_UTF8 & asf format enhancement
author gpoirier
date Mon, 06 Nov 2006 10:32:48 +0000
parents c1916b2259c5
children dc1ff57e1b08
line wrap: on
line diff
--- a/common.h	Wed Nov 01 22:39:58 2006 +0000
+++ b/common.h	Mon Nov 06 10:32:48 2006 +0000
@@ -322,7 +322,21 @@
 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
 #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24))
 
-
+/*!
+ * \def PUT_UTF8(val, GET_BYTE, ERROR)
+ * converts a 32-bit unicode character to its utf-8 encoded form (up to 6 bytes long).
+ * \param val is an input only argument and should be of type uint32_t. It holds
+ * a ucs4 encoded unicode character that is to be converted to utf-8. If
+ * val is given as a function it's executed only once.
+ * \param tmp is a temporary variable and should be of type uint8_t. It
+ * represents an intermediate value during conversion that is to be
+ * outputted by PUT_BYTE.
+ * \param PUT_BYTE writes the converted utf-8 bytes to any proper destination.
+ * It could be a function or a statement, and uses tmp as the input byte.
+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
+ * executed up to 6 times, depending on the length of the converted
+ * unicode character.
+ */
 #define GET_UTF8(val, GET_BYTE, ERROR)\
     val= GET_BYTE;\
     {\
@@ -338,6 +352,26 @@
         }\
     }
 
+#define PUT_UTF8(val, tmp, PUT_BYTE)\
+    {\
+        int bytes, shift;\
+        uint32_t in = val;\
+        if (in < 0x80) {\
+            tmp = in;\
+            PUT_BYTE\
+        } else {\
+            bytes = (av_log2(in) + 4) / 5;\
+            shift = (bytes - 1) * 6;\
+            tmp = (256 - (256 >> bytes)) | (in >> shift);\
+            PUT_BYTE\
+            while (shift >= 6) {\
+                shift -= 6;\
+                tmp = 0x80 | ((in >> shift) & 0x3f);\
+                PUT_BYTE\
+            }\
+        }\
+    }
+
 #if defined(ARCH_X86) || defined(ARCH_POWERPC)
 #if defined(ARCH_X86_64)
 static inline uint64_t read_time(void)