Commit graph

3925 commits

Author SHA1 Message Date
Oliver Woodman
3e62b63eb2 Try and use httpDataSource if scheme isn't recognised.
Issue: #473
2015-05-22 20:37:52 +01:00
Kelly Schrock
08d337365e HLS AAC fix
Fixes issue where an NPE occurs when RollingSampleBuffer is created
with a null Allocator.
2015-05-21 20:35:09 -05:00
Oliver Woodman
253a0105f7 Cleanup 2015-05-19 15:24:18 +01:00
Oliver Woodman
658a7ffba5 Step towards enhanced Webvtt parser to support HTML-rich captions and positioning. 2015-05-19 15:19:59 +01:00
Oliver Woodman
709fc7735b First steps toward implementing bounded live seek. 2015-05-19 15:16:29 +01:00
Oliver Woodman
763d68f26c Bump to 1.3.2 2015-05-19 14:37:29 +01:00
Oliver Woodman
6ae97ced3a Support content:// URIs, and some cleanup/consistency tweaks.
- There's definitely potential for more code sharing in these
classes, but deferring for now.
- Also made no-scheme default to file://, and allowed smoothstreaming
URLs to be specified with or without the /Manifest suffix.
2015-05-19 14:14:53 +01:00
Oliver Woodman
a9c977a79e Fix Mp3Extractor synchronization when loading retries.
Before preparation, and when seeking, Mp3Extractor did not handle retrying:
- synchronizedHeader was set before the header was known to be valid, which
  means that after seeing one valid frame header and then failing to read, the
  synchronization would be treated as complete.
- The input buffer would keep data loaded during synchronization but on the next
  call to synchronize when retrying it was not returned to the mark position to
  re-parse the data.

This change fixes these issues.
2015-05-19 14:13:31 +01:00
Oliver Woodman
675c7738c1 Let DefaultUriDataSource load assets. 2015-05-19 14:12:59 +01:00
Oliver Woodman
f474afbf5e Fix handling of widths/heights when choosing formats.
- Make HlsPlaylistParser treat non-positive dimensions as unknown.
- Make HlsPlaylistParser parse floating point resolutions, because
  technically that's how they're spec'd.
- Make VideoFormatSelectorUtil treat non-position dimensions as unknown.

Issue: #461
2015-05-19 14:06:48 +01:00
Oliver Woodman
059b80c1ab Improve DataSource implementations:
1. Make DefaultUriDataSource robust against exceptions through from close().
2. Make AssetDataSource handle file:///android_asset/ URIs.
2015-05-19 14:05:50 +01:00
Oliver Woodman
672906060c Fix missing ID3 events
When I moved the id3Reader instantiation out of the while
loop (below where it is now) it was no longer guarded by
the streamTypes.get(streamType) deduping check. This brings
back an equivalent check.
2015-05-19 14:05:08 +01:00
Oliver Woodman
cd6c5c3984 Fix CBR seeking when XING header is present.
When a XING header is present but not usable (due to missing fields), CBR
seeking can be used instead. It relies on the bitrate. The bitrate from the
unusable XING header is not correct, which leads to incorrect seeking.

