OSDN Git Service

Merge commit 'f963f701d90bd7bb03e39aab4e59bd137084e082'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 23 Jun 2013 11:21:21 +0000 (13:21 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 23 Jun 2013 11:21:21 +0000 (13:21 +0200)
* commit 'f963f701d90bd7bb03e39aab4e59bd137084e082':
  ogg: relax demuxer conformance checks

Conflicts:
libavformat/oggdec.c

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

@@@ -651,32 -550,17 +651,37 @@@ 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) {
 -        ogg_read_close(s);
 -        return ret;
 -    }
 +    do {
 +        ret = ogg_packet(s, NULL, NULL, NULL, NULL);
 +        if (ret < 0) {
 +            ogg_read_close(s);
 +            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;
-             av_log(s, AV_LOG_WARNING, "Number of headers (%d) mismatch for stream %d\n", os->nb_header, i);
 +        } else if (os->codec && os->nb_header < os->codec->nb_header) {
++            av_log(s, AV_LOG_WARNING,
++                   "Headers mismatch for stream %d: "
++                   "expected %d received %d.\n",
++                   i, os->codec->nb_header, os->nb_header);
++            if (s->error_recognition & AV_EF_EXPLODE)
++                return AVERROR_INVALIDDATA;
 +        }
 +        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);