Merge commit 'd1f05dd18375f2f8e68372edee11436927e43ba8'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Sep 2012 14:00:09 +0000 (16:00 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 25 Sep 2012 14:00:09 +0000 (16:00 +0200)
* commit 'd1f05dd18375f2f8e68372edee11436927e43ba8':
  ogg: calculate the start position once all the headers are parsed

Conflicts:
libavformat/oggdec.c
libavformat/oggparseskeleton.c

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

@@@ -223,19 -169,17 +223,20 @@@ static int ogg_new_stream(AVFormatConte
      os->bufsize = DECODER_BUFFER_SIZE;
      os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
      os->header = -1;
 -
 -    if (new_avstream) {
 -        st = avformat_new_stream(s, NULL);
 -        if (!st)
 -            return AVERROR(ENOMEM);
 -
 -        st->id = idx;
 -        avpriv_set_pts_info(st, 64, 1, 1000000);
+     os->start_granule = OGG_NOGRANULE_VALUE;
 +    if (!os->buf)
 +        return AVERROR(ENOMEM);
 +
 +    /* Create the associated AVStream */
 +    st = avformat_new_stream(s, NULL);
 +    if (!st) {
 +        av_freep(&os->buf);
 +        return AVERROR(ENOMEM);
      }
 +    st->id = idx;
 +    avpriv_set_pts_info(st, 64, 1, 1000000);
  
 +    ogg->nstreams++;
      return idx;
  }
  
@@@ -589,27 -513,15 +590,30 @@@ static int ogg_read_header(AVFormatCont
  {
      struct ogg *ogg = s->priv_data;
      int ret, i;
 +
      ogg->curidx = -1;
 +
      //linear headers seek from start
 -    ret = ogg_get_headers(s);
 -    if (ret < 0)
 -        return ret;
 +    do {
 +        ret = ogg_packet(s, NULL, NULL, NULL, NULL);
 +        if (ret < 0)
 +            return ret;
 +    } while (!ogg->headers);
 +    av_dlog(s, "found headers\n");
  
 -    for (i = 0; i < ogg->nstreams; i++)
 -        if (ogg->streams[i].header < 0)
 +    for (i = 0; i < ogg->nstreams; i++) {
 +        struct ogg_stream *os = ogg->streams + i;
 +
 +        if (ogg->streams[i].header < 0) {
 +            av_log(s, AV_LOG_ERROR, "Header parsing failed for stream %d\n", i);
              ogg->streams[i].codec = NULL;
 +        } else if (os->codec && os->nb_header < os->codec->nb_header) {
 +            av_log(s, AV_LOG_WARNING, "Number of headers (%d) mismatch for stream %d\n", os->nb_header, i);
 +        }
++        if (os->start_granule != OGG_NOGRANULE_VALUE)
++            os->lastpts = s->streams[i]->start_time =
++                ogg_gptopts(s, i, os->start_granule, NULL);
 +    }
  
      //linear granulepos seek from end
      ogg_get_length (s);
Simple merge
Simple merge