[FFmpeg-devel] [PATCH] libavformat/mxfenc: write package name metadata
tomas.hardin at codemill.se
tomas.hardin at codemill.se
Mon Feb 16 13:07:07 CET 2015
On 2015-02-13 01:36, Mark Reid wrote:
> /**
> + * 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);
You could maybe split this patch up by making the part that adds this
function a separate patch. Not that I'm super concerned.
> +#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);\
From the last e-mail:
> The tests need to be updated because avio_put_str16be writes zero
> terminated strings and
> the muxer previously wasn't.
I was going to object to this on the grounds that it wastes a whopping
two bytes per UTF-16 local tag, but I suspect the possible savings are
eaten up by KAG alignment anyway. Code simplicity is favorable in this
case I think :)
> + if (err)\
> + return err;\
> + ret += 2;\
> + return ret;\
> +}\
> +
> +PUT_STR16(le, avio_wl16)
> +PUT_STR16(be, avio_wb16)
> +
> +#undef PUT_STR16
>
> int ff_get_v_length(uint64_t val)
> {
> diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
> index 17ad132..c25f5fd 100644
> --- a/libavformat/mxfenc.c
> +++ b/libavformat/mxfenc.c
> @@ -624,14 +624,44 @@ static void mxf_write_preface(AVFormatContext *s)
> }
>
> /*
> - * Write a local tag containing an ascii string as utf-16
> + * Returns the length of the UTF-16 string, in 16-bit characters,
> that would result
> + * from decoding the utf-8 string.
> + */
> +static uint64_t mxf_utf16len(const char *utf8_str)
> +{
> + const uint8_t *q = utf8_str;
> + uint64_t size = 0;
> + while (*q) {
> + uint32_t ch;
> + GET_UTF8(ch, *q++, goto invalid;)
> + if (ch < 0x10000)
> + size++;
> + else
> + size += 2;
> + continue;
> +invalid:
> + av_log(NULL, AV_LOG_ERROR, "Invaid UTF8 sequence in
> mxf_utf16len\n\n");
> + }
> + size += 1;
> + return size;
> +}
Maybe this could be useful elsewhere too? What's the state of UTF-16
usage in lavf?
> +/*
> + * Write a local tag containing an utf-8 string as utf-16
> */
> static void mxf_write_local_tag_utf16(AVIOContext *pb, int tag, const
> char *value)
> {
> - int i, size = strlen(value);
> + int size = mxf_utf16len(value);
> mxf_write_local_tag(pb, size*2, tag);
> - for (i = 0; i < size; i++)
> - avio_wb16(pb, value[i]);
> + avio_put_str16be(pb, value);
> }
Wow, this thing was really broken before.
Overall the patch looks fine, apart from maybe splitting it up.
/Tomas
More information about the ffmpeg-devel
mailing list