Commit graph

639 commits

Author SHA1 Message Date
Oliver Woodman
6c5af23230 Minor tweaks to HlsSampleSource. 2015-04-11 01:12:40 +01:00
Oliver Woodman
da656e6f26 More steps towards unified extractors. 2015-04-11 01:07:41 +01:00
Oliver Woodman
53a47524a1 Support non-square pixels in HLS.
Github issue: #375
2015-04-11 00:59:00 +01:00
Oliver Woodman
37d12ff14a Steps toward generalizing the Extractor interface for all extractors. 2015-04-11 00:55:38 +01:00
Oliver Woodman
3a551c73ba Move hls.parser to a new extractor package.
This package will house all extractors, which will be unified
to implement a single Extractor interface.
2015-04-11 00:27:24 +01:00
Oliver Woodman
fc176b9cbe Fix TsExtractor bug.
The limit on the ts packet buffer can be reduced during processing
if it's discovered to have padding. Hence we need to reset it back
to the ts packet size before processing each packet.
2015-04-10 23:41:45 +01:00
Oliver Woodman
61443b2f12 Relocate content of Mp4Util to more sensible locations.
- Atom related stuff in Mp4Util is moved to Atom.
- Remainder of Mp4Util is renamed to H264Util.
2015-04-10 23:31:03 +01:00
Oliver Woodman
fea2140d57 Add ability to query size/rate support in MediaCodecUtil. 2015-04-10 23:15:52 +01:00
Oliver Woodman
38efb1fc3f Clean up Aes128DataSource. 2015-04-10 23:12:47 +01:00
Oliver Woodman
6bf52dd69c Report decoder initialization information out of track renderer. 2015-04-10 23:06:57 +01:00
Oliver Woodman
a17123c49b Clean up codec reinitialization. 2015-04-10 23:03:50 +01:00
Oliver Woodman
380c427fb3 Make MediaCodecVideoTrackRenderer easier to extend. 2015-04-10 23:01:09 +01:00
Oliver Woodman
a085d2f29b Add END_OF_INPUT constant + start using it. 2015-04-10 23:00:23 +01:00
Oliver Woodman
d745384d99 Change decodeOnly to be a sample flag. 2015-04-10 22:55:12 +01:00
Oliver Woodman
70b0e55a8b Remove deprecated bandwidth parameter. 2015-04-10 22:39:15 +01:00
Oliver Woodman
c901025643 Don't attempt license request when keys expire.
- Keys should not expire during normal playbacks of correctly configured content.
- Attempting to refresh on expiration causes a race condition, that may result
  in either failure or brief re-buffer, for the 30s license test video.
- This change provides deterministic behavior, which is to always fail.
2015-04-10 22:38:06 +01:00
Oliver Woodman
d108c13535 Remove deprecated method. 2015-04-10 22:36:07 +01:00
Oliver Woodman
4dc8e8f951 Add audio and m3u8 mime types. 2015-04-10 22:35:03 +01:00
Oliver Woodman
ecaf329b0d Improve ParsableByteArray performance + enhance API. 2015-04-10 22:34:06 +01:00
Oliver Woodman
ed658b8e8d Attempt to guard against ExoCache corruption. 2015-04-10 22:33:10 +01:00
Oliver Woodman
cfcbca6c95 Make FileDataSource throw EOFException. 2015-04-10 22:29:51 +01:00
Oliver Woodman
362dc5f382 Don't fail if server doesn't support partial requests.
Some servers, probably edge cache machines that exclusively serve
chunked media, don't support partial requests. Which is kind of
vaguely reasonable for that particular case. This change modifies
DefaultHttpDataSource to correctly handle this case, by manually
skipping data up to the requested position (and making sure not to
read more data than the requested length).
2015-04-10 22:28:20 +01:00
Oliver Woodman
1a198b8a30 Minor cleanup (remove deprecated method, fix javadoc) 2015-04-10 22:24:39 +01:00
ojw28
9183525b5e Merge pull request #221 from martinbonnin/better_input_format_change_for_non_adaptive_codecs
better handling of input format change for non-adaptive codecs
2015-04-01 13:56:15 +01:00
Oliver Woodman
acd1b9acff Enable ContentProtect elements at the Representation level 2015-03-31 11:28:51 +01:00
Oliver Woodman
5a5935cb72 Fix HLS playlist parsing of boolean attributes.
The regex included quotation marks like X="YES", but the manifests
don't actually contain them, for examples X=YES.
2015-03-30 15:56:39 +01:00
Oliver Woodman
b73b9a0509 Add workaround for #252 (but don't enable it by default). 2015-03-25 12:08:45 +00:00
Oliver Woodman
e54d07c1b0 Fix issue with new extractor input 2015-03-17 12:36:46 +00:00
Andrew Lewis
5e4a35fa7e Add Mp4SampleExtractor, for reading unfragmented MP4 files. 2015-03-13 18:10:37 +00:00
Andrew Lewis
6d8c4dd416 Add workaround for slow okhttp InputStream.close() on API levels 19/20. 2015-03-13 18:06:00 +00:00
Oliver Woodman
a22ccf9254 Another baby step to unified extractors.
- Have extractors read from an ExtractorInput. Benefits of this are
  (a) The ability to do a "full" read or skip of a specified number
  of bytes, (b) The ability to do multiple reads in your extractor's
  read method. The ExtractorInput will throw an InterruptedException
  if the read has been canceled.

- Provides the extractor with the ability to query the absolute
  position of the data being read in the stream. This is needed for
  things like parsing a segment index in fragmented mp4, where the
  position of the end of the box in the stream is required because
  the index offsets are all specified relative to that position.
2015-03-13 11:47:51 +00:00
Oliver Woodman
1111dd73a0 Further simplify HlsExtractor interface.
- Move to builder naming.
- Propagate formats to the TrackOutput instances, rather than having
  them be read through the Extractor. There was actually some weird
  indexing going on here before (which happened to work, but wasn't
  well defined).
2015-03-13 11:44:27 +00:00
Oliver Woodman
12807a7d4b Simplify encryption handling in HLS. 2015-03-12 19:44:06 +00:00
Damien Merenne
94dd9c41f4 Fix AES decryption of HLS streams.
As per http://tools.ietf.org/html/draft-pantos-http-live-streaming-04#section-5.2,
the initializaton vector (IV) of the AES decryption algorithm should be set to:
- the IV attribute value if present,
- the sequence number otherwise.

Currently, the IV is set once and use over all next media sequences
where the IV attribute is not set. The fix is to use the provided IV if
given or use the current media sequence number.
2015-03-12 13:34:58 +01:00
Oliver Woodman
5ca2e0fd95 First step toward extractor unification.
- It's probably easiest to think of this as a standalone HLS change, which is splitting out the "loading" and "consuming" sides of HlsExtractor and a good structural change in its own right. To do this, HlsExtractorWrapper becomes a final class implementing the consuming side. HlsExtractor becomes an interface defining the loading side.

