Merge commit 'ec524ed12aa1aeb37125203f1adf5aa10dfcb0de'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 3 Feb 2015 22:49:14 +0000 (23:49 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 3 Feb 2015 22:49:14 +0000 (23:49 +0100)
* commit 'ec524ed12aa1aeb37125203f1adf5aa10dfcb0de':
  tta: Fix framepos and start_offset types

Conflicts:
libavformat/tta.c

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

@@@ -55,16 -44,17 +55,18 @@@ static int tta_read_header(AVFormatCont
  {
      TTAContext *c = s->priv_data;
      AVStream *st;
 -    int i, channels, bps, samplerate, datalen;
 +    int i, channels, bps, samplerate;
-     uint64_t framepos, start_offset;
+     int64_t framepos, start_offset;
 +    uint32_t nb_samples, crc;
  
 -    if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
 -        ff_id3v1_read(s);
 +    ff_id3v1_read(s);
  
      start_offset = avio_tell(s->pb);
+     if (start_offset < 0)
+         return start_offset;
 +    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);
      if (avio_rl32(s->pb) != AV_RL32("TTA1"))
 -        return -1; // not tta file
 +        return AVERROR_INVALIDDATA;
  
      avio_skip(s->pb, 2); // FIXME: flags
      channels = avio_rl16(s->pb);
  
      avpriv_set_pts_info(st, 64, 1, samplerate);
      st->start_time = 0;
 -    st->duration = datalen;
 +    st->duration = nb_samples;
  
-     framepos = avio_tell(s->pb) + 4*c->totalframes + 4;
+     framepos = avio_tell(s->pb);
+     if (framepos < 0)
+         return framepos;
+     framepos += 4 * c->totalframes + 4;
  
 +    if (ff_alloc_extradata(st->codec, avio_tell(s->pb) - start_offset))
 +        return AVERROR(ENOMEM);
 +
 +    avio_seek(s->pb, start_offset, SEEK_SET);
 +    avio_read(s->pb, st->codec->extradata, st->codec->extradata_size);
 +
 +    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);
      for (i = 0; i < c->totalframes; i++) {
          uint32_t size = avio_rl32(s->pb);
 -        av_add_index_entry(st, framepos, i * c->frame_size, size, 0,
 -                           AVINDEX_KEYFRAME);
 +        int r;
 +        if ((r = av_add_index_entry(st, framepos, i * c->frame_size, size, 0,
 +                                    AVINDEX_KEYFRAME)) < 0)
 +            return r;
          framepos += size;
      }
 -    avio_skip(s->pb, 4); // seektable crc
 +    crc = ffio_get_checksum(s->pb) ^ UINT32_MAX;
 +    if (crc != avio_rl32(s->pb)) {
 +        av_log(s, AV_LOG_ERROR, "Seek table CRC error\n");
 +        return AVERROR_INVALIDDATA;
 +    }
  
      st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
      st->codec->codec_id = AV_CODEC_ID_TTA;