Also fix VBRI seeking by setting the correct offset on the frame to parse. Few
people seem to use that format, but I have found two very short truncated
samples which were falling back to the CBR case before but are using VBRI with
this change.
2015-05-19 14:03:39 +01:00
Oliver Woodman
d03fb10516 Remove readBitsLong, use readBits instead 2015-05-19 14:02:40 +01:00
Oliver Woodman
dd7a796883 Make constant public 2015-05-19 14:01:59 +01:00
Oliver Woodman
0dfc1d3bb7 Don't sample the timestamp/latency for AC-3 passthrough playback. 2015-05-19 14:00:49 +01:00
ood_tsen
b340d47165 support content uri (e.q. content://xxx) 2015-05-18 20:24:59 +08:00
Patrik Åkerfeldt
1469f11aa3 Support setting properties on MediaDrm 2015-05-13 10:41:22 +02:00
Oliver Woodman
5ca5df0bb2 Bump to 1.3.1 2015-05-12 18:42:46 +01:00
Oliver Woodman
06cbb4e746 Fix doc image refs 2015-05-12 16:57:39 +01:00
Oliver Woodman
683b67cc19 Correct javadoc header 2015-05-12 16:53:47 +01:00
Oliver Woodman
5ca3378b71 Rm doc dir from dev 2015-05-12 15:22:43 +01:00
Oliver Woodman
8a347d1a5d Use https 2015-05-12 15:21:42 +01:00
Oliver Woodman
cd55fc068f Gradle for Javadoc 2015-05-12 15:10:07 +01:00
Oliver Woodman
166c2f7cc0 Fix two issues related to seeking with AC-3 output.
When a passthrough AudioTrack is replaced (due to seeking) the new one behaves
as if it is still emptying data from the old one, with its playback position
advancing until it runs out of data.

Data written while the 'old' AudioTrack was emptying would be discarded, so
avoid writing to the new AudioTrack while the old one is still emptying.

Also avoid using AudioTrack.getTimestamp with passthrough tracks, as this causes
the playback position to jump to a position that breaks audio/video
synchronization.
2015-05-11 21:16:02 +01:00
Oliver Woodman
79c7798d84 Reorganize BandwidthMeter interface 2015-05-11 21:11:53 +01:00
Oliver Woodman
64cc380fe1 Avoid loading first chunk when preparing HLS for non-zero position.
This also fixes a technical mistake where HlsChunkSource is fed
seekPositionUs=-1 when obtaining the first chunk. This is wrong,
but the usage of this variable within HlsChunkSource enforces that
the seek must stay within bounds, so we get away with it.

Issue: #385
2015-05-11 21:10:20 +01:00
Oliver Woodman
116a18848f Alter default exo buffertime value to 2500ms. 2015-05-11 21:05:37 +01:00
Oliver Woodman
12d05a0917 Bump target API level to 22. 2015-05-11 21:04:51 +01:00
Oliver Woodman
b0abda43ec Ensure we configure a new extractor when we need one.
Issue: #400
2015-05-11 21:03:30 +01:00
Oliver Woodman
770ad7f06f Fix edge case in HlsSampleSource.
1. prepare() needs to load a TsChunk to actually prepare the source.
2. Source is prepared, but no tracks are enabled (this is why it's
   an edge case - no-one is likely to be doing this!).
3. The TsChunk load completes.

We should not load additional chunks in this case.
2015-05-11 21:02:38 +01:00
Oliver Woodman
dd5eabdf4a Signal EoS when seeking ExtractorSampleSource to the end of a track. 2015-05-11 21:01:35 +01:00
ojw28
2ce33c257a Merge pull request #436 from ened/dev
Simple gradle updates
2015-05-11 16:24:17 +01:00
Oliver Woodman
861d6749ef Remove ability to extend the default FormatEvaluator implementations. 2015-05-08 17:09:39 +01:00
Oliver Woodman
9f77c4009e Clip seek position to the inputLength - 1. 2015-05-08 17:08:59 +01:00
Oliver Woodman
d9071710cf Read AC-3 tracks in MPEG TSs only if AC-3 playback is supported.
Partly fixes #434 as the AC-3 stream will now be ignored if the
audio capabilities don't allow it to be played back.
2015-05-08 17:08:13 +01:00
Oliver Woodman
d8af120b98 Fix treating all DVB data as AC-3.
Issue #434
2015-05-08 17:06:59 +01:00
Oliver Woodman
7437ee39d8 Remove deprecated method. 2015-05-08 17:06:27 +01:00
Oliver Woodman
54b71a5743 Allow cross-protocol redirects.
Issue: #423
2015-05-08 17:05:54 +01:00
Oliver Woodman
4527539efe Handle cenc:pssh elements in DASH manifests.
Issue: #407
2015-05-08 17:05:04 +01:00
Oliver Woodman
3360f5eda5 Enable passthrough based on the input MIME type. 2015-05-08 17:04:21 +01:00
Oliver Woodman
a1083d360a Prevent wrapping detection on new passthrough AudioTracks. 2015-05-08 17:03:05 +01:00
Oliver Woodman
de5bce3400 Apply passthrough workarounds only on platform API versions 21/22. 2015-05-08 17:02:23 +01:00
Sebastian Roth
3079bf1d75 gradle updates 2015-05-07 16:35:53 +08:00
Oliver Woodman
9921dfd1ce Deprecate FrameworkSampleSource as a deterrent. 2015-05-05 20:33:25 +01:00
Oliver Woodman
6909c948b9 Remove SuppressLint in AudioTrack. 2015-05-05 20:32:06 +01:00
Oliver Woodman
9dcb17f21a Clean up DataSourceInputStream 2015-05-05 20:30:52 +01:00
Oliver Woodman
a63883a8c8 Fix format equality checking.
For Live SmoothStreaming, referential equality checking
isn't enough (it breaks once the manifest is updated).
Updated other instances too just for consistency.
2015-05-05 20:30:32 +01:00
Tanuj Mittal
2a06c2641c Fix DataSourceInputStream.read() for EOF cases 2015-05-05 16:30:09 +05:30
Oliver Woodman
79cdd03682 Filter unsupported video formats for HLS. 2015-05-01 20:34:57 +01:00
Oliver Woodman
b405d3d9b7 Have Representation, TrackElement and Variant consistently expose Format.
And delete things that we're parsing but don't use from TrackElement.
2015-05-01 20:33:52 +01:00
Oliver Woodman
8673cafce8 Move Allocator to HlsSampleSource (from HlsChunkSource).
- This makes HLS consistent with Chunk/ExtractorSampleSource.
- It needs to be consistent for WebVTT in HLS.
- Also trim the allocator when done.
2015-05-01 20:32:42 +01:00
Oliver Woodman
0c5a1a6c35 Distinguish exceptions caught at top level. 2015-05-01 20:31:49 +01:00
Oliver Woodman
efb9ff1fe7 Play standalone MPEG-TS files.
- Have TsExtractor report a SeekMap to the output.
- Implement TsExtractor.reset to reset extractor state.
- Add 1x sample.
2015-05-01 20:31:21 +01:00
Oliver Woodman
cfab852096 Remove pointless references to ElementaryStreamReaders. 2015-05-01 20:30:00 +01:00
Oliver Woodman
d82343d06c Remove MediaFormat.bitrate. 2015-05-01 20:29:32 +01:00
Oliver Woodman
54f97c952e Reintroduce Allocation abstraction.
Play movies has an Allocator that attempts to allocate a single
huge byte[] up front to minimize the risk of GC pauses. This abstraction
will be required to keep that when updating them to the new Exo.
2015-05-01 20:28:49 +01:00
Oliver Woodman
9b112cf94d Video format selection.
Making Representation and TrackElement extend Format will simplify
this further (TBC whether this is a good idea!).

Issue: #393
2015-05-01 20:27:11 +01:00
Oliver Woodman
fafcd79e1b Move AC-3 bitrate calculation into Ac3Util.
This is in preparation for removing bitrate from MediaFormat.
2015-05-01 20:25:19 +01:00
Oliver Woodman
6bf62770bd Make sure that the process dies if a loading task throws Error. 2015-05-01 20:24:50 +01:00
Oliver Woodman
1d528b80ea Move getUserAgent from DemoUtil to library's Util. 2015-05-01 20:24:27 +01:00
Oliver Woodman
6cb46e4549 webm_extractor: Add VP8 to the list of codecs.
VP8 can be decoded by MediaCodec (since very early versions of android). Now that we want WebmExtractor to be general purpose, adding VP8 makes sense as it is a common use case.
2015-05-01 20:23:33 +01:00
Oliver Woodman
5ea7424ee3 Tidy up AssetDataSource. 2015-05-01 20:23:02 +01:00
Oliver Woodman
053e5b9f1c Fix javadoc warning. 2015-05-01 20:22:31 +01:00
Oliver Woodman
ce3d5c9a59 Throw when getMinBufferSize returns an error value. 2015-05-01 20:22:03 +01:00
Oliver Woodman
e6c7defc79 Make ParsableBitArray.data public, like ParsableByteArray. 2015-05-01 20:21:36 +01:00
Oliver Woodman
7ad55dbf2c webm_extractor: Add support for parsing BlockGroup element
This CL adds support for parsing BlockGroup elements for all
codecs (not just opus). It also adds a test to verify the new
behavior.
2015-05-01 20:20:47 +01:00
Oliver Woodman
aed45bb2ca Add support for reading AC-3 audio in HLS. 2015-05-01 20:18:08 +01:00
Oliver Woodman
9b6c30525e webm_extractor_tests: Add tests for multi track Webm Extractor Support
Refactor the extractor tests to enable testing of multi track Webm support.

Github Issue: #363
2015-05-01 20:13:53 +01:00
Oliver Woodman
48fc9635a9 webm_extractor: Add support for Cues present at the end of file
This CL adds support for WebM files which have Cues present at the end of the file (i.e.) after Clusters. The file referenced in the bug can now be played back using the demo app. It adds a new flag to WebmExtractor which should be set to true only when being used through ExtractorSampleSource. All others (e.g. DASH) should not set it.

Reference file: http://demos.webmproject.org/exoplayer/glass_vp9_vorbis_cues_at_end.webm
2015-05-01 20:13:19 +01:00
Oliver Woodman
6cccfc1caa Make Atom.getAtomTypeString public.
I've found myself doing this a couple of times during local
debugging. It's harmless to have it public, and seems pretty
useful for debugging inside of the mp4 package.
2015-05-01 20:12:28 +01:00
Oliver Woodman
b787852e71 Correctly stop previous renderers if prepare is called again. 2015-05-01 20:11:57 +01:00
Oliver Woodman
88daaa882c Fix NPE if source is released having never been prepared. 2015-05-01 20:11:27 +01:00
Oliver Woodman
837090e8f9 Move AC-3 header parsing into a new Ac3Util class.
This is in preparation for adding support for AC-3 in HLS.

Also parse E-AC-3 boxes.
2015-05-01 20:10:47 +01:00
ojw28
26c5461b10 Merge pull request #408 from dnutcracker/dev
fix for issue #403
2015-04-24 11:51:11 +01:00
Nati Dykstein
a43dd6ba68 Update AssetDataSource.java 2015-04-22 22:25:44 +03:00
Oliver Woodman
f273c73123 Support NALUnitLengthFieldLength != 4.
Seems a little hacky to define this in Track, but there doesn't seem to
be a particularly nice alternative.

Issue: #406
2015-04-22 16:24:12 +01:00
Oliver Woodman
afb1a93059 Refine ExtractorSampleSource retry.
I was hoping not to avoid this, but in the case of a parsing
failure during preparation we keep retrying forever!
2015-04-22 16:23:33 +01:00
Oliver Woodman
1a01dcc55a Separate UriDataSource from HttpDataSource.
Using a file:// URL for loading an HLS stream (for testing) would fail due to
casting the connection to an HttpURLConnection in DefaultHttpDataSource.

This change makes UriDataSource an interface for objects that are DataSources
with URIs. That allows for reading manifests for HLS using just a UriDataSource
rather than an HttpDataSource (URLs in the playlist are relative to the data
source's URL so the getUri method is needed).
2015-04-22 16:22:48 +01:00
Oliver Woodman
d43d55edeb Add minSdkVersion note to build.gradle. 2015-04-22 16:20:12 +01:00
Oliver Woodman
a1336978ad Fix DataSpec toString formatting. 2015-04-22 16:19:48 +01:00
Oliver Woodman
c807c69a93 webm_extractor: Support for multiple tracks
Github Issue: #363
2015-04-22 16:18:23 +01:00
Oliver Woodman
f637fde962 Allow overriding of codec buffer dequeue block time. 2015-04-22 16:17:36 +01:00
Oliver Woodman
1a9bf018a4 Add frame rate to Format for use in format selection (when known). 2015-04-22 16:16:42 +01:00
Oliver Woodman
a7e2b719c5 Call init() on the extractor only once for each chunk.
On retrying loading a chunk, the state of the extractor was reset due to a call
to seek(). Prevent this call by only calling init() if no bytes were loaded.

Also make the DefaultExtractorInput use the loading position not the original
stream position so that its getPosition() method returns offsets relative to
the start of the stream, which fixes a bug where the chunk index offsets would
be relative to the wrong position if there was a retry while loading the chunk.
2015-04-22 16:14:46 +01:00
Oliver Woodman
21e69f3154 Add more loading info (including chunk loading times) to
BaseChunkSampleSourceEventListener.onLoadCompleted.
2015-04-22 16:13:19 +01:00
Oliver Woodman
3a1325b0af Make TsExtractor consistent with AdtsExtractor. 2015-04-22 16:11:23 +01:00
Nati Dykstein
647d9bedb8 fix for issue #403 2015-04-22 14:51:05 +03:00
Oliver Woodman
55e08ff712 Avoid time discontinuity when retrying a live stream.
Issue: #227
Issue: #389
2015-04-17 20:12:11 +01:00
Oliver Woodman
faf0e2c147 Improve retry logic.
1. Reset retry count to 0 if a Loadable makes progress.
2. Handle resume correctly in the case of live streams.

Issue: #227
Issue: #389
2015-04-17 20:10:31 +01:00
Oliver Woodman
4c94a846d5 webm_extractor: Fix issue in vorbis extraction.
Vorbis decoder in android MediaCodec [1] expects the last 4 bytes of the sample to be the number of samples in the current page. This definition holds good only for Ogg and is irrelevant for WebM. So we always set this to -1 (the decoder will ignore this value if we set it to -1). The android platform media extractor [2] does the same.
2015-04-17 20:09:45 +01:00
Oliver Woodman
b1aac839e6 Don't feed AC-3 input when the audio track is paused.
This works around an issue the audio track continues to play audio data written
after calling AudioTrack.pause(), which breaks rebuffering behavior (as video
can never catch up if audio continues to be consumed, in some circumstances).

Also don't increment the timestamp wrap count if the track is paused, to work
around an issue where the playback head position jumps back to zero after the
AudioTrack position jumps back to zero.
2015-04-17 20:08:54 +01:00
Oliver Woodman
c4eee71fa2 Support AAC without platform MediaExtractor.
Issue: #231
Issue: #227
2015-04-17 20:07:04 +01:00
Oliver Woodman
fb97fca04e Handle dynamic appearance/disappearance of ID3 track in HLS. 2015-04-17 20:04:52 +01:00
Oliver Woodman
5f74226d67 Make the audio track session workaround flag non-final. 2015-04-17 20:04:18 +01:00
Oliver Woodman
508e13e0bd Clean up + optimize ParsableByteArray. 2015-04-17 20:03:24 +01:00
Oliver Woodman
9092fad8e8 Fix subtitles. 2015-04-17 20:02:20 +01:00
Oliver Woodman
0523717841 Fix crash. 2015-04-17 20:01:59 +01:00
Oliver Woodman
e84c852169 Select E-AC-3 in preference to AC-3, and remove other tracks. 2015-04-17 20:01:06 +01:00
Oliver Woodman
3f1638de95 Use ENCODING_PCM_16BIT for keepSessionIdAudioTrack.
ENCODING_PCM_8BIT support is not required.
2015-04-17 19:59:58 +01:00
Oliver Woodman
e4e6a1caf0 Switch from AudioFormat.ENCODING_DEFAULT to .ENCODING_PCM_16BIT.
AudioTrack.getMinBufferSize does not handle ENCODING_DEFAULT so
switch back to ENCODING_PCM_16BIT.
2015-04-17 19:59:03 +01:00
Oliver Woodman
c3bf60b1a9 Add JavaDoc to remove lint warning about unused variable. 2015-04-14 16:45:46 +01:00
Oliver Woodman
7cf6aa86d2 Properly document in code how to pass CustomData to PlayReady DRM.
Issue: #339
2015-04-14 16:44:01 +01:00
Oliver Woodman
d9b3582baa Use OMX.google.raw.decoder for passthrough playback.
The OMX component needs to be configured with a format that has a
MIME type of audio/raw. Remove Ac3PassthroughAudioTrackRenderer,
which is no longer used.
2015-04-14 16:42:24 +01:00
Oliver Woodman
ed1dbddc75 Trim memory when disabling ExtractorSampleSource.
This prevents memory leakage even in the case where the app
is still holding a reference (direct or indirect) to the
Allocator.
2015-04-13 19:36:16 +01:00
Oliver Woodman
0d69a2eae8 Implement event reporting from HlsSampleSource.
Issue: #275
2015-04-13 19:03:04 +01:00
Oliver Woodman
e21f7801b5 Major surgery to move all playback modes to the new Extractor model. 2015-04-13 18:57:31 +01:00
Sergio Moreno Mozota
e5acc5a2c8 resync with Extractor changes 2015-04-13 16:58:19 +02:00
Sergio Moreno Mozota
da7ae2a925 Merge remote-tracking branch 'upstream/dev' into dev 2015-04-13 15:56:43 +02:00
Oliver Woodman
265adf9a8f Move chunk trigger constants into Chunk. 2015-04-11 02:09:40 +01:00
Oliver Woodman
a17ffa66f2 Delete test for the removed source package. 2015-04-11 02:05:53 +01:00
Oliver Woodman
ad56490bde Add ability to discard from write-side of DefaultTrackOutput. 2015-04-11 02:03:43 +01:00
Oliver Woodman
4c8f9a8c6f Remove source package, and restore original FrameworkSampleSource. 2015-04-11 02:00:47 +01:00
Oliver Woodman
587edf8e2b Add new style mp4/fmp4 extractors. 2015-04-11 01:58:34 +01:00
Oliver Woodman
f002e6a76e Add test for DefaultExtractorInput + trivial Extractor sanity checks. 2015-04-11 01:42:48 +01:00
Oliver Woodman
7d8141e419 Add new style mp3 extractor. 2015-04-11 01:42:03 +01:00
Oliver Woodman
4a1fed9e86 Add new style WebM extractor. 2015-04-11 01:30:11 +01:00
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
608d685b2c Add missing header. 2015-04-10 22:56:13 +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
85be2aed0a Add ability to release via Bintray. 2015-03-25 23:50:27 +00: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
f3f9c845cd Add test for DefaultSampleSource. 2015-03-10 19:02:24 +00:00
Oliver Woodman
cdf19430ef Remove TrackInfo from the SampleExtractor interface. 2015-03-10 19:01:11 +00:00
Oliver Woodman
fbd0a57e5c Push tests. 2015-03-06 16:39:00 +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
f745be8978 Merge pull request #219 from google/dev
Include gradle plugin 1.0.0
2014-12-23 10:53:58 +00:00
ojw28
a96a7fe782 Merge pull request #218 from google/master
Include gradle plugin 1.0.0
2014-12-23 10:53:29 +00:00
Sebastian Roth
e4ea9c1056 Include gradle plugin 1.0.0 2014-12-22 10:34:46 +08: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
ojw28
52b95c1f83 Merge pull request #166 from google/dev
dev -> dev-hls
2014-11-21 00:32:12 +00:00
ojw28
8c980c8892 Merge pull request #164 from talklittle/dev
gradle plugin 0.14.4 fixes
2014-11-21 00:30:48 +00:00
Andrew Shu
66c48a1151 gradle: compileSdkVersion 21
fixes broken import statements
2014-11-20 12:18:54 -08:00
Andrew Shu
0ce3e6e8a6 fix compatibility with android gradle plugin 0.14 2014-11-20 12:05:45 -08: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
Oliver Woodman
2798b430ca Delete spurious file. 2014-11-20 12:23:29 +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
ojw28
d71b9b7ca1 Merge pull request #100 from google/dev
dev -> dev-l
2014-10-28 19:30:00 +00:00
ojw28
b6bbf50c0e Merge pull request #99 from google/dev
dev -> dev-hls
2014-10-28 19:29:29 +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
Oliver Woodman
78f34cf480 Add svg source for diagrams. 2014-10-28 18:22:26 +00:00
Oliver Woodman
11cbe2819e Clean up project files. 2014-10-28 17:55:21 +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
Oliver Woodman
be721943c6 Fix incorrect condition. 2014-10-02 12:23:08 +01:00
ojw28
1c92b28b16 Merge pull request #65 from google/dev
Add file missing from "Improve subtitle handling" change.
2014-10-01 22:17:32 +01:00
ojw28
7794df7bd8 Merge pull request #64 from google/dev
Add file missing from "Improve subtitle handling" change.
2014-10-01 22:17:11 +01:00
Oliver Woodman
dec40bcbd3 Add file missing from "Improve subtitle handling" change. 2014-10-01 22:14:44 +01:00
ojw28
f4d3079bba Merge pull request #63 from google/dev
Update dev-l
2014-10-01 22:10:16 +01:00
ojw28
422f23aceb Merge pull request #62 from google/dev
Update dev-hls
2014-10-01 22:09:48 +01:00
Andrey Udovenko
d64036c5ed Add basic HLS support (VOD and Live) with EXT-X-DISCONTINUITY. 2014-10-01 17:03:07 -04:00
ojw28
8c665e3dd2 Improve subtitle handling.
- Move parsing onto a background thread. This is analogous
  to how frame decoding is pushed to MediaCodec, and should
  prevent possible jank when new subtitle samples are parsed.
  This is more important for out-of-band subtitles, which can
  take a second or two to parse fully.

- Add Useful DataSpec method.
2014-10-01 21:27:25 +01:00
ojw28
ea1ab674a4 Strip trailing newline from WebVTT subtitles. 2014-10-01 21:26:12 +01:00
ojw28
9fc963acc6 Add missing param documentation. 2014-10-01 21:25:02 +01:00
ojw28
8ea3f9805c Add class to enable loading of out-of-band subtitle files. 2014-10-01 21:23:50 +01:00
ojw28
e99aaa4d67 Update CaptionStyleCompat for L. 2014-09-29 16:59:08 +01:00
ojw28
9cfe5fcf44 API level 21 enhancements for ExoPlayer playbacks.
- Use native frame release timing in video renderer for
  smoother video playback.
- Avoid unnecessary memory copy steps in audio renderer.
- Use non-blocking AudioTrack API.
2014-09-25 20:29:44 +01:00
ojw28
dd30632aa1 SmoothStreaming Live support.
Issue: #12
2014-09-25 20:16:30 +01:00
ojw28
4adf8f77f4 Tweak stop/disable cycles. 2014-09-25 20:13:40 +01:00
Oliver Woodman
fc230733ae Ignore blockingSendMessage calls after release.
Previously we'd end up blocking forever in this case, which
is the worst thing we could do :). We could either throw an
exception or just print a warning. Printing a warning is more
in line with what other methods do (Handler prints a "sending
message to dead thread" warning).
2014-09-23 11:21:44 +01:00
Oliver Woodman
da125bb5cc Merge DashLiveMpdFetcher logic into generic ManifestFetcher.
This allows ManifestFetcher to both execute the initial
manifest load and be plugged into an ExoPlayer ChunkSource,
where it can be used for repeated manfiest refreshes during
live playback.
2014-09-23 11:17:36 +01:00
Oliver Woodman
f82a331728 Fix StreamingDrmSessionmanager.
Use locally bound variable instead of class variable.
2014-09-23 11:14:16 +01:00
Oliver Woodman
1ed048dba8 Clean up TTML timestamp parsing. 2014-09-23 11:13:54 +01:00
Oliver Woodman
7cb55e23f6 Correctly handle zero length fragmentRun. 2014-09-23 11:13:31 +01:00
Oliver Woodman
4fdd68facf Fix SmoothStreamingManifest to handle large timestamps. 2014-09-23 11:13:09 +01:00
Oliver Woodman
c4e1c3543c Enhance Loader API. 2014-09-19 18:36:12 +01:00
Oliver Woodman
ce5eea72d2 Auto-infer character encoding. 2014-09-19 18:34:46 +01:00
Oliver Woodman
4344675098 Add WebVTT parser. 2014-09-19 18:34:05 +01:00
Oliver Woodman
525b309764 SmoothStreaming - Parse last chunk duration. 2014-09-19 18:33:23 +01:00
Oliver Woodman
f52742b100 Ensure that we try and call release on a renderer
Do this even if stop/disable fails.
2014-09-19 18:32:21 +01:00
Oliver Woodman
4e96caa623 Resolve reference Uris correctly.
Ignore the path of the base Uri if the reference starts with "/".
Spec - http://tools.ietf.org/html/rfc3986#section-5.2.2
2014-09-19 18:31:17 +01:00
Oliver Woodman
bf95592b2c Remove unused import. Tweak documentation. 2014-09-19 18:30:21 +01:00
Oliver Woodman
8378019839 Fix SmoothStreaming where audio FourCC is missing. 2014-09-19 18:29:34 +01:00
Oliver Woodman
b2fc944af1 Remove getLoadedData API from ExoPlayer components.
This API wasn't particularly nice. Best to remove it whilst
hopefully no-one is using it. Leaving the ReadHead abstraction
in place, since it might well prove useful in the future.
2014-09-19 18:26:04 +01:00
Oliver Woodman
c19faa63cd A few tiny bug fixes. 2014-09-11 18:03:11 +01:00
Oliver Woodman
ec90eac301 Support anamorphic video content. 2014-09-11 16:34:35 +01:00
Oliver Woodman
6c3ae7f175 Add SubtitleView and CaptionStyleCompat to ExoPlayer. 2014-09-11 16:30:39 +01:00
Oliver Woodman
e4b35e884a Transition ExoPlayer to use longs for ms timestamps. 2014-09-11 16:26:43 +01:00
Oliver Woodman
d85f4abb2b Support negative media timestamps (if people *really* want to send us them!). 2014-09-11 16:23:50 +01:00
Oliver Woodman
6b2b6ca479 Prevent device provisioning when another device provisioning request is already under process. 2014-09-11 16:23:13 +01:00
Oliver Woodman
bc01a4f48d Relax MediaCodecVideoTrackRenderer.canReconfigureCodec().
Allow non-H264 adaptive decoders.
2014-09-11 16:22:40 +01:00
Oliver Woodman
bf5ee6ff23 1. Parse live attributes from SmoothStreaming manifest.
2. Common interface for manifest parsers.
- This effectively moves the common interface from the Fetcher level
  (i.e. ManifestFetcher) to the Parser level (i.e. ManifestParser).
- The motivation here is to allow the implementation of components that
  can work with a generic ManifestParser implementation.
2014-09-11 16:22:01 +01:00
Oliver Woodman
d4e35358a1 Fix bad assertion. It doesn't hold for TTML subtitle chunks. 2014-09-11 16:09:52 +01:00
Oliver Woodman
6e9ba9ba47 Bump version to 1.0.13. 2014-09-08 11:38:20 +01:00
Oliver Woodman
ddd2d004f0 Make SmoothStreaming manifest more robust.
- Skips unrecognized elements rather than crashing.
- FourCC treated as required for video and optional elsewhere,
  as per the SmoothStreaming spec.
- Only parse initData text when we're actually in the ProtectionHeader element
2014-09-08 11:35:39 +01:00
Oliver Woodman
181eceaf4b Fixed MPD date/time parsing issue. 2014-09-08 11:34:06 +01:00
Oliver Woodman
52a300f1fd Merge fMP4/H264 and WebM/VP9 DASH implementations. 2014-09-08 11:33:12 +01:00
Oliver Woodman
1ddd5c6e16 Parse some DASH manifest components for DVB LIVE. 2014-09-08 11:30:21 +01:00
Oliver Woodman
5d35698d8f Make MediaCodecTrackRenderer discard non-keyframes after seek.
This means that after a decoder flush, the renderer will avoid
feeding non-keyframes into the decoder until it has received and
fed the first keyframe. The decoder has no way of correctly
decoding non-keyframes that arrive before a keyframe.
2014-09-08 11:30:20 +01:00
Oliver Woodman
5b2f0566a7 Fix potential cause of infinite-spinner-without-failure.
It looks like for the case of self-contained media segments,
it's possible to get stuck without failure in the case that
the load fails having loaded less than the length of the init
data.
2014-09-08 11:30:19 +01:00
Oliver Woodman
92e3208121 Don't try and read a trackEncryptionBox unless we actually have a saiz atom to parse.
Issue: #35
2014-09-08 11:30:18 +01:00
Oliver Woodman
14048b013a Add disclaimer to stop people getting confused by the minSdkVersion.
Issue: #31
2014-09-08 11:30:17 +01:00
Oliver Woodman
d465ab7029 Call FormatHolder what it really is.
Since we have a Format class as well, it's very confusing that
FormatHolder actually holds a MediaFormat. I think it's quite
likely that Format will need promoting into the root package as
part of the HLS work, which will make this even more confusing
(although it is possible that for HLS we'll define yet another
Format class, if it turns out we need significantly different
fields).

Note - I deliberately avoided renaming the formatHolder
args/params, because they're not particularly ambiguous and
because it introduces some ugly line breaks.
2014-09-08 11:30:16 +01:00
Oliver Woodman
3b25928a13 Make audio renderer more robust to bad getTimestamp values. 2014-09-08 11:30:15 +01:00
Oliver Woodman
a7b88cd6a9 Tighten isReady() up again.
- Bring back requirement for the first video frame to be rendered
  before isReady returns true, *unless* we've deduced that the
  upstream source is serving multiple renderers.
- Ditto for requiring that the audio track has some buffered data.
2014-09-08 11:30:14 +01:00
Oliver Woodman
98a7573812 Minor changes to fix Javadoc.
- cache ref didn't work because it referred to a private variable
  (which isn't documented) from a public interface definition
  (which is). Meaning the Javadoc generator was trying to link
  to documentation that didn't exist.
2014-09-08 11:30:12 +01:00
Oliver Woodman
5b9c92cb83 Bump version to 1.0.12. 2014-08-14 15:45:33 +01:00
Oliver Woodman
4e7b333aee Support chunked requests. 2014-08-14 15:44:09 +01:00
Oliver Woodman
af6e144adc Fix bug introduced supporting self-contained media chunks.
The equals check we perform needs to ignore the max dimensions.
This tended to work in practice because formats would be the
same object, but in the case where different format objects
are used, things can break.
2014-08-12 21:35:13 +01:00
Oliver Woodman
5cfa9adacc Add missing C file. 2014-08-12 14:16:28 +01:00
Oliver Woodman
58e9e61688 Remove unnecessary SuppressWarning annotations. 2014-08-12 14:13:43 +01:00
Oliver Woodman
e0a29c841e Don't release AudioTrack unless we have to. 2014-08-12 14:12:05 +01:00
Oliver Woodman
4a745b1cd8 Optimize out quite a few allocations in FragmentedMp4Parser. 2014-08-12 13:55:38 +01:00
Oliver Woodman
005e98fc34 Simplify parsing of encryption data + support SENC boxes.
Issue: #4
2014-08-11 19:42:04 +01:00
Oliver Woodman
8ec8840261 Minor cleanup.
- Add constants class. Currently housing a single lonely variable,
which is used generally throughout the library, and so no longer
nicely fits into a specific class.

- Rename a few other constants to add clear units.

- Made minor tweak to ExoPlayer documentation.
2014-08-11 18:38:39 +01:00
Oliver Woodman
25a532656c Optimize some CodecCounter inefficiency.
1. Use ints rather than longs.
2. Remove some counters that dont seem hugely useful.
3. Replace use of volatile with explicit method calls that
   cause a memory barrier. This is a lot more efficient than
   using volatile because it can be invoked only once per
   doSomeWork.
2014-08-11 17:42:08 +01:00
Oliver Woodman
9a124120ff Changes around renderer readiness and extraction.
- Make MediaCodecTrackRenderer.isReady more permissive.
  This largely fixes #21
- Bring WebmExtractor closer to FragmentedMp4Extractor.
  The two will probably be placed under a common interface
  fairly soon, which will allow significant code
  deduplication.
2014-08-01 15:56:26 +01:00
Oliver Woodman
41ff1e4071 Add CacheDataSource.Listener. 2014-08-01 15:54:32 +01:00
Oliver Woodman
b1992c3848 Don't call doSomeWork if we're preparing 2014-08-01 15:53:49 +01:00
Oliver Woodman
2a82ff353b Make DefaultWebmExtractor handle cues and format independently.
* Remove concept of being prepared by simply reporting if format
and/or cues are known.
* Allow replacement of format and/or cues later in the stream.
* Initialization and index segments can be parsed independently
of one another but must be in order due to internal WebM dependencies.
* Let seekTo() work even when cues are unknown.
2014-08-01 15:53:08 +01:00
Oliver Woodman
32464e6de4 Fix integer variant of library version. 2014-08-01 15:51:48 +01:00
Oliver Woodman
ad26085e5c Finish painful bytes/sec -> bits/sec conversion. 2014-08-01 15:51:21 +01:00
Oliver Woodman
ef6be7957d Merge branch 'dev' of https://github.com/google/ExoPlayer into dev 2014-07-28 14:31:20 +01:00
Oliver Woodman
b3277c666b Add language to Format (+other misc fix). 2014-07-28 14:29:21 +01:00
Kentaro Takiguchi
fa83b2fa5e Add jarRelease task 2014-07-18 23:00:44 +09:00
Oliver Woodman
bb5cfd52c5 Add missing files. 2014-07-18 14:55:24 +01:00
Oliver Woodman
edb5446440 Bump version to 1.0.11. 2014-07-18 14:31:55 +01:00
Oliver Woodman
62d17cabf0 Add support for SegmentTemplate and SegmentList mpds.
Misc Notes:
- Removed content type filters because some of third parties
  don't set content type.
2014-07-18 14:30:30 +01:00
Oliver Woodman
87461821fe Define DashSegmentIndex wrapper.
This paves the way for SegmentTemplate and SegmentList based
mpds, which will implement DashSegmentIndex directly rather than
parsing an index from the media stream.

- Define DashSegmentIndex.
- Make use of DashSegmentIndex in chunk sources.
- Define an implementation of DashSegmentIndex that wraps a SegmentIndex.
- Add method that will allow Representations to return a DashSegmentIndex
  directly in the future.
- Add support for non-contiguous index and initialization data in media streams.
  For the Webm case this isn't enabled yet due to extractor limitations.
- Removed ability to fetch multiple chunks. This functionality does not extend
  properly to SegmentList and SegmentTemplate variants of DASH.
2014-07-17 11:28:05 +01:00
Oliver Woodman
d7d14037b8 Add utility classes for SegmentTemplate/SegmentList refactor.
A step towards supporting SegmentTemplate style MPDs.
2014-07-15 18:32:37 +01:00
Oliver Woodman
058333565d Use bits/sec instead of bytes/sec for format bandwidth.
Why: This was a bad initial choice. Manifests typically define bandwidth in
bits/sec. If you divide by 8 then you're throwing away information due to
rounding. Unfortunately it turns out that SegmentTemplate based manifests
require you to be able to recall the bitrate exactly (because it's substituted
in during segment URL construction).

Medium term: We should consider converting all our bandwidth estimation
over to bits/sec as well.

Note1: Also changed Period id to be a string, to match the mpd spec.
Note2: Made small optimization in FormatEvaluator to not consider discarding
the first chunk (durationBeforeThisSegmentUs will always be negative, and even
in the error case where it's not, removing the first thunk should be an error).
2014-07-15 13:55:59 +01:00
Oliver Woodman
4366afc273 Support self-contained media chunks.
- Support parsing of moov atoms contained within each chunk.
- Also do a small cleanup to WebM parser.
2014-07-15 12:47:08 +01:00
Oliver Woodman
16fe6a809e More flexible mimeType handling in mpd parser.
- Allow the content type of an adaptation set to be inferred
from the mimeTypes of the contained representations.
- Ensure the contained mimeTypes are consistent with one
another, and with the adaptation set.

Ref: Issue #2
2014-07-10 12:01:12 +01:00
Oliver Woodman
686ac2a6f5 Refactor WebM extractor. 2014-07-09 23:20:23 +01:00
Oliver Woodman
9e16dec2f8 Add support for relative baseUrls in DASH manifests.
Ref: Issue #2
2014-07-09 23:15:58 +01:00
Oliver Woodman
1b957268a6 Add utility methods for inexact ceil/floor binary searches.
This change also fixes issue #5
2014-07-09 15:34:42 +01:00
Oliver Woodman
f1213a7656 Fix NaN comparison error. 2014-07-07 17:06:01 +01:00
Oliver Woodman
43b7efa986 Widen support for fMP4 streams.
- Add support for parsing avc3 boxes.
- Make workaround for signed sample offsets in trun files always enabled.
- Generalize remaining workaround into a flag, to make it easy to add additional workarounds going forward without changing the API.
- Fix DataSourceStream bug where read wouldn't return -1 having fully read segment whose spec length was unbounded.
2014-07-07 15:55:01 +01:00
Oliver Woodman
e4ae7e08db Small javadoc tweak. 2014-07-04 01:10:52 +01:00
Oliver Woodman
47c0bbd6b5 Propagate erors to ChunkSource implementations.
This can help custom ChunkSource implementations to act on
this information. For example an adaptive implementation may
choose to blacklist a problematic format if loads of that
format keep failing.
2014-07-04 01:06:20 +01:00
Oliver Woodman
4fd4c89518 Refactored ExoPlayer to use String-based format ids. 2014-07-04 01:04:10 +01:00
Oliver Woodman
563b434de2 Keep audio time in sync with arbitrary decodeOnly samples.
AudioTrack time will go out of sync if the decodeOnly flag
is set of arbitrary samples (as opposed to just those following
a seek). It's a pretty obscure case and it would be weird for
anyone to do it, but we should be robust against it anyway.
2014-07-04 00:52:19 +01:00
Oliver Woodman
50b276fe31 Fixed issue in which MediaChunk.seekToStart might not actually seek to the start of the segment. 2014-07-04 00:47:44 +01:00
Oliver Woodman
8cad387393 Fix ChunkSource disable definition. 2014-07-04 00:45:09 +01:00
Oliver Woodman
ea796f916c Enhance Cache/SimpleCache.
1. Fix SimpleCache startReadWrite asymmetry. Allow more concurrency.

- startReadWrite does not have the concept of a read lock. Once
  a cached span is returned, the caller can do whatever it likes
  for as long as it wants to. This allows a read to be performed
  in parallel with a write that starts after it.
- If there's an ongoing write, startReadWrite will block even if
  the return operation will be a read. So there's a weird asymmetry
  where reads can happen in parallel with writes, but only if the
  reads were started first.
- This CL removes the asymmetry, by allowing a read to start even
  if the write lock is held.
- Note that the reader needs to be prepared for the thing it's
  reading to disappear, but this was already the case, and will
  always be the case since the reader will need to handle disk
  read failures anyway.

2. Add isCached method.
2014-07-04 00:29:18 +01:00
Oliver Woodman
27ab5c83a6 Initial drop. 1.0.10. 2014-06-16 12:56:04 +01:00