- The bigger picture is that, hopefully, HlsExtractor will become a lightweight extractor interface that can be used throughout the library. Because it doesn't need to implement the consuming side, we'll save on having to re-implement the consuming side for every extractor (we'll probably need one consuming side implementation for HLS/DASH/SmoothStreaming, and a second one for everything else, both of which will use SampleQueue). It's expected that the HlsExtractor interface will need to change to accommodate all use cases.

- The next step in unification will be to try and have FragmentedMp4Extractor implement HlsExtractor (which will need renaming). Once this is done, I'll try and move the chunk package over to use the HlsExtractor interface.
2015-03-11 19:21:33 +00:00
Oliver Woodman
becc6fca4c Enhance SampleQueue/RollingSampleBuffer to support other use cases.
- This is a step toward hopefully converging HLS and CHUNK packages.
- Add support for encrypted samples.
- Add support for appending from a DataSource.
2015-03-11 15:49:53 +00:00
Oliver Woodman
5d0457152d Remove need for InlinedApi with a few more C constants. 2015-03-11 15:48:12 +00:00
Oliver Woodman
56a509d8e4 Clean up handling of encrypted samples in fmp4/webm extractors.
- The fmp4 extractor was reading from sampleEncryptionData even
  for not-encrypted samples, which I'm pretty sure isn't right.
  Fixed this. For all encrypted content I've seen, this change
  will be a no-op because isEncrypted is always true if there's
  an encryptionBox present.
- Made webm extractor only set cryptoInfo if isEncrypted is true.
- Align variable naming in the two extractors, for clarity.
2015-03-10 21:44:20 +00:00
Oliver Woodman
5e11b9f008 Add DrmInitData (missed from a previous commit). 2015-03-10 19:48:41 +00:00
Oliver Woodman
eba16e55b0 Support delayed loading by Loader. 2015-03-10 19:43:25 +00:00
Oliver Woodman
8c1088559e Generalize getPsshInfo to properly accomodate WebM.
- Rather than returning a map, return a DrmInitData object,
  with mapped and non-mapped implementations.
- Include a suitable mimeType to pass to the MediaDrm. Previously
  we were incorrectly passing the mimeType of the samples,
  where-as MediaDrm expects the container mimeType. Note that
  it doesn't matter whether the mimeType starts with "video" or
  "audio", hence using video mimeTypes everywhere.
2015-03-10 19:42:48 +00:00
Oliver Woodman
eec6458b43 Add handling of Extended Western European character set for CEA-608. 2015-03-10 19:37:47 +00:00
Oliver Woodman
4192ac56af WebM Extractor support for Encrypted content. 2015-03-10 19:36:37 +00:00
Oliver Woodman
1ebaaaebd5 Parse EXT-X-MEDIA tags with SUBTITLES type.
Not yet used by anything.

Issue: #151
2015-03-10 19:07:19 +00:00
Oliver Woodman
be103106cb HLS: Better stream selection at start of playback.
- Correctly handle bandwidth NO_ESTIMATE case.
- Don't consider switching without a previous chunk.
2015-03-10 19:06:07 +00:00
Oliver Woodman
489e99158f Remove getDurationUs from the SampleExtractor interface.
Set the duration on the MediaFormat instead.
2015-03-10 19:04:38 +00:00
Oliver Woodman
cdf19430ef Remove TrackInfo from the SampleExtractor interface. 2015-03-10 19:01:11 +00:00
Oliver Woodman
462fea3eaf Correctly resolve Uris according to RFC3986.
Issue: #327
2015-03-05 11:56:00 +00:00
Sergio Moreno Mozota
9208c655d1 fix false positives in sync word detection thanks to @jeoliva 2015-03-04 20:46:22 +01:00
Oliver Woodman
457557b56f Parse ISO8601 timestamps using UTC timezone. 2015-03-04 11:02:43 +00:00
Oliver Woodman
a1d4a5e154 Continue waiting for keys until the codec is flushed.
It was possible for a codec input buffer to be filled with two frames' worth of
data, if seekTo was called after populating a buffer, if waitingForKeys was true
and seeking did not trigger a flush. This caused the CryptoInfo to be configured
as if the input buffer contained a large amount of reconfiguration data as
cleartext.

Move resetting waitingForKeys to flushCodec, so that we don't try to read the
next sample from the source until the first one has been consumed or discarded.
2015-03-03 18:16:22 +00:00
Oliver Woodman
baea1cd12d Add ftyp atom def 2015-03-03 17:17:02 +00:00
Oliver Woodman
b9addf28b2 Formatting tweaks for enhanced ID3 support + support in demo app. 2015-03-03 17:16:13 +00:00
Oliver Woodman
0c6566bce7 Add flags to DataSpec. Support GZIP option.
Also remove uriIsFullStream. It's not doing anything particularly
useful, so I think it makes sense to remove it from the public API;
it's unlikely anyone is using it.

Issue: #329
2015-03-03 17:14:48 +00:00
Oliver Woodman
3868b1d4cb Clean up media playlist blacklisting / fix nits.
It seems fairly safe to assume a playlist wont be blacklisted
within 1ms of the device booting :).
2015-03-03 17:11:21 +00:00
J. Oliva
b03c8a713b Mime type string always finish with a single 0 byte
Mime type string always finish with a single 0 byte
2015-02-28 00:47:42 +01:00
J. Oliva
88475e4fee Fixed issue in the calculation of size of objectData
- Fixed issue in the calculation of size of objectData
- Indentation fixes
2015-02-27 22:09:05 +01:00
Sergio Moreno Mozota
2ce938d650 Added MPEG audio support to TsExtractor v.2 2015-02-27 14:29:21 +01:00
J. Oliva
1739af685a Removed indexOfNot method
Removed the unused method indexOfNot
2015-02-27 11:02:37 +01:00
J. Oliva
f33cdd97e6 Fixed an issue when looking for termination string in UTF-16 and UTF-16BE
Modified parse method to take into account different lengths for the
termination character (1 for UTF-8 and ISO-8859-1; 2 for UTF-16 and
UTF-16BE).
2015-02-27 10:57:43 +01:00
J. Oliva
c135bb7a57 Fixes for correctly supporting UTF-16 and UTF-16BE charsets
For fields encoded using UTF-16 or UTF-16BE charsets when looking for
termination character we have to look for two zero consecutive bytes.

Otherwise, as many characters encoded with UTF-16 or UTF-16BE has one
of their 2 bytes set with the value zero, we will be truncating text
fields.
2015-02-26 21:54:29 +01:00
Sergio Moreno Mozota
1545a052f0 Added MPEG audio support to TsExtractor 2015-02-26 19:12:58 +01:00
J. Oliva
ebbd022a52 Added new ID3 frames
- Added support for ID3 frames of types GEOB and PRIV.

 - GEOB type is commonly used by dynamic ads provider to include in the
stream information about the ads to be played.
 - PRIV type is commonly used for time synchronization (example:
synchronizing playback of a live stream and its webvtt captions) and
also by analytics companies to include tracking information in the
stream.

- Added a sample stream from Apple that contains ID3 metadata.
2015-02-26 16:49:05 +01:00
ojw28
ea95db2375 Merge pull request #316 from jeoliva/blackplaylist_management
Better management of blacklisted playlists
2015-02-25 14:33:26 +00:00
Oliver Woodman
006986cc58 Make NetworkLoadable use an injected HttpDataSource.
Note: I'm fairly confident that NetworkLoadable.Parser implementations
can live without the inputEncoding being specified. But not completely
100%...

Issue: #311
Issue: #56
2015-02-25 13:39:15 +00:00
Oliver Woodman
2ce17b601f Correctly bound search into segment indices.
The return value here assumed that the time being searched for
was beyond the start time of the last segment. This fix also
handles the case where the time is prior to the start of the
first segment.
2015-02-25 13:34:31 +00:00
Oliver Woodman
d2da3bbf8a Simplify NetworkLoader/Parser/ManifestParser
The only downside of this change is that MediaPresentationDescriptionParser
is no longer stateless.
2015-02-25 12:09:06 +00:00
Oliver Woodman
0fdcb3347c continueBuffering should return true when ended.
This issue didn't have any material impact on playbacks, but
fixing it anyway to be technically correct.
2015-02-25 11:48:55 +00:00
Oliver Woodman
d6ebd49c63 Two small fixes for HLS.
1. Clear prefixFlags when a NAL unit is found.
2. continueBuffering should return true if loading is finished.
2015-02-25 11:37:39 +00:00
J. Oliva
2ac7046ffc Clear stale blacklisted playlist when getting next variant index
Calling clearStaleBlacklistedPlaylist within getNextVariantIndex method.
2015-02-23 22:42:53 +01:00
J. Oliva
4fe62b9b0a Clear stale blacklist in getChunkOperation
Clear stale blacklist in getChunkOperation before getting next variant.
This ensures:
1.- Player resilience to failures, always trying to look for a working
playlist that allows player to non stop playback.
2.- High quality blacklisted playlists can be reused in case they go up
after a failure. Player always trying to provide the best user
experience.
2015-02-23 20:40:37 +01:00
J. Oliva
f8a9da90e8 Renaming methods and code formating
- Method evaluatePlayListBlackListedTimestamps renamed to
clearStaleBlacklistedPlaylists
- Code formatted to be consistent with style elsewhere.
2015-02-23 20:06:49 +01:00
J. Oliva
20a40f5d11 Better management of blacklisted playlists
Added an expiration time field to playlists blacklisted to allow
Exoplayer to continue playback when playlists that failed were
recovered from a bad state.

