[FFmpeg-devel] [PATCH 1/2] libavformat/avio: added avio_put_str16be
Mark Reid
mindmark at gmail.com
Mon Mar 2 19:46:30 CET 2015
On Mon, Mar 2, 2015 at 7:17 AM, Clément Bœsch <u at pkh.me> wrote:
> 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).
>
>
Thats much simpler, I'll send a new patch doing that. I will also add a
entry to docs/APICHANGES.
For bumping the version am I suppose to reset the micro to 100?
More information about the ffmpeg-devel
mailing list