Skip to content

Commit

Permalink
Update muxjs to use new keepOriginalTimestamps option
Browse files Browse the repository at this point in the history
Depended on issue videojs/mux.js#168

Issue #1194

Change-Id: Ia2ad5c17ad82a2c53215d34fbfec7be1d119df95
  • Loading branch information
joeyparrish committed Jan 18, 2018
1 parent 87c19da commit e298fb6
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 34 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ HLS features supported:
- VOD, Live, and Event types
- Encrypted content with Widevine
- ISO-BMFF / MP4 / CMAF support
- MPEG-2 TS support (transmuxing provided by [mux.js][], must be separately included)
- MPEG-2 TS support (transmuxing provided by [mux.js][] v4.4+, must be separately included)
- WebVTT and TTML

HLS features **not** supported:
Expand Down Expand Up @@ -134,7 +134,7 @@ Shaka Player supports:
- Can parse [cueing data][] elements for DASH's SegmentBase@indexRange and SegmentTemplate@index
- Not supported in HLS
- MPEG-2 TS
- With help from [mux.js][], can be played on any browser which supports MP4
- With help from [mux.js][] v4.4+, can be played on any browser which supports MP4
- Can find and parse timestamps to find segment start time in HLS
- WebVTT
- Supported in both text form and embedded in MP4
Expand Down
7 changes: 4 additions & 3 deletions docs/tutorials/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,10 @@ The only browsers capable of playing TS natively are Edge and Chromecast. You
will get a `CONTENT_UNSUPPORTED_BY_BROWSER` error on other browsers due to
their lack of TS support.

You can enable transmuxing by [including mux.js][] in your application. If
Shaka Player detects that mux.js has been loaded, we will use it to transmux TS
content into MP4 on-the-fly, so that the content can be played by the browser.
You can enable transmuxing by [including mux.js][] v4.4+ in your application.
If Shaka Player detects that mux.js has been loaded, we will use it to transmux
TS content into MP4 on-the-fly, so that the content can be played by the
browser.

<hr>

Expand Down
3 changes: 2 additions & 1 deletion externs/mux.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@ muxjs.mp4 = {};
/**
* @constructor
* @struct
* @param {Object=} opt_options
*/
muxjs.mp4.Transmuxer = function() {};
muxjs.mp4.Transmuxer = function(opt_options) {};