In live environments, some times occur that primary encoder stop
working for a while. In that cases, HLS failover mechanism in the
player should detect the situation and “switch” to playlists served by
the backup encoder (in case a backup encoder exists). This was well
managed before these changes.

However, and to ensure a playback experience that can recover itself
from temporary issues, we cannot blacklist a playlist forever. When
streaming live events using HLS, it is quite typical that the player
needs to switch from primary to backup playlists, and from backup to
primary ones, from time to time to have playback working when temporary
issues in the network/encoder are happening. Most of the issues are
recoverable, so what I have implemented is a mechanism that makes
blacklisted playlist to be available again after a while (60 seconds).

Evaluation of this algorithm should happen just when something fails.
If player is working with a backup playlist, it shouldn’t switch to the
primary one at least something fail.
2015-02-23 15:14:09 +01:00
Oliver Woodman
6d14fc3330 Implement UTC time synchronization for DASH Live.
Support is provided for the following schemes:

urn:mpeg:dash:utc:direct:2012
urn:mpeg:dash:utc:http-iso:2014
urn:mpeg:dash:utc:http-xsdate:2012
urn:mpeg:dash:utc:http-xsdate:2014
2015-02-20 15:10:25 +00:00
Oliver Woodman
4076b08e4b Naming tweak 2015-02-20 15:07:22 +00:00
Oliver Woodman
b510088689 Fix EIA-608 issues.
- Data needs to be unescaped before it's passed to SeiReader.
- SeiReader should loop over potentially multiple child messages.
- I also changed the sample passed to the EIA-608 renderer so that
  it's the entire sei message payload. The first 8 bytes are
  unnecessary, but it seems nicer conceptually to do it this way.

Issue: #295
2015-02-19 11:22:42 +00:00
J. Oliva
e84bce6130 Fixed issue in CODEC regular expression
Previous regular expression for extracting codec information was wrong,
given a line that defines a variant it added information from “CODEC=“
text to the end of the line (including also information about
RESOLUTION or alternate rendition groups as part of the CODEC field).

This is not causing a functional problem (at least known by me)
although is making codecs field storing information that is not related
with the codec.
2015-02-19 01:17:35 +01:00
Oliver Woodman
abac6b7dd6 Fix off-by-one-bug preventing NAL unit detection at the limit. 2015-02-18 19:11:52 +00:00
Oliver Woodman
b03c5c5753 Ensure we always seek after selecting a track.
Some extractor implementations underneath MediaExtractor require a seekTo
call after tracks are selected to ensure samples are read from the correct
position. De-duplicating logic was preventing this from happening in some
cases, causing issues like:

https://github.com/google/ExoPlayer/issues/301

Note that seeking all tracks a side effect of track selection sucks if
you already have one or more tracks selected, because it introduces
discontinuities to the already selected tracks. However, in general, it
*is* necessary to specify the position for the track being selected,
because the underlying extractor doesn't have enough information to know
where to start reading from. It can't determine this based on the read
positions of the already selected tracks, because the samples in these
tracks might be very sparse with respect to time.

I think a more optimal fix would be to change the SampleExtractor
interface to receive the current position as an argument to selectTrack.
For our own extractors, we'd seek the newly selected track to that
position, whilst the already enabled tracks would be left in their
current positions (if possible). For FrameworkSampleExtractor we'd
still have no choice but to call seekTo on the extractor to seek all
of the tracks. This solution ends up being more complex though, because:

- The SampleExtractor then needs a way of telling DefaultSampleSource
  which tracks were actually seeked, so that the pendingDiscontinuities
  flags can be set correctly.
- It's a weird API that requires the "current playback position to seek
  only the track being enabled"

So it may not be worth it! I think this fix is definitely good for now,
in any case.

Issue: #301
2015-02-18 15:15:20 +00:00
Oliver Woodman
cc7a15b79b Fix bad assertion 2015-02-18 15:09:45 +00:00
Oliver Woodman
526c64294a Handle the edge case of zero-length chunks.
Issue: #289
2015-02-17 16:04:44 +00:00
Oliver Woodman
a1e196fe20 Add support for elementary AAC/ADTS streams.
- This change:

1. Extracts HlsExtractor interface from TsExtractor.
2. Adds AdtsExtractor for AAC/ADTS streams, which turned out to be
   really easy.

