Commit graph

50 commits

Author SHA1 Message Date
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
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
28166d8c0d Rename ParsableByteArray.length() to limit(). Add capacity(). 2015-02-13 19:31:01 +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
32f0eb1278 Enhance mp4 parsing. 2015-02-09 17:25:39 +00:00
Oliver Woodman
03ef3d148f Add MP4V mimetype. 2015-02-06 11:32:08 +00: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
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
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
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
ojw28
5d7820542c Merge pull request #189 from google/dev
dev -> dev-hls
2014-12-05 17:58:56 +00:00
Oliver Woodman
6f1832fb66 Support negative-fronted xs:duration values.
Issue: 186
2014-12-05 17:52:30 +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
ojw28
b9f3253924 Merge pull request #176 from google/dev
dev -> dev-hls
2014-11-27 18:18:02 +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
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
87d0be252e Merge pull request #149 from google/dev
dev -> dev-hls
2014-11-19 10:10:53 +00:00
Andrey Udovenko
15d3df6a58 Add EIA-608 (CEA-608) Closed Captioning support for HLS #68 2014-11-18 14:48:40 -05: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
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
ojw28
0005f41fe9 Merge pull request #138 from google/dev
dev -> dev-hls
2014-11-13 16:20:13 +00:00
Oliver Woodman
456d53e178 Minor cleanup. 2014-11-13 16:13:02 +00: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
d3a05c9a44 Add ID3 Timed Metadata support for HLS #67 2014-10-28 13:24:12 -04:00
Oliver Woodman
5f6b197355 Allow direct and indirect buffer replacement.
Also tweak ManifestFetcher.
2014-10-27 10:58:43 +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
4853611803 Remove additional "/" from merged URLs.
Issue: #81
2014-10-20 16:45:56 +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
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
c19faa63cd A few tiny bug fixes. 2014-09-11 18:03:11 +01:00
Oliver Woodman
e4b35e884a Transition ExoPlayer to use longs for ms timestamps. 2014-09-11 16:26:43 +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
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
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
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
27ab5c83a6 Initial drop. 1.0.10. 2014-06-16 12:56:04 +01:00