[FFmpeg-devel] [PATCH 1/2] avio: add avio_get_str()
Anton Khirnov
anton
Wed Mar 2 18:34:42 CET 2011
From: Reimar D?ffinger <Reimar.Doeffinger at gmx.de>
---
libavformat/avio.h | 12 ++++++++++++
libavformat/aviobuf.c | 17 +++++++++++++++++
2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/libavformat/avio.h b/libavformat/avio.h
index cc46ad7..912ab0b 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -526,6 +526,18 @@ unsigned int avio_rl32(AVIOContext *s);
uint64_t avio_rl64(AVIOContext *s);
/**
+ * Read a string from pb into buf. The reading will terminate when either
+ * a NULL character was encountered or maxlen bytes have been read. The
+ * result is guaranteed to be NULL-terminated, it will be truncated if buf
+ * is too small.
+ * Note that the string is not interpreted or validated in any way, it
+ * might get truncated in the middle of a sequence for multi-byte encodings.
+ *
+ * @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.
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 3f3721c..5b2f9c0 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -705,6 +705,23 @@ 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 i;
+
+ // reserve 1 byte for terminating 0
+ buflen = FFMIN(buflen - 1, maxlen);
+ for (i = 0; i < buflen; i++)
+ if (!(buf[i] = avio_r8(s)))
+ return i + 1;
+ if (buflen)
+ buf[i] = 0;
+ for (; i < maxlen; i++)
+ if (!avio_r8(s))
+ return i + 1;
+ return maxlen;
+}
+
#define GET_STR16(type, read) \
int avio_get_str16 ##type(AVIOContext *pb, int maxlen, char *buf, int buflen)\
{\
--
1.7.4.1
More information about the ffmpeg-devel
mailing list