Merge commit '174c5fde90060faab67796a5eaef742630f1db6e'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 8 Dec 2014 21:13:23 +0000 (22:13 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 8 Dec 2014 21:14:29 +0000 (22:14 +0100)
* commit '174c5fde90060faab67796a5eaef742630f1db6e':
  mov: parse @PRM and @PRQ metadata tags

Conflicts:
libavformat/mov.c

See: f540851ce320bc69621ea70b89857c54129c82c2
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/mov.c

@@@ -265,11 -258,12 +265,14 @@@ static int mov_read_udta_string(MOVCont
      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','i','l'): key = "compilation";
 +        parse = mov_metadata_int8_no_padding; break;
      case MKTAG( 'c','p','r','t'): key = "copyright"; break;
      case MKTAG( 'd','e','s','c'): key = "description"; break;
      case MKTAG( 'd','i','s','k'): key = "disc";
                  int ret = mov_read_covr(c, pb, data_type, str_size);
                  if (ret < 0) {
                      av_log(c->fc, AV_LOG_ERROR, "Error parsing cover art.\n");
 -                    return ret;
                  }
 +                return ret;
              }
          } 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);
      if (atom.size < 0)
          return AVERROR_INVALIDDATA;
  
-     str_size_alloc = str_size << 1; // worst-case requirement for output string in case of utf8 coded input
 -    // allocate twice as much as worst-case
++    // worst-case requirement for output string in case of utf8 coded input
+     str_size_alloc = raw ? str_size + 1 : str_size * 2;
      str = av_malloc(str_size_alloc);
      if (!str)
          return AVERROR(ENOMEM);
      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);
 +            int ret = avio_read(pb, str, str_size);
 +            if (ret != str_size) {
 +                av_freep(&str);
 +                return ret < 0 ? ret : AVERROR_INVALIDDATA;
 +            }
              str[str_size] = 0;
          }
          c->fc->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;