History

avformat/mov: Fix trampling of ctts during seeks when sidx support is enabled.

When sidx box support is enabled, the code will skip reading all trun boxes (each containing ctts entries for samples inthat box). If seeks are attempted before all ctts values are known, the old code would dump ctts entries into the wrong location. These are then used to compute pts values which leads to out of order and incorrectly timestamped packets. This patch fixes ctts processing by always using the index returned by av_add_index_entry() as the ctts_data index. When the index gains new entries old values are reshuffled as appropriate. This approach makes sense since the mov demuxer is already relying on the mapping of AVIndex entries to samples for correct demuxing. As a result of this all ctts entries are now 1-count. A followup change will be submitted to remove support for > 1 count entries which will simplify seeking. Notes for future improvement: Probably there are other boxes (stts, stsc, etc) that are impacted by this issue... this patch only attempts to fix ctts since it completely breaks packet timestamping. This patch continues using an array for the ctts data, which is not the most ideal given the rearrangement that needs to happen (via memmove as new entries are read in). Ideally AVIndex and the ctts data would be set-type structures so addition is always worst case O(lg(n)) instead of the O(n^2) that exists now; this slowdown is noticeable during seeks.

Dale Curtis committed 9 years ago

Commit 37e8edc1 parent c42a1384 files · +195 −35Browse files

Unified · Split

4 files
  1. libavformat/isom.h +1 −0
  2. libavformat/mov.c +57 −35
  3. tests/fate/seek.mak +3 −0
  4. tests/ref/seek/extra-mp4 +134 −0
