We use the segments' start time when the timestmap is not present.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=149006252
This method can be used to determine not cached parts of a content.
The 'length' parameter allows quicker responses without going through all adjacent spans.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=149005688
This allows building a TsPayloadReader.Factory without
having to wrap the default one.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=149004102
This mode allows the extractor to support streams with multiple
programs declared in the PAT, but only one PMT. This is necessary
to support tuner-obtained media.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148636312
textWidth can be negative if textLeft extends parentRight (i.e.
the subtitle is positioned entirely off the screen to the RHS).
We should just discard and log a warning in this case.
Issue: #2497
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148481310
This change exposes declared CEA-608 and EMSG tracks. The
tracks currently provide no samples.
Issue: #2362
Issue: #2176
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148390849
I'm going to introduce an EmptySampleStream that will be used in
some cases in conjunction as part of 608/EMSG support. This change
avoids EmptySampleStream having to provide a dummy format.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148383831
At the end of playback, BufferProcessors need to be drained to process all
remaining data, then the output needs to be written to the AudioTrack before
stop() is called.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148339194
This allows the TsExtractor to automatically determine the
closed caption tracks to expose by parsing available
descriptors.
Issue:#2161
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=148321380
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
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