[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