[FFmpeg-devel] [PATCH] read more QT tags

Dave Rice dave at dericed.com
Fri Nov 2 05:00:08 CET 2012


On Nov 1, 2012, at 10:49 PM, Michael Niedermayer wrote:

> On Thu, Nov 01, 2012 at 10:10:21PM -0400, Dave Rice wrote:
>> 
>> On Nov 1, 2012, at 9:57 PM, Michael Niedermayer wrote:
>> 
>>> On Thu, Nov 01, 2012 at 08:26:07PM -0400, Dave Rice wrote:
>>>> Hi,
>>>> 
>>>> This patch enables ffmpeg to read several additional QuickTime metadata tags and corrects a few of the existing ones.
>>>> 
>>>> I tested this against QuickTime tags that were created by QuickTime 7 and by qtmux. I uploaded a sample QuickTime file that contains many of the tags referenced in the patch to http://dericed.com/samples/metadata.mov
>>>> 
>>> 
>>>> Looking forward to feedback. Thanks.
>>> 
>>> feedback from gcc ;)
>>> 
>>> libavformat/mov.c: In function ‘mov_read_udta_string’:
>>> libavformat/mov.c:329:5: error: duplicate case value
>>> libavformat/mov.c:300:5: error: previously used here
>>> libavformat/mov.c: At top level:
>> 
>> fixed.
> 
>> mov.c |   40 ++++++++++++++++++++++++++++++++++------
>> 1 file changed, 34 insertions(+), 6 deletions(-)
>> d4062474413b5d75fab271577f549360c95debb8  quicktime_tags.patch
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index d7d7f21..e8b0f79 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -294,29 +294,57 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>> 
>>     switch (atom.type) {
>>     case MKTAG(0xa9,'n','a','m'): key = "title";     break;
>> -    case MKTAG(0xa9,'a','u','t'):
>> +    case MKTAG(0xa9,'a','u','t'): key = "author";    break;
>>     case MKTAG(0xa9,'A','R','T'): key = "artist";    break;
>>     case MKTAG( 'a','A','R','T'): key = "album_artist";    break;
>> -    case MKTAG(0xa9,'w','r','t'): key = "composer";  break;
>> +    case MKTAG(0xa9,'w','r','t'): key = "writer";    break;
>> +    case MKTAG(0xa9,'c','o','m'): key = "composer";  break;
>>     case MKTAG( 'c','p','r','t'):
>>     case MKTAG(0xa9,'c','p','y'): key = "copyright"; break;
>>     case MKTAG(0xa9,'g','r','p'): key = "grouping"; break;
>>     case MKTAG(0xa9,'l','y','r'): key = "lyrics"; break;
>> -    case MKTAG(0xa9,'c','m','t'):
>> -    case MKTAG(0xa9,'i','n','f'): key = "comment";   break;
>> +    case MKTAG(0xa9,'c','m','t'): key = "comment";    break;
>> +    case MKTAG(0xa9,'i','n','f'): key = "information";break;
>>     case MKTAG(0xa9,'a','l','b'): key = "album";     break;
>> -    case MKTAG(0xa9,'d','a','y'): key = "date";      break;
>> +    case MKTAG(0xa9,'d','a','y'): key = "creation_date";      break;
>>     case MKTAG(0xa9,'g','e','n'): key = "genre";     break;
>>     case MKTAG( 'g','n','r','e'): key = "genre";
>>         parse = mov_metadata_gnre; break;
>>     case MKTAG(0xa9,'t','o','o'):
>> -    case MKTAG(0xa9,'s','w','r'): key = "encoder";   break;
>> +    case MKTAG(0xa9,'s','w','r'): key = "software";   break;
>>     case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
> 
> with these changes mov -> avi or wav will loose encoder and artist in
> some cases

I think I made a mistake with this line
      case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
and think it should have been
      case MKTAG(0xa9,'e','n','c'): key = "encoded_by";   break;
"Encoded by" is actually the labelled used for this tag in QuickTime 7. With that change, I would propose this mapping:

QuickTime:©swr -> RIFF:ISFT
QuickTime:©enc -> RIFF:ITCH

Handling artist in mov->riff is harder. Without this patch, QuickTime:©aut and QuickTime:©ART would both map to RIFF:IART and after the patch QuickTime:©aut doesn't have any mapping to RIFF. QuickTime makes a distinction between artist and author, but LIST-INFO doesn't.

On the other hand, with the current mov.c, if a QuickTime file uses both ©aut and ©ART, then ©aut is used to map to RIFF:IART and ©ART (which seems a better candidate for IART) is ignored. Try: ffmpeg -i http://dericed.com/samples/metadata.mov.

I think the most authentic mapping would be:

QuickTime:©aut  doesn't map to RIFF
QuickTime:©ART -> RIFF:IART

Thoughts?

Also I notice that many of the key values with language modifier get cut off with this patch, for instance:
special_playbac : specialplaybackrequirements

From this I found that "key" is declared with a max size of 1024 while "key2" which is used with the language modifier gets a max size of 16 (mov.c line 286). Is there a reason for key2 to be so small?

Thanks,

Dave Rice


More information about the ffmpeg-devel mailing list