-
Notifications
You must be signed in to change notification settings - Fork 6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VolumeChangeReceiver triggers an IllegalStateException #10758
Comments
Do you create or use the player on a background thread that isn't the application main thread by any chance? Or is there anything else noteworthy about how you release the player? It certainly looks like a bug that this particular IllegalStateException is thrown and I'm trying to understand under which circumstances it can happen. |
@tonihei We're not creating the player from a background thread, to be 100% sure I reproduced it while asserting that it was the main thread. As far as releasing the player, it does happen inside of a fragment's onDestroy method, but when double checking - there's nothing noteworthy happening at the same time. I verified that our release method does only get called a single time, and to be extra sure it wasn't some strange interaction with our own I've been able to band-aid fix it by cloning the |
I tried to reproduce this in the ExoPlayer demo app by manually changing the volume and by programmatically inundating the listener with continuous artificial volume change events. This didn't trigger the problem, so I believe there is something in your setup that make this happen. Can you try to reproduce in the demo app to see what you changes to make this problem appear? I also tried to analyze the method calls to understand how this exception can possibly happen and found some possibilities that are not directly related to the volume changes. It seems the exception can happen if you overwrite a Could you check your listener implementations to see if/when you call any of these methods? We should also look into fixing this problem, but would be good to understand where it comes from exactly. |
Update: I can reproduce in a unit test that removes a listener from within the |
Aha, thanks for the thorough explanation on how it might be happening! I can definitely double check the cases you've outlined, just for some peace of mind. |
When we currently trigger the iteration finished event during the release, we don't mark the event as triggered. This means that someone can trigger another release from within the callback, which then tries to resend the event. Issue: #10758 #minor-release PiperOrigin-RevId: 488645089
When we currently trigger the iteration finished event during the release, we don't mark the event as triggered. This means that someone can trigger another release from within the callback, which then tries to resend the event. Issue: google/ExoPlayer#10758 #minor-release PiperOrigin-RevId: 488645089
When we currently trigger the iteration finished event during the release, we don't mark the event as triggered. This means that someone can trigger another release from within the callback, which then tries to resend the event. Issue: google/ExoPlayer#10758 PiperOrigin-RevId: 488645089 (cherry picked from commit 1def68b)
When we currently trigger the iteration finished event during the release, we don't mark the event as triggered. This means that someone can trigger another release from within the callback, which then tries to resend the event. Issue: #10758 #minor-release PiperOrigin-RevId: 488645089 (cherry picked from commit 3e5103a)
Bug was fixed by the commits above. |
* Provide access to original media timestamps in AudioSink. * Add `setOutputStreamOffsetUs(long)` method in `AudioSink`. * Add private methods `setOutputStreamOffsetUs(long)` method in `MediaCodecRenderer` and `DecoderAudioRenderer`. * Add protected method `onOutputStreamOffsetUs(long)` method in `MediaCodecRenderer`, in which: * `MediaCodecRenderer` itself will be no-op for this method. * `MediaCodecAudioRenderer` will propagate this value to its `audioSink`. * Add logics in `DecoderAudioRenderer` to calculate `outputStreamOffsetUs`. PiperOrigin-RevId: 479265429 (cherry picked from commit 4c73241058041fd978e9748b2158168d4e6e702d) * Add a FrameProcessor flag to drop the processed frame This mode is supported by using `C.TIME_UNSET` (which is a negative value). The new logic decouples the value of `C.TIME_UNSET` and the frame dropping behaviour. PiperOrigin-RevId: 479368880 (cherry picked from commit ccab9fba0369ea9709a6987024177e8b73a5c7ac) * Document the allowed values of TsPayloadReader.Flags IntDef PiperOrigin-RevId: 479569806 (cherry picked from commit 7c68b8d4500cb25779a473b52029944ec4d29543) * HDR: Disable tone mapping on unsupported pixel build ID. Also, update tests to allow AnyOf error codes, and no longer check exception messages, which caused quite a bit of churn. PiperOrigin-RevId: 479570861 (cherry picked from commit faa796d7365330d1f1d4f5b17901d6b1a78ce868) * Bump dexmaker version PiperOrigin-RevId: 479579252 (cherry picked from commit a6b9772f0e6f5a31baafb6965c3386d819d3c1e9) * Remove late frame dropping in FrameProcessor Currently, a frame is dropped if it's requested release time is in the past. This mode was added to support previewing. However, in normal ExoPlayer playback, slightly late frames (<30ms late) are also rendered. On MediaCodec side, this means calling `releaseOutputBuffer` with a release time in the past. PiperOrigin-RevId: 479615291 (cherry picked from commit 2188685c465aa6d641e78ab33eaa93fbb92185b8) * Adjust track selection with Dolby Vision if display does not support If the sample type is Dolby Vision and the display does not support Dolby Vision, then the capabilities DecoderSupport flag is set to DECODER_SUPPORT_FALLBACK_MIMETYPE. This denotes that the renderer will use a decoder for a fallback mimetype if possible. This alters track selection as tracks with DecoderSupport DECODER_SUPPORT_PRIMARY are preferred. UnitTests included -DefaultTrackSelector test that checks track selection reordering with DECODER_SUPPORT_FALLBACK_MIMETYPE -MediaCodecVideoRenderer test that checks setting of DecoderSupport flag based on Display's Dolby Vision support Issue: google/ExoPlayer#8944 PiperOrigin-RevId: 480040876 (cherry picked from commit a366590a0425ff138520752e2fc94c70429c20ab) * Treat NO_VALUE as zero when adding up total required bitrate We currently use the literal -1 (=NO_VALUE) when adding up the total. Tracks without known bitrate can be ignored in the calculation, but we should use an explicit value of 0. #minor-release Issue: google/ExoPlayer#10664 PiperOrigin-RevId: 480048126 (cherry picked from commit af19e0ea890e7b274b6f75f409f00f11e11c1c81) * Add local file picker to ConfigurationActivity PiperOrigin-RevId: 480349627 (cherry picked from commit 225d0dcdd1e7e7f1f41d8ac1d2dee7340c40cf3a) * Demo: Read long values from trim slider. Before, slider values were read as `floor()`'ed `longValue()`s, so that trimming to intervals less than one second would be interpreted as a request for a zero- duration trim. Also, rename `radiusRange` references here to `trimRange`, since this is not a radius range. PiperOrigin-RevId: 480401556 (cherry picked from commit 6c59f9ece40f6450405d29acd559492145158409) * Demo: Hide player controls by default. Player controls are somewhat distracting when showing the difference between the input and output video, as they obscure and darken the video players. PiperOrigin-RevId: 480597804 (cherry picked from commit 91a61cecbe37f4c5595f534ee237011289c0ac18) * Demo: Shorten trim range from 60 seconds to 10 seconds. Most demo videos aren't very long, and the default demo video is only 10 seconds. Shorten the maximum trim duration to 10 seconds, to demonstrate transformer functionality more easily, and allow this to be used more easily when trimming short sections of a longer video (ex. to make test clips) PiperOrigin-RevId: 480602037 (cherry picked from commit 3142a2127dc224e4c2124989b952a8bd1e06d510) * Add Cea608DecoderTest When debugging and fixing Issue: google/ExoPlayer#10666 I wanted to write a regression test, but needed to add a test first... This is just a small bit of coverage to start with. It checks the field/channel filtering works correctly, but doesn't check any styling info. It also doesn't test 'pop on' subtitles (i.e. when the subtitle isn't shown until a 'end of subtitle' signal is received). PiperOrigin-RevId: 480644568 (cherry picked from commit 6052212c15b89d71846f1f3855728ce863304bca) * Remove supportsSampleMimeType from Muxer.Factory - This method is redundant with getSupportedSampleMimeTypes(). - This is to prepare the Muxer class to become public. PiperOrigin-RevId: 480840902 (cherry picked from commit 8962f5a3f4b505224ceb22ac5771b85f24e30358) * Fix blank toast in Transformer Demo PiperOrigin-RevId: 480847967 (cherry picked from commit 446c9943f935541d7b76fc1dfa62ee969d775f60) * Migrate media constants from androidx.media.util.MediaConstants Adds root extras and metadata extras to MockMediaLibraryService and MockMediaBrowserCompatService and completed test cases for asserting interoperability with a media1 or Media3 browser. PiperOrigin-RevId: 480854842 (cherry picked from commit f95406e75d1eca9b96477132d33d752e2485bee6) * Ensure sessions without MediaPeriodId are ended after seek to new item We already have logic to end all session except the current one if the current one doesn't have a MediaPeriodId yet. This is assuming that this only happens after a seek on the app side where the player doesn't have detailled knowledge about the MediaPeriodIds yet. Currently this logic isn't triggered if the window we are coming from doesn't have its MediaPeriodId either as we run into another check that keeps sessions around until we have a valid windowSequenceNumber. Swapping both conditions fixes this case without breaking any of the other known transition scenarios. Issue: androidx/media#180 PiperOrigin-RevId: 480866465 (cherry picked from commit 6070d9110a9cec61f6073c7669f2f8185a635767) * Mark effectively-final PlayerControlView fields as actually final This means the null checker can be more sure that these fields don't get reassigned between a null-check and a usage. PiperOrigin-RevId: 481142004 (cherry picked from commit 248ee469ad243a86b66445f96782b915296eec4c) * Effect: Remove unused private int ouptutTexId in pixel tests. PiperOrigin-RevId: 481143798 (cherry picked from commit 026699bafc6d73bc63b6cf416ea183fc3d506039) * Fix the position of IntDef annotations on fields in the UI module PiperOrigin-RevId: 481150758 (cherry picked from commit 871a5e685e9bc78544107c803306320e7d53ee53) * Fix display settings window UI bug for foldable devices. PiperOrigin-RevId: 481215581 (cherry picked from commit 6cdaf2c031258221939eead3b11075a90e2c742c) * Add copybara annotated import statement for special cases PiperOrigin-RevId: 481605567 (cherry picked from commit fd315dadebe479f2cc75fb4fa482cb414270bdcf) * Add manifest to make gradle build work PiperOrigin-RevId: 481606248 (cherry picked from commit 325e973ace929efa193b114271d844f20814705a) * Add DefaultMuxer forwarding to FrameworkMuxer - The naming DefaultMuxer is more consistent with the rest of Transformer codebase (e.g. DefaultEncoderFactory). - By hiding the implementation details of DefaultMuxer, the transition to in-app Muxer will be seamless for apps using DefaultMuxer. - The current plan is that DefaultMuxer will become the in-app muxer. PiperOrigin-RevId: 481838790 (cherry picked from commit b4d7f066dd31cce1e3d7ab14cc47d3b7be364a88) * Remove more references to overriding layouts from Player(Control)View In exoplayer2 this affects StyledPlayer(Control)View #minor-release PiperOrigin-RevId: 481878940 (cherry picked from commit a5583c04bb6c199633e2b1edf036060c0d33b616) * Fix parameter comment block. #cleanup PiperOrigin-RevId: 481882181 (cherry picked from commit b6bd35860cda60f27439df737fdee815060ed6fe) * Remove deprecated setOutputMimeType This is to prepare Muxer to become public PiperOrigin-RevId: 481893842 (cherry picked from commit bd9181e6ba5daf865f9c2f4338f1238b108dafd8) * GL: Move loadAsset to GlProgram, where it's used. (Also, make some public methods private) PiperOrigin-RevId: 481912071 (cherry picked from commit a404fde4fa9d9d16b0be3c6e08dabd059c07f471) * Ensure onMediaItemTransition is sent for repeats of the same item Currently, repeating the same item (via seekNext/Previous) implicitly results in a seek to the default position of the current item, which looks exactly the same as a direct seek. As a result, we don't send onMediaItemTransition as we would for every other seekNext/Previous call. This can be fixed by explicitly marking the repeat case in the internal BasePlayer/ExoPlayerImpl methods, so that the callback can be triggered. Issue: google/ExoPlayer#10667 PiperOrigin-RevId: 481951788 (cherry picked from commit 76ce0cc69fa12a9b2592103da97dd45c15bfe4d3) * Test: Update MatrixProcessorPixelTest to use input width and height. Before, they used `width` and `height`, which was inconsistent with other pixel tests, and less descriptive. Refactoring change only. No functional change intended. PiperOrigin-RevId: 481970243 (cherry picked from commit 620d8c9479469f11bdd372e80d231a64e0132808) * Remove ForwardingPlayer special case from PlayerControlView.setPlayer This was originally added in https://github.com/google/ExoPlayer/commit/4fd7d777b669f6adacc3737a7e15b04a57f030fb, but it hasn't done anything since https://github.com/google/ExoPlayer/commit/98ee159df161c7c8806c0b0490b642738822f6a7 (when the instanceof ExoPlayer check was removed). PiperOrigin-RevId: 482161662 (cherry picked from commit 7d5f1a24be204321961aba81f2de5b1ce1328c71) * Effect: Remove unnecessary "this" qualifier `transformationMatrix` is not ambiguous, as there's no other local transformationMatrix variable nearby. PiperOrigin-RevId: 482184602 (cherry picked from commit c698ec51a24bdf42e2affad181d2a6d812cbe47b) * Make Muxer public The reason for making the Muxer public is that we want to add an option to disable or configure the timer that will throw when the muxer doesn't receive any data for a given period of time. PiperOrigin-RevId: 482199360 (cherry picked from commit d213b93958fce7e2a25851ec44b7c1938fcf0d7d) * HDR: Support RGBA_1010102 in GlUtil as a parameter. Make it easier to support use of RGBA_101012 rather than RGBA_8888 for EGL contexts, displays, and surfaces. This tangentially supports adding HDR tests, by slightly simplifying the color selection logic we'd have to add in HDR tests. PiperOrigin-RevId: 482219428 (cherry picked from commit 9e1adee4cbc3386672f42d580734175c442bdbea) * Corrected ordering of javadoc params PiperOrigin-RevId: 482231370 (cherry picked from commit 897722071e90f7b79527a75ac667a4e2143fbdfd) * Merge pull request #10578 from thucngv:release-v2 PiperOrigin-RevId: 481115402 (cherry picked from commit 9861f88f3db419553b893efd98a5e1a0c8c6287c) * Use static import for Assertions in MCVR PiperOrigin-RevId: 481122795 (cherry picked from commit 12f7174e1f8a2c2b1f36df749b43262efb88f60a) * Merge pull request #183 from jasper-apps:bugfix/make-download-notification-appear-immediately PiperOrigin-RevId: 482165983 (cherry picked from commit 405455b06c6d596552c695670664309319f5570c) * Map lib-effect from androidx to exoplayer2 PiperOrigin-RevId: 482179761 (cherry picked from commit 28c4be2f6bd56205e3b8128bf710c34b3b3d65e9) * Remove muxerFactory dependency on playerListener This listener will need to be passed to the MuxerWrapper to throw when the Transformer is stuck. PiperOrigin-RevId: 482433552 (cherry picked from commit e3f28421fd85f1c44135f24c3df1fac000834f67) * Change areSizeAndRateSupported to use PerfomancePoint.covers PiperOrigin-RevId: 482461219 (cherry picked from commit 0eb30eacc7f65f84e34e038567d0dd86dc4b6e2c) * Fix some incorrect comments in Cea608DecoderTest Also used all-caps consistently PiperOrigin-RevId: 483317405 (cherry picked from commit 6dcb9aaaa87d1a11a0eb41d1f80312796bceb55a) * Merge pull request #10618 from vishnuchilakala:fix/do_not_send_content_complete_if_midroll_skipped PiperOrigin-RevId: 482481703 (cherry picked from commit a413b478f7c45615d3fc7ebd31cacfc363e8ca31) * Merge pull request #162 from ittiam-systems:rtp-mp4a-latm PiperOrigin-RevId: 482490230 (cherry picked from commit fd2ba37b1d67576313aec0512d630331b7c99f4b) * Add DAI specific methods to AdPlaybackState PiperOrigin-RevId: 482755468 (cherry picked from commit a8e6894ad63271293a831d13419b1372fe0f387a) * Add CanIgnoreReturnValue to AudioProcessor#configure + implementations Although it can be useful to check the output format, it's not required or needed. For some AudioProcessor implementations, it is stated/obvious that the output format will match the input, in which case there is no a need to check the return value. #cleanup PiperOrigin-RevId: 483403679 (cherry picked from commit a7bfa12eecb42cbdd13bd7e612603a4d400ebda4) * Use int for an unsigned byte value in Cea608Decoder This is a no-op, but it's more 'correct' because it avoids any potential sign mix-ups that come from storing an unsigned byte (with a potentially set MSB) in a signed java byte variable. PiperOrigin-RevId: 483409798 (cherry picked from commit 3d0f43a149c846670480c993e09def1a2d2eeeea) * Clarify sideloaded subtitle example #minor-release PiperOrigin-RevId: 483633564 (cherry picked from commit eaf1f2153abca685fce6092a52eb4059bc61815a) * Add GL utility methods to get 4x4 identity and set identity PiperOrigin-RevId: 483671580 (cherry picked from commit f5ad4e098dd71bd4f99b87350e042acab4f95746) * Move AudioProcessor to common. PiperOrigin-RevId: 483699606 (cherry picked from commit dda17db261758f7211ffa793ee9cc6fea842addb) * Move `DefaultAudioSink.AudioProcessorChain` to `AudioProcessorChain` Split inner interface into separate file, which will go in common module. The old interface will be deprecated and extends the new. #cleanup PiperOrigin-RevId: 483732226 (cherry picked from commit ad52b68c738e8321b966b904d3cd2139f7a560ef) * Fix `Cea608Decoder` handling of service switch commands in field 2 From ANSI-CTA-608-E R-2014 section 8.4: > When closed captioning is used on line 21, field 2, it shall conform > to all of the applicable specifications and recommended practices as > defined for field 1 services with the following differences: > 1. The non-printing character of the miscellaneous control-character > pairs that fall in the range of 0x14, 0x20 to 0x14, 0x2F in field 1, > shall be replaced with 0x15, 0x20 to 0x15, 0x2F when used in field > 2. > 2. The non-printing character of the miscellaneous control-character > pairs that fall in the range of 0x1C, 0x20 to 0x1C, 0x2F in field > 1, shall be replaced with 0x1D, 0x20 to 0x1D, 0x2F when used in > field 2. This basically means that `cc1=0x15` in field 2 should be interpreted as `cc1=0x14` in field 1, and same for `0x1D -> 0x1C`. The `isMiscCode` method above already handles this by ignoring the LSB (the only difference between `0x14` and `0x15`, and `0x1C` and `0x1D`) by AND-ing with `0xF6` instead of `0xF7`. This change uses the same trick in `isServiceSwitchCommand`. Issue: google/ExoPlayer#10666 #minor-release PiperOrigin-RevId: 483927506 (cherry picked from commit 7c6d492ff19b6aead4cc6f1f9a426145fc1faa0d) * Mute input video player in transformer demo PiperOrigin-RevId: 483969411 (cherry picked from commit 8181b3c6a1aba32459d4a5975cc708cbf224b397) * Add AudioProcessor.AudioFormat equals method. PiperOrigin-RevId: 483983486 (cherry picked from commit c9585d0154980c576710d035be51eb472fbd6665) * Add muxer timer to detect when generating an output sample is too slow This allows to throw when the Transformer is stuck or is too slow. PiperOrigin-RevId: 484179037 (cherry picked from commit 376ee77f52bed47de54c6478b4006f1b25a543d0) * Make adding ad live breaks more robust This change makes adding ad events in live streams more robust by allowing ad groups to grow in number of ads if more ad events are received than initially announced by the SDK. With the IMA prefetch feature, an AdPod can grow in size in certain conditions like from initially 2 ads to 4 ads being part of the ad group. With this change, if an additional ad event arrives while the ad group is still being played, the ad group is expanded. If the event arrives late and the ad group is already completed, a new group is created for the remaining ads. This also covers the case where we join the live stream while an ad is being played and we missed at least one LOADED event from the SDK. Ads of the group before the first LOADED event are ignored in such a case. PiperOrigin-RevId: 484214760 (cherry picked from commit 136addf640e451602163be9e4272d1e27b8ed5b8) * Add test for muxer watchdog timer PiperOrigin-RevId: 484298261 (cherry picked from commit 42057cc9f8f81e24c64c629d2e11e7102afd0f30) * Upgrade dackka and fix some generation errors #minor-release PiperOrigin-RevId: 484483080 (cherry picked from commit fc1eca10f4934fd92c84db222815fc1e77ddd5f6) * Disable the muxer watchdog if all tracks have ended. PiperOrigin-RevId: 484512661 (cherry picked from commit 2390322a00a9e71f16dfe28088ae7cd3e462129f) * Bump appTargetSDKVersion to 33 #minor-release PiperOrigin-RevId: 484514123 (cherry picked from commit 1bbe7c11f8ad7dfbbf3fe30796414bd196f0df5a) * Tighten the wording for sending a pull request. PiperOrigin-RevId: 485036120 (cherry picked from commit 8030a492ff676fa32dc25fe48829c9a066529cd5) * Disable failing tests of FlacExtractorSeekTest PiperOrigin-RevId: 485061783 (cherry picked from commit 55b82ff8ae491f6bcc7f3901476d2b1571a10005) * Enfore minCompileSdk version when depending on ExoPlayer/Media3 libs If an app sets a compileSdkVersion that is lower than the one used to create AARs of its dependencies, the build process may produce invalid outputs, for example by stripping methods from the APK that are only called when the app is running on a new API version. To avoid this issue, we can enforce that the compileSdk of apps or libraries depending on ExoPlayer/Media3 is at least the same as the one we used for compilation when creating the AAR. Issue: google/ExoPlayer#10684 PiperOrigin-RevId: 485100067 (cherry picked from commit 23d39caea0bee0143705191fd97ac7f0cf9a76f9) * Removed move transformation for exoplayer2 audio package-info.java https://github.com/google/ExoPlayer/commit/dda17db261758f7211ffa793ee9cc6fea842addb creation of audio/package-info.java introduced a copybara conflict with the exoplayer2/audio/package-info.java move transformation in copy.bara.sky. Solution was to remove original package-info-common-audio.java and the move transformation as https://github.com/google/ExoPlayer/commit/dda17db261758f7211ffa793ee9cc6fea842addb now covers it. Tested with a copybara push to exoplayer github PiperOrigin-RevId: 485329674 (cherry picked from commit 972e169bd85b14848dcae75e34f9e95fe87e1f4b) * HDR: Generalize Pixel 6 workaround to TP PiperOrigin-RevId: 485366659 (cherry picked from commit 6de5d9336db68cab7ffa886869fe882af6299223) * Load bitmaps for `MediaMetadataCompat` and handle the metadata updates. * Add `Listener` in `MediaSession` with method `onNotificationRefreshRequired(MediaSession)`. * Add `MediaSessionService` as the listener of the `MediaSession` when `MediaSession` is added to `MediaSessionService` * Load bitmap when update metadata in `MediaSessionLegacyStub` and call `onNotificationRefreshRequired` when bitmap asynchronously arrives. PiperOrigin-RevId: 485376145 (cherry picked from commit 624238c6b6e621deed585cb19b63f117ae3f7e76) * Apply tone mapping workaround to Pixel Watch as well. Not sure what BUILD.ID the fix will first be applied on though. PiperOrigin-RevId: 485389618 (cherry picked from commit 2ddd645a3484aed4b9e519f99f4ab1bc989b6a0e) * Fix Dackka/Metalava errors in the effects module Public methods may only refer to public types in their signature. This change ensures that by switching to a public supertype everywhere. PiperOrigin-RevId: 485568625 (cherry picked from commit 3fdfe585ffe927c90f412b892101dbe01119b8df) * Fix Dackka javadoc errors in protected methods If there's an @param javadoc tag in a supertype then all overrides of this method that don't also override the javadoc must use the same parameter name. PiperOrigin-RevId: 485857711 (cherry picked from commit b8e5d708fc77a06e831abd7f2c2e57f68bb3720f) * Add 'Player.getVideoSurfaceSize' that returns the size of the surface on which the video is rendered. Design Doc: go/aaos-mu-media-dd PiperOrigin-RevId: 485884772 * HDR Test: Add link to tested method. PiperOrigin-RevId: 485890141 (cherry picked from commit bd4e58d68bd219154e3d90b0a1031236f8608e96) * Disable publishing block when media3 included in another build. From https://github.com/androidx/media/pull/127/files PiperOrigin-RevId: 485921271 (cherry picked from commit 36a51ac9163fdea5e85e1308a7acd0b945918992) * Add @SuppressWarnings to unblock T SDK for <unknown commit> LSC: https://docs.google.com/document/d/16tpK6aXqN68PvTyvt4siM-m7f0NXi_8xEeitLDzr8xY/edit?usp=sharing TESTED=NA BEGIN_PUBLIC/END_PUBLIC PiperOrigin-RevId: 486180995 (cherry picked from commit 88445d213a3ebfd30b32994dbdacc9488923041e) * HDR: Update test FileUtil to handle null ColorInfo. PiperOrigin-RevId: 486706595 (cherry picked from commit 0b53c934d8f391000c72a0a9d6ced9c2bdb77a95) * HDR: Set decoder codec profile and level if available. This should be necessary to ensure decoders see fewer errors. Setting this resulted in removing native_dequeueOutputBuffer errors on OMX.MTK decoders for in-app tone mapping prototyping. PiperOrigin-RevId: 486715941 (cherry picked from commit 0b7e5bbad287053d56720ad682c1a5015eedb9cf) * Move muxer initialization off application thread Problem: We are initialising muxer as soon as we start the transformation. Now the startTransformation() method can be called from main thread, but muxer creation is an I/O operation and should be not be done on main thread. Solution: Added lazy initialisation of muxer object. The actual transformation happens on background thread so the muxer will be initialised lazily from background thread only. Another way was to provide an initialize() method on MuxerWrapper which will explicitly initialise muxer object but with this approach the caller need to call the initialise method before calling anything else. With current implementation the renderers are calling MuxerWrapper methods on various callbacks (Not sequentially) and also we are sharing same muxer with multiple renderers so It might become confusing for the caller on when to call the initialise() method. Also there are few methods on MuxerWrapper which dont really need muxer object. So in short it might make MuxerWrapper APIs more confusing. Validation: Verified the transformation from demo app. PiperOrigin-RevId: 486735787 (cherry picked from commit b10b4e6d4694c7240073b81c3a09227042b58c21) * Move muxing inside sample pipelines This logic is currently in the player renderers. With multi-asset, the renderers will go into the AssetLoader, which shouldn't be responsible for muxing. PiperOrigin-RevId: 486860502 (cherry picked from commit d8754b6642d0a99e2705f3e21ff8b83d50472bbd) * Set targetSdkVersion of main demo app back to 29 #minor-release PiperOrigin-RevId: 486969194 (cherry picked from commit 21724665283a29133f5d77f5321bcdf182e6aafd) * Move slow mo logic to sample pipelines This is to avoid having this logic in TransformerInternal once it is added. PiperOrigin-RevId: 487159941 (cherry picked from commit b59fdf5e98bf5ec3cd0800edb5fb2e6ebd9da5c3) * Merge Issue: google/ExoPlayer#10762: Fix ffmpeg jni wrapper returning invalid result codes Imported from GitHub PR Issue: google/ExoPlayer#10762 This ensure that ffmpeg error code are properly translated to values that the ExoPlayer decoder understand. The main gain is that it allows the decoder to properly ignore more cases of invalid data and recover. The second gain is that the other errors are now proper ExoPlayer errors and no more obscure buffer ones. Fixes: Issue: google/ExoPlayer#10760 Merge 82ceeb77d6df71f5ffb0474db66a36fd6eb8e51a into 972e169bd85b14848dcae75e34f9e95fe87e1f4b COPYBARA_INTEGRATE_REVIEW=go/exoghi/10762 from Tolriq:ffmpeg_error_code 82ceeb77d6df71f5ffb0474db66a36fd6eb8e51a PiperOrigin-RevId: 487189910 (cherry picked from commit 6d2e7a1b5760a05eade18b1a028b3d27f714715c) * Add ExoPlayerAssetLoader Just move some code around for now, to start setting up the overall structure. PiperOrigin-RevId: 487229329 (cherry picked from commit 5d1cab0cf50e31e5886310dd55e6de7c4b3523ba) * Change UnsupportedEncodingException to IllegalArgumentException In startTransformation method we were throwing UnsupportedEncodingException (IOException) when mediaItem with unsupported arguments is passed. Changed this to IllegalArgumentException which seems more logical here. PiperOrigin-RevId: 487259296 (cherry picked from commit 4598cc92485c149f5c613d3c926ae4493a457668) * Set HDR color info on FrameworkMuxer Not setting the color info results in a missing "colr" box in the produced container, under file/moov/trak/mdia/minf/stbl/stsd/hvc1. This means extractors will not be able to find out the transcoded file is HDR. In `Transformer`, this means it can't transcode this transcoded file, because it currently relies on the container bearing HDR info to construct the transcoding sample pipeline. PiperOrigin-RevId: 487276712 (cherry picked from commit d6c8e3a8aff07be5c184473826753047bf4b2387) * HDR: Implement ForceInterpretHdrVideoAsSdr Also, document that we tone map when no HDR features are explicitly set PiperOrigin-RevId: 487310971 (cherry picked from commit 8bdd2784d330c0c9f493f092825d08f8a5cc4305) * Fix Dackka/Metalava errors in the ExoPlayer module This makes two types of fix: 1. Align parameter names on overridden methods where the superclass has `@param` javadoc. 2. Use `@hide` on `protected final` methods that refer to package-private types. This will hide these symbols from Dackka javadoc generation but not (currently) from the artefacts distributed on Maven. These methods are currently unusable outside their package anyway (e.g. by external developers) because of the dependency on a package-private type. This also changes some HLS, SmoothStreaming, and IMA code where I've renamed parameters of overridden methods to be consistent across the type hierarchy. #minor-release PiperOrigin-RevId: 487472665 (cherry picked from commit 10c4a4dfc172cfac77528c7cb746fe827ca6f78c) * Fix Dackka/Metalava errors in the HLS and RTSP modules This makes two fixes: 1. Remove `HlsSampleStreamWrapper.Callback` (package-private) from the list of interfaces implemented by `HlsMediaPeriod` (`public`) and move the implementation to a private inner class instead. This avoids Metalava complaining about a public class that inherits from a package-private type. 2. Reduce the visibility of `RtpPayloadFormat.isFormatSupported(MediaDescription)` from `public` to package-private. The `MediaDescription` type is already package-private, so this method was already unusable outside the package. #minor-release PiperOrigin-RevId: 487472781 (cherry picked from commit 9041d7b979f3b998758d74279f5d281088d879a8) * Fix Dackka/Metalava errors in av1, flac, ffmpeg, midi, and opus modules This uses `@hide` on `protected final` methods to hide them from Dackka javadoc generation, since these methods are inaccessible to developers anyway. These symbols will still (currently) be included in artefacts distributed on Maven (because we don't run Metalava as part of generating these artefacts). In some cases I had to change the visibility/finality of methods to make them `protected final` before adding the `@hide` annotation (but the impact should be very low, since most of these methods were either already unusable by app developers, or they shouldn't have been used). #minor-release PiperOrigin-RevId: 487472907 (cherry picked from commit 1cd488ac9a1e838139495f55aa32eb951f1e8d8f) * Fix Dackka/Metalava errors in test_utils module This involves reducing the visibility of methods/constructors that are already unusable outside the `androidx.media3.test.utils` package. #minor-release PiperOrigin-RevId: 487473005 (cherry picked from commit ca8de0e49b03339b03a6e048e7e7a27df86e5ff5) * Fix Dackka parameter name error in `Gav1Decoder` and `VpxDecoder` These aren't caught by presubmit because the classes are annotated `@VisibleForTesting` and are therefore stripped out by Metalava. However Metalava doesn't run when we're generating javadoc for real. #minor-release PiperOrigin-RevId: 487476260 (cherry picked from commit 14e23d34e17afa076cd912264bb60685961c58e3) * Set targetSdkVersion of main demo app to 29 #minor-release PiperOrigin-RevId: 487479366 (cherry picked from commit 09bee98b8f94a608fc994f96f2f538458a96b8d9) * Fix parameter name mismatch in MappingTrackSelector.selectTracks It's not clear to me why presubmit didn't catch this, I briefly investigated but couldn't work it out - so I'm just going to fix it and move on. #minor-release PiperOrigin-RevId: 487497827 (cherry picked from commit 13ee34faccaf98ff90850601f40c95622b1e878b) * Configure Dackka to generate javadoc for protected methods #minor-release PiperOrigin-RevId: 487497923 (cherry picked from commit 7cb2e1130326a3a802b439185210004268d96b31) * Add missing IntDef on MediaSource.Factory.getSupportedTypes overrides Without this the annotation isn't shown in javadoc (same in Dackka) No annotation: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.html#getSupportedTypes() Annotation present: https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/source/MediaSource.Factory.html#getSupportedTypes() #minor-release PiperOrigin-RevId: 487498450 (cherry picked from commit 4949fbe5edc9dbbf1a713b152907cc3a175956d5) * Reformat demo build.gradle file PiperOrigin-RevId: 487539107 (cherry picked from commit 0383b723b7c26da107a719a16a05da459ae971ee) * Add `@ForOverride` to `DecoderAudioRenderer` `protected` methods PiperOrigin-RevId: 487779266 (cherry picked from commit a34fdcf168a3704babdb6b7d96c60344ab89c17c) * Reformat demo build.gradle file PiperOrigin-RevId: 488376715 (cherry picked from commit 30b73c85c53cce0d21e8df21ee680406aa0ad1d7) * Calculate SSAI window duration for live periods with unset duration. We currently skip this calculation entirely, but it can be added by calculating the window duration using the wrapped window's duration and the provided AdPlaybackState. Issue: google/ExoPlayer#10764 PiperOrigin-RevId: 488614767 (cherry picked from commit 20151b9930f1b54d7894ec41465a2e85df92462d) * Mark iterationFinished when triggering release event. When we currently trigger the iteration finished event during the release, we don't mark the event as triggered. This means that someone can trigger another release from within the callback, which then tries to resend the event. Issue: google/ExoPlayer#10758 #minor-release PiperOrigin-RevId: 488645089 (cherry picked from commit 3e5103a3e55e2dc545b4a2442beaa49f307ecfdc) * Set valid channel masks for 8 and 12 channels on all Android versions Util.getAudioTrackChannelConfig() maps a channel count to a channel mask that is passed to AudioTrack. The method expected that playback of 8-channel audio is possible from Android 5.1 and playback of 12-channel audio is only possible from Android 12L. However, there is no restriction on the upper number of channels that can be passed to the AudioTrack. google/ExoPlayer#10701 is an example where the audio decoder outputs 12 channels on an Android 10. This change removes the restrictions for 8 and 12 channels. Note, we still do not support playback of arbitrary number of channels as it would require further changes to DefaultAudioSink. #minor-release Issue: google/ExoPlayer#10701 PiperOrigin-RevId: 488659831 (cherry picked from commit 1b24e6fd14774d5c8b3e7b8084b30204581d13ce) * Rename getVideoSurfaceSize to getSurfaceSize This better matches the callback name (onSurfaceSizeChanged) and probably cause less confusion with getVideoSize. PiperOrigin-RevId: 488669786 (cherry picked from commit 8438daca1f8cbea24aa414ee500044baf1a28367) * Filter bogus AndroidX core jar file when creating javadoc #minor-release PiperOrigin-RevId: 489202167 (cherry picked from commit 7e82d4ec44b88a54ac022acf1cccdcd383457e1a) * Remove @hide javadoc annotation from ExoPlayer GitHub This tag is only understood by Dackka, which is used to generate the media3 javadoc. PiperOrigin-RevId: 489233200 (cherry picked from commit 058cba95d40db83c77f4dd0aa8cb561221463b3a) * Version bump to exoplayer:2.18.2 and media3:1.0.0-beta03 #minor-release PiperOrigin-RevId: 489959918 (cherry picked from commit ca190c084bd9ef8c281fac7655344d48f265042c) * Update JavaDoc for exoplayer:2.18.2 #minor-release PiperOrigin-RevId: 490202192 (cherry picked from commit 6f1cf6dab4dd7e37e5d2ea15ad0cc34eafba601c) * Reorder some release notes in other sections. #minor-release PiperOrigin-RevId: 490224795 (cherry picked from commit e567594cf7640bd96ec13d071c4523f7898b55be) * Fix compilation error in ffmpeg JNI layer PiperOrigin-RevId: 490263003 (cherry picked from commit 202e03fc64dac568955ce00684368cbea9b244f7) * Remove two media3-only release notes from the ExoPlayer release notes Issue: google/ExoPlayer#10811 PiperOrigin-RevId: 490726544 (cherry picked from commit bb270c62cf2f7a1570fe22f87bb348a2d5e94dcf) * Update migration script Issue: google/ExoPlayer#10854 PiperOrigin-RevId: 496922055 (cherry picked from commit 8e9f83867b5c9536488cf74f06c4cf2535ef848f) * Changed decoder list sort to order by functional support of format Added new method to check if codec just functionally supports a format. Changed getDecoderInfosSortedByFormatSupport to use new function to order by functional support. This allows decoders that only support functionally and are more preferred by the MediaCodecSelector to keep their preferred position in the sorted list. UnitTests included -Two MediaCodecVideoRenderer tests that verify hw vs sw does not have an effect on sort of the decoder list, it is only based on functional support Issue: google/ExoPlayer#10604 PiperOrigin-RevId: 487779284 (cherry picked from commit 1eb8a6b36ed98bd66a5bad5273526a918511a39f) * Fix NPE when listener is not set PiperOrigin-RevId: 488970696 (cherry picked from commit f52bb274b8b54df2404ab485c7d277150005b679) * Add setPlaybackLooper ExoPlayer builder method The method allows clients to specify a pre-existing thread to use for playback. This can be used to run multiple ExoPlayer instances on the same playback thread. PiperOrigin-RevId: 488980749 (cherry picked from commit 79b809b5563260cd20541afe607e36ae351fbbed) * Mark broadcast receivers as not exported They are called from the system only and don't need to be exported to be visible to other apps. PiperOrigin-RevId: 489210264 (cherry picked from commit c1fd03df7403019143f503bbe208d73cabc11243) * Throw exception if a released player is passed to TestPlayerRunHelper I considered moving this enforcement inside the ExoPlayerImpl implementation, but it might lead to app crashes in cases that apps (incorrectly) call a released player, but it wasn't actually causing a problem. PiperOrigin-RevId: 489233917 (cherry picked from commit d4c9199a6175a6c89f7a3d3900af1b9dfcb075f0) * Add additional codecs to the eosPropagationWorkaround list. Issue: google/ExoPlayer#10756 PiperOrigin-RevId: 489236336 (cherry picked from commit cbcdbfe021d9ffb453ed0e67a9ca1ea5f8691f51) * Pass correct frame size for passthrough playback When estimating the AudioTrack min buffer size, we must use a PCM frame of 1 when doing direct playback (passthrough). The code was passing -1 (C.LENGTH_UNSET). PiperOrigin-RevId: 489238392 (cherry picked from commit d9d716869b7df2cd95704e9ac24a5f9a376afa2c) * Add remaining state and getters to SimpleBasePlayer This adds the full Builders and State representation needed to implement all Player getter methods and listener invocations. PiperOrigin-RevId: 489503319 (cherry picked from commit b81cd08271cd94f244ca5d7c995cd29523057a60) * Add `set -eu` to all shell scripts These flags ensure that any errors cause the script to exit (instead of just carrying on) (`-e`) and that any unrecognised substitution variables cause an error instead of silently resolving to an empty string (`-u`). Issues like Issue: google/ExoPlayer#10791 should be more quickly resolved with `set -e` because the script will clearly fail with an error like `make: command not found` which would give the user a clear pointer towards the cause of the problem. #minor-release PiperOrigin-RevId: 490001419 (cherry picked from commit f83441974411dca5673a34548b11bc6e6cb809ff) * Fixed missing imports for Metadata and AdPlaybackState for Exoplayer PiperOrigin-RevId: 490012573 (cherry picked from commit 1551bea3983196272d1a8e836103a77fd9090568) * Fixed Exoplayer imports for SimpleBasePlayerTest PiperOrigin-RevId: 490181547 (cherry picked from commit 788f74740b2e560af255ab948a4bc64d116633ca) * Add `DefaultExtractorsFactory.setTsSubtitleFormats` ExoPlayer is unable to detect the presence of subtitle tracks in some MPEG-TS files that don't fully declare them. It's possible for a developer to provide the list instead, but doing so is quite awkward without this helper method. This is consistent for how `DefaultExtractorsFactory` allows other aspects of the delegate `Extractor` implementations to be customised. * Issue: google/ExoPlayer#10175 * Issue: google/ExoPlayer#10505 #minor-release PiperOrigin-RevId: 490214619 (cherry picked from commit 4853444f0dc90163c257d0e20962604510557df4) * Reorder some release notes in other sections. PiperOrigin-RevId: 490224795 (cherry picked from commit e567594cf7640bd96ec13d071c4523f7898b55be) * Merge pull request #10786 from TiVo:p-aacutil-test-impl PiperOrigin-RevId: 490465182 (cherry picked from commit 8a9a66c288d5ee2749a29de133e598f326e518dd) * Exclude tracks from `PlayerInfo` if not changed This change includes a change in the `IMediaController.aidl` file and needs to provide backwards compatibility for when a client connects that is of an older or newer version of the current service implementation. This CL proposes to create a new AIDL method `onPlayerInfoChangedWithExtensions` that is easier to extend in the future because it does use an `Bundle` rather than primitives. A `Bundle` can be changed in a backward/forwards compatible way in case we need further changes. The compatibility handling is provided in `MediaSessionStub` and `MediaControllerStub`. The approach is not based on specific AIDL/Binder features but implemented fully in application code. Issue: androidx/media#102 #minor-release PiperOrigin-RevId: 490483068 (cherry picked from commit f262e9132b32ad89f65853086f30389925b61422) * Parse and set `peakBitrate` for Dolby TrueHD(AC-3) and (E-)AC-3 #minor-release PiperOrigin-RevId: 490527831 (cherry picked from commit 01eddb34f555903c576c79b02a7b34a53e0272cb) * Rollback of https://github.com/google/ExoPlayer/commit/01eddb34f555903c576c79b02a7b34a53e0272cb *** Original commit *** Parse and set `peakBitrate` for Dolby TrueHD(AC-3) and (E-)AC-3 #minor-release *** PiperOrigin-RevId: 490570517 (cherry picked from commit ea3552c1a030d8b14c0cd0093f7eaa6242f969eb) * Rollback of https://github.com/google/ExoPlayer/commit/ea3552c1a030d8b14c0cd0093f7eaa6242f969eb *** Original commit *** Rollback of https://github.com/google/ExoPlayer/commit/01eddb34f555903c576c79b02a7b34a53e0272cb *** Original commit *** Parse and set `peakBitrate` for Dolby TrueHD(AC-3) and (E-)AC-3 #minor-release *** *** PiperOrigin-RevId: 490707234 (cherry picked from commit 8c91a31ced401ce14911fbfdf58dda3c7ee8e643) * Remove two media3-only release notes from the ExoPlayer release notes Issue: google/ExoPlayer#10811 PiperOrigin-RevId: 490726544 (cherry picked from commit bb270c62cf2f7a1570fe22f87bb348a2d5e94dcf) * Use `ParsableBitArray` instead of `ParsableByteArray` To avoid complicated bit shifting and masking. Also makes the code more readable. PiperOrigin-RevId: 490749482 (cherry picked from commit 89e4b8d049507efeb610f437429f25cf18df8f8b) * Convert bitrates to bps before setting it Format expects the values of `averageBitrate` and `peakBitrate` in bps and the value fetched from AC3SpecificBox and EC3SpecificBox is in kbps. PiperOrigin-RevId: 490756581 (cherry picked from commit 67955e0ce331481bcb3fd94c9ffb9632f27eae6e) * Remove flakiness from DefaultAnalyticsCollectorTest Our FakeClock generally makes sure that playback tests are fully deterministic. However, this fails if the test uses blocking waits with clock.onThreadBlocked and where relevant Handlers are created without using the clock. To fix the flakiness, we can make the following adjustments: - Use TestExoPlayerBuilder instead of legacy ExoPlayerTestRunner to avoid onThreadBlocked calls. This also makes the tests more readable. - Use clock to create Handler for FakeVideoRenderer and FakeAudioRenderer. Ideally, this should be passed through RenderersFactory, but it's too disruptive given this is a public API. - Use clock for MediaSourceList and MediaPeriodQueue update handler. PiperOrigin-RevId: 490907495 (cherry picked from commit 7d62943bcd149eecce77cb44e4f867128ca374d3) * Clean up javadoc on `Metadata.Entry.populateMediaMetadata` Remove self-links, and remove section that is documenting internal ordering behaviour of [`SimpleBasePlayer.getCombinedMediaMetadata`](https://github.com/google/ExoPlayer/blob/bb270c62cf2f7a1570fe22f87bb348a2d5e94dcf/library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java#L1770) rather than anything specifically about this method. #minor-release PiperOrigin-RevId: 490923719 (cherry picked from commit ed8c196e2eb36eefef9952d255cb6355807b9e9f) * Ensure messages sent on a dead thread don't block FakeClock execution FakeClock keeps an internal list of messages to be executed to ensure deterministic serialization. The next message from the list is triggered by a separate helper message sent to the real Handler. However, if the target HandlerThread is no longer alive (e.g. when it quit itself during the message execution), this helper message is never executed and the entire message execution chain is stuck forever. This can be solved by checking the return values of Hander.post or Handler.sendMessage, which are false if the message won't be delivered. If the messages are not delivered, we can unblock the chain by marking the message as complete and triggering the next one. PiperOrigin-RevId: 491275031 (cherry picked from commit 2977bef872d7f3a1611fd6e8a45931388ea21c9f) * Merge pull request #10799 from OxygenCobalt:id3v2-multi-value PiperOrigin-RevId: 491289028 (cherry picked from commit c827e46c3db2691b1b5fed57fa5b67890331aa85) * Split up `Id3DecoderTest` methods It's clearer if each test method follows the Arrange/Act/Assert pattern PiperOrigin-RevId: 491299379 (cherry picked from commit bf77290fbe78aa25698c1a7082b2a18cd7f1b06c) * Remove impossible `UnsupportedEncodingException` from `Id3Decoder` The list of charsets is already hard-coded, and using `Charset` types ensures they will all be present at run-time, hence we will never encounter an 'unsupported' charset. PiperOrigin-RevId: 491324466 (cherry picked from commit 043546a03475356764cf8b754bd0fff87a0c6e1a) * Merge pull request #10776 from dongvanhung:feature/add_support_clear_download_manager_helpers PiperOrigin-RevId: 491336828 (cherry picked from commit 3a7f940f41e278cde88c29201191229ed7d39e49) * Bump cast sdk version and remove workaround for live duration The fix for b/171657375 (internal) has been shipped with 21.1.0 already (see https://developers.google.com/cast/docs/release-notes#august-8,-2022). PiperOrigin-RevId: 491583727 (cherry picked from commit 04f031d16805a6d6786d135f77d0f6e79c77c8f7) * Add configuration to support OPUS offload To support OPUS offload, we need to provide a few configuration values that are currently not set due to the lack of devices supporting OPUS offload. PiperOrigin-RevId: 491613716 (cherry picked from commit 4cf877b81428021c4eb2dfa1a743178f280aceb5) * Use audio bitrate to calculate AudioTrack min buffer in passthrough Use the bitrate of the audio format (when available) in DefaultAudioSink.AudioTrackBufferSizeProvider.getBufferSizeInBytes() to calculate accurate buffer sizes for direct (passthrough) playbacks. #minor-release PiperOrigin-RevId: 491628530 (cherry picked from commit e219ac21ae604f182769d69f6f590191a92100d0) * Rename SimpleBasePlayer.PlaylistItem to MediaItemData This better matches the terminology we use elsewhere in the Player interface, where items inside the playlist are referred to as "media item" and only the entire list is called "playlist". PiperOrigin-RevId: 491882849 (cherry picked from commit 6c467590d0fdc27dd5afeefe479c3d4414483de5) * Parse and set bitrates in `Ac3Reader` PiperOrigin-RevId: 492003800 (cherry picked from commit 5f73984823b943d750f41519d431ad3b12dada65) * Add media type to MediaMetadata This helps to denote what type of content or folder the metadata describes. PiperOrigin-RevId: 492123690 (cherry picked from commit 1ac72de551a07d37c3b80d96028463244407a5b4) * Add support for most setters in SimpleBasePlayer This adds the forwarding logic for most setters in SimpleExoPlayer in the same style as the existing logic for setPlayWhenReady. This change doesn't implement the setters for modifying media items, seeking and releasing yet as they require additional handling that goes beyond the repeated implementation pattern in this change. PiperOrigin-RevId: 492124399 (cherry picked from commit e598a17b3628e1179fa4219ca3212407fb3fdeb1) * Merge pull request #10750 from Stronger197:subrip_utf_16 PiperOrigin-RevId: 492164739 (cherry picked from commit 496cfa420d7dd23fb5913c9ecf7b0b1e04cc65ff) * Split SubripDecoder and ParsableByteArray tests In some cases we split a test method, and in other cases we just add line breaks to make the separation between arrange/act/assert more clear. PiperOrigin-RevId: 492182769 (cherry picked from commit 02fa8aa784b518f0ffad5c44da6eec1a94def4ee) * Removed ExoPlayer specific states from SimpleBasePlayer PiperOrigin-RevId: 492443147 (cherry picked from commit 08f6fe172732f8a3327746f249888368c39265bc) * Fix `TextRenderer` exception when a subtitle file contains no cues Discovered while investigating Issue: google/ExoPlayer#10823 Example stack trace with the previous code (I added the index value for debugging): ``` playerFailed [eventTime=44.07, mediaPos=44.01, window=0, period=0, errorCode=ERROR_CODE_FAILED_RUNTIME_CHECK androidx.media3.exoplayer.ExoPlaybackException: Unexpected runtime error at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:202) at android.os.Looper.loop(Looper.java:291) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: java.lang.IllegalArgumentException: index=-1 at androidx.media3.common.util.Assertions.checkArgument(Assertions.java:55) at androidx.media3.extractor.text.webvtt.WebvttSubtitle.getEventTime(WebvttSubtitle.java:62) at androidx.media3.extractor.text.SubtitleOutputBuffer.getEventTime(SubtitleOutputBuffer.java:56) at androidx.media3.exoplayer.text.TextRenderer.getCurrentEventTimeUs(TextRenderer.java:435) at androidx.media3.exoplayer.text.TextRenderer.render(TextRenderer.java:268) at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1008) at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:509) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:202) at android.os.Looper.loop(Looper.java:291) at android.os.HandlerThread.run(HandlerThread.java:67) ] ``` #minor-release PiperOrigin-RevId: 492464180 (cherry picked from commit 5f6fde4d2a90d78a8d58430c88d7dc12849fe163) * Fix `ExoPlayerTest` to use `C.TIME_UNSET` instead of `C.POSITION_UNSET` This inconsistency was exposed by an upcoming change to deprecate `POSITION_UNSET` in favour of `INDEX_UNSET` because position is an ambiguous term between 'byte offset' and 'media position', as shown here. PiperOrigin-RevId: 492470241 (cherry picked from commit 2f8cf947c71db6be9459492117fe95b1a8bc7178) * Fix threading of onFallbackApplied callback The callback is currently triggered on the ExoPlayer playback thread instead of the app thread that added the listener. PiperOrigin-RevId: 492474405 (cherry picked from commit f3fc4fb9735a4b67a3740b3796495017eb5c978c) * Add javadoc links to README files Fix some other link titles and destinations spotted along the way. #minor-release PiperOrigin-RevId: 493276172 (cherry picked from commit c006575d4306f9bfad9c6f27d964fab00a6e1718) * Support release in SimpleBasePlayer This adds support for the release handling. To align with the established behavior in ExoPlayer, the player can only call listeners from within the release methods (and not afterwards) and automatically enforces an IDLE state (without listener call) in case getters of the player are used after release. PiperOrigin-RevId: 493543958 (cherry picked from commit 3a66c28d4f0fc6bbd7af3f5846a5645aa3ccf778) * Replace MediaMetadata folderType by isBrowsable The folder type has a mix of information about the item. It shows whether the item is browsable (type != FOLDER_TYPE_NONE) and which Bluetooth folder type to set for legacy session information. It's a lot clearer to split this into a boolean isBrowsable and use the existing mediaType to map back to the bluetooth folder type where required. folderType is not marked as deprecated yet as this would be an API change, which will be done later. PiperOrigin-RevId: 493544589 (cherry picked from commit 9d059352cff0a75f0f9c4e37010bbfa2fc6079fd) * Remove debug timeout multiplier. It looks like this was added accidentally in <unknown commit>. PiperOrigin-RevId: 493834134 (cherry picked from commit f8e4e1765f3bc956e1e6e9eb17d72cb6c152282c) * Clarify and correct allowed multi-threading for some Player methods Some Player methods like getting the Looper and adding listeners were always allowed to be called from any thread, but this is undocumented. This change makes the threading rules of these methods more explicit. Removing listeners was never meant to be called from another thread and we also don't support it safely because final callbacks may be triggered from the wrong thread. To find potential issues, we can assert the correct thread when releasing listeners. Finally, there is a potential race condition when calling addListener from a different thread at the same time as release, which may lead to a registered listener that could receive callbacks after the player is released. PiperOrigin-RevId: 493843981 (cherry picked from commit e9364b0f6e1a104de9cf4393daab521edc4eccf4) * Forward seek command details to seekTo method in BasePlayer BasePlayer simplifies implementations by handling all the various seek methods and forwarding to a single method that can then be implemented by subclasses. However, this loses the information about the concrete entry point used for seeking, which is relevant when the subclass wants to verify or filter by Player.Command. This can be improved by adding the command as a new parameter. Since we have to change the method anyway, we can also incorporate the boolean flag about whether the current item is repeated to avoid the separate method. PiperOrigin-RevId: 494948094 (cherry picked from commit 6e0f1f10b3666e6c2c74fc5a154dec3f0e03fecb) * Reset isLoading when calling SimpleBasePlayer.stop/release isLoading is not allowed to be true when IDLE, so we have to set to false when stopping in case it was set to true before. PiperOrigin-RevId: 494975405 (cherry picked from commit e4f0b73aa325d096b493bd646c63bc6a4bf5880b) * Document the reason for defining private method `defaultIfNull` PiperOrigin-RevId: 495004732 (cherry picked from commit c3ca71fda738772dccc5a5e07293c884d2194f0a) * Remove parameters with default values from bundle in `MediaItem` This improves the time taken to construct PlayerInfo from bundle from ~600ms to ~450ms. PiperOrigin-RevId: 495055355 (cherry picked from commit 7de47fe2a1493da1b0720ddeb357052d2b1dc5bb) * Clear one-off events from state as soon as they are triggered. This ensures they are not accidentally triggered again when the state is rebuilt with a buildUpon method. PiperOrigin-RevId: 495280711 (cherry picked from commit fa5aaf958d616d831d50fdaceb02d3ff3cbad0fa) * Allow unset index and position values + remove period index This simplifies some position tracking needs for an app implementing SimpleBasePlayer. - The period index can always be derived from the media item index and the position. So there is no need to set it separately. - The media item index can be left unset in the State in case the app doesn't care about the value or wants to set it the default start index (e.g. while the playlist is still empty where UNSET is different from zero). - Similarly, we should allow to set the content position (and buffered position) to C.TIME_UNSET to let the app ignore it or indicate the default position explictly. PiperOrigin-RevId: 495352633 (cherry picked from commit 91557ac9d4eaf83e68f563373541dc8e12043e00) * Remove parameters with `null` values from bundle in `MediaMetadata` Improves the time taken to construct `playerInfo` from its bundle from ~450 ms to ~400 ms. Each `MediaItem` inside `Timeline.Window` contains `MediaMetadata` and hence is a good candidate for bundling optimisations. There already exists a test to check all parameters for null values when unset. PiperOrigin-RevId: 495614719 (cherry picked from commit 8dea624c980ff65aece63c6aeecdeef894470231) * Use theme when loading drawables on API 21+ Issue: androidx/media#220 PiperOrigin-RevId: 495642588 (cherry picked from commit 33f8f406929c739e98bbea475b3609beb7db2b5f) * Rename `EMPTY_MEDIA_ITEM` to `PLACEHOLDER_MEDIA_ITEM` The `MediaItem` instances in the following cases are not actually empty but acts as a placeholder. `EMPTY_MEDIA_ITEM` can also be confused with `MediaItem.EMPTY`. PiperOrigin-RevId: 495843012 (cherry picked from commit 74559b4a188e476378f3f0df908598ce763d909a) * Clarify behavior for out-of-bounds indices and align implementations Some Player methods operate relative to existing indices in the playlist (add,remove,move,seek). As these operations may be issued from a place with a stale playlist (e.g. a controller that sends a command while the playlist is changing), we have to handle out- of-bounds indices gracefully. In most cases this is already documented and implemented correctly. However, some cases are not documented and the existing player implementations don't handle these cases consistently (or in some cases not even correctly). PiperOrigin-RevId: 495856295 (cherry picked from commit a1c0b10482baffc3721561446ee4bb788d8a1231) * Check if codec still exists before handling tunneling events The tunneling callbacks are sent via Handler messages and may be handled after the codec/surface was changed or released. We already guard against the codec/surface change condition by creating a new listener and verifying that the current callback happens for the correct listener instance, but we don't guard against a released codec yet. PiperOrigin-RevId: 495882353 (cherry picked from commit 5e23b8bfd5a9a9542c2ab8d23ae51c1689d8ff51) * Add playlist and seek operations to SimpleBasePlayer These are the remaining setter operations. They all share the same logic that handles playlist and/or position changes. The logic to create the placeholder state is mostly copied from ExoPlayerImpl's maskTimelineAndPosition and getPeriodPositonUsAfterTimelineChanged. PiperOrigin-RevId: 496364712 (cherry picked from commit 09d37641d1ef3b8cf26dc39cfcd317ebe3ef5c79) * Remove ellipsis from Player javadoc PiperOrigin-RevId: 496377192 (cherry picked from commit 844428ea329754118b8c0a2d58373415f539d725) * Fix Dackka error due to param name mismatch https://developer.android.com/reference/androidx/leanback/media/PlayerAdapter#seekTo(long) #minor-release PiperOrigin-RevId: 496378709 (cherry picked from commit d2a3d8f6fabb6d22ac28a76379725d0915344cba) * Clarify some Player command and method javadoc #minor-release PiperOrigin-RevId: 496661152 (cherry picked from commit f47ad3c2d097a557bd2222a5b104e7867aef585d) * Document the relationship between Player methods and available commands #minor-release PiperOrigin-RevId: 496668378 (cherry picked from commit 54e79689e925a2a18bc02522d4f7f73dcfb35d83) * Add error messages to correctness assertions in SimpleBasePlayer Users of this class may run into these assertions when creating the State and they need to check the source code to understand why the State is invalid. Adding error messages to all our correctness assertions helps to understand the root cause more easily. PiperOrigin-RevId: 496875109 (cherry picked from commit b7e887a58dff7615926f8002ee3210b3071c5537) * Fix recursive loop when registering controller visibility listeners There are two overloads of this method due to a type 'rename' from `PlayerControlView.VisibilityListener` to `PlayerView.ControllerVisibilityListener`. Currently when you call one overload it passes `null` to the other one (to clear the other listener). Unfortunately this results in it clearing itself, because it receives a null call back! This change tweaks the documentation to clarify that the 'other' listener is only cleared if you pass a non-null listener in. This solves the recursive problem, and allows the 'legacy' visibility listener to be successfully registered. Issue: androidx/media#229 #minor-release PiperOrigin-RevId: 496876397 (cherry picked from commit 37fd65a8e51ddba92584109217114d9f2c2f009d) * Update migration script Issue: google/ExoPlayer#10854 PiperOrigin-RevId: 496922055 (cherry picked from commit 8e9f83867b5c9536488cf74f06c4cf2535ef848f) * Bump IMA SDK version to 3.29.0 Issue: google/ExoPlayer#10845 PiperOrigin-RevId: 496947392 (cherry picked from commit 8ed515880a0b6c05b766e868e2ef931b886925cc) * Check `MediaMetadata` bundle to verify keys are skipped Added another check in test to make sure we don't add keys to bundle for fields with `null` values. PiperOrigin-RevId: 496948705 (cherry picked from commit 890fd0a9fb135e938dc465d936b24065c65dbb98) * Optimise bundling for `AdPlaybackState` using `AdPlaybackState.NONE` Did not do this optimisation for `AdPlaybackState.AdGroup` as its length is zero for `AdPlaybackState` with no ads. No need to pass default values while fetching keys, which we always set in `AdPlaybackState.AdGroup.toBundle()`. PiperOrigin-RevId: 496995048 (cherry picked from commit f2eac2df711cad579f3042568a24c1f51a119428) * Fix order of playback controls in RTL layout Issue: androidx/media#227 #minor-release PiperOrigin-RevId: 497159283 (cherry picked from commit 8313af1677507fb0cc51d53e81bf930f1a954c87) * Enable RTL support in the demo app We might as well keep this enabled by default, rather than having to manually toggle it on to investigate RTL issues like Issue: androidx/media#227. PiperOrigin-RevId: 497159744 (cherry picked from commit 010c6b96e74979370f139f8126c176ea7b279313) * Remove player listener on the application thread of the player PiperOrigin-RevId: 497183220 (cherry picked from commit 965606f7a7626b95087845191f9b6d4c33ced2e7) * Check bundles in `MediaItem` to verify keys are skipped Added another check in each of these tests to make sure we don't add keys to bundle for fields with default values. Also fixed comments of similar changes in `AdPlaybackStateTest` and `MediaMetadataTest`. PiperOrigin-RevId: 499463581 (cherry picked from commit 9d431a52ef7a39772f65b8de170a225848be5251) * Optimise bundling for `Timeline.Window` and `Timeline.Period` Improves the time taken to construct playerInfo from its bundle from ~400 ms to ~300 ms. Also made `Timeline.Window.toBundle(boolean excludeMediaItem)` public as it was required to assert a condition in tests. PiperOrigin-RevId: 499512353 (cherry picked from commit 2a77f1e2f96684c8c2e0b27e4118635af0724811) * Throw a ParserException instead of a NullPointerException if the sample table (stbl) is missing a required sample description (stsd). As per the javadoc for AtomParsers.parseTrack, ParserException should be "thrown if the trak atom can't be parsed." PiperOrigin-RevId: 499522748 (cherry picked from commit bbe78b10c125529d039fea9bf0117cc04d2a3532) * Fix typo in `DefaultTrackSelector.Parameters` field PiperOrigin-RevId: 499905136 (cherry picked from commit bdd6818c14f97ba305d008c963fd2c369fab312c) * Initialise fields used for bundling as String directly Initialising the fields as Integer and then getting a String on compute time is slow. Instead we directly initialise these fields as String. Improves the time taken in bundling PlayerInfo further to less than 200ms from ~300ms. Also modified a test to improve productive coverage. PiperOrigin-RevId: 500003935 (cherry picked from commit d49437c6e112e60e9c85edeef73a73bce7de939a) * Update bandwidth meter estimates PiperOrigin-RevId: 501010994 (cherry picked from commit 09a15fb73103c406965856de4d120a5028bb37b5) * Add focusSkipButtonWhenAvailable to focus UI on ATV For TV devices the skip button needs to have the focus to be accessible with the remote control. This property makes this configurable while being set to true by default. PiperOrigin-RevId: 501077608 (cherry picked from commit d2898b70ead3b2ad1244a730c3b456146755c138) * Request notification permission in demo app for API 33+ Starting with API 33 the POST_NOTIFICATION permission needs to be requested at runtime or the notification is not shown. Note that with an app with targetSdkVersion < 33 but on a device with API 33 the notification permission is automatically requested when the app starts for the first time. If the user does not grant the permission, requesting the permission at runtime result in an empty array of grant results. Issue: google/ExoPlayer#10884 PiperOrigin-RevId: 501320632 (cherry picked from commit 6bacbaac548d612e85647b4d13c22dae0401447e) * Document that `DownloadService` needs notification permissions Starting with Android 13 (API 33) an app needs to request the permission to post notifications or notifications are suppressed. This change documents this in the class level JavaDoc of the `DownloadService`. Issue: google/ExoPlayer#10884 PiperOrigin-RevId: 501346908 (cherry picked from c…
ExoPlayer Version
2.18.1
Devices that reproduce the issue
Devices: Moto, Samsung, Pixel
Android Versions: 12, 13
Devices that do not reproduce the issue
Has not been observed on any android versions under 12
Reproducible in the demo app?
Trying, haven't been able to reproduce
Reproduction steps
I've been able to reproduce it locally by triggering rapid volume changes when exiting playback. I've done it both via spamming ADB commands and also holding the physical volume slider on the phone.
Looking across multiple instances of it occurring, it seems to happen to a non-insignificant number of users after the playback activity / fragments trigger their destroyed lifecycle methods.
It's worth noting that our playback activity is locked to landscape, so users often get configuration changes when exiting it (many users lock their phones in portrait). Reproducing this using the volume method as described above is rather flakey -
but as of right now I haven't been able to reproduce while keeping the phone in landscape across both activities.Expected result
ExoPlayer would not throw an IllegalStateException after the activity has been destroyed.
Actual result
ExoPlayer occasionally enters a state where an exception is thrown.
Media
N/A
Bug Report
adb bugreport
to [email protected] after filing this issue.The text was updated successfully, but these errors were encountered: