{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":590882052,"defaultBranch":"mirego-main","name":"ExoPlayer","ownerLogin":"mirego","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2023-01-19T12:43:40.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1202891?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1700536954.0","currentOid":""},"activityList":{"items":[{"before":"cf4f4f2bf0681ce4226c9bc8641a687730d3c233","after":"e02ecb841ca29878ea944440a2c28ae9f167181c","ref":"refs/heads/mirego-main","pushedAt":"2023-11-21T03:22:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Increment version to 2.18.6.0035","shortMessageHtmlLink":"Increment version to 2.18.6.0035"}},{"before":"e5baed478c34d9e886e9276841119380fc6ba29c","after":null,"ref":"refs/heads/download_track_selection","pushedAt":"2023-11-21T03:22:34.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"}},{"before":"648937a3cb6d9e3536b98b74b43e9fb239b9adfe","after":"cf4f4f2bf0681ce4226c9bc8641a687730d3c233","ref":"refs/heads/mirego-main","pushedAt":"2023-11-21T03:22:33.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Enable access to MediaPeriod.getStreamKeys() in dash downloads (to fix download track selection) (#58)\n\nWe're doing our own custom track selection for downloads in our app.\r\nWe are using the StreamKeys to create the download request. The track\r\ngroups in the download helper were used directly to generate the stream\r\nkeys. Unfortunately, they don't exactly fit with the manifest. Some\r\ngroups can be inserted in the array (when there are embedded tracks,\r\nlike CCs embedded in video). I also realized the tracks are ordered\r\nwithin a group according to bitrate. So that could also lead to\r\ndownloading the wrong track.\r\n\r\nThis PR gives access to the periods from the download helper. That way\r\nwe can use the same internal process used by ExoPlayer when the\r\nDefaultTrackSelector is used, to map the runtime groups to the right\r\nmanifest group, discarding the ones that were added (so not directly\r\navailable in the manifest). We also give access to the\r\nDownloadTrackSelection, to avoid redoing our own implementation of an\r\nExoTrackSelection.","shortMessageHtmlLink":"Enable access to MediaPeriod.getStreamKeys() in dash downloads (to fi…"}},{"before":"7456245527289bb5c7b612dc874326401665e803","after":"e5baed478c34d9e886e9276841119380fc6ba29c","ref":"refs/heads/download_track_selection","pushedAt":"2023-11-21T03:21:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"PR comment","shortMessageHtmlLink":"PR comment"}},{"before":null,"after":"7456245527289bb5c7b612dc874326401665e803","ref":"refs/heads/download_track_selection","pushedAt":"2023-11-21T01:32:47.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Give access to MediaPeriods and DownloadTrackSelection, so the app can use the mapping of runtime track to manifest tracks (period.getStreamKeys())","shortMessageHtmlLink":"Give access to MediaPeriods and DownloadTrackSelection, so the app ca…"}},{"before":"62230b804fd014dac56dbbb6880f67365db8704c","after":"648937a3cb6d9e3536b98b74b43e9fb239b9adfe","ref":"refs/heads/mirego-main","pushedAt":"2023-11-03T12:58:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Increment version to 2.18.6.0034","shortMessageHtmlLink":"Increment version to 2.18.6.0034"}},{"before":"7762ef93f4cd08d9691ae0f6f15a9ccdd35c440f","after":null,"ref":"refs/heads/add_timeout_stack","pushedAt":"2023-11-03T12:57:39.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"}},{"before":"5e248c9cdb1af47cc3d28f22b76027d51c828c95","after":"62230b804fd014dac56dbbb6880f67365db8704c","ref":"refs/heads/mirego-main","pushedAt":"2023-11-03T12:57:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Log stack of timed out playback thread (#57)\n\nWe have a lot of TIMEOUT_OPERATION_DETACH_SURFACE in production.\r\nIncreasing the timeout delay had an impact, but didn't solve everything.\r\nThis PR logs the callstack of the playback thread when it times out. If\r\nwe see the same stacks too often, it might give us a clue as to what's\r\ngoing on.","shortMessageHtmlLink":"Log stack of timed out playback thread (#57)"}},{"before":null,"after":"7762ef93f4cd08d9691ae0f6f15a9ccdd35c440f","ref":"refs/heads/add_timeout_stack","pushedAt":"2023-11-03T10:20:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"output stack of playback thread","shortMessageHtmlLink":"output stack of playback thread"}},{"before":"f48e68332b243a7d644d97a6a76d9a6918100e53","after":"5e248c9cdb1af47cc3d28f22b76027d51c828c95","ref":"refs/heads/mirego-main","pushedAt":"2023-11-01T13:24:02.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Increment version to 2.18.6.0033","shortMessageHtmlLink":"Increment version to 2.18.6.0033"}},{"before":"42d996d04aa2ec2cc5c9ebf3b27e0fa93d25d7dd","after":"f48e68332b243a7d644d97a6a76d9a6918100e53","ref":"refs/heads/mirego-main","pushedAt":"2023-11-01T13:23:38.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Fix increment script for linux","shortMessageHtmlLink":"Fix increment script for linux"}},{"before":"60b8f31b31a2cb75915fa11ab5d3d711dd6dfe9e","after":null,"ref":"refs/heads/increment-version","pushedAt":"2023-10-31T13:28:05.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"}},{"before":"5d06656cdf717c7f71271f5863bd765c98929939","after":"42d996d04aa2ec2cc5c9ebf3b27e0fa93d25d7dd","ref":"refs/heads/mirego-main","pushedAt":"2023-10-31T13:28:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Automatically increment version (#56)\n\nAutomatically bump the Mirego version when running a build (in both\r\nfiles).\r\nDisclaimer: this script was barely tested and uses a clunky regex.","shortMessageHtmlLink":"Automatically increment version (#56)"}},{"before":"ab78d72b16dc0c6105afe68314b51273e5fe9e14","after":null,"ref":"refs/heads/throttle_buffer_size_reached_log","pushedAt":"2023-10-31T09:15:15.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"}},{"before":"6c2286d1edb730f3a3fa24cae4ca4ad5e0f2a639","after":"5d06656cdf717c7f71271f5863bd765c98929939","ref":"refs/heads/mirego-main","pushedAt":"2023-10-31T09:15:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Throttle a log that can spam (#55)\n\nLooking at Crashlytics, I saw a log spamming a few times.\r\n\r\nThis PR throttles the \"Target buffer size reached\" log. And also adds\r\nsome more details to it.","shortMessageHtmlLink":"Throttle a log that can spam (#55)"}},{"before":"6fe47a91baba1e7c34f6c7368a0785db5e0aef25","after":"60b8f31b31a2cb75915fa11ab5d3d711dd6dfe9e","ref":"refs/heads/increment-version","pushedAt":"2023-10-30T21:47:15.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Get version after increment","shortMessageHtmlLink":"Get version after increment"}},{"before":"d1b5b855e311c4a0d564f109fadc9430747ffe18","after":"6fe47a91baba1e7c34f6c7368a0785db5e0aef25","ref":"refs/heads/increment-version","pushedAt":"2023-10-30T18:19:08.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Change message","shortMessageHtmlLink":"Change message"}},{"before":"7f9db4aee257a0f5fdf1f1c9b625afa7d6cc7b2a","after":"d1b5b855e311c4a0d564f109fadc9430747ffe18","ref":"refs/heads/increment-version","pushedAt":"2023-10-30T18:16:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Add version number","shortMessageHtmlLink":"Add version number"}},{"before":null,"after":"7f9db4aee257a0f5fdf1f1c9b625afa7d6cc7b2a","ref":"refs/heads/increment-version","pushedAt":"2023-10-30T14:11:35.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"randy-sab-roy","name":"Randy Sab-Roy","path":"/randy-sab-roy","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/22605135?s=80&v=4"},"commit":{"message":"Automatically increment version on release","shortMessageHtmlLink":"Automatically increment version on release"}},{"before":null,"after":"ab78d72b16dc0c6105afe68314b51273e5fe9e14","ref":"refs/heads/throttle_buffer_size_reached_log","pushedAt":"2023-10-30T12:29:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Throttle a log than can spam","shortMessageHtmlLink":"Throttle a log than can spam"}},{"before":"e775f39314c7e000a52818b2376785b4c32669b0","after":"6c2286d1edb730f3a3fa24cae4ca4ad5e0f2a639","ref":"refs/heads/mirego-main","pushedAt":"2023-10-27T17:21:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Increase version to 2.18.6.0032","shortMessageHtmlLink":"Increase version to 2.18.6.0032"}},{"before":"b04ecde6dd5fcc90c8727f5d8d8177bfae692a5e","after":null,"ref":"refs/heads/fix_v_desync_audio_track_wrap_error","pushedAt":"2023-10-27T17:18:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"}},{"before":"8c0e45d4d7e175fbda2aeb3ad2330862843aa6b8","after":"e775f39314c7e000a52818b2376785b4c32669b0","ref":"refs/heads/mirego-main","pushedAt":"2023-10-27T17:18:20.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Fix wrong audio track wrap detection (Av desync) (#54)\n\nWhile testing DLAR on a slow device, I experienced severe AV desync and\r\nadditional performance issues.\r\n\r\nIt can happen that the audio track returns a raw playback head position\r\nof 0 for a little while, even though the state is still playing. After a\r\nlittle while the playback position returns to normal. But the issue is\r\nthat since it was smaller than its latest position, ExoPlayer assumes it\r\nhas wrapped (it wraps on an unsigned 32 bit). The wrap count is then\r\nused to compute an unsigned 64 bit that keeps track of the virtual\r\nposition. Since we wrongly incremented it once, the position used\r\ninternally is off by 4 GBs, completely breaking the AV sync (all\r\nremaining timestamps are rejected, since they're deemed spurious,\r\nrightly so). On top of that, since the timestamp is rejected, it\r\ncontinuously tries again at every update, reading the raw playhead\r\nposition, rejecting again, etc.\r\n\r\nWe just ignore the position 0. If it wrapped for real and got precisely\r\non 0 (unlikely, and infrequent), then it's going to take a few seconds\r\nbefore we get a new one. It only means we'll keep extrapolating from the\r\nprevious one, not getting an adjusted timestamp.","shortMessageHtmlLink":"Fix wrong audio track wrap detection (Av desync) (#54)"}},{"before":"004319db981a2b40434fd6ef377630b103eebb58","after":"8c0e45d4d7e175fbda2aeb3ad2330862843aa6b8","ref":"refs/heads/mirego-main","pushedAt":"2023-10-27T12:59:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Increase version to 2.18.6.0031","shortMessageHtmlLink":"Increase version to 2.18.6.0031"}},{"before":"596f7bd9925cd94142f390118aac31fbed776d6f","after":null,"ref":"refs/heads/fix_audio_codec_init_error","pushedAt":"2023-10-27T12:55:39.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"}},{"before":"9dd9bbde2b5f72e446aab92acb940d96b24a5316","after":"004319db981a2b40434fd6ef377630b103eebb58","ref":"refs/heads/mirego-main","pushedAt":"2023-10-27T12:55:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Fix audio codec init error (ERROR_CODE_DECODER_INIT_FAILED) (#53)\n\nSometimes we get playback errors 4001 (ERROR_CODE_DECODER_INIT_FAILED).\r\nIt can be repetitive and/or very frequent on some device models. I was\r\nable to reproduce it on such a device.\r\n\r\nThere seems to be an issue in the codec, where it fails to init when it\r\nwas used for unprotected content, and then for protected content. It was\r\nstill trying to use the internal unprotected surface from the previous\r\ninit.\r\n\r\nWhen that happens the codec resets itself. And there is a workaround for\r\nthat type of issue in ExoPlayer, that just retries to init again after a\r\n50 ms wait (so that the codec has reset itself). Usually, the second\r\ntime's the charm. But sometimes, it fails again (often on some devices).\r\nSince I was able to reproduce it, I noticed in the system logs that when\r\nit fails, the codec still tries to use the unprotected surface the\r\nsecond time (failing the init again). But when the retry succeeds, it's\r\na new surface, with the right attributes. What seems to happen is that\r\ndepending on the device performance, the codec might not have time to\r\ncomplete its post-init-fail reset before we try again.\r\n\r\nI've added a few retries. Instead of just trying once after 50 ms. We\r\nretry 3 times, adding 50 ms of additional delay every time (so we retry\r\nafter 50ms, if it fails, wait another 100, then potentially another 150\r\nms before a last retry)\r\n\r\nConfirmed the fix works, by reproducing again the issue where the init\r\nfailed the 2nd time, but it did succeed on the 3rd.","shortMessageHtmlLink":"Fix audio codec init error (ERROR_CODE_DECODER_INIT_FAILED) (#53)"}},{"before":null,"after":"b04ecde6dd5fcc90c8727f5d8d8177bfae692a5e","ref":"refs/heads/fix_v_desync_audio_track_wrap_error","pushedAt":"2023-10-26T21:12:58.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Fix wrong audio track wrap detection, leading to av desync on devices experiencing very bad momentary performance","shortMessageHtmlLink":"Fix wrong audio track wrap detection, leading to av desync on devices…"}},{"before":"eba58afef3fd96696e37fdfc6baadc0908366dc9","after":"596f7bd9925cd94142f390118aac31fbed776d6f","ref":"refs/heads/fix_audio_codec_init_error","pushedAt":"2023-10-26T20:46:29.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"PR comments","shortMessageHtmlLink":"PR comments"}},{"before":"ae7a6b163acde70f912b76cdafc41e6d164e31ef","after":"eba58afef3fd96696e37fdfc6baadc0908366dc9","ref":"refs/heads/fix_audio_codec_init_error","pushedAt":"2023-10-26T20:27:05.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Move sleep inside retry fn","shortMessageHtmlLink":"Move sleep inside retry fn"}},{"before":null,"after":"ae7a6b163acde70f912b76cdafc41e6d164e31ef","ref":"refs/heads/fix_audio_codec_init_error","pushedAt":"2023-10-26T20:14:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"SylvainMorel","name":null,"path":"/SylvainMorel","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/62572068?s=80&v=4"},"commit":{"message":"Retry codec init more than once","shortMessageHtmlLink":"Retry codec init more than once"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAADs9yOEgA","startCursor":null,"endCursor":null}},"title":"Activity · mirego/ExoPlayer"}