From 81a91269a2fbeb87de53e395c6bed0c70c310cae Mon Sep 17 00:00:00 2001 From: Mark Reid Date: Mon, 2 Mar 2015 20:06:13 -0800 Subject: [PATCH] libavformat/avio: added avio_put_str16be Signed-off-by: Michael Niedermayer --- doc/APIchanges | 3 +++ libavformat/avio.h | 6 ++++++ libavformat/aviobuf.c | 23 +++++++++++++++++++---- libavformat/version.h | 4 ++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 5fdfc82cde..6875aede93 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2014-08-09 API changes, most recent first: +2015-03-xx - xxxxxxx - lavf 56.24.100 + Add avio_put_str16be() + 2015-xx-xx - xxxxxxx - lavc 56.13 Add width, height, coded_width, coded_height and format to AVCodecParserContext. diff --git a/libavformat/avio.h b/libavformat/avio.h index b9b4017fb3..8fc7e27d4e 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -233,6 +233,12 @@ int avio_put_str(AVIOContext *s, const char *str); */ int avio_put_str16le(AVIOContext *s, const char *str); +/** + * Convert an UTF-8 string to UTF-16BE and write it. + * @return number of bytes written. + */ +int avio_put_str16be(AVIOContext *s, const char *str); + /** * Passing this as the "whence" parameter to a seek function causes it to * return the filesize without seeking anywhere. Supporting this is optional. diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 8fd04668c0..537c11f6b4 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -342,7 +342,7 @@ int avio_put_str(AVIOContext *s, const char *str) return len; } -int avio_put_str16le(AVIOContext *s, const char *str) +static inline int put_str16(AVIOContext *s, const char *str, const int be) { const uint8_t *q = str; int ret = 0; @@ -353,19 +353,34 @@ int avio_put_str16le(AVIOContext *s, const char *str) uint16_t tmp; GET_UTF8(ch, *q++, goto invalid;) - PUT_UTF16(ch, tmp, avio_wl16(s, tmp); ret += 2;) + PUT_UTF16(ch, tmp, be ? avio_wb16(s, tmp) : avio_wl16(s, tmp); + ret += 2;) continue; invalid: - av_log(s, AV_LOG_ERROR, "Invaid UTF8 sequence in avio_put_str16le\n"); + av_log(s, AV_LOG_ERROR, "Invaid UTF8 sequence in avio_put_str16%s\n", be ? "be" : "le"); err = AVERROR(EINVAL); } - avio_wl16(s, 0); + if (be) + avio_wb16(s, 0); + else + avio_wl16(s, 0); if (err) return err; ret += 2; return ret; } +#define PUT_STR16(type, big_endian) \ +int avio_put_str16 ## type(AVIOContext *s, const char *str) \ +{ \ +return put_str16(s, str, big_endian); \ +} + +PUT_STR16(le, 0) +PUT_STR16(be, 1) + +#undef PUT_STR16 + int ff_get_v_length(uint64_t val) { int i = 1; diff --git a/libavformat/version.h b/libavformat/version.h index 248cd3cbb0..08ab50be6f 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,8 +30,8 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 56 -#define LIBAVFORMAT_VERSION_MINOR 23 -#define LIBAVFORMAT_VERSION_MICRO 106 +#define LIBAVFORMAT_VERSION_MINOR 24 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \