mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-17 20:17:55 +02:00
avi: try to synchronize the points in time of the starts of streams after seeking.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
8a68697dc6
commit
fbfcc8f1b7
@ -54,6 +54,8 @@ typedef struct AVIStream {
|
||||
AVFormatContext *sub_ctx;
|
||||
AVPacket sub_pkt;
|
||||
uint8_t *sub_buffer;
|
||||
|
||||
int64_t seek_pos;
|
||||
} AVIStream;
|
||||
|
||||
typedef struct {
|
||||
@ -987,6 +989,12 @@ resync:
|
||||
ast->packet_size= 0;
|
||||
}
|
||||
|
||||
if(!avi->non_interleaved && ast->seek_pos > pkt->pos){
|
||||
av_free_packet(pkt);
|
||||
goto resync;
|
||||
}
|
||||
ast->seek_pos= 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
@ -1252,7 +1260,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
|
||||
AVIContext *avi = s->priv_data;
|
||||
AVStream *st;
|
||||
int i, index;
|
||||
int64_t pos;
|
||||
int64_t pos, pos_min;
|
||||
AVIStream *ast;
|
||||
|
||||
if (!avi->index_loaded) {
|
||||
@ -1289,6 +1297,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
|
||||
return 0;
|
||||
}
|
||||
|
||||
pos_min= pos;
|
||||
for(i = 0; i < s->nb_streams; i++) {
|
||||
AVStream *st2 = s->streams[i];
|
||||
AVIStream *ast2 = st2->priv_data;
|
||||
@ -1312,21 +1321,13 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
|
||||
flags | AVSEEK_FLAG_BACKWARD);
|
||||
if(index<0)
|
||||
index=0;
|
||||
|
||||
if(!avi->non_interleaved){
|
||||
while(index>0 && st2->index_entries[index].pos > pos)
|
||||
index--;
|
||||
while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
|
||||
index++;
|
||||
}
|
||||
|
||||
// av_log(s, AV_LOG_DEBUG, "%"PRId64" %d %"PRId64"\n", timestamp, index, st2->index_entries[index].timestamp);
|
||||
/* extract the current frame number */
|
||||
ast2->seek_pos= st2->index_entries[index].pos;
|
||||
pos_min= FFMIN(pos_min,ast2->seek_pos);
|
||||
ast2->frame_offset = st2->index_entries[index].timestamp;
|
||||
}
|
||||
|
||||
/* do the seek */
|
||||
avio_seek(s->pb, pos, SEEK_SET);
|
||||
avio_seek(s->pb, pos_min, SEEK_SET);
|
||||
avi->stream_index= -1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -8,27 +8,27 @@ ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret:-1 st: 0 flags:1 ts:-0.320000
|
||||
ret:-1 st: 1 flags:0 ts: 2.586122
|
||||
ret: 0 st: 1 flags:1 ts: 1.462857
|
||||
ret: 0 st: 1 flags:1 dts: 1.018776 pts: 1.018776 pos: 329774 size: 209
|
||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret: 0 st:-1 flags:0 ts: 0.365002
|
||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 156166 size: 27955
|
||||
ret: 0 st: 1 flags:1 dts: 0.470204 pts: 0.470204 pos: 155948 size: 209
|
||||
ret:-1 st:-1 flags:1 ts:-0.740831
|
||||
ret:-1 st: 0 flags:0 ts: 2.160000
|
||||
ret: 0 st: 0 flags:1 ts: 1.040000
|
||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret: 0 st: 1 flags:0 ts:-0.052245
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 37784 size: 208
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 9908 size: 27867
|
||||
ret: 0 st: 1 flags:1 ts: 2.847347
|
||||
ret: 0 st: 1 flags:1 dts: 1.018776 pts: 1.018776 pos: 329774 size: 209
|
||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret:-1 st:-1 flags:0 ts: 1.730004
|
||||
ret: 0 st:-1 flags:1 ts: 0.624171
|
||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 156166 size: 27955
|
||||
ret: 0 st: 1 flags:1 dts: 0.470204 pts: 0.470204 pos: 155948 size: 209
|
||||
ret: 0 st: 0 flags:0 ts:-0.480000
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 9908 size: 27867
|
||||
ret: 0 st: 0 flags:1 ts: 2.400000
|
||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret:-1 st: 1 flags:0 ts: 1.306122
|
||||
ret: 0 st: 1 flags:1 ts: 0.208980
|
||||
ret: 0 st: 1 flags:1 dts: 0.208980 pts: 0.208980 pos: 92800 size: 209
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 9908 size: 27867
|
||||
ret: 0 st:-1 flags:0 ts:-0.904994
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 9908 size: 27867
|
||||
ret: 0 st:-1 flags:1 ts: 1.989173
|
||||
@ -38,7 +38,7 @@ ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret:-1 st: 0 flags:1 ts:-0.240000
|
||||
ret:-1 st: 1 flags:0 ts: 2.664490
|
||||
ret: 0 st: 1 flags:1 ts: 1.567347
|
||||
ret: 0 st: 1 flags:1 dts: 1.018776 pts: 1.018776 pos: 329774 size: 209
|
||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 301466 size: 27864
|
||||
ret: 0 st:-1 flags:0 ts: 0.460008
|
||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 156166 size: 27955
|
||||
ret: 0 st: 1 flags:1 dts: 0.470204 pts: 0.470204 pos: 155948 size: 209
|
||||
ret:-1 st:-1 flags:1 ts:-0.645825
|
||||
|
Loading…
x
Reference in New Issue
Block a user