comparison oggdec.c @ 5957:986168b721ca libavformat

oggdec: Fix duration calculation if the last page in a file has no granule
author conrad
date Fri, 16 Apr 2010 12:21:35 +0000
parents 4d8244eae68f
children ad447f146859
comparison
equal deleted inserted replaced
5956:4d8244eae68f 5957:986168b721ca
429 429
430 static int 430 static int
431 ogg_get_length (AVFormatContext * s) 431 ogg_get_length (AVFormatContext * s)
432 { 432 {
433 struct ogg *ogg = s->priv_data; 433 struct ogg *ogg = s->priv_data;
434 int idx = -1, i; 434 int i;
435 int64_t size, end; 435 int64_t size, end;
436 436
437 if(url_is_streamed(s->pb)) 437 if(url_is_streamed(s->pb))
438 return 0; 438 return 0;
439 439
449 ogg_save (s); 449 ogg_save (s);
450 url_fseek (s->pb, end, SEEK_SET); 450 url_fseek (s->pb, end, SEEK_SET);
451 451
452 while (!ogg_read_page (s, &i)){ 452 while (!ogg_read_page (s, &i)){
453 if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 && 453 if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
454 ogg->streams[i].codec) 454 ogg->streams[i].codec) {
455 idx = i; 455 s->streams[i]->duration =
456 } 456 ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
457 457 if (s->streams[i]->start_time != AV_NOPTS_VALUE)
458 if (idx != -1){ 458 s->streams[i]->duration -= s->streams[i]->start_time;
459 s->streams[idx]->duration = 459 }
460 ogg_gptopts (s, idx, ogg->streams[idx].granule, NULL);
461 if (s->streams[idx]->start_time != AV_NOPTS_VALUE)
462 s->streams[idx]->duration -= s->streams[idx]->start_time;
463 } 460 }
464 461
465 ogg_restore (s, 0); 462 ogg_restore (s, 0);
466 463
467 return 0; 464 return 0;