libavformat/isom.h+1−0
@@ -137,6 +137,7 @@ typedef struct MOVStreamContext { · 136 unmodified lines
137 unsigned int stts_count;137 unsigned int stts_count;
138 MOVStts *stts_data;138 MOVStts *stts_data;
139 unsigned int ctts_count;139 unsigned int ctts_count;
140 unsigned int ctts_allocated_size;
140 MOVStts *ctts_data;141 MOVStts *ctts_data;
141 unsigned int stsc_count;142 unsigned int stsc_count;
142 MOVStsc *stsc_data;143 MOVStsc *stsc_data;
libavformat/mov.c+57−35
@@ -74,6 +74,8 @@ typedef struct MOVParseTableEntry { · 73 unmodified lines
74 74
75static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom);75static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom);
76static int mov_read_mfra(MOVContext *c, AVIOContext *f);76static int mov_read_mfra(MOVContext *c, AVIOContext *f);
77static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int* ctts_count, unsigned int* allocated_size,
78 int count, int duration);
77 79
78static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb,80static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb,
79 unsigned len, const char *key)81 unsigned len, const char *key)
@@ -2711,7 +2713,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 2631 unmodified lines
2711{2713{
2712 AVStream *st;2714 AVStream *st;
2713 MOVStreamContext *sc;2715 MOVStreamContext *sc;
2714 unsigned int i, entries, ctts_count = 0;2716 unsigned int i, j, entries, ctts_count = 0;
2715 2717
2716 if (c->fc->nb_streams < 1)2718 if (c->fc->nb_streams < 1)
2717 return 0;2719 return 0;
@@ -2729,7 +2731,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 11 unmodified lines
2729 if (entries >= UINT_MAX / sizeof(*sc->ctts_data))2731 if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
2730 return AVERROR_INVALIDDATA;2732 return AVERROR_INVALIDDATA;
2731 av_freep(&sc->ctts_data);2733 av_freep(&sc->ctts_data);
2732 sc->ctts_data = av_realloc(NULL, entries * sizeof(*sc->ctts_data));2734 sc->ctts_data = av_fast_realloc(NULL, &sc->ctts_allocated_size, entries * sizeof(*sc->ctts_data));
2733 if (!sc->ctts_data)2735 if (!sc->ctts_data)
2734 return AVERROR(ENOMEM);2736 return AVERROR(ENOMEM);
2735 2737
@@ -2744,9 +2746,9 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 8 unmodified lines
2744 continue;2746 continue;
2745 }2747 }
2746 2748
2747 sc->ctts_data[ctts_count].count = count;2749 /* Expand entries such that we have a 1-1 mapping with samples. */
2748 sc->ctts_data[ctts_count].duration = duration;2750 for (j = 0; j < count; j++)
2749 ctts_count++;2751 add_ctts_entry(&sc->ctts_data, &ctts_count, &sc->ctts_allocated_size, 1, duration);
2750 2752
2751 av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",2753 av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",
2752 count, duration);2754 count, duration);
@@ -3049,7 +3051,6 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 296 unmodified lines
3049 int64_t index;3051 int64_t index;
3050 int64_t index_ctts_count;3052 int64_t index_ctts_count;
3051 int flags;3053 int flags;
3052 unsigned int ctts_allocated_size = 0;
3053 int64_t start_dts = 0;3054 int64_t start_dts = 0;
3054 int64_t edit_list_media_time_dts = 0;3055 int64_t edit_list_media_time_dts = 0;
3055 int64_t edit_list_start_encountered = 0;3056 int64_t edit_list_start_encountered = 0;
@@ -3084,6 +3085,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 28 unmodified lines
3084 msc->ctts_count = 0;3085 msc->ctts_count = 0;
3085 msc->ctts_index = 0;3086 msc->ctts_index = 0;
3086 msc->ctts_sample = 0;3087 msc->ctts_sample = 0;
3088 msc->ctts_allocated_size = 0;
3087 3089
3088 // If the dts_shift is positive (in case of negative ctts values in mov),3090 // If the dts_shift is positive (in case of negative ctts values in mov),
3089 // then negate the DTS by dts_shift3091 // then negate the DTS by dts_shift
@@ -3193,7 +3195,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 103 unmodified lines
3193 ctts_sample_old++;3195 ctts_sample_old++;
3194 if (ctts_sample_old == ctts_data_old[ctts_index_old].count) {3196 if (ctts_sample_old == ctts_data_old[ctts_index_old].count) {
3195 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,3197 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,
3196 &ctts_allocated_size,3198 &msc->ctts_allocated_size,
3197 ctts_data_old[ctts_index_old].count - edit_list_start_ctts_sample,3199 ctts_data_old[ctts_index_old].count - edit_list_start_ctts_sample,
3198 ctts_data_old[ctts_index_old].duration) == -1) {3200 ctts_data_old[ctts_index_old].duration) == -1) {
3199 av_log(mov->fc, AV_LOG_ERROR, "Cannot add CTTS entry %"PRId64" - {%"PRId64", %d}\n",3201 av_log(mov->fc, AV_LOG_ERROR, "Cannot add CTTS entry %"PRId64" - {%"PRId64", %d}\n",
@@ -3292,7 +3294,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 92 unmodified lines
3292 3294
3293 if (ctts_data_old && ctts_sample_old != 0) {3295 if (ctts_data_old && ctts_sample_old != 0) {
3294 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,3296 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,
3295 &ctts_allocated_size,3297 &msc->ctts_allocated_size,
3296 ctts_sample_old - edit_list_start_ctts_sample,3298 ctts_sample_old - edit_list_start_ctts_sample,
3297 ctts_data_old[ctts_index_old].duration) == -1) {3299 ctts_data_old[ctts_index_old].duration) == -1) {
3298 av_log(mov->fc, AV_LOG_ERROR, "Cannot add CTTS entry %"PRId64" - {%"PRId64", %d}\n",3300 av_log(mov->fc, AV_LOG_ERROR, "Cannot add CTTS entry %"PRId64" - {%"PRId64", %d}\n",
@@ -4262,7 +4264,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 963 unmodified lines
4262 int64_t dts;4264 int64_t dts;
4263 int data_offset = 0;4265 int data_offset = 0;
4264 unsigned entries, first_sample_flags = frag->flags;4266 unsigned entries, first_sample_flags = frag->flags;
4265 int flags, distance, i, err, old_nb_index_entries;4267 int flags, distance, i;
4266 4268
4267 for (i = 0; i < c->fc->nb_streams; i++) {4269 for (i = 0; i < c->fc->nb_streams; i++) {
4268 if (c->fc->streams[i]->id == frag->track_id) {4270 if (c->fc->streams[i]->id == frag->track_id) {
@@ -4290,21 +4292,20 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 21 unmodified lines
4290 if (!sc->ctts_count && sc->sample_count)4292 if (!sc->ctts_count && sc->sample_count)
4291 {4293 {
4292 /* Complement ctts table if moov atom doesn't have ctts atom. */4294 /* Complement ctts table if moov atom doesn't have ctts atom. */
4293 ctts_data = av_realloc(NULL, sizeof(*sc->ctts_data));4295 ctts_data = av_fast_realloc(NULL, &sc->ctts_allocated_size, sizeof(*sc->ctts_data) * sc->sample_count);
4294 if (!ctts_data)4296 if (!ctts_data)
4295 return AVERROR(ENOMEM);4297 return AVERROR(ENOMEM);
4298 /* Don't use a count greater than 1 here since it will leave a gap in
4299 * the ctts index which the code below relies on being sequential. */
4296 sc->ctts_data = ctts_data;4300 sc->ctts_data = ctts_data;
4297 sc->ctts_data[sc->ctts_count].count = sc->sample_count;4301 for (i = 0; i < sc->sample_count; i++) {
4298 sc->ctts_data[sc->ctts_count].duration = 0;4302 sc->ctts_data[sc->ctts_count].count = 1;
4299 sc->ctts_count++;4303 sc->ctts_data[sc->ctts_count].duration = 0;
4304 sc->ctts_count++;
4305 }
4300 }4306 }
4301 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))4307 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
4302 return AVERROR_INVALIDDATA;4308 return AVERROR_INVALIDDATA;
4303 if ((err = av_reallocp_array(&sc->ctts_data, entries + sc->ctts_count,
4304 sizeof(*sc->ctts_data))) < 0) {
4305 sc->ctts_count = 0;
4306 return err;
4307 }
4308 if (flags & MOV_TRUN_DATA_OFFSET) data_offset = avio_rb32(pb);4309 if (flags & MOV_TRUN_DATA_OFFSET) data_offset = avio_rb32(pb);
4309 if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);4310 if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
4310 dts = sc->track_end - sc->time_offset;4311 dts = sc->track_end - sc->time_offset;
@@ -4315,26 +4316,28 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 4 unmodified lines
4315 unsigned sample_size = frag->size;4316 unsigned sample_size = frag->size;
4316 int sample_flags = i ? frag->flags : first_sample_flags;4317 int sample_flags = i ? frag->flags : first_sample_flags;
4317 unsigned sample_duration = frag->duration;4318 unsigned sample_duration = frag->duration;
4319 unsigned ctts_duration = 0;
4318 int keyframe = 0;4320 int keyframe = 0;
4321 int ctts_index = 0;
4322 int old_nb_index_entries = st->nb_index_entries;
4319 4323
4320 if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);4324 if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);
4321 if (flags & MOV_TRUN_SAMPLE_SIZE) sample_size = avio_rb32(pb);4325 if (flags & MOV_TRUN_SAMPLE_SIZE) sample_size = avio_rb32(pb);
4322 if (flags & MOV_TRUN_SAMPLE_FLAGS) sample_flags = avio_rb32(pb);4326 if (flags & MOV_TRUN_SAMPLE_FLAGS) sample_flags = avio_rb32(pb);
4323 sc->ctts_data[sc->ctts_count].count = 1;4327 if (flags & MOV_TRUN_SAMPLE_CTS) ctts_duration = avio_rb32(pb);
4324 sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?4328
4325 avio_rb32(pb) : 0;4329 mov_update_dts_shift(sc, ctts_duration);
4326 mov_update_dts_shift(sc, sc->ctts_data[sc->ctts_count].duration);
4327 if (frag->time != AV_NOPTS_VALUE) {4330 if (frag->time != AV_NOPTS_VALUE) {
4328 if (c->use_mfra_for == FF_MOV_FLAG_MFRA_PTS) {4331 if (c->use_mfra_for == FF_MOV_FLAG_MFRA_PTS) {
4329 int64_t pts = frag->time;4332 int64_t pts = frag->time;
4330 av_log(c->fc, AV_LOG_DEBUG, "found frag time %"PRId644333 av_log(c->fc, AV_LOG_DEBUG, "found frag time %"PRId64
4331 " sc->dts_shift %d ctts.duration %d"4334 " sc->dts_shift %d ctts.duration %d"
4332 " sc->time_offset %"PRId64" flags & MOV_TRUN_SAMPLE_CTS %d\n", pts,4335 " sc->time_offset %"PRId64" flags & MOV_TRUN_SAMPLE_CTS %d\n", pts,
4333 sc->dts_shift, sc->ctts_data[sc->ctts_count].duration,4336 sc->dts_shift, ctts_duration,
4334 sc->time_offset, flags & MOV_TRUN_SAMPLE_CTS);4337 sc->time_offset, flags & MOV_TRUN_SAMPLE_CTS);
4335 dts = pts - sc->dts_shift;4338 dts = pts - sc->dts_shift;
4336 if (flags & MOV_TRUN_SAMPLE_CTS) {4339 if (flags & MOV_TRUN_SAMPLE_CTS) {
4337 dts -= sc->ctts_data[sc->ctts_count].duration;4340 dts -= ctts_duration;
4338 } else {4341 } else {
4339 dts -= sc->time_offset;4342 dts -= sc->time_offset;
4340 }4343 }
@@ -4346,7 +4349,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 5 unmodified lines
4346 }4349 }
4347 frag->time = AV_NOPTS_VALUE;4350 frag->time = AV_NOPTS_VALUE;
4348 }4351 }
4349 sc->ctts_count++;4352
4350 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)4353 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
4351 keyframe = 1;4354 keyframe = 1;
4352 else4355 else
@@ -4355,19 +4358,38 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 2 unmodified lines
4355 MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));4358 MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
4356 if (keyframe)4359 if (keyframe)
4357 distance = 0;4360 distance = 0;
4358 old_nb_index_entries = st->nb_index_entries;4361 ctts_index = av_add_index_entry(st, offset, dts, sample_size, distance,
4359 err = av_add_index_entry(st, offset, dts, sample_size, distance,4362 keyframe ? AVINDEX_KEYFRAME : 0);
4360 keyframe ? AVINDEX_KEYFRAME : 0);4363 if (ctts_index >= 0 && old_nb_index_entries < st->nb_index_entries) {
4361 if (err < 0) {4364 unsigned int size_needed = st->nb_index_entries * sizeof(*sc->ctts_data);
4365 unsigned int request_size = size_needed > sc->ctts_allocated_size ?
4366 FFMAX(size_needed, 2 * sc->ctts_allocated_size) : size_needed;
4367 ctts_data = av_fast_realloc(sc->ctts_data, &sc->ctts_allocated_size, request_size);
4368 if (!ctts_data) {
4369 av_freep(&sc->ctts_data);
4370 return AVERROR(ENOMEM);
4371 }
4372
4373 sc->ctts_data = ctts_data;
4374 if (ctts_index != old_nb_index_entries) {
4375 memmove(sc->ctts_data + ctts_index + 1, sc->ctts_data + ctts_index,
4376 sizeof(*sc->ctts_data) * (sc->ctts_count - ctts_index));
4377 if (ctts_index <= sc->current_sample) {
4378 // if we inserted a new item before the current sample, move the
4379 // counter ahead so it is still pointing to the same sample.
4380 sc->current_sample++;
4381 }
4382 }
4383
4384 sc->ctts_data[ctts_index].count = 1;
4385 sc->ctts_data[ctts_index].duration = ctts_duration;
4386 sc->ctts_count++;
4387 } else {
4362 av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");4388 av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
4363 } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries &&
4364 st->nb_index_entries != old_nb_index_entries) {
4365 // if we inserted a new item before the current sample, move the
4366 // counter ahead so it is still pointing to the same sample.
4367 sc->current_sample++;
4368 }4389 }
4390
4369 av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "4391 av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
4370 "size %u, distance %d, keyframe %d\n", st->index, err,4392 "size %u, distance %d, keyframe %d\n", st->index, ctts_index,
4371 offset, dts, sample_size, distance, keyframe);4393 offset, dts, sample_size, distance, keyframe);
4372 distance++;4394 distance++;
4373 dts += sample_duration;4395 dts += sample_duration;
tests/fate/seek.mak+3−0
@@ -248,7 +248,10 @@ FATE_SEEK += $(FATE_SEEK_LAVF-yes:%=fate-seek-lavf-%) · 247 unmodified lines
248FATE_SEEK_EXTRA-$(CONFIG_MP3_DEMUXER) += fate-seek-extra-mp3248FATE_SEEK_EXTRA-$(CONFIG_MP3_DEMUXER) += fate-seek-extra-mp3
249FATE_SEEK_EXTRA-$(call ALLYES, CACHE_PROTOCOL PIPE_PROTOCOL MP3_DEMUXER) += fate-seek-cache-pipe249FATE_SEEK_EXTRA-$(call ALLYES, CACHE_PROTOCOL PIPE_PROTOCOL MP3_DEMUXER) += fate-seek-cache-pipe
250FATE_SEEK_EXTRA-$(CONFIG_MATROSKA_DEMUXER) += fate-seek-mkv-codec-delay250FATE_SEEK_EXTRA-$(CONFIG_MATROSKA_DEMUXER) += fate-seek-mkv-codec-delay
251FATE_SEEK_EXTRA-$(CONFIG_MOV_DEMUXER) += fate-seek-extra-mp4
252
251fate-seek-extra-mp3: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/gapless/gapless.mp3 -fastseek 1253fate-seek-extra-mp3: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/gapless/gapless.mp3 -fastseek 1
254fate-seek-extra-mp4: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mov/buck480p30_na.mp4 -duration 180 -frames 4
252fate-seek-cache-pipe: CMD = cat $(TARGET_SAMPLES)/gapless/gapless.mp3 | run libavformat/tests/seek$(EXESUF) cache:pipe:0 -read_ahead_limit -1255fate-seek-cache-pipe: CMD = cat $(TARGET_SAMPLES)/gapless/gapless.mp3 | run libavformat/tests/seek$(EXESUF) cache:pipe:0 -read_ahead_limit -1
253fate-seek-mkv-codec-delay: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mkv/codec_delay_opus.mkv256fate-seek-mkv-codec-delay: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mkv/codec_delay_opus.mkv
254 257
tests/ref/seek/extra-mp4+134−0
@@ -0,0 +1,134 @@
1ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
2ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
3ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
4ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
5ret: 0 st:-1 flags:0 ts:-1.000000
6ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
7ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
8ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
9ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
10ret: 0 st:-1 flags:1 ts: 101.894167
11ret: 0 st: 0 flags:1 dts: 101.300000 pts: 101.333333 pos:10982311 size: 67237
12ret: 0 st: 0 flags:0 dts: 101.333333 pts: 101.433333 pos:11049548 size: 3524
13ret: 0 st: 0 flags:0 dts: 101.366667 pts: 101.366667 pos:11053072 size: 562
14ret: 0 st: 0 flags:0 dts: 101.400000 pts: 101.400000 pos:11053634 size: 599
15ret: 0 st: 0 flags:0 ts: 24.788333
16ret: 0 st: 0 flags:1 dts: 25.300000 pts: 25.333333 pos:2607246 size: 40273
17ret: 0 st: 0 flags:0 dts: 25.333333 pts: 25.433333 pos:2647519 size: 2959
18ret: 0 st: 0 flags:0 dts: 25.366667 pts: 25.366667 pos:2650478 size: 197
19ret: 0 st: 0 flags:0 dts: 25.400000 pts: 25.400000 pos:2650675 size: 230
20ret: 0 st: 0 flags:1 ts: 127.682500
21ret: 0 st: 0 flags:1 dts: 126.633333 pts: 126.666667 pos:13359975 size: 68741
22ret: 0 st: 0 flags:0 dts: 126.666667 pts: 126.766667 pos:13428716 size: 2914
23ret: 0 st: 0 flags:0 dts: 126.700000 pts: 126.700000 pos:13431630 size: 781
24ret: 0 st: 0 flags:0 dts: 126.733333 pts: 126.733333 pos:13432411 size: 817
25ret: 0 st:-1 flags:0 ts: 50.576668
26ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
27ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
28ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
29ret: 0 st: 0 flags:0 dts: 50.700000 pts: 50.700000 pos:5927614 size: 176
30ret: 0 st:-1 flags:1 ts: 153.470835
31ret: 0 st: 0 flags:1 dts: 153.466667 pts: 153.500000 pos:15867700 size: 96169
32ret: 0 st: 0 flags:0 dts: 153.500000 pts: 153.533333 pos:15963869 size: 785
33ret: 0 st: 0 flags:0 dts: 153.533333 pts: 153.633333 pos:15964654 size: 3135
34ret: 0 st: 0 flags:0 dts: 153.566667 pts: 153.566667 pos:15967789 size: 859
35ret: 0 st: 0 flags:0 ts: 76.365000
36ret: 0 st: 0 flags:1 dts: 77.833333 pts: 77.866667 pos:8659657 size: 41182
37ret: 0 st: 0 flags:0 dts: 77.866667 pts: 77.966667 pos:8700839 size: 4197
38ret: 0 st: 0 flags:0 dts: 77.900000 pts: 77.900000 pos:8705036 size: 653
39ret: 0 st: 0 flags:0 dts: 77.933333 pts: 77.933333 pos:8705689 size: 751
40ret: 0 st: 0 flags:1 ts:-0.740833
41ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
42ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
43ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
44ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
45ret: 0 st:-1 flags:0 ts: 102.153336
46ret: 0 st: 0 flags:1 dts: 104.066667 pts: 104.100000 pos:11116461 size:112929
47ret: 0 st: 0 flags:0 dts: 104.100000 pts: 104.133333 pos:11229390 size: 585
48ret: 0 st: 0 flags:0 dts: 104.133333 pts: 104.166667 pos:11229975 size: 797
49ret: 0 st: 0 flags:0 dts: 104.166667 pts: 104.200000 pos:11230772 size: 810
50ret: 0 st:-1 flags:1 ts: 25.047503
51ret: 0 st: 0 flags:1 dts: 20.233333 pts: 20.266667 pos:2223959 size: 51823
52ret: 0 st: 0 flags:0 dts: 20.266667 pts: 20.300000 pos:2275782 size: 488
53ret: 0 st: 0 flags:0 dts: 20.300000 pts: 20.400000 pos:2276270 size: 670
54ret: 0 st: 0 flags:0 dts: 20.333333 pts: 20.333333 pos:2276940 size: 84
55ret: 0 st: 0 flags:0 ts: 127.941667
56ret: 0 st: 0 flags:1 dts: 131.233333 pts: 131.266667 pos:13727953 size: 62229
57ret: 0 st: 0 flags:0 dts: 131.266667 pts: 131.366667 pos:13790182 size: 2349
58ret: 0 st: 0 flags:0 dts: 131.300000 pts: 131.300000 pos:13792531 size: 571
59ret: 0 st: 0 flags:0 dts: 131.333333 pts: 131.333333 pos:13793102 size: 1190
60ret: 0 st: 0 flags:1 ts: 50.835833
61ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
62ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
63ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
64ret: 0 st: 0 flags:0 dts: 50.700000 pts: 50.700000 pos:5927614 size: 176
65ret: 0 st:-1 flags:0 ts: 153.730004
66ret: 0 st: 0 flags:1 dts: 157.033333 pts: 157.066667 pos:16225365 size: 82738
67ret: 0 st: 0 flags:0 dts: 157.066667 pts: 157.166667 pos:16308103 size: 2273
68ret: 0 st: 0 flags:0 dts: 157.100000 pts: 157.100000 pos:16310376 size: 350
69ret: 0 st: 0 flags:0 dts: 157.133333 pts: 157.133333 pos:16310726 size: 337
70ret: 0 st:-1 flags:1 ts: 76.624171
71ret: 0 st: 0 flags:1 dts: 75.966667 pts: 76.000000 pos:8520178 size: 94395
72ret: 0 st: 0 flags:0 dts: 76.000000 pts: 76.100000 pos:8614573 size: 483
73ret: 0 st: 0 flags:0 dts: 76.033333 pts: 76.033333 pos:8615056 size: 37
74ret: 0 st: 0 flags:0 dts: 76.066667 pts: 76.066667 pos:8615093 size: 56
75ret: 0 st: 0 flags:0 ts:-0.481667
76ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
77ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
78ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
79ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
80ret: 0 st: 0 flags:1 ts: 102.412500
81ret: 0 st: 0 flags:1 dts: 101.300000 pts: 101.333333 pos:10982311 size: 67237
82ret: 0 st: 0 flags:0 dts: 101.333333 pts: 101.433333 pos:11049548 size: 3524
83ret: 0 st: 0 flags:0 dts: 101.366667 pts: 101.366667 pos:11053072 size: 562
84ret: 0 st: 0 flags:0 dts: 101.400000 pts: 101.400000 pos:11053634 size: 599
85ret: 0 st:-1 flags:0 ts: 25.306672
86ret: 0 st: 0 flags:1 dts: 27.400000 pts: 27.433333 pos:2674605 size:127383
87ret: 0 st: 0 flags:0 dts: 27.433333 pts: 27.466667 pos:2801988 size: 68
88ret: 0 st: 0 flags:0 dts: 27.466667 pts: 27.500000 pos:2802268 size: 1754
89ret: 0 st: 0 flags:0 dts: 27.500000 pts: 27.533333 pos:2804022 size: 4071
90ret: 0 st:-1 flags:1 ts: 128.200839
91ret: 0 st: 0 flags:1 dts: 127.833333 pts: 127.866667 pos:13514072 size: 67382
92ret: 0 st: 0 flags:0 dts: 127.866667 pts: 127.966667 pos:13581454 size: 2936
93ret: 0 st: 0 flags:0 dts: 127.900000 pts: 127.900000 pos:13584390 size: 451
94ret: 0 st: 0 flags:0 dts: 127.933333 pts: 127.933333 pos:13584841 size: 537
95ret: 0 st: 0 flags:0 ts: 51.095011
96ret: 0 st: 0 flags:1 dts: 52.033333 pts: 52.066667 pos:6028050 size:115809
97ret: 0 st: 0 flags:0 dts: 52.066667 pts: 52.166667 pos:6143859 size: 1620
98ret: 0 st: 0 flags:0 dts: 52.100000 pts: 52.100000 pos:6145479 size: 92
99ret: 0 st: 0 flags:0 dts: 52.133333 pts: 52.133333 pos:6145571 size: 533
100ret: 0 st: 0 flags:1 ts: 153.989178
101ret: 0 st: 0 flags:1 dts: 153.466667 pts: 153.500000 pos:15867700 size: 96169
102ret: 0 st: 0 flags:0 dts: 153.500000 pts: 153.533333 pos:15963869 size: 785
103ret: 0 st: 0 flags:0 dts: 153.533333 pts: 153.633333 pos:15964654 size: 3135
104ret: 0 st: 0 flags:0 dts: 153.566667 pts: 153.566667 pos:15967789 size: 859
105ret: 0 st:-1 flags:0 ts: 76.883340
106ret: 0 st: 0 flags:1 dts: 77.833333 pts: 77.866667 pos:8659657 size: 41182
107ret: 0 st: 0 flags:0 dts: 77.866667 pts: 77.966667 pos:8700839 size: 4197
108ret: 0 st: 0 flags:0 dts: 77.900000 pts: 77.900000 pos:8705036 size: 653
109ret: 0 st: 0 flags:0 dts: 77.933333 pts: 77.933333 pos:8705689 size: 751
110ret: 0 st:-1 flags:1 ts:-0.222493
111ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
112ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
113ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
114ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
115ret: 0 st: 0 flags:0 ts: 102.671678
116ret: 0 st: 0 flags:1 dts: 104.066667 pts: 104.100000 pos:11116461 size:112929
117ret: 0 st: 0 flags:0 dts: 104.100000 pts: 104.133333 pos:11229390 size: 585
118ret: 0 st: 0 flags:0 dts: 104.133333 pts: 104.166667 pos:11229975 size: 797
119ret: 0 st: 0 flags:0 dts: 104.166667 pts: 104.200000 pos:11230772 size: 810
120ret: 0 st: 0 flags:1 ts: 25.565844
121ret: 0 st: 0 flags:1 dts: 25.300000 pts: 25.333333 pos:2607246 size: 40273
122ret: 0 st: 0 flags:0 dts: 25.333333 pts: 25.433333 pos:2647519 size: 2959
123ret: 0 st: 0 flags:0 dts: 25.366667 pts: 25.366667 pos:2650478 size: 197
124ret: 0 st: 0 flags:0 dts: 25.400000 pts: 25.400000 pos:2650675 size: 230
125ret: 0 st:-1 flags:0 ts: 128.460008
126ret: 0 st: 0 flags:1 dts: 131.233333 pts: 131.266667 pos:13727953 size: 62229
127ret: 0 st: 0 flags:0 dts: 131.266667 pts: 131.366667 pos:13790182 size: 2349
128ret: 0 st: 0 flags:0 dts: 131.300000 pts: 131.300000 pos:13792531 size: 571
129ret: 0 st: 0 flags:0 dts: 131.333333 pts: 131.333333 pos:13793102 size: 1190
130ret: 0 st:-1 flags:1 ts: 51.354175
131ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
132ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
133ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
134ret: 0 st: 0 flags:0 dts: 50.700000 pts: 50.700000 pos:5927614 size: 176

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t