[FFmpeg-devel] [PATCH] Store Major brand, Minor version and compatible brands of a mov file using the metadata API

Baptiste Coudurier baptiste.coudurier
Tue Sep 22 19:51:18 CEST 2009


Hi,

On 09/22/2009 02:23 AM, haim alon wrote:
> Hi,
>
> On Tue, Sep 22, 2009 at 10:28 AM, Baptiste Coudurier<
> baptiste.coudurier at gmail.com>  wrote:
>
>> Hi,
>>
>> On Tue, Sep 22, 2009 at 09:45:32AM +0300, haim alon wrote:
>>> Hi,
>>>
>>> On Thu, Sep 17, 2009 at 8:53 PM, Baptiste Coudurier<
>>> baptiste.coudurier at gmail.com>  wrote:
>>>
>>>> Hi,
>>>>
>>>> ...
>>>
>>>
>>>> Please remove the special treatment of compatible brands.
>>>> It should be one get_buffer only, and compatible_brands_num is useless:
>> it
>>>> will be strlen(compatible_brands)/4.
>>>>
>>>>
>>> OK, one call to get_buffer to get the compatible brands list (no
>>> verification) and there is no need to deliver compatible_brands_num.
>>>
>>>
>>>
>>>> Besides, as an overall comment, too much code is needed to export
>> metadata,
>>>> but that's not your fault.
>>>> Especially these array declarations, snprintf, av_metadata_set for ints
>>>> really annoy me, this should be simplified by adding
>> av_metadata_set_int or
>>>> something.
>>>>
>>>>
>>>> --
>>>> Baptiste COUDURIER
>>>> Key fingerprint
>> 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
>>>> FFmpeg maintainer
>> http://www.ffmpeg.org
>>>> _______________________________________________
>>>> ffmpeg-devel mailing list
>>>> ffmpeg-devel at mplayerhq.hu
>>>> https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-devel
>>>>
>>>
>>> Update attached.
>>>
>>> Thanks,
>>> Haim.
>>
>>> Index: libavformat/mov.c
>>> ===================================================================
>>> --- libavformat/mov.c (revision 19950)
>>> +++ libavformat/mov.c (working copy)
>>> @@ -490,15 +490,32 @@
>>>       return 0; /* now go for moov */
>>>   }
>>>
>>> +/* read major brand, minor version and compatible brands and store them
>> as metadata */
>>>   static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
>>>   {
>>> -    uint32_t type = get_le32(pb);
>>> +    uint32_t minor_ver;
>>> +    int num_comp_brand;
>>> +    char major_brand_str[5]; /* 4 characters + null */
>>> +    char minor_ver_str[11]; /* 32 bit integer ->  10 digits + null */
>>> +    char* comp_brands_str;
>>> +    uint8_t type[5] = {0};
>>
>> An empty line here wouldn't hurt :>
>>
>>
> Sure.
>
>
>>> +    get_buffer(pb, type, 4);
>>>
>>> -    if (type != MKTAG('q','t',' ',' '))
>>> +    if (strcmp(type, "qt, "))
>>>           c->isom = 1;
>>> -    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand:
>> %.4s\n",(char *)&type);
>>> -    get_be32(pb); /* minor version */
>>> -    url_fskip(pb, atom.size - 8);
>>> +    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",
>> (char *)&type);
>>
>> Cosmetics.
>>
>>
> Is it the av_log ?
>
>
>>> +    av_strlcpy(major_brand_str, type, 5); /*set major version to
>> major_brand_str */
>>> +    av_metadata_set(&c->fc->metadata, "major_brand", major_brand_str);
>>> +    minor_ver = get_be32(pb); /*minor version*/
>>
>> Spaces after and before *
>>
>> OK
>
>
>>> +    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
>>> +    av_metadata_set(&c->fc->metadata, "minor_version", minor_ver_str);
>>> +
>>> +    num_comp_brand = (atom.size - 8) / 4;
>>> +    comp_brands_str = av_malloc(num_comp_brand*4 + 1); /* 4 characters
>> for each brand + null terminator */
>>> +    get_buffer(pb, comp_brands_str, num_comp_brand*4);
>>> +    comp_brands_str[num_comp_brand*4] = '\0';
>>
>> length of comp_brands_str is atom.size - 8
>>
>>
> I'll use comp_brand_size instead of num_comp_brand.
>
> [...]
>
> Index: libavformat/mov.c
> ===================================================================
> --- libavformat/mov.c	(revision 19958)
> +++ libavformat/mov.c	(working copy)
> @@ -490,15 +490,32 @@
>       return 0; /* now go for moov */
>   }
>
> +/* read major brand, minor version and compatible brands and store them as metadata */
>   static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
>   {
> -    uint32_t type = get_le32(pb);
> +    uint32_t minor_ver;
> +    int comp_brand_size;
> +    char major_brand_str[5]; /* 4 characters + null */
> +    char minor_ver_str[11]; /* 32 bit integer ->  10 digits + null */
> +    char* comp_brands_str;
> +    uint8_t type[5] = {0};
>
> -    if (type != MKTAG('q','t',' ',' '))
> +    get_buffer(pb, type, 4);
> +    if (strcmp(type, "qt, "))
>           c->isom = 1;
>       av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
> -    get_be32(pb); /* minor version */
> -    url_fskip(pb, atom.size - 8);
> +    av_strlcpy(major_brand_str, type, 5); /* set major version to major_brand_str */
> +    av_metadata_set(&c->fc->metadata, "major_brand", major_brand_str);

You don't need the copy and major_brand_str, use type.

> +    minor_ver = get_be32(pb); /* minor version */
> +    snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
> +    av_metadata_set(&c->fc->metadata, "minor_version", minor_ver_str);
> +
> +    comp_brand_size = atom.size - 8;
> +    comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */

Check for malloc return.

[...]

-- 
Baptiste COUDURIER
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                                  http://www.ffmpeg.org



More information about the ffmpeg-devel mailing list