/**
Expand Down
2 changes: 1 addition & 1 deletion lib/media/media_source_engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ shaka.media.MediaSourceEngine.prototype.appendBuffer =
if (contentType == ContentType.TEXT) {
return this.textEngine_.appendBuffer(data, startTime, endTime);
} else if (this.transmuxers_[contentType]) {
return this.transmuxers_[contentType].transmux(data, startTime).then(
return this.transmuxers_[contentType].transmux(data).then(
function(transmuxedData) {
return this.enqueueOperation_(contentType,
this.append_.bind(this, contentType, transmuxedData.buffer));
Expand Down
24 changes: 4 additions & 20 deletions lib/media/transmuxer.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ goog.require('shaka.util.Uint8ArrayUtils');
*/
shaka.media.Transmuxer = function() {
/** @private {muxjs.mp4.Transmuxer} */
this.muxTransmuxer_ = new muxjs.mp4.Transmuxer();
this.muxTransmuxer_ = new muxjs.mp4.Transmuxer({
'keepOriginalTimestamps': true
});

/** @private {shaka.util.PublicPromise} */
this.transmuxPromise_ = null;
Expand All @@ -46,9 +48,6 @@ shaka.media.Transmuxer = function() {
/** @private {boolean} */
this.isTransmuxing_ = false;

/** @private {boolean} */
this.baseDecodeTimeSet_ = false;

this.muxTransmuxer_.on('data', this.onTransmuxed_.bind(this));

this.muxTransmuxer_.on('done', this.onTransmuxDone_.bind(this));
Expand Down Expand Up @@ -139,23 +138,15 @@ shaka.media.Transmuxer.convertTsCodecs = function(contentType, tsMimeType) {
/**
* Transmux from Transport stream to MP4, using mux.js library.
* @param {!ArrayBuffer} data
* @param {?number} startTime
* @return {!Promise.<!Uint8Array>}
*/
shaka.media.Transmuxer.prototype.transmux = function(data, startTime) {
shaka.media.Transmuxer.prototype.transmux = function(data) {
goog.asserts.assert(!this.isTransmuxing_,
'No transmuxing should be in progress.');
this.isTransmuxing_ = true;
this.transmuxPromise_ = new shaka.util.PublicPromise();
this.transmuxedData_ = [];

// TODO: remove this once videojs/mux.js#168 is solved
if (startTime != null && !this.baseDecodeTimeSet_) {
var timescale = shaka.media.Transmuxer.TS_TIMESCALE_;
this.muxTransmuxer_.setBaseMediaDecodeTime(startTime * timescale);
this.baseDecodeTimeSet_ = true;
}

var dataArray = new Uint8Array(data);
this.muxTransmuxer_.push(dataArray);
this.muxTransmuxer_.flush();
Expand Down Expand Up @@ -191,10 +182,3 @@ shaka.media.Transmuxer.prototype.onTransmuxDone_ = function() {
this.transmuxPromise_.resolve(output);
this.isTransmuxing_ = false;
};


/**
* @const {number}
* @private
*/
shaka.media.Transmuxer.TS_TIMESCALE_ = 90000;
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"karma-source-map-support": "^1.2.0",
"karma-spec-reporter": "~0.0.31",
"karma-webdriver-launcher": "~1.0.5",
"mux.js": "~4.2.1",
"mux.js": "~4.4.0",
"requirejs": "~2.3.3",
"rimraf": "~2.6.1",
"sprintf-js": "~1.0.3",
Expand Down
12 changes: 6 additions & 6 deletions test/media/transmuxer_integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ describe('Transmuxer', function() {
describe('transmuxing', function() {
it('transmux video from TS to MP4', function(done) {
var sawMDAT = false;
transmuxer.transmux(videoSegment, 0).then(function(transmuxedData) {
transmuxer.transmux(videoSegment).then(function(transmuxedData) {
expect(transmuxedData instanceof Uint8Array).toBe(true);
expect(transmuxedData.length).toBeGreaterThan(0);
new shaka.util.Mp4Parser()
Expand All @@ -115,7 +115,7 @@ describe('Transmuxer', function() {

it('transmux audio from TS to MP4', function(done) {
var sawMDAT = false;
transmuxer.transmux(audioSegment, 0).then(function(transmuxedData) {
transmuxer.transmux(audioSegment).then(function(transmuxedData) {
expect(transmuxedData instanceof Uint8Array).toBe(true);
expect(transmuxedData.length).toBeGreaterThan(0);
new shaka.util.Mp4Parser()
Expand All @@ -130,7 +130,7 @@ describe('Transmuxer', function() {

it('transmux empty video from TS to MP4', function(done) {
var sawMDAT = false;
transmuxer.transmux(emptySegment, 0).then(function(transmuxedData) {
transmuxer.transmux(emptySegment).then(function(transmuxedData) {
expect(transmuxedData instanceof Uint8Array).toBe(true);
expect(transmuxedData.length).toBeGreaterThan(0);
new shaka.util.Mp4Parser()
Expand All @@ -142,12 +142,12 @@ describe('Transmuxer', function() {
}).catch(fail).then(done);
});

it('offsets output timestamps', function(done) {
it('passes through true timestamps', function(done) {
var parsed = false;
var expectedMp4Timestamp = 123 * 90000; // timescale units
var expectedMp4Timestamp = 5166000; // in timescale units
var mp4Timestamp;

transmuxer.transmux(videoSegment, 123).then(function(transmuxedData) {
transmuxer.transmux(videoSegment).then(function(transmuxedData) {
var Mp4Parser = shaka.util.Mp4Parser;

new Mp4Parser()
Expand Down

0 comments on commit e298fb6

Please sign in to comment.