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
137137 unsigned int stts_count;
138138 MOVStts *stts_data;
139139 unsigned int ctts_count;
140+ unsigned int ctts_allocated_size;
140141 MOVStts *ctts_data;
141142 unsigned int stsc_count;
142143 MOVStsc *stsc_data;
libavformat/mov.c+57−35
@@ -74,6 +74,8 @@ typedef struct MOVParseTableEntry { · 73 unmodified lines
7474
7575 static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom);
7676 static int mov_read_mfra(MOVContext *c, AVIOContext *f);
77+static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int* ctts_count, unsigned int* allocated_size,
78+ int count, int duration);
7779
7880 static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb,
7981 unsigned len, const char *key)
@@ -2711,7 +2713,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 2631 unmodified lines
27112713 {
27122714 AVStream *st;
27132715 MOVStreamContext *sc;
2714− unsigned int i, entries, ctts_count = 0;
2716+ unsigned int i, j, entries, ctts_count = 0;
27152717
27162718 if (c->fc->nb_streams < 1)
27172719 return 0;
@@ -2729,7 +2731,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 11 unmodified lines
27292731 if (entries >= UINT_MAX / sizeof(*sc->ctts_data))
27302732 return AVERROR_INVALIDDATA;
27312733 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));
27332735 if (!sc->ctts_data)
27342736 return AVERROR(ENOMEM);
27352737
@@ -2744,9 +2746,9 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 8 unmodified lines
27442746 continue;
27452747 }
27462748
2747− sc->ctts_data[ctts_count].count = count;
2748− sc->ctts_data[ctts_count].duration = duration;
2749− ctts_count++;
2749+ /* Expand entries such that we have a 1-1 mapping with samples. */
2750+ for (j = 0; j < count; j++)
2751+ add_ctts_entry(&sc->ctts_data, &ctts_count, &sc->ctts_allocated_size, 1, duration);
27502752
27512753 av_log(c->fc, AV_LOG_TRACE, "count=%d, duration=%d\n",
27522754 count, duration);
@@ -3049,7 +3051,6 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 296 unmodified lines
30493051 int64_t index;
30503052 int64_t index_ctts_count;
30513053 int flags;
3052− unsigned int ctts_allocated_size = 0;
30533054 int64_t start_dts = 0;
30543055 int64_t edit_list_media_time_dts = 0;
30553056 int64_t edit_list_start_encountered = 0;
@@ -3084,6 +3085,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 28 unmodified lines
30843085 msc->ctts_count = 0;
30853086 msc->ctts_index = 0;
30863087 msc->ctts_sample = 0;
3088+ msc->ctts_allocated_size = 0;
30873089
30883090 // If the dts_shift is positive (in case of negative ctts values in mov),
30893091 // then negate the DTS by dts_shift
@@ -3193,7 +3195,7 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) · 103 unmodified lines
31933195 ctts_sample_old++;
31943196 if (ctts_sample_old == ctts_data_old[ctts_index_old].count) {
31953197 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,
3196− &ctts_allocated_size,
3198+ &msc->ctts_allocated_size,
31973199 ctts_data_old[ctts_index_old].count - edit_list_start_ctts_sample,
31983200 ctts_data_old[ctts_index_old].duration) == -1) {
31993201 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
32923294
32933295 if (ctts_data_old && ctts_sample_old != 0) {
32943296 if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count,
3295− &ctts_allocated_size,
3297+ &msc->ctts_allocated_size,
32963298 ctts_sample_old - edit_list_start_ctts_sample,
32973299 ctts_data_old[ctts_index_old].duration) == -1) {
32983300 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
42624264 int64_t dts;
42634265 int data_offset = 0;
42644266 unsigned entries, first_sample_flags = frag->flags;
4265− int flags, distance, i, err, old_nb_index_entries;
4267+ int flags, distance, i;
42664268
42674269 for (i = 0; i < c->fc->nb_streams; i++) {
42684270 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
42904292 if (!sc->ctts_count && sc->sample_count)
42914293 {
42924294 /* 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);
42944296 if (!ctts_data)
42954297 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. */
42964300 sc->ctts_data = ctts_data;
4297− sc->ctts_data[sc->ctts_count].count = sc->sample_count;
4298− sc->ctts_data[sc->ctts_count].duration = 0;
4299− sc->ctts_count++;
4301+ for (i = 0; i < sc->sample_count; i++) {
4302+ sc->ctts_data[sc->ctts_count].count = 1;
4303+ sc->ctts_data[sc->ctts_count].duration = 0;
4304+ sc->ctts_count++;
4305+ }
43004306 }
43014307 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
43024308 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− }
43084309 if (flags & MOV_TRUN_DATA_OFFSET) data_offset = avio_rb32(pb);
43094310 if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
43104311 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
43154316 unsigned sample_size = frag->size;
43164317 int sample_flags = i ? frag->flags : first_sample_flags;
43174318 unsigned sample_duration = frag->duration;
4319+ unsigned ctts_duration = 0;
43184320 int keyframe = 0;
4321+ int ctts_index = 0;
4322+ int old_nb_index_entries = st->nb_index_entries;
43194323
43204324 if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(pb);
43214325 if (flags & MOV_TRUN_SAMPLE_SIZE) sample_size = avio_rb32(pb);
43224326 if (flags & MOV_TRUN_SAMPLE_FLAGS) sample_flags = avio_rb32(pb);
4323− sc->ctts_data[sc->ctts_count].count = 1;
4324− sc->ctts_data[sc->ctts_count].duration = (flags & MOV_TRUN_SAMPLE_CTS) ?
4325− avio_rb32(pb) : 0;
4326− mov_update_dts_shift(sc, sc->ctts_data[sc->ctts_count].duration);
4327+ if (flags & MOV_TRUN_SAMPLE_CTS) ctts_duration = avio_rb32(pb);
4328+
4329+ mov_update_dts_shift(sc, ctts_duration);
43274330 if (frag->time != AV_NOPTS_VALUE) {
43284331 if (c->use_mfra_for == FF_MOV_FLAG_MFRA_PTS) {
43294332 int64_t pts = frag->time;
43304333 av_log(c->fc, AV_LOG_DEBUG, "found frag time %"PRId64
43314334 " sc->dts_shift %d ctts.duration %d"
43324335 " 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,
43344337 sc->time_offset, flags & MOV_TRUN_SAMPLE_CTS);
43354338 dts = pts - sc->dts_shift;
43364339 if (flags & MOV_TRUN_SAMPLE_CTS) {
4337− dts -= sc->ctts_data[sc->ctts_count].duration;
4340+ dts -= ctts_duration;
43384341 } else {
43394342 dts -= sc->time_offset;
43404343 }
@@ -4346,7 +4349,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 5 unmodified lines
43464349 }
43474350 frag->time = AV_NOPTS_VALUE;
43484351 }
4349− sc->ctts_count++;
4352+
43504353 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
43514354 keyframe = 1;
43524355 else
@@ -4355,19 +4358,38 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 2 unmodified lines
43554358 MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
43564359 if (keyframe)
43574360 distance = 0;
4358− old_nb_index_entries = st->nb_index_entries;
4359− err = av_add_index_entry(st, offset, dts, sample_size, distance,
4360− keyframe ? AVINDEX_KEYFRAME : 0);
4361− if (err < 0) {
4361+ ctts_index = av_add_index_entry(st, offset, dts, sample_size, distance,
4362+ keyframe ? AVINDEX_KEYFRAME : 0);
4363+ if (ctts_index >= 0 && old_nb_index_entries < st->nb_index_entries) {
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 {
43624388 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++;
43684389 }
4390+
43694391 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,
43714393 offset, dts, sample_size, distance, keyframe);
43724394 distance++;
43734395 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
248248 FATE_SEEK_EXTRA-$(CONFIG_MP3_DEMUXER) += fate-seek-extra-mp3
249249 FATE_SEEK_EXTRA-$(call ALLYES, CACHE_PROTOCOL PIPE_PROTOCOL MP3_DEMUXER) += fate-seek-cache-pipe
250250 FATE_SEEK_EXTRA-$(CONFIG_MATROSKA_DEMUXER) += fate-seek-mkv-codec-delay
251+FATE_SEEK_EXTRA-$(CONFIG_MOV_DEMUXER) += fate-seek-extra-mp4
252+
251253 fate-seek-extra-mp3: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/gapless/gapless.mp3 -fastseek 1
254+fate-seek-extra-mp4: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mov/buck480p30_na.mp4 -duration 180 -frames 4
252255 fate-seek-cache-pipe: CMD = cat $(TARGET_SAMPLES)/gapless/gapless.mp3 | run libavformat/tests/seek$(EXESUF) cache:pipe:0 -read_ahead_limit -1
253256 fate-seek-mkv-codec-delay: CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mkv/codec_delay_opus.mkv
254257
tests/ref/seek/extra-mp4+134−0
@@ -0,0 +1,134 @@
1+ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
2+ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
3+ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
4+ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
5+ret: 0 st:-1 flags:0 ts:-1.000000
6+ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
7+ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
8+ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
9+ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
10+ret: 0 st:-1 flags:1 ts: 101.894167
11+ret: 0 st: 0 flags:1 dts: 101.300000 pts: 101.333333 pos:10982311 size: 67237
12+ret: 0 st: 0 flags:0 dts: 101.333333 pts: 101.433333 pos:11049548 size: 3524
13+ret: 0 st: 0 flags:0 dts: 101.366667 pts: 101.366667 pos:11053072 size: 562
14+ret: 0 st: 0 flags:0 dts: 101.400000 pts: 101.400000 pos:11053634 size: 599
15+ret: 0 st: 0 flags:0 ts: 24.788333
16+ret: 0 st: 0 flags:1 dts: 25.300000 pts: 25.333333 pos:2607246 size: 40273
17+ret: 0 st: 0 flags:0 dts: 25.333333 pts: 25.433333 pos:2647519 size: 2959
18+ret: 0 st: 0 flags:0 dts: 25.366667 pts: 25.366667 pos:2650478 size: 197
19+ret: 0 st: 0 flags:0 dts: 25.400000 pts: 25.400000 pos:2650675 size: 230
20+ret: 0 st: 0 flags:1 ts: 127.682500
21+ret: 0 st: 0 flags:1 dts: 126.633333 pts: 126.666667 pos:13359975 size: 68741
22+ret: 0 st: 0 flags:0 dts: 126.666667 pts: 126.766667 pos:13428716 size: 2914
23+ret: 0 st: 0 flags:0 dts: 126.700000 pts: 126.700000 pos:13431630 size: 781
24+ret: 0 st: 0 flags:0 dts: 126.733333 pts: 126.733333 pos:13432411 size: 817
25+ret: 0 st:-1 flags:0 ts: 50.576668
26+ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
27+ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
28+ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
29+ret: 0 st: 0 flags:0 dts: 50.700000 pts: 50.700000 pos:5927614 size: 176
30+ret: 0 st:-1 flags:1 ts: 153.470835
31+ret: 0 st: 0 flags:1 dts: 153.466667 pts: 153.500000 pos:15867700 size: 96169
32+ret: 0 st: 0 flags:0 dts: 153.500000 pts: 153.533333 pos:15963869 size: 785
33+ret: 0 st: 0 flags:0 dts: 153.533333 pts: 153.633333 pos:15964654 size: 3135
34+ret: 0 st: 0 flags:0 dts: 153.566667 pts: 153.566667 pos:15967789 size: 859
35+ret: 0 st: 0 flags:0 ts: 76.365000
36+ret: 0 st: 0 flags:1 dts: 77.833333 pts: 77.866667 pos:8659657 size: 41182
37+ret: 0 st: 0 flags:0 dts: 77.866667 pts: 77.966667 pos:8700839 size: 4197
38+ret: 0 st: 0 flags:0 dts: 77.900000 pts: 77.900000 pos:8705036 size: 653
39+ret: 0 st: 0 flags:0 dts: 77.933333 pts: 77.933333 pos:8705689 size: 751
40+ret: 0 st: 0 flags:1 ts:-0.740833
41+ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
42+ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
43+ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
44+ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
45+ret: 0 st:-1 flags:0 ts: 102.153336
46+ret: 0 st: 0 flags:1 dts: 104.066667 pts: 104.100000 pos:11116461 size:112929
47+ret: 0 st: 0 flags:0 dts: 104.100000 pts: 104.133333 pos:11229390 size: 585
48+ret: 0 st: 0 flags:0 dts: 104.133333 pts: 104.166667 pos:11229975 size: 797
49+ret: 0 st: 0 flags:0 dts: 104.166667 pts: 104.200000 pos:11230772 size: 810
50+ret: 0 st:-1 flags:1 ts: 25.047503
51+ret: 0 st: 0 flags:1 dts: 20.233333 pts: 20.266667 pos:2223959 size: 51823
52+ret: 0 st: 0 flags:0 dts: 20.266667 pts: 20.300000 pos:2275782 size: 488
53+ret: 0 st: 0 flags:0 dts: 20.300000 pts: 20.400000 pos:2276270 size: 670
54+ret: 0 st: 0 flags:0 dts: 20.333333 pts: 20.333333 pos:2276940 size: 84
55+ret: 0 st: 0 flags:0 ts: 127.941667
56+ret: 0 st: 0 flags:1 dts: 131.233333 pts: 131.266667 pos:13727953 size: 62229
57+ret: 0 st: 0 flags:0 dts: 131.266667 pts: 131.366667 pos:13790182 size: 2349
58+ret: 0 st: 0 flags:0 dts: 131.300000 pts: 131.300000 pos:13792531 size: 571
59+ret: 0 st: 0 flags:0 dts: 131.333333 pts: 131.333333 pos:13793102 size: 1190
60+ret: 0 st: 0 flags:1 ts: 50.835833
61+ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
62+ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
63+ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
64+ret: 0 st: 0 flags:0 dts: 50.700000 pts: 50.700000 pos:5927614 size: 176
65+ret: 0 st:-1 flags:0 ts: 153.730004
66+ret: 0 st: 0 flags:1 dts: 157.033333 pts: 157.066667 pos:16225365 size: 82738
67+ret: 0 st: 0 flags:0 dts: 157.066667 pts: 157.166667 pos:16308103 size: 2273
68+ret: 0 st: 0 flags:0 dts: 157.100000 pts: 157.100000 pos:16310376 size: 350
69+ret: 0 st: 0 flags:0 dts: 157.133333 pts: 157.133333 pos:16310726 size: 337
70+ret: 0 st:-1 flags:1 ts: 76.624171
71+ret: 0 st: 0 flags:1 dts: 75.966667 pts: 76.000000 pos:8520178 size: 94395
72+ret: 0 st: 0 flags:0 dts: 76.000000 pts: 76.100000 pos:8614573 size: 483
73+ret: 0 st: 0 flags:0 dts: 76.033333 pts: 76.033333 pos:8615056 size: 37
74+ret: 0 st: 0 flags:0 dts: 76.066667 pts: 76.066667 pos:8615093 size: 56
75+ret: 0 st: 0 flags:0 ts:-0.481667
76+ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
77+ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
78+ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
79+ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
80+ret: 0 st: 0 flags:1 ts: 102.412500
81+ret: 0 st: 0 flags:1 dts: 101.300000 pts: 101.333333 pos:10982311 size: 67237
82+ret: 0 st: 0 flags:0 dts: 101.333333 pts: 101.433333 pos:11049548 size: 3524
83+ret: 0 st: 0 flags:0 dts: 101.366667 pts: 101.366667 pos:11053072 size: 562
84+ret: 0 st: 0 flags:0 dts: 101.400000 pts: 101.400000 pos:11053634 size: 599
85+ret: 0 st:-1 flags:0 ts: 25.306672
86+ret: 0 st: 0 flags:1 dts: 27.400000 pts: 27.433333 pos:2674605 size:127383
87+ret: 0 st: 0 flags:0 dts: 27.433333 pts: 27.466667 pos:2801988 size: 68
88+ret: 0 st: 0 flags:0 dts: 27.466667 pts: 27.500000 pos:2802268 size: 1754
89+ret: 0 st: 0 flags:0 dts: 27.500000 pts: 27.533333 pos:2804022 size: 4071
90+ret: 0 st:-1 flags:1 ts: 128.200839
91+ret: 0 st: 0 flags:1 dts: 127.833333 pts: 127.866667 pos:13514072 size: 67382
92+ret: 0 st: 0 flags:0 dts: 127.866667 pts: 127.966667 pos:13581454 size: 2936
93+ret: 0 st: 0 flags:0 dts: 127.900000 pts: 127.900000 pos:13584390 size: 451
94+ret: 0 st: 0 flags:0 dts: 127.933333 pts: 127.933333 pos:13584841 size: 537
95+ret: 0 st: 0 flags:0 ts: 51.095011
96+ret: 0 st: 0 flags:1 dts: 52.033333 pts: 52.066667 pos:6028050 size:115809
97+ret: 0 st: 0 flags:0 dts: 52.066667 pts: 52.166667 pos:6143859 size: 1620
98+ret: 0 st: 0 flags:0 dts: 52.100000 pts: 52.100000 pos:6145479 size: 92
99+ret: 0 st: 0 flags:0 dts: 52.133333 pts: 52.133333 pos:6145571 size: 533
100+ret: 0 st: 0 flags:1 ts: 153.989178
101+ret: 0 st: 0 flags:1 dts: 153.466667 pts: 153.500000 pos:15867700 size: 96169
102+ret: 0 st: 0 flags:0 dts: 153.500000 pts: 153.533333 pos:15963869 size: 785
103+ret: 0 st: 0 flags:0 dts: 153.533333 pts: 153.633333 pos:15964654 size: 3135
104+ret: 0 st: 0 flags:0 dts: 153.566667 pts: 153.566667 pos:15967789 size: 859
105+ret: 0 st:-1 flags:0 ts: 76.883340
106+ret: 0 st: 0 flags:1 dts: 77.833333 pts: 77.866667 pos:8659657 size: 41182
107+ret: 0 st: 0 flags:0 dts: 77.866667 pts: 77.966667 pos:8700839 size: 4197
108+ret: 0 st: 0 flags:0 dts: 77.900000 pts: 77.900000 pos:8705036 size: 653
109+ret: 0 st: 0 flags:0 dts: 77.933333 pts: 77.933333 pos:8705689 size: 751
110+ret: 0 st:-1 flags:1 ts:-0.222493
111+ret: 0 st: 0 flags:1 dts:-0.033333 pts: 0.000000 pos: 1287 size: 183
112+ret: 0 st: 0 flags:0 dts: 0.000000 pts: 0.033333 pos: 1470 size: 24
113+ret: 0 st: 0 flags:0 dts: 0.033333 pts: 0.066667 pos: 1494 size: 6779
114+ret: 0 st: 0 flags:0 dts: 0.066667 pts: 0.100000 pos: 8273 size: 11041
115+ret: 0 st: 0 flags:0 ts: 102.671678
116+ret: 0 st: 0 flags:1 dts: 104.066667 pts: 104.100000 pos:11116461 size:112929
117+ret: 0 st: 0 flags:0 dts: 104.100000 pts: 104.133333 pos:11229390 size: 585
118+ret: 0 st: 0 flags:0 dts: 104.133333 pts: 104.166667 pos:11229975 size: 797
119+ret: 0 st: 0 flags:0 dts: 104.166667 pts: 104.200000 pos:11230772 size: 810
120+ret: 0 st: 0 flags:1 ts: 25.565844
121+ret: 0 st: 0 flags:1 dts: 25.300000 pts: 25.333333 pos:2607246 size: 40273
122+ret: 0 st: 0 flags:0 dts: 25.333333 pts: 25.433333 pos:2647519 size: 2959
123+ret: 0 st: 0 flags:0 dts: 25.366667 pts: 25.366667 pos:2650478 size: 197
124+ret: 0 st: 0 flags:0 dts: 25.400000 pts: 25.400000 pos:2650675 size: 230
125+ret: 0 st:-1 flags:0 ts: 128.460008
126+ret: 0 st: 0 flags:1 dts: 131.233333 pts: 131.266667 pos:13727953 size: 62229
127+ret: 0 st: 0 flags:0 dts: 131.266667 pts: 131.366667 pos:13790182 size: 2349
128+ret: 0 st: 0 flags:0 dts: 131.300000 pts: 131.300000 pos:13792531 size: 571
129+ret: 0 st: 0 flags:0 dts: 131.333333 pts: 131.333333 pos:13793102 size: 1190
130+ret: 0 st:-1 flags:1 ts: 51.354175
131+ret: 0 st: 0 flags:1 dts: 50.600000 pts: 50.633333 pos:5858254 size: 67903
132+ret: 0 st: 0 flags:0 dts: 50.633333 pts: 50.733333 pos:5926157 size: 1307
133+ret: 0 st: 0 flags:0 dts: 50.666667 pts: 50.666667 pos:5927464 size: 150
134+ret: 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