mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Patch get_frag_time
This commit is contained in:
parent
1c1dd8f972
commit
f94c1a8461
@ -1246,55 +1246,64 @@ static int64_t get_stream_info_time(MOVFragmentStreamInfo * frag_stream_info)
|
||||
return AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
static int64_t get_frag_time(MOVFragmentIndex *frag_index,
|
||||
int index, int track_id)
|
||||
static int64_t get_frag_time(AVFormatContext *s, AVStream *dst_st,
|
||||
MOVFragmentIndex *frag_index, int index)
|
||||
{
|
||||
MOVFragmentStreamInfo * frag_stream_info;
|
||||
MOVStreamContext *sc = dst_st->priv_data;
|
||||
int64_t timestamp;
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
if (track_id >= 0) {
|
||||
frag_stream_info = get_frag_stream_info(frag_index, index, track_id);
|
||||
// If the stream is referenced by any sidx, limit the search
|
||||
// to fragments that referenced this stream in the sidx
|
||||
if (sc->has_sidx) {
|
||||
frag_stream_info = get_frag_stream_info(frag_index, index, dst_st->id);
|
||||
if (frag_stream_info->sidx_pts != AV_NOPTS_VALUE)
|
||||
return frag_stream_info->sidx_pts;
|
||||
if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE)
|
||||
return frag_stream_info->first_tfra_pts;
|
||||
return frag_stream_info->sidx_pts;
|
||||
}
|
||||
|
||||
for (i = 0; i < frag_index->item[index].nb_stream_info; i++) {
|
||||
AVStream *frag_stream = NULL;
|
||||
frag_stream_info = &frag_index->item[index].stream_info[i];
|
||||
for (j = 0; j < s->nb_streams; j++)
|
||||
if (s->streams[j]->id == frag_stream_info->id)
|
||||
frag_stream = s->streams[j];
|
||||
if (!frag_stream) {
|
||||
av_log(s, AV_LOG_WARNING, "No stream matching sidx ID found.\n");
|
||||
continue;
|
||||
}
|
||||
timestamp = get_stream_info_time(frag_stream_info);
|
||||
if (timestamp != AV_NOPTS_VALUE)
|
||||
return timestamp;
|
||||
return av_rescale_q(timestamp, frag_stream->time_base, dst_st->time_base);
|
||||
}
|
||||
return AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
static int search_frag_timestamp(MOVFragmentIndex *frag_index,
|
||||
static int search_frag_timestamp(AVFormatContext *s, MOVFragmentIndex *frag_index,
|
||||
AVStream *st, int64_t timestamp)
|
||||
{
|
||||
int a, b, m;
|
||||
int a, b, m, m0;
|
||||
int64_t frag_time;
|
||||
int id = -1;
|
||||
|
||||
if (st) {
|
||||
// If the stream is referenced by any sidx, limit the search
|
||||
// to fragments that referenced this stream in the sidx
|
||||
MOVStreamContext *sc = st->priv_data;
|
||||
if (sc->has_sidx)
|
||||
id = st->id;
|
||||
}
|
||||
|
||||
a = -1;
|
||||
b = frag_index->nb_items;
|
||||
|
||||
while (b - a > 1) {
|
||||
m = (a + b) >> 1;
|
||||
frag_time = get_frag_time(frag_index, m, id);
|
||||
if (frag_time != AV_NOPTS_VALUE) {
|
||||
if (frag_time >= timestamp)
|
||||
b = m;
|
||||
if (frag_time <= timestamp)
|
||||
m0 = m = (a + b) >> 1;
|
||||
|
||||
while (m < b &&
|
||||
(frag_time = get_frag_time(s, st, frag_index, m)) == AV_NOPTS_VALUE)
|
||||
m++;
|
||||
|
||||
if (m < b && frag_time <= timestamp)
|
||||
a = m;
|
||||
else
|
||||
b = m0;
|
||||
}
|
||||
}
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
@ -7829,7 +7838,7 @@ static int mov_seek_fragment(AVFormatContext *s, AVStream *st, int64_t timestamp
|
||||
if (!mov->frag_index.complete)
|
||||
return 0;
|
||||
|
||||
index = search_frag_timestamp(&mov->frag_index, st, timestamp);
|
||||
index = search_frag_timestamp(s, &mov->frag_index, st, timestamp);
|
||||
if (index < 0)
|
||||
index = 0;
|
||||
if (!mov->frag_index.item[index].headers_read)
|
||||
|
Loading…
x
Reference in New Issue
Block a user