[FFmpeg-devel] [PATCH] avio: add avio_get_str as a replacement for get_strz

Anton Khirnov anton
Tue Mar 1 18:33:56 CET 2011


It's more flexible and compatible with avio_get_str16.
---
 libavformat/avio.h    |   15 ++++++++++++++-
 libavformat/aviobuf.c |   29 +++++++++++++++++++----------
 libavformat/cafdec.c  |    4 ++--
 libavformat/ffmdec.c  |    3 ++-
 libavformat/mov.c     |    2 +-
 5 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/libavformat/avio.h b/libavformat/avio.h
index cc46ad7..7e0dca0 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -526,6 +526,14 @@ unsigned int avio_rl32(AVIOContext *s);
 uint64_t     avio_rl64(AVIOContext *s);
 
 /**
+ * Read a UTF-8 string from pb. The reading will terminate when either
+ * a NULL character was encountered or maxlen bytes have been read.
+ *
+ * @return number of bytes read (is always <= maxlen).
+ */
+int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);
+
+/**
  * Read a UTF-16 string from pb and convert it to UTF-8.
  * The reading will terminate when either a null or invalid character was
  * encountered or maxlen bytes have been read.
@@ -534,7 +542,12 @@ uint64_t     avio_rl64(AVIOContext *s);
 int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen);
 int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);
 
-char *get_strz(AVIOContext *s, char *buf, int maxlen);
+#if FF_API_OLD_AVIO
+/**
+ * @deprecated use avio_get_str instead
+ */
+attribute_deprecated char *get_strz(AVIOContext *s, char *buf, int maxlen);
+#endif
 unsigned int avio_rb16(AVIOContext *s);
 unsigned int avio_rb24(AVIOContext *s);
 unsigned int avio_rb32(AVIOContext *s);
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 0c733a7..e9ab189 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -675,20 +675,13 @@ unsigned int avio_rb32(AVIOContext *s)
     return val;
 }
 
+#if FF_API_OLD_AVIO
 char *get_strz(AVIOContext *s, char *buf, int maxlen)
 {
-    int i = 0;
-    char c;
-
-    while ((c = avio_r8(s))) {
-        if (i < maxlen-1)
-            buf[i++] = c;
-    }
-
-    buf[i] = 0; /* Ensure null terminated, but may be truncated */
-
+    avio_get_str(s, INT_MAX, buf, maxlen);
     return buf;
 }
+#endif
 
 int ff_get_line(AVIOContext *s, char *buf, int maxlen)
 {
@@ -705,6 +698,22 @@ int ff_get_line(AVIOContext *s, char *buf, int maxlen)
     return i;
 }
 
+int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
+{
+    int ret = 0;
+
+    while (ret < maxlen) {
+        char c = avio_r8(s);
+        ret++;
+        if (!c)
+            break;
+        if (ret < buflen - 1)
+            *buf++ = c;
+    }
+    *buf = 0;
+    return ret;
+}
+
 #define GET_STR16(type, read) \
     int avio_get_str16 ##type(AVIOContext *pb, int maxlen, char *buf, int buflen)\
 {\
diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c
index d98c4bf..55465ab 100644
--- a/libavformat/cafdec.c
+++ b/libavformat/cafdec.c
@@ -185,8 +185,8 @@ static void read_info_chunk(AVFormatContext *s, int64_t size)
     for (i = 0; i < nb_entries; i++) {
         char key[32];
         char value[1024];
-        get_strz(pb, key, sizeof(key));
-        get_strz(pb, value, sizeof(value));
+        size -= avio_get_str(pb, size, key,   sizeof(key));
+        size -= avio_get_str(pb, size, value, sizeof(value));
         av_metadata_set2(&s->metadata, key, value, 0);
     }
 }
diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c
index bcfc165..7dd567e 100644
--- a/libavformat/ffmdec.c
+++ b/libavformat/ffmdec.c
@@ -325,7 +325,8 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
             codec->qcompress = avio_rb16(pb) / 10000.0;
             codec->qblur = avio_rb16(pb) / 10000.0;
             codec->bit_rate_tolerance = avio_rb32(pb);
-            codec->rc_eq = av_strdup(get_strz(pb, rc_eq_buf, sizeof(rc_eq_buf)));
+            avio_get_str(pb, INT_MAX, rc_eq_buf, sizeof(rc_eq_buf));
+            codec->rc_eq = av_strdup(rc_eq_buf);
             codec->rc_max_rate = avio_rb32(pb);
             codec->rc_min_rate = avio_rb32(pb);
             codec->rc_buffer_size = avio_rb32(pb);
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 537b9c6..ad5bada 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2331,7 +2331,7 @@ static void mov_read_chapters(AVFormatContext *s)
             avio_get_str16le(sc->pb, len, title, title_len);
         else {
             AV_WB16(title, ch);
-            get_strz(sc->pb, title + 2, len - 1);
+            avio_get_str(sc->pb, len - 2, title + 2, title_len - 2);
         }
 
         ff_new_chapter(s, i, st->time_base, sample->timestamp, end, title);
-- 
1.7.4.1




More information about the ffmpeg-devel mailing list