This allows BufferProcessors to partially and/or asynchronously handle
input/output. Document contract for queueInput and getOutput.
Update ResamplingBufferProcessor to use the new interface.
Separate submitting bytes vs. writing data to the AudioTrack.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148212269
This CL allows passing multiple formats describing CC channels to the
TS payload reader factory. As a simple usecase, ATSC can expose both
608 channels by passing a two element list with the corresponding
accessibility channels. The HLS media source can construct this list
from the EXT-X-MEDIA:TYPE="CLOSED-CAPTIONS" tags, including language
and selection flags. The interface extends without modification to
708.
Pending work:
* Multiple CC channels in HLS.
* caption_service_descriptor parsing for overriding the user's selection.
* 708 support in SEI reader.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148030293
This avoids breaking the player if the first variant is not
supported by the device.
Issue:#2353
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148025791
InitializationChunk calls init(null). When the initialization and index data is separate they need to
be loaded separately which results to two init(null) calls.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=147837985
I've also added a TODO to not even bother trying to parse CEA from
SEI NAL units if they're fully or partially encrypted, which it's
possible to determine in the FMP4 extractor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=147613979
SoftAAC2 would cause an exception to be thrown from
dequeueOutputBuffer/releaseOutputBuffer after queueing an end-of-stream buffer
for certain streams.
The bug was introduced in L and fixed in L MR1, so the workaround is targeted to
API 21.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=147613659
The outputBuffer is not necessarily empty after a flush, so the assertion could
fail in normal usage. The assertion can just be removed as the output buffer is
rewritten in full on every call to handleBuffer.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=147541016
- It's always fine to prefer the manifest drm init data. In
DASH we always do this anyway. In SS the manifest and sample
formats are identical.
- Optimized the case where the manifest and sample formats are
identical by avoiding the format copy.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=147385282
Tab commands were being used cumulatively (i.e. moving the cursor farther and farther over) resulting in the text eventually trying to write beyond the bounds of the screen and throwing an exception.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146783284
This allows binding by track type in ChunkExtractorWrapper, which
allows the EMSG and 608 tracks to be enabled on FragmentedMp4Extractor
in DefaultDashChunkSource. ChunkExtractorWrapper currently binds these
to DummyTrackOutputs.
Note: I wanted to pass the mimeType instead, since it's a more specific,
but unfortunately there's at least one place where it's not known at the
point of invoking track() (FlvExtractor).
Issue #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146471082
The first issue occurs when we attempt to process a DtvCcPacket that hasn't been completely filled. In this case we attempted to extract data beyond the length of the packet, instead of dropping the packet as we should have. The other issue occurs when we encountered an invalid cc_data_pkt. In that case we were finalizing the entire DtvCcPacket, instead of just ignoring that particular cc_data_pkt as we should have.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146373074
This CL is a no-op refactor but allows defining the outputted
channels through the TsPayloadReaderFactory.
Issue:#2161
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146243736
* Prevents calling endTracks() before all PMTs have been
processed.
* Adds a unique ID to the format of each track. This allows
the track selector to identify which track belongs to
each program. The format of each id is
"<program number>/<track output id>".
Note: This CL will break malformed TS files whose PAT
declares more PMTs than it actually contains, which
previously were supported. This does not apply for HLS
mode.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146151642
This initial version of the BufferProcessor interface assumes that buffers are
handled in their entirety on each invocation.
Move PCM resampling out of AudioTrack into a BufferProcessor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146128411
- Cea708 Javadoc references private internals with @link. Doc
about device accessibility settings doesn't relate to the
decoder, either.
- Creator Javadoc unnecessary.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146118092
Instead of clearing the DECODE_ONLY flag for all input buffers in TextRenderer (i.e. for all caption types), we now only clear it on the output buffer in SimpleSubtitleDecoder. The number if input buffers in CeaDecoder has also been increased to reduce the delay before captions appear for playback sessions that start far ahead into the content.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=146028680
This fixed the resume live window issue by modifying the demo app.
Issue:#2344
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145987470
This aims to replace InvalidCodeResponse's with BLWE's caused by trying to
load chunks that have been removed from the server.
Issue:#2344
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145679171
For the video renderer, it's not true that the source always
provides from a sync frame specifically in the case where
the surface has been replaced on the renderer. In this case
the source doesn't know that it should be providing from a
sync frame.
Issue: #2093
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145562222
- Fix to use different track ids for EMSG + CEA608, so they can
both be enabled at once.
- Tweaked extractor to output formats prior to endTracks() when
parsing the initial moov box. This makes it easier to handle
multiple tracks through the chunk package. It may or may not
be made a requirement (it's already true for the MKV extractor).
Issue: #2362
Issue: #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145538757
According to the spec, subtitle renditions must be Webvtt media
segments.
Issue:#2025
Issue:#2355
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145289266
This allows the user to interpret PTSs in the playback timebase.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145280921
If we don't have resolutions (and therefore cannot determine
pixel counts) then use bitrate as a tie breaker instead. Also
use pixel count as a tie breaker if pixel counts are known
but equal. Streams with known pixel counts will always be
preferred over streams without.
Issue: #2343
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145269968
If no tracks are selected at the start of playback, TrackSelectorResult
isEquivalent(null) returned true, meaning we were keeping the old result
(i.e. null), which we then tried to de-reference.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145105702
It should be possible to remove ChunkExtractorWrapper from the track
output side as well (currently all extractor output is funneled via
ChunkExtractorWrapper just so it can adjust the format, which is kind
of unnecessary).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145083620
*** Original change description ***
Pull assertion and layer of indirection out from ChunkExtractorWrapper
It should be possible to remove ChunkExtractorWrapper from the track
output side as well (currently all extractor output is funneled via
ChunkExtractorWrapper just so it can adjust the format, which is kind
of unnecessary).
***
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145078094
It should be possible to remove ChunkExtractorWrapper from the track
output side as well (currently all extractor output is funneled via
ChunkExtractorWrapper just so it can adjust the format, which is kind
of unnecessary).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145076891
This is no longer needed as MetadataDecoderFactory
figures out which decoder should be used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144999613
This is more consistent with our handling of DRM init data,
and is more correct. It'll be up to whoever's using the
manifest to look one layer deeper and figure out what event
streams are defined on all representations, if they wish to
do so.
Issue #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144968183
When the first streaming license request response provided to mediaDrm it might return an empty array instead of null.
This was set to offlineLicenseKeySetId which made the work like there is a valid offline license.
Simplified the code and made it to set offlineLicenseKeySetId only if there is sensible data in keySetId.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144843144
- Tunneling can be enabled by calling:
trackSelector.setTunnelingAudioSessionId(
C.generateAudioSessionIdV21(this));
- If enabled, tunneling is automatically used when the renderers
and track selection combination support it. Tunneling is
automatically turned on and off through playlists if the support
changes.
Issue: #1688
This is an initial version that does not handle cross-playlists
adjustment in an ideal way.
Issue:#1789
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144692969
This will allow recreating timestamp adjustment on the decoding side.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144692956
Also clear the playingPeriodHolder in the case the renderers
are being disabled. This is required to ensure that
setPlayingPeriodHolder isn't turned into a no-op, which will
break the seek.
Issue: #2330
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144635220
At this point the renderers all have TODOs in enable(),
and turning on tunneling is reduced to the problem of
propagating a tunneling ID to these points.
Issue: #1688
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144619393
under certain circumstances (e.g. seek to a position where the input format
changed) the audio track needs a reconfigure even if there aren't any
pending buffers
- Support querying whether the current window is dynamic
and seekable. The new methods are similar to getDuration,
which is also a convenience method for the current window.
- Improve demo app to restore positions in VOD items within
playlists where the last item is live. Also restore the
position within the window for live items unless the player
failed with BehindLiveWindowException.
Issue: #2320
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144443898
This overrides the start position relative to the window.
Issue:#1544
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144434903
This class can accommodate extra information that may potentially
be specified by TrackSelectors in the future (e.g. configuration
for renderers). Even if we don't do this, it's cleaner to have a
proper class and an info field to refer to, as opposed to using a
Pair.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144428963
- Add proguard rules for libraries/extensions into .aar files
- Add proguard rules to retain CEA608/708 decoder constructors
- Remove lots of default config from gradle files
- Remove disabling of abort on lint error
- Enable optimizations on release builds of demo app
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144350233
Also revert ability to query for a decoder that explicitly
supports tunneling, since in the new design we'll just be
querying the first decoder provided by the MediaCodecSelector
and then reporting what it supports. This is in line with
what we do when reporting support for adaptive switching.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144315746
Position discontinuities are notified via AudioTrack.Listener.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144202048
Move initialization code from the audio renderers into handleBuffer. The audio
session id and tunneling enabled state can be altered using new setters.
This change is not intended to change the behavior of the audio renderers.
Before this change, the AudioTrack would always be reinitialized by the
renderers before calling handleBuffer.
Add a protected onAudioTrackUnderrun method for custom renderers that want to
implement custom handling of underruns.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144067149
Extra calls to CipherOutputStream.close() causes each time extra 16 bytes written to the
underlying OutputStream. Prevented close() is called more than once and also discarded any
data in ReusableBufferedOutputStream buffer on reset().
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144063120
ClippingMediaPeriod may be a useful component for other MediaSources too so
remove its dependency on ClippingMediaSource.
Also allow the clipping end point to be TIME_END_OF_SOURCE, in which case
the clipping window extends to the end of the wrapped period.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144056285
This is analogous to what we do for text/subtitles, and
adds support for playlists where the type of metadata
changes from one playlist item to the next.
Issue: #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143948307
This doesn't make a stateless decoder but it is a step in the right direction.
Note that subtitles are not rendering. Is there something wrong with the timecodes?
Note: End to end emsg support is still non-functional.
There's some additional plumbing that still needs to
be done.
Issue: #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143775147
Renamed StreamingDrmSessionManager to DefaultDrmSessionManager and added functionality to download, restore, renew and release offline keys. Added a utility class, OfflineLicenseHelper, to facilitate use of DefaultDrmSessionManager for downloading, renewing and releasing offline keys.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143769955
Also move timeline, manifest and format verifications into the test* methods.
Issue: #2252
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143761969
- Parse EMSG leaf atoms during FMP4 extraction (although
currently they're just discarded).
- Add readNullTerminatedString to ParsableByteArray.
Issue: #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143555965
I wrote this whilst investigating a user issue. It looks like
we don't need to do anything about the issue itself, but since
I wrote the test we may as well keep it!
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143549697
This isn't perfect because it performs seeks whilst the
user is holding down L/R, rather than when they release
it. Performing the seek on release properly looks non
trivial, and would likely require extending SeekBar.
Issue: #2278
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=143440580
These currently lead to cryptic ArrayIndexOutOfBoundsExceptions being thrown from System.arraycopy() so my proposal is to throw a more useful ParserException instead.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142087132
- If there's no program-date-time then this change is
a no-op.
- If there is a program-date-time this change considers
the period as having started at the epoch rather than
at the start of the content. The window is then set
to start at the start of the content. This is a little
weird, but is required so that the period sample
timestamps match the start of the period. Note that
this also brings the handling of on-demand in line
with how the live case is handled, meaning there wont
be weird changes if a live stream changes into an
on-demand one.
Issue: #2224
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142442719
This has always been broken in V2, but the issue is now also
visible for the very first period in the timeline because we
offset if by 60s. Previously the issue would only have been
visible from the start of the second period.
Issue: #2208
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142252702
Create a MediaCodecVideoTrackRenderer.shouldDropFrame function that can be overriden by a child class. The YouTube override prevents a frame drop if we haven't rendered anything in the last 35 ms.
The YouTube override is off at the moment, I plan to use a server side flag to do a slow and controlled experiment.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142190774
Cue has been modified to optionally accept a fill color and a toggle specifying when to use the fill color. When the fill color toggle is set, then SubtitlePainter will use the fill color value instead of the color specified by the device's Accessibility settings. Cea708Decoder has also been modified to propagate that value, as well as cleaned up (in terms of documentation) to prepare it for inclusion in the open-source project.
There is also a new Cea708Cue, extending Cue, which holds the Cue's priority, which is used to sort potentially overlapping cues/windows.
Note that I've left the @ClosedSource annotation and logging in this CL. I intend to start testing the 608 and 708 functionality in the Fiber app to ensure that it works as expected on a wide-range of channels (as opposed to the single channel in ExoPlayer Demo) before removing these.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142173264
It's a nicer place for it to live once it starts being passed
around more widely (e.g. through the video renderer, for
tunneling)
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142158460
Although the underlying platform AudioTrack is capable of
writing the AV sync header from M onward, I've opted not
to use the functionality since it appears to allocate an
unnecessary (and large) number of ByteBuffers. We can swap
over from O if this is addressed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142138988
Also clarify when getNextLoadPositionUs and continueLoading
can be called.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142124497
These currently lead to cryptic ArrayIndexOutOfBoundsExceptions being thrown from System.arraycopy() so my proposal is to throw a more useful ParserException instead.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=142087132
ClippingMediaSource wraps a single period/window video-on-demand source and
exposes a specified time range within it.
Issue: #1988
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141991215
This is particularly problematic for subtitle tracks where adjustment
can be broken. Now, the primary url can change when clients ask for a
variant snapshot, instead of happening on chunk load as before.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141933689
Define what element is returned if inclusive is true and there are multiple
elements equal to the input value.
Clarify/fix javadoc.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141891741
Not sure what I think about this, but we're getting quite
a lot of issues reported where streams play fine but capabilities
indicate they wont. It's probably best just to cross our fingers
and hope for the best in such cases, as was the case in V1 when
using ExtractorSampleSource.
Issue: #2157
Issue: #2034
Issue: #2007
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141758070
This requires knowing the seek time in Extractor.seek, so that it's possible to
pick the latest synchronization sample at/before the seek time for each track
(rather than the earliest synchronization sample after the seek position).
Also remove the STATE_AFTER_SEEK state which should no longer be needed.
Issue: #2167
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141432598
When the primary url is blacklisted (due to a 404, for example) or
the selected variant is different from primary url, allow the tracker
to change the url.
Issue:#87
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141291435
Pending improvement:
* Peek just the required priv frame. Avoid decoding all id3 information.
* Sniff the used container format instead of using the extension.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141181781
The definition of negative line indices was intentionally shifted
by one because the way VTT defines them doesn't appear to allow for
cues to be positioned at the very bottom of the screen in the case
that ANCHOR_TYPE_END is used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141168028
This is a first step toward supporting tunneled playback
Issue: #1688
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141167501
- Fix bug where we'd try and call replaceStream having already
notified the renderer that the current stream is final. This
could occur if a period was added to the end of the playlist.
- If the current period being played is removed and a new period
to play cannot be resolved, assume we've gone off the end of
the playlist and transition to the ended state. This allows
the current source to be re-used (unlike the previous behavior
of considering it an error). Treat valid seeks that cannot be
resolved due to concurrent timeline update similarly.
- Add seek sanity check back to ExoPlayerImpl. Meh. It's probably
best to keep this, since it stops the exposed window index
being invalid w.r.t the exposed timeline.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141167151
- Infer likely left/center/right alignment for pop-on captions.
This makes the rendering much better in practice, particularly
when the captions were intended to be center aligned.
- Fix line anchoring.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141156222
CEA-608 specifies a "safe-area" in which the captions should be rendered. This change adjusts all of the cue positions so they are within that safe area. It also fixes a minor issue in which roll up captions would drift towards the last row if a preamble address code had the "next row toggle" bit set.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141077433
Seeks are permitted when there's no timeline, and in this
case playback necessarily fails on the playback thread when
the timeline becomes known. Pushing failure to the same
place when the timeline is known means there's only one
failure path for this case. A later CL will likely introduce
an InvalidSeekPositionException for this case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=141037708
This is implemented in the same way as in MediaCodecRenderer.
Move codec != null guard into feedInputBuffer to handle the case of an input
format change with no dequeued buffers where the codec can't be reinitialized
immediately.
Issue: #2111
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140864942
These additions are useful for sources that need to track the playback position
and control playback.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140828310
Prevented readFile() setting "changed" boolean to true every time. It's set only if encryption key is set but the index file isn't encrypted.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140714173
If a period has no enabled tracks it is considered to be fully buffered, even
if its duration is unknown. This would cause the offset of the next loading
period to be set based on the unset duration of the preceding period, in turn
causing the from of the player to expose a position based on an unset value.
Only load the next period when the current one has a known duration. If a
period has no enabled tracks and an unknown duration this causes the player to
play the period indefinitely.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140613858
When CEA-608 is embedded in MP4 each packet consists of
cc_data_1 and cc_data_2 only. The marker_bits, cc_valid
and cc_type are implicit. As a result playback of CEA-608
embedded in MP4 broke when we started passing the extra
byte for the TS case (and adjusted the decoder to assume
the byte was present).
This change introduces a special mimeType for the case
where the byte is implicit (!). An alternative option
was to insert the extra byte every 2 bytes in the MP4
extractor, but this is really quite fiddly to get right.
Also made the loops in the 608/708 decoders robust against
input of the wrong length.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140609304
Encryption key in index file is read by DataInputStream.read() which may return less bytes than required. Replaced it with readFully() which should read full length of data.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140597693
Leaving disabled by default for now, but we may want to consider
enabling it by default. Note that in V1 for ExtractorSampleSource
the behaviour was equivalent to this option being enabled, since
we didn't perform capabilities checks. For DASH/SS/HLS the V1
behaviour was equivalent to this option being disabled.
The type in PlayerActivity has been changed just to make it
easier to add a line that calls setParameters.
Issue: #2034
Issue: #2007
Issue: #2078
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140477568
I can't see how this would ever make a difference, but there's no
point in returning true. Either we've really reached EOS (in which
case outputStreamEnded will be true and the next drainOutputBuffer
will be turned into a no-op) or we've re-initialized the codec (in
which case there wont be anything to drain since we wont have fed
anything to the codec yet).
This change should also prevent the hypothetical NPE described in
issue #2096, although we're unsure how that NPE would occur unless
MediaCodecRenderer has been extended in an unusual way.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140338581
The simple verifications in this test may be useful for smoke testing, but the
coverage of ExoPlayerImplInternal is low. The intention is to add tests for
more complex logic in ExoPlayerImplInternal in later changes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140327358
This allows ID3 PRIV timestamp extraction and Extractor Sniffing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140209568
Select the timestamp master depending on track availability. If
a variant is being loaded, then that is the timestmap master.
Otherwise, if an audio track is being loaded, then the responsible
chunk source is the timestmap master. If no variant or audio
rendition is enabled, then a subtitle chunk source is selected as
timestamp master. This CL will become specially relevant once
ID3 PRIV timestamps are used for audio renditions.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140201385
Note that we still have null timelines in ExoPlayerImplInternal.
This is deliberate; and is likely necessary to distinguish between
the no-timeline-yet and timeline-is-empty cases (we want to try
and process a pending seek for the latter, but not the former).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140200980
The refresh handler in HlsPlaylistTracker was being instantiated in the
same thread as the MediaSource (i.e. Main thread).
Issue:#2108
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140197553
- Allow extension and overriding of renderer creation.
Several developers have asked for this, so that they
can use their own renderers (typically extensions to
the core ones) without losing the ability to use
SimpleExoPlayer.
- Add option to not attempt extension renderer creation,
for efficiency.
- Align build variants for internal and external demo
apps. This is slightly unfortunate, but convergence
seems necessary for useExtensionRenderers.
- Fix DASH playback tests to use the debug video
renderer.
Issue #2102
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140140915
This issue affects ExtractorMediaSource only. We shouldn't
start loading in the case that we're prepared and have no
enabled tracks, since there's nothing that we need to load.
This was causing an assertion failure in startLoading.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140030650
This behavior is defined in ISO-13818-1, section 2.4.3.3(continuity_counter).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140029161
- Fix handling of the currently playing period being
removed. This didn't do the right thing at all.
- Relax rule on seekToPeriodPosition re-using an
existing holder.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140014791
Note that multi-segment fetching is only possible in the
case that segments in a representation are defined to have
the same Uri and adjacent ranges (this is very rarely true
for live streams, but is quite often true for on-demand).
In the case that merging is requested but not possible,
the implementation will request one at a time.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140012443
Also allow custom DashManifestParser injection, to
support parsing of custom elements and attributes that
service providers may wish to include in their manifests
(e.g. #2058).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139813108
- This should be a no-op change
- Inline attemptRestart
- Clean up processing of pending seeks
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139804630
This is techically not allowed by the spec[1] but might still occur in
certain scenarios. New playlists with older media sequence numbers are
ignored.
[1]: HLS draft version 20, section-6.2.1
Issue:#2059
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139564889
continueLoading shouldn't return true unless it's done
something. Always returning true if endOfStream was
causing CompositeSequenceableLoader.continueLoading to
loop forever.
It looks like the same issue exists in ChunkSampleStream
as well, although I can't seem to provoke DASH or SS
playbacks into doing anything bad as a result.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139559834
ReusableBufferedOutputStream is a subclass of BufferedOutputStream with a reset(OutputStream) that allows an instance to be re-used with another underlying output stream.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139505999
I'll have a more thorough refactor of some of this class
fairly soon!
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139451693
Use BufferedOutputStream and BufferedInputStream while writing / reading.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139446039
This removes duplication from SimpleDecoderAudioRenderer and
MediaCodecAudioRenderer.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=139187254
Clean up AtomicFile and make it return a custom FileOutputStream
for writing which handles IOException automatically during write
operations.
It also syncs the file descriptor and deletes the backup file on
close() call. This fixes the order of flush and close operations
when the fileoutputstream is wrapped by another OutputStream.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138779187
This can be used by the app for showing arbitrary UI on top of the player (for
example, UI elements associated with an ad).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138610733
These variables are never read, since the underlying control
view reads them directly from the attrs.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138528246
This fixes VOD->Live transitions, with the caveat that
the Live portion still ends up further behind the live
edge than intended. This will be fixed in a following
change.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138407066
This change fixes the race condition where the internal
timeline is different to the externally visible timeline
when a seek is performed. We now resolve the seek position
using the externally visible timeline, then adjust the
period index as required for the internal timeline. If the
period is missing we follow similar logic for the existing
case where the playing period is removed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138402076
This CL adds a SpliceInfoDecoder for the most common SCTE35 commands for splcing.
So far, it only includes TransportStreams, but porting it to HLS and DASH should be
fairly easy.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138389807
This is the first step towards allowing discontinuities in the
playlist tracking. Also changed durationSecs for durationUs in
MediaPlaylist.Segment.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138207732
handlePeriodPrepared
->setPlayingPeriodHolder
->enableRenderers
passes rendererPositionUs to renderer.enable(), but
this value is not set correctly.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138176114
A VOD-style period in a dynamic manifest would result in a NullPointerException.
Also fix another issue in which an unrecognized mime type would also result in
NullPointerException.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138075137
In order to expose the live window, it is necessary (unlike before) to refresh
the live playlists being played periodically so as to know where the user can
seek to. For this, the HlsPlaylistTracker is added, which is basically a map
from HlsUrl's to playlist. One of the playlists involved in the playback will
be chosen to define the live window. The playlist tracker it periodically.
The rest of the playilst will be loaded lazily. N.B: This means that for VOD,
playlists are not refreshed at all. There are three important features missing
in this CL(that will be added in later CLs):
* Blacklisting HlsUrls that point to resources that return 4xx response codes.
As per [Internal: b/18948961].
* Allow loaded chunks to feed timestamps back to the tracker, to fix any
drifting in live playlists.
* Dinamically choose the HlsUrl that points to the playlist that defines the
live window.
Other features:
--------------
The tracker can also be used for keeping track of discontinuities. In the case
of single variant playlists, this is particularly useful. Might also work if
there is a that the live playlists are aligned (but this is more like working
around the issue, than actually solving it). For this, see [Internal: b/32166568]
and [Internal: b/28985320].
Issue:#87
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=138054302
- Use A/V tracks only for buffering position when available
in ExtractorMediaPeriod.
- Fix layering of exo_simple_player_view so that subtitles
are above album art. The test stream provided has both.
- Make album art in SimpleExoPlayer view respect the resize
mode, like we do for video.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137698473
TrackSelector no longer has a listener. Instead, tracks
change events are reported through ExoPlayer.EventListener.
Applications interested in retrieving the selection info
should retrieve it directly from the TrackSelector by
calling an exposed getter.
Pretty sure the ref'd issue is fixed as a side effect of
this change.
Issue: #1942
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137183073
Unlike with PesReaders, sections don't have a standard way
of providing timestmaps or even generating tracks. We need
to pass this information so that readers decide what to do
with it.
Issue:#726
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137162494
This allows the user to create section readers(usually) for reserved pids,
like SDT, EIT, CAT, etc.
Issue:#726
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=137150853
SectionPayloadReaders are provided to a SectionReader to
get whole sections(crc checked). This allows the injection
of custom section readers. E.G: SCTE35 messages.
Issue:#726
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136816612
In this CL:
* PesReader moves out of TsExtractor and becomes public.
* ElementaryStreamReaderFactory becomes TsPayloadReaderFactory and is
moved to TsPayloadReader.
* The TsPayloadReaderFactory is in charge of wrapping any
ElementaryStreamReaders with a PesReader.
Incoming:
* Extract SectionReader supperclass (analog to PesReader, but for
sections) from Pat and Pmt readers.
* Add a ScteReader, wrapped by a section reader, and include it in
the DefaultTsPayloadReaderFactory.
Issue:#726
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136707706
pesPayloadReader can be null here because DefaultStreamReader.init() can return null on unknown streamId. If we have a junk transport stream in our content an exception will be thrown.
*** Reason for rollback ***
Flag doesn't enforce what it says it enforces, due to redirects
*** Original change description ***
Add REQUIRE_HTTPS flag
Note that it's not possible for the library to enforce that
the flag is adhered to, since it's possible for applications
to inject custom implementations of DataSource (there's no
requirement they even extend HttpDataSource for network
requesting implementations). It's possible for applications
to replace pretty much anything in the library, so there's
no other place we could put the flag where we could make
this guarantee. Hence this is a best-effort that will work
when...
***
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136583459
This is a problem when two invocations of getNextChunk that retrieve
chunks (i.e. not playlists) occur too apart in time. In that case
the last loaded chunk has a media sequence that is behind the current
playlist.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136501291
Note that it's not possible for the library to enforce that
the flag is adhered to, since it's possible for applications
to inject custom implementations of DataSource (there's no
requirement they even extend HttpDataSource for network
requesting implementations). It's possible for applications
to replace pretty much anything in the library, so there's
no other place we could put the flag where we could make
this guarantee. Hence this is a best-effort that will work
when using HttpDataSource implementations that we provide.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136500947
Use sha1 of content uri if a custom cache key or content id isn't provided.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136351830
One issue with the previous implementation was that
isUnsynchronized would not be set back to false if
previously set to true and if the next header has
majorVersion >= 4. In general, having the decoder be
stateless is clearer (and thread safe, albeit that
this property is not required).
1. HttpMediaDrmCallback.executeProvisionRequest needs to specify
an empty byte[], else we do a GET instead of a POST.
2. Content-Type should not be set when making the provision
request, since there's no body.
3. DataSource implementations must correctly handle a non-null
body with zero length. CronetDataSource was not handling this
case. DefaultHttpDataSource was, but made a code modification
to make it a little clearer. OkHttpDataSource seems to handle
the case correctly, and it doens't look like the code can be
made clearer.
Issue #1925
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136042641
Note that actually handling CEA-708 is not yet implemented,
and so this is a no-op change from a behavior point of view.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136038439
The method track(int id) currently has different behaviours across
implementations. This CL maps ids to track outputs, which means
that successive calls with the same id will return the same
TrackOutput instance. Also fixes TsExtractor inconsistent behavior
after a seek.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136026721
A blocking call is necessary where we want to guarantee that
the player wont access the surface after the method call has
returned. We currently only do this for the case:
Surface->Null
But we should also do it for the case:
SurfaceA->SurfaceB
Since the caller may reasonably do something like destroy
SurfaceA immediately after it's been replaced.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135921296
This allows the injectable reader factory to be a stateless factory, allows
the seeking to be consistent and will allow multiple CC channel support later
on.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135909712
- Fix issue in ExoPlayerImpl where the timeline was null'd
but onTimelineChanged was not fired.
- Add the ability to not reset the timeline. This is useful
for retries where you know the timeline will be the same
as it was previously.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135797577
playingPeriodHolder can be null in the case that the first
period is still being prepared. We need to make sure we
release the period that's being prepared in such cases,
which is loadingPeriodHolder.
Issue: #1914
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135793472
- Move nearly all logic onto the calling thread (i.e. the thread
calling open/read/close), to make threading correctness more
obvious.
- Document which variables are read/written from which thread, and
why the call sequences are safe.
- Fix thread safety issue that I think could probably cause data
corruption in the case of a read timeout followed by another
request into the DataSource.
Also:
- Relaxed content length checking to be consistent with the other
http DataSource implementations, and avoided parsing the headers
where they're not used.
- Fixed missing generics in CronetDataSourceFactory.
- Added TODO to work with servers that don't support partial range
requests.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135702217
- Make sure no events are posted on PlaybackControlView
if it's not attached to a window. This can cause leaks.
The target hide time is recorded if necessary and
processed when the view is re-attached.
- Deduplicated PlaybackControlView.VisibilityListener
invocations.
- Fixed timeouts to be more intuitive (I think).
- Fixed initial visibility of PlaybackControlView when
used as part of SimpleExoPlayerView.
- Made some more attributes configurable from layout xml.
Issue: #1908
Issue: #1919
Issue: #1923
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135679988
- Lots of misc cleanup
- Remove GaplessInfo from Metadata. IMO it doesn't quite belong there,
and means it ends up being represented twice inside Format.
- Note: Changes untested, but will be tested in due course!
Without this developers which reuse a SurfaceHolder with multiple instances of
SimpleExoPlayer need to call simpleExoPlayer.setVideoSurfaceHolder(null) to get
the SimpleExoPlayer.ComponentListener removed from the surface holder. If they
don't, the component listener is still registered and as a member class leaks
an instance of simpleExoPlayer.
Issue #1855
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135292439
Playback would fail if a renderer is toggled from consuming from
one child to another in a single step.
Issue: #1900
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135270356
https://github.com/google/ExoPlayer/issues/1827
Three different modes available: fit (default), fixed_width, fixed_height
Developers need to use wrap_content for the dimension which is not fixed:
app:resize_mode="fixed_width"
android:layout_width="320dp"
android:layout_height="wrap_content"
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135264861
Configuration of retry currently fails if all of the
following are true, which is highly unlikely but does
occur in the ref'd issue.
1. Loading/extraction fails
2. Neither length of stream of a seek map is known
3. At least one track has been output by the extractor
Issue: #1899
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135228687
- Enfroce read returns 0 if readLength==0 everywhere.
- Fixes and simplifications for CronetDataSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135138232
- Make read return 0 if readLength==0
- Return RESULT_END_OF_INPUT properly in the case that
bytesRemaining is unset (this was broken previously,
but only applies for assets > 2^31 bytes, so it's
unlikely anyone ever hit this issue)
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135136541
- Correctly null out streams[j] in the case that a renderer
is being disabled.
- Read discontinuities from all children, not just enabled
ones. This fixes a failure when reading a discontinuity
with all renderers disabled.
- Add in some assertions to make incorrect stream selection
failures obvious and immediate.
- Relocate subtitles so they're above the shutter (needed so
they continue to be visible when video is disabled but
text is still enabled).
Issue: #1854
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135089944
This CL adds support for initialization segments in HLS. This is required mainly for(but not limited to) usage of fMP4. The fMP4 support only consists in creating the required extractor if the extension is .mp4, provided the initialization segment is correctly
loaded and passed to the extractor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134997636
This prevents a large amount of memory from being held
in the case that a player instance is released, but the
application is holding dangling references to the player
that are preventing it from being garbage collected.
Issue: #1855
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134992945
- Fix NPE issue in SingleSampleMediaPeriod.
- Delay handling of EOS in TextRenderer until the last
subtitle is fully played out.
Issue: #1882
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134979286
Currently this has only been tested with the RawCC container, though it should work with anything that makes use of SeiReader (i.e. MPEG2-TS) with minimal changes to SeiReader.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134781660
When reading the last period, the readingPeriodHolder was set to null in
updatePeriods if it was the last period. (This would occur almost immediately
when playing a single-period source.) seekToPeriodPosition suppresses reusing a
loaded/prepared period if the reading period and playing period did not match,
which meant that the whole timeline was recreated when seeking in the last
period.
Leave readingPeriodHolder non-null. This means that at all times either
playingPeriodHolder == readingPeriodHolder (and they could be null or
non-null), or playingPeriodHolder and readingPeriodHolder differ and are both
non-null.
Also fix an issue where streams were never forced to be recreated during track
reselection when reading ahead.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134774238
All of the classes in the text.eia608 package have been moved to
text.cea, and renamed with the "cea" prefix instead of "eia". All of
the buffering logic has been extracted from Cea608Decoder (formerly
Eia608Decoder) into the abstract CeaDecoder, which Cea608Decoder
extends. Cea608Decoder also now expects a 3-byte sample (i.e. the
entire cc_data_pkt instead of just the cc_data_1 and cc_data_2 bytes).
Classes like RawCcExtractor and SeiReader, responsible for creating
these samples, have also been updated accordingly.
This change is a necessary precursor to adding support for multi
-channel CEA-608 and CEA-708 captions.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134537482
This encourages a single invalidation when setting different parameters.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134436136
HlsSampleStreamWrapper and ExtractorMediaPeriod would call
onPrepared/onSourceInfoRefreshed from their loading threads. That was
problematic for ConcatenatingMediaSource and MergingMediaSource, which assume
that their callbacks are called on the same thread (iterating through timelines
from all sources and updating pendingTimelineSources respectively). This change
makes them post calls to the callbacks on the playback thread.
Generally, implementing a composite MediaSource is easier if
MediaPeriod.Callback's methods are all called on the same (playback) thread, so
this change makes that part of its contract.
Also post onContinueLoadingRequested from ExtractingLoadable because
MergingMediaPeriod.onContinueLoadingRequested reads trackGroups written on the
playback thread.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134407280
Eia608Decoder.
Full preamble positioning will be provided in a subsequent CL. This CL
also contains some minor cleanup in Eia608Decoder and adds some TODOs
to handle the second channel.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134299337
This solves the thread unsafety issue of the default track selector and
allows atomic configuration changes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=134288525
Also add a test MP3 stream with one frame.
Make FakeExtractorInput's end of input detection to apply also for peekFully, and
make its skip and read methods read at least one byte.
Issue: #1732
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=133241641
The four-arg constructor didn't exist in ViewGroup for
earlier API levels. I think it can probably be safely
omitted, unless you know otherwise?
Issue: #1820
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=133156975
If a Webvtt HlsChunkSource got to schedule its chunk load before the
master HlsChunkSource (the one that downloads the TS or the fMP4
chunks), the player would never get past the buffering state.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132985792
- Also make some of the naming more concise + misc style cleanup.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132899979
- Also fix an issue that allowed blacklisting of all tracks,
due to incorrect index being used.
- Also fix an issue with track deselection for HLS.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132882151
This allows the adjustment of timestamps in microseconds along with
TS timestamps. This is useful for containers that include the
timestamps in microseconds format, like fMP4 and WebVTT.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132547521
- This change fixes seeking before the prepare (or more
accurately, before the timeline is set). The fix a minimal
one to fix the behavior. It's inefficient compared to
posting the pending seek onto the playback thread, which
will be the long term solution.
- As of this change, I think we can call V2 "done". There are
some loose ends to tie up, but the API is effectively
finalized and the implementation is in a state where you
can take it, use it and expect it to work.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132468107
Adds a few unused fields to HlsUrl and moves things towards the Hls
reimplementation we are looking for. Also fixes a bug related to
asuming every getNextChunk().loadable == null being related to
reaching the live edge.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132305206
If the live window has a small duration, we currently
end up setting the default start position to be right
at the start of the window. This increases the chance
of a BehindLiveWindowException.
With this change we impose a minimum 5s gap between
the start of the window and the default start position.
If the window is *really* small (<10s) then doing this
would push the default start position too close to the
end of the window. We don't have much time to play with
in either direction in this case, so we put the default
start position in the middle of the window and hope for
the best.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132054802
Now you can do cool things (if you really want to!) like
play a video twice, then play a second video, then loop
the whole thing, all seamlessly.
new LoopingMediaSource(
new LoopingMediaSource(firstVideoSource, 2),
secondVideoSource));
You can also just loop, which is probably more useful :).
Issue: #490
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132049599
People will inevitably try and do it, and it's pretty
easy to handle properly, so why not...
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=132047019
- Don't send a timeline to the listener until all children
have reported their timelines.
- Propagate a proper merge error if merging fails.
- The PlayerActivity hack is necessary due to the way Andorid's
MediaController widget attaches to the window :(. It'll go
away once we get our own player controls.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131958169
This could cause us to "lose" allocations backed by an
initial block, meaning they became unavailable for use
despite still being allocated.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131931465
- Centralise compileSdkVersion, targetSdkVersion and
buildToolsVersion in a single place for gradle.
- Bump compileSdkVersion and targetSdkVersion to 24.
- Bump com.android.tools.build version to re-enable
instant start.
- Bump targetSdkVersion in manifests (needed for
internal builds).
- Use standard expandable_list_item from Android in
the demo app, since ours doesn't look right when
targeting API level 24. We were also setting the
theme on the wrong element in the manifest, so I'm
removing that line.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131929216
- The need to pass a Clock is pretty much only for testing, so
make the constructor that takes one package private + use
the system clock for public constructors.
- Add default timeout values.
- Also make sure we set Content-Type in all license requests,
since when using Cronet the stack requires it to be set.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131404298
This is done through the bitstream id field and allows removing
the isEac3 parameter from the constructor.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131393477
If they're omitted, it's reasonable to assume it's because
they were uninteresting (i.e. sample data always tightly
packed at the start of the mdat). This is an issue for some
SmoothStreaming streams.
We actually already play such streams successfully, but
that's only due to another bug to be fixed in a following CL.
The same is true for V1, but given the low impact nature,
the fix will be V2 only.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131191975
If currentTrackBundle is updated at the start of the
block and then something goes wrong in the middle (e.g.
one of the skipFully calls) then the extractor wont
resume from the correct place.
This would be caught by our extractor tests if we had
a test sample that requires skipping to the sample data.
I'll try and construct one of those.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131191174
- The -1 needs to be a 0. My bad.
- Create AAC CSD if not defined in manifest, like in V1.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131190995
Also tweak how the null checks happen in a few DataSource
implementations (should be no-op changes, but allow you
to look at close() and be happy it does the right thing
without having to loop at the open() implementations).
Issue: #1759
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131172427
There's still some internal to clean up to do, and in particular
it remains a TODO to be able to handle seek calls before the
timeline is set (for this CL, such calls are dropped). This change
does however finalize the API.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131171318
Fix the calculation of the seek window for multi-period DASH.
Snap the default initial position back to the start of its segment, to ensure
that the first sample provided when transitioning to a DASH live source is a
key-frame.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131052912
- Remove playingPeriodEndPositionUs. It doesn't look like it's
required.
- Rename time variables to make it clearer what they are.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=131027164
Window is potentially confusing with Android's Window class.
Once Window is renamed, it makes sense to rename Timeline too.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130938392
Also inline a few methods/classes where they can be made
private and therefore be removed from the public API.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130935090
Mainly, this allows the extractor to expose multiple audio tracks.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130928152
- Use a single constant for unset/unknown times across
all time bases. Note also that this moves away from
use of -1 for unset/unknown times in ms, which was a
bad choice (it might conflict with real times, such
as a time representing being just behind the start
of a live window).
- Add a few other unset constants, and use them.
- Fix some hardcoding of -1 where existing constants
should have been used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130775594
- Remove getNewPlayingPeriodIndex from MediaSource
- Remove all absolute references to period indices from
Window. Their existence prevents ConcatenatingMediaSource
from being able to efficiently handle children with
large numbers of entries (e.g. a cursor backed source),
since it would copy all windows into its merged timeline.
- Fix ExoPlayerImplInternal to attempt a restart in the
case that the loading (but not yet prepared) period is
removed, in absence of a playing period.
- Implement logic for finding the "next" period in the old
timeline when attempting a retry.
Removing some of the nasty US<->MS conversions left as a
virtual TODO.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130659973
Period transitions can either be to new windows (in which case the default
position for the new window should be loaded) or to the next period of the
current window (in which case the the new period should be played from zero).
Fix the logic for calculating the new period index to load to implement this.
In processManifest, periodsById may contain periods that have been removed from
the manifest, which are still being used by the player (it releases periods on
receiving the source info refresh after processManifest returns). Ignore
periods that have been removed from the manifest when calling updateManifest.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130626441
- This change marks the methods that will be removed, and
renames the Window methods to remove "Window" from their
names.
- The Window methods need to be made to work (rather than
throw exceptions) when the timeline isn't set. Once that
gets done in a subsequent CL, the deprecated methods will
be removed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130612979
- This change also enables seeking in live windows in the
ExoPlayer demo app.
- The added playlist doesn't transition properly by itself,
but for manual transitions it works correctly, and
demonstrates seeking into a default position.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130515880
- Add missing callback call.
- Allow injection of live edge offset.
- Refine calculation of live window size to correctly
handle just-started streams where the DVR window
hasn't yet grown to full size.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130412465
Also allow use of suggestedPresentationDelay taken from the
manifest, and enable this by default.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130409924
SinglePeriodTimelines can all use the same identifier, as their identifier is
wrapped in a pair with the (fixed) source index when they are concatenated with
other sources' timelines.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130386297
This is a 1:1 mapping. This change formalises the fact,
and makes it possible to easily query the mapping.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130375111
This was always a bit of a hack; for Play Movies. It may well
no longer be necessary, and if not I'd like to think of a nicer
or more general way of doing it. We can always bring it back
if needed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130373433
- This avoids the need to have to use the timeline to
calculate a window duration, which can be awkward.
- Window now represents a window of availability with
an isSeekable flag, rather than a window of
seekability.
- Promoted Timeline and Window to top package; they're
pretty important :).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130278509
It's no longer safe to convert END_OF_SOURCE -> duration on
the main therad, since the Timeline from which the duration
is obtained is posted to the main thread, where-as the
buffered position is passed by updating a volatile. Hence
an update to the latter might become visible to the main
thread before the corresponding Timeline.
This change moves the conversion to the playback thread.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130265893
This is in preparation for making it so that periods aren't reused.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130113382
- For audio/video, we should report the minimum largest
queued timestamp. This ensures that buffering continues
rather than stops in the case of bad sample interleaving.
- If there are "sparse" tracks then they should be ignored
for this calculation, otherwise the buffered position can
end up getting stuck at some small value (e.g. if there's
a text track containing a single sample with a small
timestamp).
- In the edge case that there are only "sparse" tracks, we
probably want to take the maximum largest queued time
instead.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130094266
*** Reason for rollback ***
Referential equality was probably the right thing to do, since using .equals
breaks track selection in the case that a source exposes two or more tracks
whose formats are equal. We should fix the way overrides work instead.
*** Original change description ***
Fix multi-period transitions with track selection overrides
An override applies across periods provided they expose the
same track groups according to .equals, but the formats in
the override are then compared against the period's formats
according to ==. Use .equals consistently to fix.
***
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130083840
To generate the reports, under 'v2' folder run:
./gradlew createDebugCoverageReport
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129991223
This change allows MediaPeriod instances to replace
SampleStream instances when the selection isn't changing.
It also allows MediaPeriod instances to retain a
SampleStream but indicate that the renderer consuming
from it needs to be reset.
The change is used to fix the ref'd bug, and is used to
do the same thing in HLS without the need for the source
to report a discontinuity. Note that reporting discontinuity
could cause unnecessary failure when used as a child of
MergingMediaSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129971782
Split Cue Rendering up into a layout, background drawing and foreground
drawing phase so that issues with overlapping 608 captions are being prevented.
If a renderer is reading ahead of the playing period, seeking within the
playing period would fail, because renderers would not be disabled but then try
to read from SampleStreams that have a released period.
Also, in the same circumstances, seeking within the reading period would fail,
because all renderers would be disabled, but their sample streams have already
been read. When they are reenabled they expect to see a format but don't
receive one.
In both cases, seeking can just clear the timeline. This only occurs in rare
circumstances when the player is reading ahead, so the cost of re-preparing
will not be incurred often, and allows the seeking logic to be simpler.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129891060
Referential equality is going to become important for detecting
whether a SampleStream has been replaced, so we need to create
new instances as we do elsewhere.
This also enables multiple SampleStreams to be provided for a
single TrackGroup, as is also true for DASH and SmoothStreaming.
It's forbidden to ask for multiple SampleStreams from a single
TrackGroup currently, but we may choose to relax that at some
point (and indicate whether it's allowed as a flag on each
TrackGroup).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129842336
- Support specifying a preferred text language.
- Score based selection for text/audio/other tracks.
- Prefer default tracks to non-default ones.
- Allow overriding of base select*Track methods.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129626994
When seekToPeriodPosition found that the seek destination period was already
prepared, it would not disable/re-enable renderers. This was fine if the
playing period wasn't changing, but in other cases the renderers would be left
reading the incorrect streams (and the underlying periods may have been
released).
Also, transition to the buffering state before re-enabling renderers, so that
the renderers are not started until leaving the buffering state.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129625632
- Enforce viewport constraints for fixed video track selection.
- Select best fixed video track, not the first one.
- Better handling of video tracks with unknown dimensions.
- Mini bug fix.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129226593
- Only setup a codec to allow adaptation to other compatible
formats in the stream. If something like the mimeType is
changing adaptation will never be possible, so there's no
point.
- Incorporate maxInputSize into the reconfiguration logic.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129088464
On an edge case, player may get stuck when the renderers are ready but the buffer doesn't get full enough because of a fatal error in data source. An example state can be created by starting a live DASH stream and switching between normal and slow network connections.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129084824
An override applies across periods provided they expose the
same track groups according to .equals, but the formats in
the override are then compared against the period's formats
according to ==. Use .equals consistently to fix.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129081591
For self-initializing segments, DefaultTrackOutput receives
a null format and then the actual format. This broke the
deduplication logic in InfoQueue.format, since there were
two transitions: FormatX->Null and Null->FormatX. This CL
allows deduplication to succeed in this case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129081583
The codec cannot be reconfigured if the format rotation
changes, or if the format dimensions exceed the current
decoder's configured maximum dimensions.
Issue #1707
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=129004187
When seeking to the default position in a period, the containing source may
actually return a position in another period. Multi-period live sources can do
this to seek the player to the live edge.
ExoPlayerImplInternal uses the same functionality when the playback position
reaches the end of a period to determine what period/position to play next.
This means that when playback transitions to a multi-period live source from
some other source (playing a concatenation of those two sources), the player
will play the live edge rather than the beginning of the earliest period.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128984355
Useful functionality promoted to core library:
1. Management of SurfaceHolder.Callback lifecycle
promoted to SimpleExoPlayer
2. Ability to determine whether audio/video tracks
exist but are all unsupported promoted to
MappingTrackSelector.TrackInfo
3. Read external storage permissions check promoted
to Util
4. SubtitleView given ability to act directly as a
TextRenderer.Output to remove layer of indirection
5. SubtitleView given ability to configure itself to
user's platform wide caption styling
6. KeyCompatibleMediaController promoted to library's
UI package.
Relocation of boring stuff:
1. ID3 frame logging moved to EventLogger.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128714230
This change merges the duties of FormatEvaluator into
TrackSelection classes, so that both the static and
dynamic parts of track selection are implemented in a
single place.
New feature: Demo app now allows you to enable random
adaptation in the track selection dialog.
Notes:
- It should be quite easy to allow application side
track blacklisting in addition to source side, as an
extension to this. That would effectively allow
applications to do seamless/deferred track selection
by creating a TrackSelection with all tracks enabled,
and then toggling the blacklist flags to select the
ones they want to be active.
- It should be trivial to implement format blacklisting
for DASH and SS as an extension to this. Will do in a
follow up CL.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128707517
- Invoked --> Called
- Gets --> Returns
- "True if X. False otherwise." --> "Whether X."
- Removed some @returns where the Javadoc is in "Returns X" form
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128678638
This is in preparation for allowing MediaSources to skip over periods when one
period ends, which is needed for starting to play a multi-period live stream
that is concatenated on to another period at the live edge.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128674659
- Suppress spurious resource type warnings.
- Make AS happy by making private method non-final.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128584391
As per the spec of MediaPeriod.getDurationUs, when a live
stream ends we need to start returning the correct final
duration.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128471183
We were forgetting to reset renderers during track
selections where muxed media is used.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128391816
It's only "needed" for HLS, and this requirement will
go away soon. It's safe to remove the flag ahead of
this because a TrackSelector can/should not attempt to
adapt between multiple audio/text tracks.
Also remove unnecessary restrictions on TrackGroups
being non-empty and only of known types.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128376601
- Remove null checks (never happens).
- Use "const".equals(Util.CONST) where possible.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128351654
The classes these tests are written for have changed
so much we'll have to write them again. We can refer
to V1 if we want to look at what the old tests did, so
there's no need to keep this file in the V2 tree at
the moment.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128189076
- TrackSelection now exposes the selected formats, ordered
by decreasing bandwidth. This removes the need for DASH,
SS and HLS to do the sorting individually.
- The change also removes the need to reconstruct TrackSelection
instances with a different group index in various places
(e.g. MergingMediaPeriod).
- This is also a step toward potentially packaging the
FormatEvaluator inside of the TrackSelection (TBD).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128159064
According to the spec, there is no mandatory relation between segments'
sequence numbers of different variants. This CL ignores sequence numbers
when switching variants:
* In vod, the switching playback position is obtained by adding the
duration of previous segments.
* In live playback this is not possible. It is assumed that the
different live media playlists do not drift apart too much, so
the playback position is obtained by subtracting the duration
in reverse order.
In later CLs, the described mechanisms will become the fallback methods
by replacing them with the use of EXT-X-PROGRAM-DATE-TIME information
or more reliable sources.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=128072663
SmoothStreaming -> Ss
MediaPresentationDescription -> DashManifest
DashSingleSegmentIndex -> SingleSegmentIndex
Moved DASH and Ss manifest classes to matching
manifest packages for consistency. For Hls the
package is called playlist still, since that's
what they're widely known as.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127925961
This also removes direct use of HttpURLConnection and
allows use of any HttpDataSource for license requests,
which means those using OkHttp can finally use the
same network stack for license requests as they're using
for everything else, without having to implement their
own callback.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127841045
With this change, MediaCodecRenderer acquires a session
from its DrmSessionManager whenever the DrmInitData in
the format changes. The DrmSessionManager is permitted
to return the same session if it can be re-used.
This plumbing adds support for:
1. Key-rotation, in the case that a key-rotation-aware
DrmSessionManager is used. Such an implementation will
return the same DrmSession for every aquisition, but
will be making use of multiple MediaDrm instances within
that session to enable the rotation.
2. Playlists with mixed clear and protected content. One
final piece to this will be to have each MediaPeriod
provide its own license URL. We could also allow each
MediaPeriod to specify the DRM UUID, but switching from
PlayReady to Widevine in a playlist seems like quite a
hypothetical thing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127816046
This is a no-op change to avoid an error-prone unnecessary
boolean expression warning.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127787709
There may be other ways to estimate bandwidth that don't
require listening to our own transfers.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127741651
This was possible previously, but now we support things
like multi-period DASH we need to do the injection in
the form of factories rather than concrete instances.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127735816
- Cleaned up documentation
- Removed getIndex from Renderer interface
- Renamed reset to be positionReset
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127731006
This change restores ExoPlayer to its previous behaviour.
I think we'll want a "resetPosition" boolean parameter on
setMediaSource at some point, but no need to add it right
now. Note that this would not always reset to the start
of the source. For a live playback it will reset to the
desired position (normally somewhere slightly behind the
live edge).
Issue: #1667
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127549700
Renderer no longer extends RendererCapabilities after this
change. Capabilities are instead accessed via a getter.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127532634
In V1 we received complaints that Renderer was too locked down.
In particular, it wasn't possible to implement a Renderer that
wrapped another Renderer, since most of the methods were package
private and final (e.g. enable).
This change defines Renderer as a proper interface, removing
this limitation. A method-reordering-only change will follow
this one, to get things into a nice consistent/sane order in
each of the Renderer classes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127527995
We should only give a TrackSelector access to what it
needs, not the whole Renderer. This is particular true
if [] happens, since more Renderer methods
will become publicly visible.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127526473
DashMediaPeriod.releasePeriod resets duration to 0, but
instances are currently being re-used through multiple
prepare/release cycles. Hence the duration needs to be
retained. This change fixes this issue, and also makes
variables final in DashMediaPeriod where possible.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127440080
1. Rename "extensions" package to "decoder". It's used by both
text and (should be used by) metadata, so it's no longer just
for extensions.
2. Move Buffer objects move into the decoder package.
3. Rename SubtitleParser and MetadataParser to SubtitleDecoder
and MetadataDecoder respectively, since they extend Decoder.
Ditto for all subclasses.
4. Subtitle and Metadata decoders now throw their own exception
types rather than ParserException.
5. Move MediaCodec classes into a mediacodec package, with the
exception of the concrete audio and video renderers.
6. Create an audio package to hold the two audio renderer classes
plus related util classes.
7. Create a video package to hold the one video renderer class
plus related util classes.
After this change the following nice properties hold:
1. Want a video renderer? Look in the video package. Ditto for
audio, text and metadata.
2. All TrackRenderer implementations use a decoder of some kind
to decode buffers received from the source, so we have
consistent terminology there.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127326805
The BandwidthMeter should only be used by MediaSource
instances and the objects they reference, so there's
really no reason for the player to need to know about it.
This change sacrifices DebugTextViewHelper showing the
estimated bandwidth, but I think that's a price worth
paying.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127316755
It doesn't look like TrackSelectionPolicy is going to be
useful other than with DefaultTrackSelector, and it's kinda
confusing dealing with both "selector" and "policy"
terminology. This change does the following:
DefaultTrackSelector -> selector.MappingTrackSelector
DefaultTrackSelectionPolicy -> selector.DefaultTrackSelector
TrackSelectionPolicy -> [deleted]
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127196326
- Chunk package is only useful to source packages.
- BehindLiveWindowException is a source exception.
- SequenceableLoader is related to sources.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127195307
Also, only enable the workaround when the resolution isn't changing but the
format is changing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127192637
Also addded result constants to C to remove the dependency
on TrackStream from extractor.DefaultTrackOutput.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127192488
There aren't really enough classes to justify it right
now, but if we're going to do a VideoView equivalent and
sensible player controls at some point, it's worth making
now to get classes into the correct place.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127184374
All other MediaCodec specific classes are prefixed MediaCodec,
and we now have other decoders that aren't not related to
MediaCodec.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127093330
The volantis H.264/AVC decoder could get stuck when adapting between certain
stream formats where there was no change in resolution.
Queue a small Baseline profile SPS, PPS and IDR slice during adaptation on this
device, to force reallocation of reference frames.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127091330
As multi period DASH isn't supported yet use the duration of the first period only.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=127086808
- The package is renamed to avoid conflicts with v1, should any
app wish to include both v1 and v2 for a period of time. This is
similar to the approach used by some other open source projects
(e.g. okhttp).
- Copyright year is updated everywhere for completeness.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126895326
Before this change, calling seekTo then setPlayWhenReady would cause the player
throw an error, due to using the sample source provider before it's set.
Transition to the buffering state in seekToInternal only if we have a sample
source provider.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126804528
1. Suppress onContinueLoadingRequested until a source is
prepared (since such calls are not supposed to be made
until after preparation has completed).
2. Don't use the format evaluator in HlsChunkSource prior
to prepration completing.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126794616
Also attempt to clear up naming a little, using "buffering" to
mean the user visible buffering state, and "loading" to mean a
source being loaded.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126693592
This fixes HlsChunkSource to allow selection of variants
other than the first one (as originally ordered in the
master playlist) in the case that the first one is
blacklisted. Having done this, the two disabled tests can
be restored.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126646547
Also fix possible repeat-preparation for HlsTrackStreamWrapper
and ExtractorSampleSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126640380
At a high level, everything that we need to load in sync
with anything else now implements a new SequenceableLoader
class. This includes ChunkTrackStream, since multiple
demuxed tracks in DASH/SS need to be loaded in sync with
one another. At a higher level, SampleSources are also
SequenceableLoaders, which allows them to be kept in sync
by MultiSampleSource.
CompositeSequenceableLoader is able to load multiple
instances SequenceableLoaders in sync with one another,
and is used in various places where this is required.
This change also removes LoadControl registration, which
was complicated and error prone.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126632861
- Removes the load delay that was previously present after
source preparation.
- Prevents premature failure in the case that the buffering
source fails to prepare.
- SampleSource.Callback will get a second method in a
subsequent CL, approximately meaning "tell me if I can load
more stuff". This will remove the need for LoadControl and
the complexity that comes with it.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126172573
This is required for buffering to work properly across
playlist transitions. It's also much simpler, since
specifying the buffering policy becomes independent of
the type of media being played (i.e. the source).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=126051755
1. The readiness of the timeline is only relevant if there
aren't any enabled renderers. It's also only ready if
the source after the playing source is actually prepared
(if not, we're waiting for preparation).
2. Prevent early transition to the ENDED state when the
playback position hits the duration, but we're not at the
final entry in the playlist.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125685193
- Always continue loading if we've got less than the minimum
amount of media in the buffer.
- Use LoadControl in ExtractorSampleSource.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125679669
- Update playbackInfo duration/position/bufferedPosition in a
single place.
- Remove sampleSource variable, and remove side effects from
getSampleSource. There was actually a subtle bug where
getSampleSource wasn't called by anything where no renderers
where enabled (meaning the source never transitioned).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125676540
Also, getBufferedPosition shouldn't be called if no tracks
are selected.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125670213
Also do some naming cleanup + do ms->us seek conversion
in ExoPlayerImpl, since that's where we now do all the
conversions coming out of the player.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125662973
ExoPlayer.EventListener.onPositionDiscontinuity is notified during seeking and
transitioning from one source to the next.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125578976
This CL only provides checks for HEVC codecs and adds codec information to Format
instances in DASH. Right now, we check that the supported profiles are advertised
individually and that the supported level is equal or higher than the requested codec
level.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125470489
We have our snazzy new file-based extractor tests now,
and the other ones have historically proven way more
hassle than they're worth (e.g. I spent a good few hours
once just trying to work out how to fix the Mp4 extractor
test, having established it was the test and not the
code that was broken!).
I think some more can go from the ogg package, but leaving
in place for now because it's a bit less clear what to
get rid of.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=125330072
- AllowedVideoJoiningTimeMs must be set to 0 for tests so
that tests which disable/enable video renderers don't
register a large number of dropped frames.
- Fixed a threading issue that could cause occassional test
failure.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124978843
The ones that are commented out are legitimately broken
and will need a library fix.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124978438
It looks like the manifests are essentially pointless,
but various tools are unhappy if I delete them.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124976509
When buffering playlist items after the currently-playing one,
continueBuffering should take a position that is negative because the playback
position is before the start of the source being buffered. This change makes
sure that ExtractorSampleSources always have a known duration when they are
fully buffered, which means that the correct (negative) source-relative
position can be calculated.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124949409
ExtractorSampleSource covers almost all use cases (except for AMR, AVI and
legacy Widevine). The FLAC extension must be compiled for support for FLAC
extraction.
FrameworkSampleSource has device-specific issues, makes blocking calls to the
underlying MediaExtractor, and does not provide much control over buffering.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124850102
- Event listener is now at the SampleSource level, since the
individual ChunkTrackStream instances are created internally.
- Event listener receives events corresponding to loads made
at the SampleSource level (e.g. manifest fetches) in addition
to those made by the ChunkTrackStream instances.
- Added ability for FormatEvaluators to propagate arbitrary
information (as an Object) through to the listeners. This was
a request from YouTube.
- Added significantly more information to each event, for example
the DataSpec that defines the load being made is now passed, as
is timing information.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124732984
DashTest will be migrated separately, since it's a little
more work.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124722462
If the same instance is reset then rapidly re-enabling the
renderer after disabling it can prevent an application from
reading the final values at the time when the renderer was
disabled. Hence we now instantiate a new CodecCounters each
time. This is needed to migrate DashTest to V2.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124721106
TextTrackRenderer would unconditionally flip input buffers read from its
source TrackStream, but the data could be null in the case where the buffer
signaled end of stream. Only flip if the corresponding flag is not set.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124559077
Things like manifests are loaded not in the context of a Chunk,
but we want to eventually be reporting all loading events. So
it makes senes to define data types at a global level.
Also added {@code} in a few places for consistency.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124549737
DASH and SS manifests define potentially useful information
that isn't present in the actual media streams. Primarily
the representation id, but bitrate, fps and language may
also be defined only at the manifest leve. This change merges
the information into the sample format that's propagated to
the renderers.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124225175
- Parse APIC and TextInformation frames.
- In MPEG-TS, don't mind if packets contain end padding.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124079930
On older devices getCapabilitiesForType calls fail for some
secondary codecs. We didn't used to call getCapabilitiesForType
on secondary codecs, and so avoided this issue.
This change suppresses any exceptions encountered when
querying secondary decoders on API levels prior to N, to
restore previous behavior when a failure occurs.
Issue: #1534
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124010242
This allows the TrackRenderer superclass to do things when the renderer is
reset, and makes resetting consistent with other 'events' on renderers.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123974633
The allocator and buffering policy (e.g. how large the buffer
is) is moving to the top level as part of playlist support,
so it no longer makes sense to inject these parameters as
args into ExtractorSampleSource's constructor.
Instantiating the allocator and buffer size inside of the
source is temporary and only until they're moved up.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123968976
It is possible to add use of this feature in the demo app, restricting the selected
tracks to the viewport size. But it should be added in a future CL.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123965232
The bug this cl fixes is basically an uncaught case of []
Issue: #1567
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123963779
This removes "message sent on dead thread" warnings in nearly
all cases, and guarantees delivery of load cancelation to event
listeners.
Issue: #426
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123957691
- The main goal of this change is to remove the need for
discardSamplesForDisabledTracks() in continueBuffering
in HlsTrackStreamWrapper and ExtractorSampleSource. As
a result we'll also save one Allocation per disabled
track.
- Another benefit of this change is that Allocator.trim
calls can no longer be dropped. This could previously
happen on player release if the playback thread's
Looper quit before delivery of onLoadCanceled which
performed the trim in the case that a load needed to be
canceled at the time of the release.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123957434
Plus remove some unused util methods + make a few
warnings go away.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123888046
This is similar to suppression of failures disabling the
renderers (in the block above).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123847812
- Remove need for SampleSources to ref ChunkSources.
- Correctly propagate errors loading manifests through
ChunkSource components.
- Fix some misc warnings.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123732918
Aside from deleting code, this change (a) adds retry
functionality for initial manifest fetches, (b) uses
the same loader for the utc timing fetch as for the
manifest.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123634812
The issue is visible for DRM playbacks because
BUFFER_FLAG_ENCRYPTED is being cleared, which results
in trying to play encrypted samples without decryption.
The issue would have also incorrectly cleared key frame
flags too, for both clear and encrypted playbacks, but
I don't think we're using that flag downstream anywhere
and so the issue wasn't visible.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123426582
We allow 2 configurations: Forcing seamless adaptiveness and allowing
mixed mime types adaptation.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123420364
Pull more logic up to HlsSampleSource. Somewhat regretfully,
this also backs out the optimization work done toward the
ref'd issue. I think that's one for another time perhaps...
Issue: #551
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123417413
It's not a comprehensive solution for setting the
playback speed because (a) it doesn't apply when
audio is disabled, and (b) we do some timestamp
interpolation in a few places where we assume real
time. However in practice it works pretty well and
most apps probably don't allow disabling of audio,
so I think it makes sense to expose it.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123406605
This is in preparation for changing the TrackStream while keeping the renderer
enabled, to give seamless transitions for playlists.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123394733
Added a new method TestUtil.consumeTestData() to emulate
the exact behaviour and modified OggExtractorFileTests to
use it. Rest of the test will be fixed in follow up CLs.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123320538
Initially only the first source index is used. In a later change,
ExoPlayerImplInternal will create SampleSources for different playlist item
indices as necessary.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123312595
This change moves generally useful functionality (load timing
and fatal error propagation) inside of Loader, so that callers
don't have to duplicate effort.
The change also makes use of generics so that the callback
receives a Loadable with a more specific type.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123304369
Where multiple messages are required to be sent in order
to perform a player reconfiguration, it will usually be
desirable to process all messages in a single "transaction"
(i.e. without any rendering happening when only some of
the messages have been applied).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123228334
This should be a no-op change, but it seems sensible to
have them not overlap.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123208140
- Simplify setSurface by always blocking when the surface
is being cleared.
- Add analogous setVolume API.
- Support setting of playback params for extension audio
decoders. We can probably use this to add a setPlaybackRate
API to SimpleExoPlayer for API level 23 and above only,
but we'd probably want to make sure it works properly when
there's no audio track too, so some thought will be
required.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123204581
DrmSessionManager is now an actual manager. For each session
request it may return a shared session (as things work now,
and as is suitable for Widevine VOD) or a separate instance
(e.g. for PlayReady where audio and video are protected with
different keys).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123203664
DemoPlayer moves into core library as SimpleExoPlayer, which
implements ExoPlayer.
Issue: #383
Issue: #592
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123090184
With this CL:
* The first supported video track found is selected.
* The first supported audio track with preferred language is selected.
If none, we fallback to the first supported one.
* For text, we only present a selection if one of the tracks has the
preferred language and the track is flagged as forced.
TODO list:
* Add a selection policy for video (probably related with adaptiveness).
* We should decide what to do with the default flag.
* Perhaps, if no audio with the preferred language(assuming there is one)
is found, we should fall back to a text track that has the preferred
language.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122985006
1. Properly split out listening responsibilities so that
DemoPlayer only listens to its own components.
2. Revert StreamingDrmSessionManager UnsupportedDrmScheme
exceptions back to how they worked in V1, and inject
a DrmSessionManager rather than a MediaDrmCallback into
DemoPlayer.
This much better prepares DemoPlayer for promotion into
the core ExoPlayer library, since it removes assumptions
such as what SampleSource and DrmSessionManager impls
might be used with it.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122980952
- Parse APIC and TextInformation frames.
- In MPEG-TS, don't mind if packets contain end padding.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122743786
Bigger changes will be coming, but this gets DRM back
up and working again.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122719062
Previously, rounding down to the nearest frame wasn't
being done correctly; seeking could seek into a sample.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122618668
This field will allow us to flexibly add information provided by the container
or streaming manifests related to the tracks that must be selected.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122559858
- Don't report errors to listeners if playback will immediately
fail. Doing so is redundant, since such errors are immediately
reported through ExoPlayer's listener as a result of playback
failure. We were also reporting these errors inconsistently
across renderers.
- Reduce code duplication through EventDispatcher classes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122519976
- Parse duration from mehd box for FMP4.
- Handle absent tfdt boxes by accumulating decode time
from one fragment to the next.
Issue: #1529
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122512416
This is required because in V2 we'll be instantiating DRM
session managers before the ExoPlayer instance (and hence
we wont have the Looper). This logic will be further cleaned
up in later CLs that overhaul DrmSessionManager in more
depth.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122453765
Search up to 4 KB for both fragmented and unfragmented files.
Detect files with an mvex box in their moov box as fragmented.
Fix reading of brands.
Issue: #1523
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122429548
Now [DASH/SS]SampleSource instances are creating ChunkTrackStream
instances dynamically, it makes sense to always require that the
min retry count be injected from that level. The SampleSource
implementations should also use the retry count when refreshing
the manifest.
The option to configure the retry count on the SampleSource classes
will arrive in a later CL.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122424774
Allows the user to provide their own criteria for selecting one of the available tracks
without having to reimplement the track assignment logic, i.e. linking type x tracks with
type x renderer.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122422087
1. Merge HlsOutput and HlsSampleSource -> HlsTrackStreamWrapper.
2. Rename HlsSource -> HlsSampleSource2. This will be renamed to
HlsSampleSource in a subsequent CL.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122415970
- Increment skippedBufferCount for VPX and ADTR.
- Set maxConsecutiveDroppedOutputBufferCount count for VPX.
Tweak its meaning to ignore skipped frames.
- Remove outputFormat/outputBuffer changed counts. These add
limited value. Also, MediaCodec is moving toward a model where
you don't see the output buffers changing because you dequeue
them one at a time (like how our extension decoders work).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122258530
1. AudioDecoderTrackRenderer now reports decoder initialization
and AudioTrack underruns.
2. AudioDecoderTrackRenderer can now render more than one output
buffer per call to doSomeWork, to be consistent with
MediaCodecAudioTrackRenderer. This may also prevent audio
underruns in the case that audio is fragmented into many small
buffers.
3. AudioDecoderTrackRenderer now has an overridable method that
receives the audio session id, to be consistent with
MediaCodecAudioTrackRenderer.
4. Fix unsafe event notification in LibvpxVideoTrackRenderer.
5. Vpx and AudioDecoder extensions now increment the CodecCounter
inputBufferCount field correctly.
6. Decoders now have names :).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122250009
The FFmpeg extension can support various different MIME types, so pass the
whole format to configure the decoder.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122246589
When skipToData is called the peek position is not equal
to the read position of the input. Hence peeking a chunk
header and then skipping by that amount wont do the right
thing :)!
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122157603
Mechanical step to create a new HlsSource in the library.
Note that naming is now confusing. This will be fixed in
the next CL, when:
HlsSource -> HlsSampleSource
HlsSampleSource+HlsOutput -> HlsOutput
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=122054800
Support for opus content in ogg container.
TODO: Sample duration and seeking.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121940392
- This means DrmInitData is propagated through sample queues (i.e.
is effectively attached to every sample, so we can see when it
changes when reading from the queue).
- It also allows different DrmInitData per track, which is possible
in muxed MKV/WebM, and per Representation for DASH, although we
wont be able to seamlessly adapt in the latter case.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121821928
I've seen a sample that has a LIST chunk prior to fmt. It
seems best just to skip all chunks until the format is
located. As per the RIFF spec:
"Programs must expect (and ignore) any unknown chunks
encountered, as with all RIFF forms."
https://www.aelius.com/njh/wavemetatools/doc/riffmci.pdf
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121682470
This allows limiting the horizontal extension of the cues.
NOTE: So far, we only support percentages for size magnitudes.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121682404
SubtitleParser includes a method updating the current
playback position for parsers that need to be aware
of the position in order to determine how to batch
captions (i.e. Eia608Parser).
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121519712
- This moves to a single DrmInitData implementation that supports
both specific and universal UUID matching. You can also do a
combination of the two, which was not previously possible.
- The object model is simplified as a result. This is a precursor
to a change where DrmInitData will be included directly in the
Format to enable key rotation.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121472592
In order to apply track type specific policies in
the track selection, we need to know the type of
the track renderer, this method returns one of the
constants defined in C.java of the form TRACK_TYPE_*
to allow renderer classification.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121369021
If the media format changes from one Format object to another
one that's is equal (but not the same object), readData would
end up performing an expensive equality evaluation on every
invocation.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121362300
This will be required for key rotation to work, since
we'll need a way to determine whether or not the init
data has changed.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121018211
Only edit lists that truncate the first/last sample are supported, which is
sufficient to handle AAC encoder delay/padding.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121011278
Dash/SS SampleSources now instantiate ChunkSource and
ChunkSampleSource (renamed to ChunkTrackStream) instances
on demand as tracks are enabled. The TrackGroups exposed
by the DASH/SS SampleSources are now constructed at the
top level.
Note that this change resolves the TODOs at the top of the
ChunkSource classes, allowing multiple adaptation sets of
the same type.
Next steps will include:
- Bring back UTC timing element support for DASH, which
will be an extra request during preparation in the DASH
SampleSource.
- Simplification of manifest fetching to use a Loader directly
in the two top level SampleSource classes. ManifestFetcher
should eventually go away once HLS no longer needs it.
- Eventually, some consolidation between DASH/SS. There's a
lot of common code there now.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=121001777