[FFmpeg-devel] [PATCH] libavformat/mxfenc: write package name metadata
tomas.hardin at codemill.se
tomas.hardin at codemill.se
Tue Feb 17 10:22:04 CET 2015
On 2015-02-16 20:24, Mark Reid wrote:
> On Mon, Feb 16, 2015 at 4:07 AM, <tomas.hardin at codemill.se> wrote:
>
>> 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.
>
>
> will do.
Another thing: since this is adds another function to the API maybe the
minor version should be bumped? I can't recall if the avio_* functions
are strictly internal. If they are then there might not be a need.
>>> +#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
>> :)
>>
> I wasn't to thrilled about the 2 bytes either, but seeing that the
> function is part of the public api, I didn't want to break anything.
Good call :)
>>> + 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?
>
>
> I couldn't find too much stuff writing utf-16 strings, id3v2, mmst and
> subtiles. I think most of them calculate the length after writing.
> would utils/avstring.c be good place to put it?
Possibly, but I don't think we need to extend the API if nothing else
needs it.
>>> +/*
>>> + * 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.
>>
>
> Okay, I'll split it into two patches and send a new set, thanks for
> taking
> the time to review
No problem
/Tomas
More information about the ffmpeg-devel
mailing list