Commit graph

340 commits

Author SHA1 Message Date
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
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
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
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
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