[FFmpeg-devel] [PATCH 1/2] libavformat/avio: added avio_put_str16be
Clément Bœsch
u at pkh.me
Mon Mar 2 16:17:34 CET 2015
On Sun, Mar 01, 2015 at 01:30:54PM -0800, Mark Reid wrote:
> ---
> libavformat/avio.h | 6 ++++++
> libavformat/aviobuf.c | 50 +++++++++++++++++++++++++++-----------------------
> libavformat/version.h | 2 +-
> 3 files changed, 34 insertions(+), 24 deletions(-)
>
> diff --git a/libavformat/avio.h b/libavformat/avio.h
> index b9b4017..8fc7e27 100644
> --- a/libavformat/avio.h
> +++ b/libavformat/avio.h
> @@ -234,6 +234,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.
> * If it is not supported then the seek function will return <0.
> diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
> index 8fd0466..8cb77b0 100644
> --- a/libavformat/aviobuf.c
> +++ b/libavformat/aviobuf.c
> @@ -342,29 +342,33 @@ int avio_put_str(AVIOContext *s, const char *str)
> return len;
> }
>
> -int avio_put_str16le(AVIOContext *s, const char *str)
> -{
> - const uint8_t *q = str;
> - int ret = 0;
> - int err = 0;
> -
> - while (*q) {
> - uint32_t ch;
> - uint16_t tmp;
> -
> - GET_UTF8(ch, *q++, goto invalid;)
> - PUT_UTF16(ch, tmp, avio_wl16(s, tmp); ret += 2;)
> - continue;
> -invalid:
> - av_log(s, AV_LOG_ERROR, "Invaid UTF8 sequence in avio_put_str16le\n");
> - err = AVERROR(EINVAL);
> - }
> - avio_wl16(s, 0);
> - if (err)
> - return err;
> - ret += 2;
> - return ret;
> -}
> +#define PUT_STR16(type, write) \
> + int avio_put_str16 ##type(AVIOContext *s, const char *str)\
> +{\
> + const uint8_t *q = str;\
> + int ret = 0;\
> + int err = 0;\
> + while (*q) {\
> + uint32_t ch;\
> + uint16_t tmp;\
> + GET_UTF8(ch, *q++, goto invalid;)\
> + PUT_UTF16(ch, tmp, write(s, tmp); ret += 2;)\
> + continue;\
> +invalid:\
> + av_log(s, AV_LOG_ERROR, "Invaid UTF8 sequence in avio_put_str16" #type "\n");\
> + err = AVERROR(EINVAL);\
> + }\
> + write(s, 0);\
> + if (err)\
> + return err;\
> + ret += 2;\
> + return ret;\
> +}\
> +
> +PUT_STR16(le, avio_wl16)
> +PUT_STR16(be, avio_wb16)
> +
> +#undef PUT_STR16
>
static inline int put_str16(AVIOContext *s, const char *str, const int be)
{
const uint8_t *q = str;
int ret = 0;
int err = 0;
while (*q) {
uint32_t ch;
uint16_t tmp;
GET_UTF8(ch, *q++, goto invalid;)
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_str16" #type "\n");
err = AVERROR(EINVAL);
}
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)
[...]
Less macro messy that way, and smaller diff (untested).
--
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150302/7b115841/attachment.asc>
More information about the ffmpeg-devel
mailing list