You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
oggdec: Make sure start time correction is applied once to each stream
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -452,6 +452,7 @@ static int ogg_get_length(AVFormatContext *s)
|
|||||||
struct ogg *ogg = s->priv_data;
|
struct ogg *ogg = s->priv_data;
|
||||||
int i;
|
int i;
|
||||||
int64_t size, end;
|
int64_t size, end;
|
||||||
|
int streams_left=0;
|
||||||
|
|
||||||
if(!s->pb->seekable)
|
if(!s->pb->seekable)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -473,8 +474,14 @@ static int ogg_get_length(AVFormatContext *s)
|
|||||||
ogg->streams[i].codec) {
|
ogg->streams[i].codec) {
|
||||||
s->streams[i]->duration =
|
s->streams[i]->duration =
|
||||||
ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
|
ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
|
||||||
if (s->streams[i]->start_time != AV_NOPTS_VALUE)
|
if (s->streams[i]->start_time != AV_NOPTS_VALUE){
|
||||||
s->streams[i]->duration -= s->streams[i]->start_time;
|
s->streams[i]->duration -= s->streams[i]->start_time;
|
||||||
|
streams_left-= (ogg->streams[i].got_start==-1);
|
||||||
|
ogg->streams[i].got_start= 1;
|
||||||
|
}else if(!ogg->streams[i].got_start){
|
||||||
|
ogg->streams[i].got_start= -1;
|
||||||
|
streams_left++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,8 +492,13 @@ static int ogg_get_length(AVFormatContext *s)
|
|||||||
while (!ogg_read_page (s, &i)){
|
while (!ogg_read_page (s, &i)){
|
||||||
if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
|
if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
|
||||||
ogg->streams[i].codec) {
|
ogg->streams[i].codec) {
|
||||||
|
if(s->streams[i]->duration && s->streams[i]->start_time == AV_NOPTS_VALUE && !ogg->streams[i].got_start){
|
||||||
s->streams[i]->duration -=
|
s->streams[i]->duration -=
|
||||||
ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
|
ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
|
||||||
|
ogg->streams[i].got_start= 1;
|
||||||
|
streams_left--;
|
||||||
|
}
|
||||||
|
if(streams_left<=0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ struct ogg_stream {
|
|||||||
int incomplete; ///< whether we're expecting a continuation in the next page
|
int incomplete; ///< whether we're expecting a continuation in the next page
|
||||||
int page_end; ///< current packet is the last one completed in the page
|
int page_end; ///< current packet is the last one completed in the page
|
||||||
int keyframe_seek;
|
int keyframe_seek;
|
||||||
|
int got_start;
|
||||||
void *private;
|
void *private;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user