Selection of the ADTS extractor relies on seeing the .aac extension.
This is at least guaranteed not to break anything that works already
(since no-one is going to be using .aac as the extension for something
that's not elementary AAC/ADTS).

Issue: #209
2015-02-17 15:42:38 +00:00
Oliver Woodman
b46d1fc7cc Bump dev version to 1.3.x 2015-02-16 22:30:28 +00:00
Oliver Woodman
3472e86c36 Correctly reset ADTSreader state 2015-02-16 22:22:25 +00:00
Oliver Woodman
40411269da Use C.SAMPLE_FLAG_SYNC 2015-02-13 20:36:27 +00:00
Oliver Woodman
9d480ecd20 Fix broken javadoc link 2015-02-13 20:34:30 +00:00
Oliver Woodman
bc99435b48 Add C.SAMPLE_FLAG_SYNC and removed InlinedApi suppression in a few places. 2015-02-13 20:20:45 +00:00
Oliver Woodman
5f64a1fde7 Restrict HLS buffering by total buffer size as well as duration.
This prevents excessive memory consumption when switching to
very high bitrate streams.

Issue: #278
2015-02-13 20:13:11 +00:00
Oliver Woodman
c3788c0931 Eliminate memory copy of H264 data through H264 reader.
I think this is the limit of how far we should be pushing complexity
v.s. efficiency. It's a little complicated to understand, but probably
worth it since the H264 bitstream is the majority of the data.

Issue: #278
2015-02-13 20:11:12 +00:00
Oliver Woodman
37e6946cd9 Finally - Remove Sample, fix GC churn + inefficient memory usage.
Use of Sample objects was inefficient for several reasons:

- Lots of objects (1 per sample, obviously).
- When switching up bitrates, there was a tendency for all Sample
  instances to need to expand, which effectively led to our whole
  media buffer being GC'd as each Sample discarded its byte[] to
  obtain a larger one.
- When a keyframe was encountered, the Sample would typically need
  to expand to accommodate it. Over time, this would lead to a
  gradual increase in the population of Samples that were sized to
  accommodate keyframes. These Sample instances were then typically
  underutilized whenever recycled to hold a non-keyframe, leading
  to inefficient memory usage.

This CL introduces RollingBuffer, which tightly packs pending sample
data into a byte[]s obtained from an underlying BufferPool. Which
fixes all of the above. There is still an issue where the total
memory allocation may grow when switching up bitrate, but we can
easily fix that from this point, if we choose to restrict the buffer
based on allocation size rather than time.

Issue: #278
2015-02-13 19:32:01 +00:00
Oliver Woodman
28166d8c0d Rename ParsableByteArray.length() to limit(). Add capacity(). 2015-02-13 19:31:01 +00:00
Oliver Woodman
321005e4b1 Use 'bitrate' not 'bit-rate' consistently. 2015-02-13 19:27:52 +00:00
Oliver Woodman
d1360ad7d2 Pragmatic fix for "stuck-in-ready-state" when seeking near the
end of some streams.
2015-02-13 19:26:49 +00:00
Oliver Woodman
066334dad7 Continue TsExtractor refactor.
- Remove TsExtractor's knowledge of Sample.
- Push handling of Sample objects into SampleQueue as much
  as possible. This is a precursor to replacing Sample objects
  with a different type of backing memory. Ideally, the
  individual readers shouldn't know how the sample data is
  stored. This is true after this CL, with the except of the
  TODO in H264Reader.
- Avoid double-scanning every H264 sample for NAL units, by
  moving the scan for SEI units from SeiReader into H264Reader.

Issue: #278
2015-02-12 17:24:23 +00:00
Oliver Woodman
61a86295fd Fix for video-only playbacks transitioning straight to STATE_ENDED.
The complexity around not enabling the video renderer before it
has a valid surface is because MediaCodecTrackRenderer supports
a "discard" mode where it pulls through and discards samples
without a decoder. This mode means that if the demo app were to
enable the renderer before supplying the surface, the renderer
could discard the first few frames prior to getting the surface,
meaning video rendering wouldn't happen until the following sync
frame.

To get a handle on complexity, I think we're better off just removing
support for this mode, which nicely decouples how the demo app
handles surfaces v.s. how it handles enabling/disabling renderers.
2015-02-12 17:02:34 +00:00
Oliver Woodman
784431f3e0 Move EIA reordering back to the renderer (sorry for churn).
Reordering in the extractor isn't going to work well with the
optimizations I'm making there. This change moves sorting back
to the renderer, although keeps all of the renderer
simplifications. It's basically just moving where the sort
happens from one place to another.
2015-02-12 12:48:27 +00:00
Oliver Woodman
f7fb4d4c35 Optimize NAL unit search.
I'm not really a fan of micro-optimizations, but given this method
scans through every H264 frame in the HLS case, it seems worthwhile.
The trick here is to examine the first 7 bits of the third byte
first. If they're not all 0s, then we know that we haven't found a
NAL unit, and also that we wont find one at the next two positions.
This allows the loop to increment 3 bytes at a time.

Speedup is around 60% on Art according to some ad-hoc benchmarking.
2015-02-12 12:46:58 +00:00
Oliver Woodman
3568ecaf00 Split TsExtractor into multiple files.
There's no code change here at all, except for how TsExtractor's
getLargestSampleTimestamp method works.
2015-02-12 12:09:57 +00:00
Oliver Woodman
92f085bc58 Remove intermediate copy steps in TsExtractor.
1. AdtsReader would previously copy all data through an intermediate
adtsBuffer. This change eliminates the additional copy step, and
instead copies directly into Sample objects.

2. PesReader would previously accumulate a whole packet by copying
multiple TS packets into an intermediate buffer. This change
eliminates this copy step. After the change, TS packet buffers
are propagated directly to PesPayloadReaders, which are required
to handle partial payload data correctly. The copy steps in the
extractor are simplified from:

DataSource->Ts_BitArray->Pes_BitArray->Sample->SampleHolder

To:

DataSource->Ts_BitArray->Sample->SampleHolder

Issue: #278
2015-02-11 14:57:07 +00:00
Oliver Woodman
797fa7f872 Make TsExtractor use ParsableByteArray where possible.
- TsExtractor is now based on ParsableByteArray rather than BitArray.
  This makes is much clearer that, for the most part, data is byte
  aligned. It will allow us to optimize TsExtractor without worrying
  about arbitrary bit offsets.
- BitArray is renamed ParsableBitArray for consistency, and is now
  exclusively for bit-stream level reading.
- There are some temporary methods in ParsableByteArray that should be
  cleared up once the optimizations are in place.

Issue: #278
2015-02-10 22:13:01 +00:00
Oliver Woodman
7c66b6ed3b HLS optimization #1 (refactor).
This is the start of a sequence of changes to fix the ref'd
github issue. Currently TsExtractor involves multiple memory
copy steps:

DataSource->Ts_BitArray->Pes_BitArray->Sample->SampleHolder

This is inefficient, but more importantly, the copy into
Sample is problematic, because Samples are of dynamically
varying size. The way we end up expanding Sample objects to
be large enough to hold the data being written means that we
end up gradually expanding all Sample objects in the pool
(which wastes memory), and that we generate a lot of GC churn,
particularly when switching to a higher quality which can
trigger all Sample objects to expand.

The fix will be to reduce the copy steps to:

DataSource->TsPacket->SampleHolder

We will track Pes and Sample data with lists of pointers into
TsPackets, rather than actually copying the data. We will
recycle these pointers.

The following steps are approximately how the refactor will
progress:

1. Start reducing use of BitArray. It's going to be way too
complicated to track bit-granularity offsets into multiple packets,
and allow reading across packet boundaries. In practice reads
from Ts packets are all byte aligned except for small sections,
so we'll move over to using ParsableByteArray instead, so we
only need to track byte offsets.

2. Move TsExtractor to use ParsableByteArray except for small
sections where we really need bit-granularity offsets.

3. Do the actual optimization.

Issue: #278
2015-02-10 12:25:13 +00:00
Oliver Woodman
b0a3c30a90 Improve EIA608 caption support.
- Also make text renderers respect the decodeOnly flag.
- Also fix AC3 passthrough to always allocate direct buffers.
2015-02-09 17:28:07 +00:00
Oliver Woodman
32f0eb1278 Enhance mp4 parsing. 2015-02-09 17:25:39 +00:00
Oliver Woodman
bfa1de68d8 Move common MP4 parsing code to CommonMp4AtomParsers and Mp4Util.
Also add parseMp4vFromParent and return the track's duration in parseTrak.

This is in preparation for adding a non-fragmented MP4 extractor.
2015-02-06 11:43:37 +00:00
Oliver Woodman
a968e5535b Continue playback of tracks with longer duration than the timesource.
If the timesource track renderer ends, but other track renderers
haven't finished, the player would get stuck in a pending state.
This change enables automatic switching to the media clock in the
case that the timesource renderer has ended, which allows other
renderers to continue to play.
2015-02-06 11:32:46 +00:00
Oliver Woodman
03ef3d148f Add MP4V mimetype. 2015-02-06 11:32:08 +00:00
Oliver Woodman
fbf75e1263 Fix SubtitleView to redraw if text changes but bounds stay the same. 2015-02-06 11:31:13 +00:00
Oliver Woodman
7505944497 Separate leaf/container children in ContainerAtom.
Add a utility for converting named atom types to integers.

Add atom types for non-fragmented MP4 parsing.
2015-02-03 12:44:18 +00:00
Oliver Woodman
5bfc5f373b Bug fixes for ByteArrayDataSource. 2015-02-03 12:43:09 +00:00
Oliver Woodman
0ef28abbec Modified Webvtt parser to handle cue identifiers and tags.
Issue: #268
2015-02-03 12:41:49 +00:00
Oliver Woodman
c1a2f3d0c2 Add AOSP header. 2015-02-02 19:54:56 +00:00
Oliver Woodman
7b9b7c6e3b Handle non-indexed representations.
These may occur in VOD streams where a representation's data
is small enough not to require segmentation or an index. For
example subtitle files.

Issue: #268
2015-02-02 19:54:08 +00:00
Oliver Woodman
d1fe33cdf8 Add DefaultSampleSource and SampleExtractor interface.
SampleExtractor will initially only be implemented by FrameworkSampleExtractor
which delegates to a MediaExtractor, but eventually it will also be implemented
by additional extractors.

The sample extractor can be used as a source of samples via DefaultSampleSource.
2015-02-02 14:59:30 +00:00
Oliver Woodman
6f3ccc3615 Handle byte-order-mark prefix to WebVTT file.
Issue: #268
2015-02-02 14:56:33 +00:00
Martin Bonnin
e33e1d7922 cleaner test 2015-01-27 18:37:27 +01:00
Martin Bonnin
c228017fe4 rename hasQueuedOneInputBuffer to hasQueuedInputBuffer 2015-01-27 18:35:40 +01:00
Oliver Woodman
ed0b02d09b Package restructuring to accommodate incoming features (sorry).
This may be painful in terms of applications having to change their
imports. Sorry about that.
2015-01-27 17:00:46 +00:00
Oliver Woodman
b7be7bc01b Fix handling of PTS wraparound. 2015-01-27 15:12:33 +00:00
Oliver Woodman
ee83468084 Blacklist playlists that 404/410. 2015-01-27 15:11:44 +00:00
ojw28
c6c6f2d83e Merge pull request #266 from google/dev
dev -> dev-hls
2015-01-27 15:10:34 +00:00
Martin Bonnin
424b29f996 remove REINIT_STATE_DO_REINIT_NOW state, reinit directly when needed. 2015-01-27 10:44:02 +01:00
Oliver Woodman
f1a7784eb1 Fix DASH Live edge calculation.
Also added clamping to getSegmentNum in one case where
it was not already implemented, and defined this behavior
property in the getSegmentNum javadoc.

Issue: #262
2015-01-26 14:49:33 +00:00
Oliver Woodman
a64df69f85 Refine last segment calculation.
This makes the calculation correct for the case where periodDurationMs
does not divide exactly into durationMs.
2015-01-26 14:08:38 +00:00
Ihor Zakhozhyi
1a363849e2 Fixed wrong calculation of last segment number when using segment template without segment timeline. 2015-01-25 18:49:53 +02:00
ojw28
95341440da Merge pull request #263 from google/dev
dev -> dev-hls
2015-01-23 14:32:21 -08:00
Oliver Woodman
14d1317ce0 Replace tabs with spaces. 2015-01-23 22:25:39 +00:00
Oliver Woodman
4f65e94e93 Add Javadoc to ParsableByteArray. 2015-01-23 22:23:59 +00:00
Oliver Woodman
59b04df4c3 Fix incorrect max height calculation. 2015-01-23 22:18:54 +00:00
Oliver Woodman
6520557dc0 Add (not technically necessary 0xFF guard for clarity).
Without this, the byte is cast as follows (in bits) if the top
byte is set:

10000010 -> 1000000000000000000000000000010

This works because we then always shift at least one bit left,
and only look at the bottom 8 bits of the result. It's confusing
though. It's clearer if the cast to int gives just adds zeros to
the front, like:

10000010 -> 0000000000000000000000010000010
2015-01-23 09:08:41 -08:00
Lei YU
80602b1684 Make BitArray.readUnsignedByte() a bit more clear by using int value instead of byte to prevent unnecessary convert from int to byte. 2015-01-23 23:52:46 +08:00
Lei YU
a9b2120fc9 Fix an issue in BitArray.readUnsignedByte() returns incorrect value when bitOffset is not zero and data[byteOffset + 1] starts with bit 1.
This is caused by signed right shift, the fix is simply to make it unsigned right shift.
2015-01-23 16:44:23 +08:00
Andrey Udovenko
b30f55f147 Process only type == 0 captions. #156 2015-01-22 12:53:33 -05:00
Martin Bonnin
79708f43f8 handle the case when flushCodec() is called while reiniting the decoders 2015-01-22 10:24:51 +01:00
ojw28
ef396933f8 Merge pull request #255 from google/dev
dev -> dev-hls
2015-01-21 15:52:31 -08:00
Oliver Woodman
e246970a20 Minor style tweaks. 2015-01-21 15:51:02 -08:00
Oliver Woodman
bb9e34f512 Minor style tweaks. 2015-01-21 15:47:17 -08:00
Andrey Udovenko
4158ede6e3 Move Closed Captions processing to Eia608TrackRenderer. Use TextRenderer interface for captions. Sort captions based on video frames DTS. Add better control characters and special characters in basic North American character set support. Fixes #156 2015-01-21 11:54:23 -05:00
Nezz
8547f0c05d Replaced tabs with spaces 2015-01-21 17:44:48 +01:00
Nezz
796e5bc7d6 FrameworkSampleSource with FileDescriptor #246 2015-01-21 04:23:13 +01:00
Oliver Woodman
fe43377104 Increase retry count to 3 2015-01-12 17:44:42 +00:00
ojw28
06e9e5d3ea Merge pull request #234 from google/dev
dev -> dev-hls
2015-01-12 17:43:44 +00:00
Oliver Woodman
a879819dd3 Force callers into MediaCodecUtil to catch any exceptions that occur.
Issue: #217
Issue: #228
2015-01-12 17:40:55 +00:00
Oliver Woodman
286365ada8 Use Long.SIZE. 2015-01-12 17:38:21 +00:00
Oliver Woodman
3ca12d0c39 Update min retry count to 3.
Empirical testing in shows increased robustness.
2015-01-12 17:37:25 +00:00
Oliver Woodman
e8d2c00cf7 Add trace to chunk fetches. 2015-01-12 17:37:07 +00:00
Oliver Woodman
f65a093596 AudioTrack enhancements.
- Workaround issue where video may freeze whilst audio continues
  on some devices that have entered bad states.
- Fix wrap-around for playbacks lasting more than 27 hours.
2015-01-12 17:35:43 +00:00
Oliver Woodman
224fc2eef8 Omit range header if the range is 0-.
Apparently some servers don't like it, and in general it's
unnecessary to set the header for this case.
2015-01-12 17:34:00 +00:00
ojw28
a6e94af267 Merge pull request #226 from google/dev
Refine logic for determining AudioTrack size.
2015-01-06 20:15:42 +00:00
Oliver Woodman
1613c9c7a8 Refine logic for determining AudioTrack size.
- Target 4x the minimum specified by the framework.
- Impose a minimum duration (250ms).
- Impose a maximum duration (750ms, or the minimum
  specified by the framework if that's larger).

I've removed the ability to specify the multiplication
factor, since the underlying implementation is getting more
complicated, and we should really be able to figure this out
internally.
2015-01-06 20:13:50 +00:00
ojw28
869ecbfcf3 Merge pull request #225 from google/dev
dev -> dev-hls
2015-01-02 17:38:59 +00:00
Oliver Woodman
d906e405a1 Propagate AudioTrack errors. 2015-01-02 17:35:57 +00:00
Martin Bonnin
e8a8c49a97 better handling of input format change for non-adaptive codecs
* this fixes a bug when switching from HE-AAC 22050Hz to AAC 44100Hz (the AudioTrack was not reset and we were trying to send a bad number of bytes, triggering a "AudioTrack.write() called with invalid size" error)
* this also improves quality switches, making it almost seamless
2014-12-23 13:47:50 +01:00
ojw28
f39d83cf75 Merge pull request #215 from google/dev
dev -> dev-hls
2014-12-20 12:00:41 +00:00
Oliver Woodman
4c0554d0d7 Start adding support for more formats in WebM container. 2014-12-20 11:59:19 +00:00
Oliver Woodman
ed6fcb638e Fix reading single byte from DataSourceInputStream. 2014-12-20 11:57:49 +00:00
Oliver Woodman
0414b0d2f6 Fix assertion fail on seek.
Issue: #214
2014-12-20 11:57:05 +00:00
Oliver Woodman
c497b78ffe Fix memory leak in TsExtractor when not all tracks are enabled.
Previously samples belonging to disabled tracks would just
accumulate in an arbitrarily long queue in TsExtractor. We
need to actively throw samples away from disabled tracks up
to the current playback position, so as to prevent this.

Issue: #174
2014-12-19 12:14:06 +00:00
Oliver Woodman
1fce55f6fe HLS: Consider all programs.
I'm not sure exactly what the implications of this change are,
but I'd really hope that only one program in each stream is carrying
audio/video. For GoPro cameras, they expose the video stream in
the second program, for some reason.

Issue: #116
2014-12-19 12:12:04 +00:00
Oliver Woodman
0756c3d28c Relax assertion.
We've seen a few streams where this assertion fails. If you
just skip the packet, things appear to recover correctly in
all cases I've seen, so replacing failure with a warning.
2014-12-19 12:11:17 +00:00
ojw28
5cf781ab9f Merge pull request #211 from google/dev
dev -> dev-hls
2014-12-19 12:09:06 +00:00
Oliver Woodman
99b438e4c4 Don't request that the server use DEFLATE compression.
If the server actually gives us a DEFLATE response, we
fail to handle it properly!
2014-12-19 12:06:00 +00:00
Oliver Woodman
4d6c9f27c2 Minor cleanup of AudioTrack. 2014-12-19 12:05:03 +00:00
ojw28
83e80f98fb Merge pull request #207 from google/dev
dev -> dev-hls
2014-12-17 19:25:12 +00:00
Oliver Woodman
3a9d08edb5 Misc performance/correctness tweaks. 2014-12-17 19:18:33 +00:00
Oliver Woodman
f1fe109bfa Fix AC3Passthrough
- Handle read returning NOTHING_READ for AC-3 streams.
- Remove extra checks for the audio track being initialized.
- Call isInitialized() instead of checking audioTrack != null.
2014-12-17 19:16:02 +00:00
ojw28
1face38709 Merge pull request #204 from google/dev
dev -> dev-hls
2014-12-15 15:12:21 +00:00
Oliver Woodman
11eb1c222b Identify AC-3 tracks by codecs="ac-3", not the MIME type. 2014-12-15 15:04:38 +00:00
Oliver Woodman
595147de9b Enforce sliding window of available segments for DASH DVB. 2014-12-15 15:03:10 +00:00
Oliver Woodman
978a4d857a Handle getting the audio track's position before the first AC-3 buffer.
ac3Bitrate is set only after the first buffer is handled, which meant that
getting the playback position would cause a divide by zero before then.

When playing back AC-3 content, the ac3Bitrate will always be set after the
first buffer is handled, so return a 0 position if it is not set.
2014-12-15 15:02:29 +00:00
Oliver Woodman
b80569237b Correctly propagate fatal load error. 2014-12-12 14:25:48 +00:00
Oliver Woodman
0cb8169323 Merge branch 'dev-hls' into dev 2014-12-12 14:23:43 +00:00
Oliver Woodman
5a3340d638 Add initial AC3 passthrough support. 2014-12-12 14:18:54 +00:00
Oliver Woodman
81bf68b1cb Minor doc fixes. 2014-12-12 14:13:58 +00:00
Oliver Woodman
9d4e177347 Support DASH Live TTML subtitles.
Also add missing file.
2014-12-12 14:12:00 +00:00
Oliver Woodman
bb024fda08 Partial support for DASH DVB Live streams.
- Adds support for dash manifests that define SegmentTemplate
  but no SegmentTimeline.
- Assumes that the device clock is correct when calculating which
  segments to load. The final step here is to use the Utc timing
  element in the DASH manifest to obtain an accurate client clock.
- Doesn't yet enforce that the client shouldn't load segments that
  are in the future or behind the live window.
2014-12-12 14:07:48 +00:00
Oliver Woodman
1554db1673 Skip bad PES packets
Issue: #200
2014-12-11 10:26:50 +00:00
ojw28
035671b722 Merge pull request #198 from google/dev
dev -> dev-hls
2014-12-10 14:08:10 +00:00
Oliver Woodman
f15e3973e0 Fix discovery of secure decoders on some L devices. 2014-12-10 14:05:51 +00:00
Oliver Woodman
86b2209ad0 Bump version to 1.1.0.
Also update gradle files.
2014-12-10 14:04:58 +00:00
Oliver Woodman
a254218891 No-op format changes. 2014-12-08 20:19:24 +00:00
Oliver Woodman
87ca1b3465 Skip previously loaded HLS data after an error occurs.
Github issue: #183
2014-12-08 20:18:10 +00:00
ojw28
1344b36da9 Merge pull request #194 from google/dev
dev -> dev-hls
2014-12-08 20:17:17 +00:00
Oliver Woodman
c4b2a01212 Allow out-of-band pssh data for DASH playbacks.
This fixes the referenced issue, except that the MPD parser
needs to actually parse out UUID and binary data for schemes
that we wish to support. Alternatively, it's easy to applications
to do this themselves by extending the parser and overriding
the parseContentProtection and buildContentProtection methods.

Github Issue: #119
2014-12-08 20:15:06 +00:00
Oliver Woodman
2f0a1779e2 Stop piping PSSH information through the extractor.
It's cleaner to not inject data into the extractor only
so that it can be read out as though it were parsed from
the stream. This is also an incremental step towards
fixing Github issue #119.
2014-12-08 20:13:52 +00:00
Oliver Woodman
cf80c4d9cb Allow passing of optional parameters in MediaDrm key requests. 2014-12-08 20:12:04 +00:00
Oliver Woodman
01151c9c65 Don't append base uri if chunkUrl is absolute. 2014-12-08 20:10:52 +00:00
Oliver Woodman
7ca1de2275 Experiment to add SPS/PPS to the media format. 2014-12-08 11:36:51 +00:00
ojw28
5d7820542c Merge pull request #189 from google/dev
dev -> dev-hls
2014-12-05 17:58:56 +00:00
Oliver Woodman
c8e5988e6d Fix handling of unknown duration in FMP4.
Issue: 186
2014-12-05 17:53:24 +00:00
Oliver Woodman
6f1832fb66 Support negative-fronted xs:duration values.
Issue: 186
2014-12-05 17:52:30 +00:00
Oliver Woodman
fc8c08d240 Fix #187 2014-12-05 17:51:52 +00:00
Oliver Woodman
3d775c1641 Use C constants + minor cleanup. 2014-12-03 18:50:31 +00:00
Oliver Woodman
511dd9435a Merge branch 'dev' into dev-hls 2014-12-03 18:48:20 +00:00
Oliver Woodman
4efc0abde9 Implement DASH Live.
Note: This adds support for the majority of DASH live streams,
however we do not yet correctly support live streams that rely
on UtcTimingElements in their manifests.

Issue: #52
2014-12-03 18:45:13 +00:00
Oliver Woodman
6652f864bd Audio improvements. 2014-12-03 18:33:36 +00:00
Oliver Woodman
2e1f9897e7 Fixed issue in which setting a representation duration to unknown wasn't handled correctly. 2014-12-03 18:30:56 +00:00
Oliver Woodman
dc644ae86d Make single MICROS_PER_SECOND constant + use it everywhere. 2014-12-03 18:30:15 +00:00
Oliver Woodman
656fc0b0ca Make sure SmoothStreaming manifest durations are -1 for Live.
Plus start to properly document the SmoothStreaming package.
Note that where the documentation is a little vague, this is
because the original SmoothStreaming documentation is equally
vague!
2014-12-03 18:26:48 +00:00
Oliver Woodman
c2d55acab5 Get Exo+HLS memory usage more under control.
- Split sample pools for video/audio/misc, since the typical
  required sample sizes are very different (and so it becomes
  inefficient to use a sample sized for video to hold audio).
- Add TODO for further improvements.

Issue: #174
2014-12-03 18:10:30 +00:00
ojw28
b9f3253924 Merge pull request #176 from google/dev
dev -> dev-hls
2014-11-27 18:18:02 +00:00
Oliver Woodman
165562d880 Add VSYNC aligning smooth frame release helper. 2014-11-27 18:15:16 +00:00
Oliver Woodman
2969bba60f Fix timestamp rollover issue for DASH live.
The timestamp scaling in SegmentBase.getSegmentTimeUs was
overflowing for some streams. Apply a similar trick to that
applied in the SmoothStreaming case to fix it.
2014-11-27 18:14:19 +00:00
Oliver Woodman
c534263032 Enhance parsing of xs:duration to support year/month/day. 2014-11-27 18:12:46 +00:00
Oliver Woodman
1a557a06c1 Support SmoothStreaming repeated chunk tags. 2014-11-27 18:11:43 +00:00
Oliver Woodman
40f3172237 HLS: More control over buffering + tweak caption impl.
- Move all three buffering constants to a single class (the
  chunk source).
- Increase the target buffer to 40s for increased robustness
  against temporary network blips.
- Make values configurable via the chunk source constructor.
- Treat captions as a text track for HLS. This allows them to
  be enabled/disabled through the demo app UI.

Issue: #165
2014-11-26 17:21:41 +00:00
Oliver Woodman
8e2801ce9b Improve HLS ABR.
- Add options to switch abruptly at segment boundaries. Third
  parties who guarantee keyframes at the start of segments will
  want this, because it makes switching more efficient and hence
  rebuffering less likely.
- Switch quality faster when performing a splicing switch (when
  we detect that we need to switch variant, we now immediately
  request the same segment as we did last time for the new variant,
  rather than requesting one more segment for the old variant
  before doing this.
2014-11-26 12:08:46 +00:00
Oliver Woodman
410fcdeb87 Merge HLS playlist parsers, make a single parser identify the
playlist type (master or media).

Issue: #155
2014-11-26 12:01:36 +00:00
ojw28
f9f3b82d93 Merge pull request #172 from google/dev
dev -> dev-hls
2014-11-26 11:26:39 +00:00
Oliver Woodman
ab00a4da03 Allow non-strict webvtt parsing. 2014-11-26 11:23:15 +00:00
Oliver Woodman
7dfebc2e11 Make default retry count public. 2014-11-26 11:22:54 +00:00
ojw28
f034ee7d40 Merge pull request #169 from google/dev
Correctly handle redirection when requesting manifests.
2014-11-21 17:55:38 +00:00
Oliver Woodman
69c7cb09c8 Correctly handle redirection when requesting manifests. 2014-11-21 17:54:55 +00:00
Oliver Woodman
03e859d774 Fix handling of encrypted media if IV changes.
1. Correctly replace the AES data source if IV changes.
2. Check the largest timestamp for being equal to MIN_VALUE, and
   handle this case properly.
3. Clean up AES data source a little.

Issue: #162
2014-11-20 17:11:02 +00:00
Oliver Woodman
81e2c9f0d3 Fix https://github.com/google/ExoPlayer/issues/159.
The actual fix here is to not call discardExtractors in HlsSampleSource
whilst the loading thread that's pushing data into it is still running.
It's required to wait for that thread to have exited before doing this.

Issue: #159
2014-11-20 14:59:22 +00:00
Oliver Woodman
8c07847b00 Properly propagate errors that occur during preparation. 2014-11-20 14:58:06 +00:00
ojw28
b501f8ab39 Merge pull request #160 from google/dev
dev -> dev-hls
2014-11-20 11:12:06 +00:00
Oliver Woodman
33c37ebc82 Fix AudioTrack position reporting whilst paused.
Issue: #158
2014-11-20 11:04:38 +00:00
Oliver Woodman
2a832fd3c4 Minor stylistic tweaks. 2014-11-20 11:03:47 +00:00
ojw28
faf196a581 Merge pull request #154 from google/dev
Merge dev -> dev-hls
2014-11-19 16:10:17 +00:00
ojw28
d506d7660d Merge pull request #147 from jonasl/dev-gc
MediaCodecTrackRenderer: Avoid excessive garbage generation
2014-11-19 16:08:38 +00:00
ojw28
25ddeab57d Merge pull request #146 from jonasl/dev-hls-crop
TsExtractor: Account for frame cropping when parsing SPS
2014-11-19 16:08:27 +00:00
Oliver Woodman
127bcd18c3 Bring internal/external branches closer.
- Unredact internal error ids.
- Move images.
2014-11-19 15:58:26 +00:00
Oliver Woodman
4280511a33 Seamless splicing for adaptive HLS. 2014-11-19 10:34:49 +00:00
ojw28
87d0be252e Merge pull request #149 from google/dev
dev -> dev-hls
2014-11-19 10:10:53 +00:00
Andrey Udovenko
3cfe894b93 Additional IV fix. Trim sign bit from BigInteger.toByteArray() output, if it creates a 17th byte for it. #145 2014-11-18 19:36:44 -05:00
Jonas Larsson
255c3b27f6 MediaCodecTrackRenderer: Avoid excessive garbage generation
Looking up a long in a HashSet<Long> auto boxes the long and leaves
it for the GC. As decodeOnly is relatively infrequent it's much
better to do a simple linear search in a List<Long>. That way
we can avoid boxing every incoming time stamp value. In the general
case this will be linear searching in an empty list, a very fast
operation.

Signed-off-by: Jonas Larsson <jonas@hallerud.se>
2014-11-18 15:41:16 -08:00
Andrey Udovenko
15d3df6a58 Add EIA-608 (CEA-608) Closed Captioning support for HLS #68 2014-11-18 14:48:40 -05:00
Andrey Udovenko
c57484f90a Fix for IV bigger than 32 bits #145 2014-11-18 14:11:02 -05:00
Andrey Udovenko
3abcefa00c Add EXT-X-BYTERANGE support #139 2014-11-18 14:05:34 -05:00
Oliver Woodman
bc303b730a Factor out AudioTrack from MediaCodecAudioTrackRenderer.
AudioTrack contains the portions of MediaCodecAudioTrackRenderer that handle the
platform AudioTrack instance, including synchronization (playback position
smoothing), non-blocking writes and releasing.

This refactoring should not affect the behavior of audio playback, and is in
preparation for adding an Ac3PassthroughAudioTrackRenderer that will use the
AudioTrack.
2014-11-18 19:04:14 +00:00
Oliver Woodman
44bc01b28d Add receiver for HDMI plugged-in configuration changes. 2014-11-18 19:02:32 +00:00
Oliver Woodman
7cd201c28b Add missing class. 2014-11-18 19:02:20 +00:00
Oliver Woodman
2472637264 Add support for extracting Vorbis audio in WebM Extractor. 2014-11-18 19:00:30 +00:00
Oliver Woodman
6a544da2f8 Use new MediaCodecList APIs on L. 2014-11-18 18:58:04 +00:00
Oliver Woodman
685e1d1f06 Minimize memory leak risks.
Remove implicit back-reference from playback thread to player.
2014-11-18 18:54:45 +00:00
Jonas Larsson
467f19568b TsExtractor: Account for frame cropping when parsing SPS
Passing uncropped dimensions to certain decoders will make them
output frames without proper cropping set.

Signed-off-by: Jonas Larsson <jonas@hallerud.se>
2014-11-18 08:53:54 -08:00
Oliver Woodman
360d452dad Avoid seeking if seekPosition==currentPosition 2014-11-14 18:32:22 +00:00
Oliver Woodman
eb1210d410 Make sampleQueue thread safe 2014-11-14 18:31:55 +00:00
Oliver Woodman
6b123590ca Correctly propagate errors 2014-11-14 16:31:47 +00:00
Oliver Woodman
643f33f7e9 Properly handle different profiles (skipping SPS data as needed). 2014-11-14 16:31:23 +00:00
Oliver Woodman
fd51901620 Big HLS update. Add start of adaptive support, but leave disabled for now. 2014-11-13 16:32:10 +00:00
Oliver Woodman
6c6ba900a9 Fix the build. 2014-11-13 16:23:44 +00:00
ojw28
0005f41fe9 Merge pull request #138 from google/dev
dev -> dev-hls
2014-11-13 16:20:13 +00:00
Oliver Woodman
d14e11c507 Additional extraction for AC3 2014-11-13 16:13:55 +00:00
Oliver Woodman
456d53e178 Minor cleanup. 2014-11-13 16:13:02 +00:00
Oliver Woodman
2d97d31a9e Add ability to make fine-grained frame release timestamp adjustments 2014-11-13 16:11:52 +00:00
Oliver Woodman
f1c646b793 Add diagnostic info to decoder exceptions + minor cleanup 2014-11-13 16:10:21 +00:00
Oliver Woodman
59688397fa Suppress deprecation warnings 2014-11-13 16:08:43 +00:00
Oliver Woodman
bc871c94a6 Add bitrate to MediaFormat 2014-11-13 16:08:16 +00:00
Oliver Woodman
4460b7c626 Fix typo 2014-11-13 16:06:49 +00:00
ojw28
7b5c4d705f Merge pull request #131 from google/dev-l
Merge dev-l into dev-hls, now L SDK is released.
2014-11-10 08:49:20 +00:00
ojw28
5abb413f4e Merge pull request #127 from google/dev
dev -> dev-l
2014-11-06 19:30:47 +00:00
ojw28
e9dacb08df Merge pull request #126 from google/dev
dev -> dev-hls
2014-11-06 19:30:24 +00:00
Oliver Woodman
1653e81687 Add configurable retry count to ChunkSampleSource 2014-11-06 19:28:21 +00:00
Oliver Woodman
eccf8d7924 Minor Webvtt parsing tweaks 2014-11-06 19:27:28 +00:00
Oliver Woodman
d2e73dd566 Add brackets to make expression clearer. 2014-11-06 19:26:41 +00:00
Oliver Woodman
aeb17e6a88 HLS improvements + steps towards ABR. 2014-11-06 19:22:14 +00:00
Oliver Woodman
9790430a62 Trim whitespace from codecs 2014-11-06 19:17:22 +00:00
Oliver Woodman
55b4272a46 Pro-actively parse the final PES packet. 2014-11-05 17:25:02 +00:00
ojw28
e6c7e29647 Merge pull request #121 from google/dev
dev -> dev-l
2014-11-05 17:15:39 +00:00
Andrey Udovenko
71f918c01b ID3 refactoring to match apple's player behavior #67 2014-11-05 11:54:45 -05:00
Andrey Udovenko
c781fcd13d Merge pull request #117 from google/dev
Add cookies support and use the same UserAgent in ManifestFetcher and in...
2014-11-04 14:20:36 -05:00
Andrey Udovenko
712e46085d Add cookies support and use the same UserAgent in ManifestFetcher and in HttpDataSource. 2014-11-04 14:06:37 -05:00
Andrey Udovenko
a76addba5d Add AES-128 encryption support for HLS #69 and parsing logic for CODECS and RESOLUTION attributes. 2014-11-04 13:38:22 -05:00
ojw28
059835e357 Merge pull request #113 from google/dev
dev -> dev-l
2014-11-03 12:21:45 +00:00
ojw28
f4a5cd637f Merge pull request #112 from google/dev
dev -> dev-hls
2014-11-03 12:21:04 +00:00
Oliver Woodman
19eb7795fe Fix default startNumber.
Issue: #108
2014-11-03 12:01:53 +00:00
Oliver Woodman
4c146ee28d Neaten TsExtractor a little.
- Add a readBit method to BitsArray for reading a boolean flag.
- Make things accessed from inner classes package visibility to avoid
  the compiler generating thunk methods.
2014-10-28 19:48:54 +00:00
Oliver Woodman
2422912be8 Refactor HLS support.
- The HlsSampleSource now owns the extractor. TsChunk is more or less dumb.
  The previous model was weird, because you'd end up "reading" samples from
  TsChunk objects that were actually parsed from the previous chunk (due to
  the way the extractor was shared and maintained internal queues).
- Split out consuming and reading in the extractor.
- Make it so we consume 5s ahead. This is a window we allow for uneven
  interleaving, whilst preventing huge read-ahead (e.g. in the case of sparse
  ID3 samples).
- Avoid flushing the extractor for a discontinuity until it has been fully
  drained of previously parsed samples. This avoids skipping media shortly
  before discontinuities.
- Also made start-up faster by avoiding double-loading the first segment.

Issue: #3
2014-10-28 19:25:44 +00:00
Andrey Udovenko
d3a05c9a44 Add ID3 Timed Metadata support for HLS #67 2014-10-28 13:24:12 -04:00
ojw28
dd2921f9b2 Merge pull request #97 from google/dev
dev
2014-10-28 14:19:18 +00:00
ojw28
3bee259de9 Merge pull request #96 from google/dev
dev -> dev-hls
2014-10-28 14:18:56 +00:00
Oliver Woodman
c34f7368ae Minor tweak to UriDataSource. 2014-10-28 14:12:55 +00:00
Oliver Woodman
5ba3f1eea3 Fix build. 2014-10-28 10:08:49 +00:00
ojw28
119eb6712a Merge pull request #93 from google/dev
Dev -> Dev-hls
2014-10-27 11:06:31 +00:00
ojw28
1057a45812 Merge pull request #92 from google/dev
Dev -> Dev-l
2014-10-27 11:06:10 +00:00
Oliver Woodman
192cdc66a2 Ignore secure decoders. They shouldn't be explicitly listed. 2014-10-27 11:00:04 +00:00
Oliver Woodman
067422a491 Cleanup TextTrackRenderer. 2014-10-27 10:59:37 +00:00
Oliver Woodman
5f6b197355 Allow direct and indirect buffer replacement.
Also tweak ManifestFetcher.
2014-10-27 10:58:43 +00:00
Oliver Woodman
ae6e082d2f Add a UriDataSource for reading from file or network. 2014-10-27 10:54:51 +00:00
Oliver Woodman
6aeb989327 Add some MimeTypes that will be useful in the future. 2014-10-27 10:54:20 +00:00
Oliver Woodman
f859205438 Let FileDataSource report to a TransferListener. 2014-10-27 10:52:45 +00:00
Oliver Woodman
b8415dba59 Parse all UUID boxes, not just the first one. 2014-10-27 10:51:45 +00:00
ojw28
4c348d8aa6 Merge pull request #83 from google/dev
Pull dev -> dev-l
2014-10-20 16:59:46 +01:00
ojw28
c2c7a75681 Merge pull request #82 from google/dev
Pull dev -> dev-hls
2014-10-20 16:59:18 +01:00
Oliver Woodman
1f0d411886 Make mpd parser more ameanable for extension. 2014-10-20 16:55:38 +01:00
Oliver Woodman
5a87133219 Add case for 7.1 audio. 2014-10-20 16:54:51 +01:00
Oliver Woodman
5f0be427a4 Update HlsSampleSource + correctly propagate error from prepare.
Issue: #81
2014-10-20 16:53:43 +01:00
Oliver Woodman
4853611803 Remove additional "/" from merged URLs.
Issue: #81
2014-10-20 16:45:56 +01:00
Oliver Woodman
60d162df18 Fix overflow when comparing HLS Segments for long videos. 2014-10-15 20:42:26 +01:00
Oliver Woodman
fcd9ec6c23 Tweak audio renderer to match dev/dev-hls. 2014-10-09 21:55:10 +01:00
Oliver Woodman
fd3016cd13 Use setVolume on API level 21 devices, plus minor naming cleanup. 2014-10-09 17:54:30 +01:00
ojw28
d2e480f01b Merge pull request #75 from google/dev
Merge dev -> dev-hls
2014-10-09 17:31:36 +01:00
ojw28
989bbef24e Merge pull request #74 from google/dev
Merge dev -> dev-l
2014-10-09 17:31:05 +01:00
Oliver Woodman
759431048d Treat "no chunk to load yet" in the same way as finished.
The key change here is that nextLoadPositionUs is set to -1
if we're not loading but don't have a next chunk ready to
load. This ensures that "missing chunks" in one stream don't
prevent chunks in another stream from loading. This occurs
in SmoothStreaming with TTML subtitles, where the chunks are
sparse.
2014-10-09 17:27:20 +01:00
Oliver Woodman
027d9eefbd Smoother playback #1.
Propagate elapsedRealtimeUs to the video renderer. This allows
the renderer to calculate and adjust for the elapsed time since
the start of the current rendering loop. Typically this is <2ms,
but there situations where it can go higher (normally when the
video renderer ends up processing more than 1 output buffer in
a single loop).

Also made variable naming more consistent throughout the package.
2014-10-09 17:26:01 +01:00
Oliver Woodman
3b4409ae0b Allow relaxation of TTML validity requirement when parsing subtitles. 2014-10-09 17:19:14 +01:00
Oliver Woodman
d4e824634c Throw a checked exception rather than unchecked one.
So that we actually catch it, rather than having the process crash!
2014-10-09 17:17:43 +01:00
Oliver Woodman
43712ce41c Cap AudioTrack latencies at 10 seconds and log a warning if too large. 2014-10-09 17:16:13 +01:00
Oliver Woodman
ac18ac087b Fix missing ->IN_SYNC transition. 2014-10-09 17:13:14 +01:00