1. Currently, we may throw source info refresh errors while the previous media
period is still playing.
2. We don't throw if the next period in a playlist fails to prepare and the
previous renderers are all disabled.
3. We throw source info refresh errors for playlists before playback reaches
the culprit source.
This change:
1. Defers the exceptions until all existing media periods have been played.
2. Checks for period preparation exception if the next period is not
getting prepared and the renderer time reached the next period.
3. Does no longer throw from ConcatenatingMediaSource.maybeThrowSourceInfo
RefreshError. The deferred media periods take care of that for each source
individually.
Issue:#4661
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=211819436
To report DRM session metrics in the future as part of the listener, we need
a callback at the end of the drm session to get the final metric state.
For completion, the session acquired callback is also added.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=211328412
Also make some javadocs more consistent with the rest of the library.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=211071559
The current structure tries to associate events to media periods and windows
based on the reported values and the current timeline. However the reported
EventTime may not always be consistent in case the timeline doesn't contain
windows or media periods yet or not anymore.
The recent changes to MediaPeriodId allow to use it as a unique identifer for
media periods independent of the timeline. This enables more accurate tracking
of the media period queue and prevents reporting events with inconsistent
data.
Issue:#4492
Issue:#4634
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210713120
This provides the list of currently buffered media chunks and iterators over
the potential next chunks to the track selection. Having these two parameters
enables more advanced decision logic based on this data.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210551812
This fixes or suppresses all reported issues by the code review linter tools.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210107759
There are C.CLEARKEY_UUID.equals(uuid) checks in FrameworkMediaDrm,
so uuid needs to be CLEARKEY_UUID, not COMMON_PSSH_UUID
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210094372
- Add @Deprecated on overrides of deprecated method.
- Suppress deprecation warnings where appropriate.
- Use non-deprecated alternatives where appropriate.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210092434
This prevents problems caused by unintended double-registration of the same
transfer listener.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210078454
This option is currently not available as a non-null adaptive track selection
has to be provided. Adds a parameter "forceHighestSupportedBitrate" which
corresponds to the default fixed track selection for audio and video.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210073675
At the point of starting to play a postroll, source info refreshes for future
postroll ads in the same ad group would cause a seek that incorrectly identified
the media period to play as the content media period. Fix the logic in
getAdGroupIndexForPositionUs to address this.
Also handle empty postroll ad breaks by resetting the expected ad group index
when we send content complete.
Issue: #4710
Issue: #4681
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=210071054
Similar to getBufferedPosition and getCurrentPosition, getDuration should
mention that it also returns the duration of the current ad.
And, also similar to getContentBufferedDuration and getContentPosition, a
new method getContentDuration simplifies querying the content duration while
playing an ad.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209914696
The response headers of the last load are available from the loading source
when creating media source events and can be easily forwarded.
Issue:#4361
Issue:#4615
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209900693
The doc can be improved by enumerating and linking all possible values from
the interface doc.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209772309
Apps targeting P or later now must request this permission in order to
use foreground services.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209762160
Also remove NonNull, since we assume NonNull by default. Except
where explicitly overriding a method with NonNull annotated args,
in which case we're still expected to use it.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209758204
Some tests were flaky because of the PlayUntilPosition action which called
player.setPlayWhenReady from the wrong thread. Also fixed some other misc
flakiness.
ExoPlayerTest seems to be non-flaky now (tested with 10000 runs).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209743076
The MediaPeriodId with index is only properly defined together with a
timeline containing the index. Changing it to the period uid allows to use
the MediaPeriodId independent of the corresponding timeline.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=209430257
When playing a playlist where the exact maximum input size is known from the
container for each item, it may be necessary to recreate the decoder to increase
its maximum input buffer size at the point of transitioning from one item to the
next, which can make transitions non-seamless.
Scale up the initial video decoder maximum input size so playlist item
transitions with small increases in maximum sample size don't require
reinitialization.
Issue: #4510
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208650244
Also fix an NPE in FfmpegAudioRenderer if sampleMimeType wasn't set.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208230947
Also add support for parsing PlayReady DRM information
Issue:#4180
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208094290
Future changes for checking codec capabilities will go in the renderer rather
than in the codec selector, so the codec selector only needs a MIME type as
before.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208076716
Add automatic audio focus handling to SimpleExoPlayer. Audio focus
handling is an opt-in feature that can be requested by passing
the system's AudioManager and an AudioFocusConfiguration to
SimpleExoPlayer.setAudioFocusConfiguration.
When audio focus is being managed by SimpleExoPlayer, the player
will transparently handle pausing playback during
AUDIOFOCUS_LOSS_TRANSIENT, as well as lowering playback volume
during AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=208045732
Also locally cache length in BaseDataSource and use zero cost
castNonNull to make sure there's no performance regression.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207715734
* Make dedicated section in RELEASENOTES
* Clean up AMR FACTORY
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207550281
Lint likes all constants for an IntDef to be declared explicitly
in switch statements.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207545682
Lint likes flags to be declared in this way, for safety, apparently
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207545382
This CL adds support for seeking witin TS streams by using binary search. For
any seek timestamp, it tries to find the location in the stream where PCR
timestamp is close to the target timestamp, and return this position as the
seek position.
Github: #966.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207529906
For now, just allow any prefix (and don't check the namespace).
Checking the namespace requires turning on the XmlPullParser
namespace awareness feature, but this can only be done before
parsing, and I think requires us to specify the namespace when
querying other attributes. This would also risk breaking services
who currently don't set namespaces correctly.
It's possible we'll run into similar issues with the few other
tags (e.g. mspr:pro). We should revisit enabling namespace
awareness if/when we see this.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207526883
- Use ConstantBitrateSeeker to implement seeking for ADTS format. Since most
ADTS streams are VBR, we use the average bitrate of the first 1000 frames as
the average bit rate.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207509651
Currently, MetadataRetrieverImpl uses MediaCodecVideoRenderer to renderering
frames to capture. It suffers from 2 issues:
- MediaCodecVideoRenderer has a lot of logic to time frame release, including
drop frames if late or try to keep up with feeding speed etc... These are not
necessary at all for frame retrieval.
- MediaCodecVideoRenderer always tries to render 1 frame after video surface
update. This may some times lead to the wrong image being rendered for
MetadataRetriever.
This CL replaces this with a custom video renderer, that does not time frame
releases, and only render first frame after position reset / renderer
re-enabling.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207276937
The error is spurious, and is due to an incorrect annotation in
the framework.
[Internal: b/32137960]
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=207234603
Amazon like to use Device.MODEL, so key on that instead for
these workarounds.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206917935
When user seeks to an unprepared period, since there is no period being played, currently the track groups and track selections are still the ones from previous period. This CL changes it so that when such seeking happens, PlaybackInfo's track groups and track selections are changed to empty.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206916109
This is needed for implementing (optional) support for audio focus handling in a
later change.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206899837
This CL adds support for seeking within PS streams by using binary search. For
any seek timestamp, it tries to find the location in the stream where SCR
timestamp is close to the target timestamp, and return this position as the
seek position.
Github: #4476.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206787691
Currently, we have KeyStatus, KeyRequest and ProvisionRequest as interface, so we can use
custom implementation for purpose such as wrapping native objects. However, these interfaces and the corresponding default classes are only used to bundle data, and in all existing implementation (including native code), it's just as efficient to just use the Java default implementation. Therefore we can just get rid of the interfaces, and change
the interfaces into classes with the default implementation.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206765389
There is some risk associated with this change, as audio track buffers come from
shared memory and limits may be device-specific. I've tested these sizes on
Nvidia Shield TV and Nexus Player on various builds. The maximum size allocated
is about 800 KB. We could implement support for retrying creating the audio
track if it fails to initialize, but it seems preferable to avoid the extra
complexity required to do that unless we know it's necessary to work around
device-specific limitations.
Issue: #3803
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206749222
The platform fix was merged into O MR1, not O. Nexus Player has
not received this build.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206734342
Add TeeAudioProcessor that doesn't modify the input audio but writes it to an
AudioBufferSink, and WavFileAudioBufferSink for writing audio to a .wav file.
This is intended to be used for diagnostics and debugging.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206717458
MatroskaExtractor was checking for INDEX_UNSET as the sample count for buffers
not containing syncframes, but actually 0 was returned for these. Theoretically
this could prevent us starting to play a TrueHD stream as we wait until we can
read the sample count from a syncframe before accepting the audio in
DefaultAudioSink, but it seems that rechunking avoided this issue arising in
practice.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206575462
The looping media source doesn't convert the media period id to the externally
visible media period id. And the merging media source reports media period
creations multiple times which will break listeners assuming a media period
with a specific id will only be created once.
Also amend the doc for MediaSource.createPeriod to reflect that media periods
created in parallel do not actually have the same id.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206327241
Period transitions with non-zero start position happen too early as the
playing period is advanced as soon as the renderer offset is reached not
taking into account that the start position needs to be added to that.
Issue:#4583
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206310328
AudioTrack checks the channel configuration against a mask of allowed channels.
Before Android M the check in getMinBufferSize would always fail for 8 channel
output.
For Android L constants are available to build the required channel
configuration for a conventional 7.1 setup and these constants are part of the
allowed channels mask, so switch to using them.
Before Android L the constants for 7.1 aren't in the allowed channels mask, so
discard channels to give a 5.1 stream.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206307892
Remove minLoadableRetryCount from HLS components in favor of
LoadErrorHandlingPolicy#getMinimumLoadableRetryCount.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206298419
The new method allows to add TransferListeners after the DataSource
has been created. Most implementations just forward to their wrapped
upstream DataSource. Implementation which directly read data implement
BaseDataSource instead.
Also removes the temporary default no-op implementation in DataSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206289986
This helps to distinguish between the MediaPeriodId the deferred media period is being
created with and the MediaPeriodId which is used to create the actual underlying period.
This serves two purposes:
1. The error reporting of ad prepare errors uses the correct media period id (the
externally visible ad media period id).
2. The transition to using media period uid instead of indices is simplified.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206160463
Using our own no-op castNonNull prevents linking into checkerframeworks library.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206152148
Rewrite FlacBinarySearchSeeker and extract out the core binary search algorithm
into BinarySearchSeeker class so it can be re-used for other formats.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=206012900
This changes the default initial bitrate estimate to be country (group) and
network type specific. The existing overwrite still works as before and new
overwrites for the country or specific network types are provided for
customization.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205972705
While the timeline is empty, we keep a dummy MediaPeriodId in PlaybackInfo with
a period index of 0. We leak this MediaPeriodId in actual use in these
situations:
1. When issuing an IllegalSeekPosition after preparation. The timeline becomes
non-empty, but the media period id stays at its dummy value.
2. When re-adding sources to a previously empty timeline. The dummy period id
is used as the start position for the new non-empty timeline.
This change makes:
- the constructor of PlaybackInfo using those dummy values more explicit
- prevents the issues above by using the correct default position in the new
non-empty timeline for the above mentioned cases.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205803006
All known instances use DataSource as generic type and thus code can be simplified
by removing the generic type altogether.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205798542
Using this surface it's possible to play 360 videos in a non-VR Activity that is
affected by phone and touch input.
RELNOTES=true
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205720776
This reduces the number of calls to the DataSpec constructor and minimizes the number of files that need to be updated when adding a new DataSpec parameter (ex: followup []
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205719005
This allows to automatically forward bandwidth estimate events to
AnalyticsListeners.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205642752
This removes the need to populate the entire period for the common usage of
getting the uid from the period.
Also add default implementation to get period by uid.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205638265
The end position is needed to make the MediaPeriodId unique as multiple
content periods may only vary in this parameter.
This also simplfies some other comparisons where the end position needed to
be compared in addition to the media period id.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205634508
The number is shelved in calls to queue.clear() to keep it for the next
media period. However, the queue may also become empty by repeated calls to
advancePlayingPeriod which may happen when seeking to an unprepared period.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205376036
Currently, when the VideoRendererOutputCapturer updates output size, it will
set the new surface, then release the old surface. This can lead to problem
when both surface depends on EGL, since the second release() can release EGL
resources of the first surface.
This CL reverses this process, and ensures that the old surface is released before the new one is created.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=205235451
Setting the transfer listener on the data source factories is only needed for debug
purposes, logging and for custom bandwidth metering which doesn't use the
player-provided bandwidth meter. As such, it is not compulsary and it should be easy
to set up the data source factory without a transfer listener.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204926083
This was only needed temporatily until we could ensure that the player always
provides a BandwidthMeter.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204903640
As part of this change:
- Don't apply the workaround on API level 27+. GTS coverage
should prevent such devices from existing.
- Use Util.DEVICE consistently.
- Remove the "// Device name", which don't really add much
but make extra work when updating the list.
Issue: #4468
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204889657
This will allow deduplicating the argument from all Loader clients.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204889331
This bandwidth meter is then forwarded to the track selection and as a transfer
listener to media and data sources.
When no bandwidth meter is specified in the ExoPlayerFactory methods, a static
singleton instance will be used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204881497
When notifying the bandwidth listeners of new samples, the forwarded values
need to be final to prevent concurrent access. Putting the event forwarding
into a separate method ensures the values are final.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=204877650