These tags describe the product and quicktime library version respectively.
Originate from Adobe Premiere, but some other products also use them.
Contrary to other tags, they contain 'raw' data which is not be
interpreted as iso639 or mac strings.

Based on a patch by Peter Ross <[email protected]>.
---
Now without the new parsing function. I can restore the previous version if 
preferred.
Vittorio

 libavformat/mov.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index e634af4..0310544 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -258,8 +258,11 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
     uint16_t langcode = 0;
     uint32_t data_type = 0, str_size, str_size_alloc;
     int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL;
+    int raw = 0;
 
     switch (atom.type) {
+    case MKTAG( '@','P','R','M'): key = "premiere_version"; raw = 1;     break;
+    case MKTAG( '@','P','R','Q'): key = "quicktime_version"; raw = 1;    break;
     case MKTAG( 'a','A','R','T'): key = "album_artist";                  break;
     case MKTAG( 'c','p','r','t'): key = "copyright";                     break;
     case MKTAG( 'd','e','s','c'): key = "description";                   break;
@@ -318,7 +321,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
                 }
             }
         } else return 0;
-    } else if (atom.size > 4 && key && !c->itunes_metadata) {
+    } else if (atom.size > 4 && key && !c->itunes_metadata && !raw) {
         str_size = avio_rb16(pb); // string length
         langcode = avio_rb16(pb);
         ff_mov_lang_to_iso639(langcode, language);
@@ -340,7 +342,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
         return AVERROR_INVALIDDATA;
 
     // allocate twice as much as worst-case
-    str_size_alloc = str_size * 2;
+    str_size_alloc = raw ? str_size : str_size * 2;
     str = av_malloc(str_size_alloc);
     if (!str)
         return AVERROR(ENOMEM);
@@@ -345,7 +348,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
     if (parse)
         parse(c, pb, str_size, key);
     else {
-        if (data_type == 3 || (data_type == 0 && (langcode < 0x400 || langcode 
== 0x7fff))) { // MAC Encoded
+        if (!raw && (data_type == 3 || (data_type == 0 && (langcode < 0x400 || 
langcode == 0x7fff)))) { // MAC Encoded
             mov_read_mac_string(c, pb, str_size, str, str_size_alloc);
         } else {
             avio_read(pb, str, str_size);
-- 
1.9.3 (Apple Git-50)

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to