From 3b4b29dcd9c5da2ba40a34ce3d9eb3a7f659ba77 Mon Sep 17 00:00:00 2001
From: Fabrice Bellard <fabrice@bellard.org>
Date: Tue, 22 Oct 2002 09:23:14 +0000
Subject: [PATCH] put/get portable for IEEE double - renamed
 put_native_string/get_native_string

Originally committed as revision 1062 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libav/avio.h    |  8 ++++----
 libav/aviobuf.c | 26 +++++++++++++++++---------
 libav/ffm.c     | 20 ++++++++++----------
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/libav/avio.h b/libav/avio.h
index be4189b8a39..bf00f2edd13 100644
--- a/libav/avio.h
+++ b/libav/avio.h
@@ -87,8 +87,8 @@ void put_le16(ByteIOContext *s, unsigned int val);
 void put_be16(ByteIOContext *s, unsigned int val);
 void put_tag(ByteIOContext *s, char *tag);
 
-void put_native_double(ByteIOContext *s, double val);
-void put_native_string(ByteIOContext *s, const char *buf);
+void put_be64_double(ByteIOContext *s, double val);
+void put_strz(ByteIOContext *s, const char *buf);
 
 offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
 void url_fskip(ByteIOContext *s, offset_t offset);
@@ -108,8 +108,8 @@ unsigned int get_le32(ByteIOContext *s);
 UINT64 get_le64(ByteIOContext *s);
 unsigned int get_le16(ByteIOContext *s);
 
-double get_native_double(ByteIOContext *s);
-char *get_native_string(ByteIOContext *s, char *buf, int maxlen);
+double get_be64_double(ByteIOContext *s);
+char *get_strz(ByteIOContext *s, char *buf, int maxlen);
 unsigned int get_be16(ByteIOContext *s);
 unsigned int get_be32(ByteIOContext *s);
 UINT64 get_be64(ByteIOContext *s);
diff --git a/libav/aviobuf.c b/libav/aviobuf.c
index 3f0108361b7..27f6b5d38a5 100644
--- a/libav/aviobuf.c
+++ b/libav/aviobuf.c
@@ -176,12 +176,18 @@ void put_be32(ByteIOContext *s, unsigned int val)
     put_byte(s, val);
 }
 
-void put_native_double(ByteIOContext *s, double val)
+/* IEEE format is assumed */
+void put_be64_double(ByteIOContext *s, double val)
 {
-    put_buffer(s, (const unsigned char *) &val, sizeof(val));
+    union {
+        double d;
+        UINT64 ull;
+    } u;
+    u.d = val;
+    put_be64(s, u.ull);
 }
 
-void put_native_string(ByteIOContext *s, const char *str)
+void put_strz(ByteIOContext *s, const char *str)
 {
     if (str)
         put_buffer(s, (const unsigned char *) str, strlen(str) + 1);
@@ -339,16 +345,18 @@ unsigned int get_be32(ByteIOContext *s)
     return val;
 }
 
-double get_native_double(ByteIOContext *s)
+double get_be64_double(ByteIOContext *s)
 {
-    double val;
+    union {
+        double d;
+        UINT64 ull;
+    } u;
 
-    get_buffer(s, (unsigned char *) &val, sizeof(val));
-
-    return val;
+    u.ull = get_be64(s);
+    return u.d;
 }
 
-char *get_native_string(ByteIOContext *s, char *buf, int maxlen)
+char *get_strz(ByteIOContext *s, char *buf, int maxlen)
 {
     int i = 0;
     char c;
diff --git a/libav/ffm.c b/libav/ffm.c
index 45bfbcb7ce5..dba08865437 100644
--- a/libav/ffm.c
+++ b/libav/ffm.c
@@ -166,14 +166,14 @@ static int ffm_write_header(AVFormatContext *s)
             put_be16(pb, (int) (codec->qcompress * 10000.0));
             put_be16(pb, (int) (codec->qblur * 10000.0));
             put_be32(pb, codec->bit_rate_tolerance);
-            put_native_string(pb, codec->rc_eq);
+            put_strz(pb, codec->rc_eq);
             put_be32(pb, codec->rc_max_rate);
             put_be32(pb, codec->rc_min_rate);
             put_be32(pb, codec->rc_buffer_size);
-            put_native_double(pb, codec->i_quant_factor);
-            put_native_double(pb, codec->b_quant_factor);
-            put_native_double(pb, codec->i_quant_offset);
-            put_native_double(pb, codec->b_quant_offset);
+            put_be64_double(pb, codec->i_quant_factor);
+            put_be64_double(pb, codec->b_quant_factor);
+            put_be64_double(pb, codec->i_quant_offset);
+            put_be64_double(pb, codec->b_quant_offset);
             put_be32(pb, codec->dct_algo);
             break;
         case CODEC_TYPE_AUDIO:
@@ -420,14 +420,14 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
             codec->qcompress = get_be16(pb) / 10000.0;
             codec->qblur = get_be16(pb) / 10000.0;
             codec->bit_rate_tolerance = get_be32(pb);
-            codec->rc_eq = strdup(get_native_string(pb, rc_eq_buf, sizeof(rc_eq_buf)));
+            codec->rc_eq = strdup(get_strz(pb, rc_eq_buf, sizeof(rc_eq_buf)));
             codec->rc_max_rate = get_be32(pb);
             codec->rc_min_rate = get_be32(pb);
             codec->rc_buffer_size = get_be32(pb);
-            codec->i_quant_factor = get_native_double(pb);
-            codec->b_quant_factor = get_native_double(pb);
-            codec->i_quant_offset = get_native_double(pb);
-            codec->b_quant_offset = get_native_double(pb);
+            codec->i_quant_factor = get_be64_double(pb);
+            codec->b_quant_factor = get_be64_double(pb);
+            codec->i_quant_offset = get_be64_double(pb);
+            codec->b_quant_offset = get_be64_double(pb);
             codec->dct_algo = get_be32(pb);
             break;
         case CODEC_TYPE_AUDIO:
-- 
GitLab