Skip to content

Commit

Permalink
fix(hls): Assume MP4 if MIME type can't be deduced (shaka-project#3325)
Browse files Browse the repository at this point in the history
  • Loading branch information
surajkumar-sk committed Apr 13, 2021
1 parent dc5d033 commit 7714099
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 36 deletions.
9 changes: 4 additions & 5 deletions lib/hls/hls_parser.js
Expand Up @@ -2414,11 +2414,10 @@ shaka.hls.HlsParser = class {
const contentMimeType = response.headers['content-type'];

if (!contentMimeType) {
throw new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.MANIFEST,
shaka.util.Error.Code.HLS_COULD_NOT_GUESS_MIME_TYPE,
extension);
// if the HLS content is lacking in both MIME type metadata and
// segment file extensions we fall back to assuming its MP4.
const fallbackMimeType = map['mp4'];
return fallbackMimeType;
}

// Split the MIME type in case the server sent additional parameters.
Expand Down
6 changes: 1 addition & 5 deletions lib/util/error.js
Expand Up @@ -582,11 +582,7 @@ shaka.util.Error.Code = {
*/
'HLS_MULTIPLE_MEDIA_INIT_SECTIONS_FOUND': 4020,

/**
* HLS parser was unable to guess mime type of a stream.
* <br> error.data[0] is the stream file's extension.
*/
'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021,
// RETIRED: 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021,

/**
* No Master Playlist has been provided. Master playlist provides
Expand Down
64 changes: 38 additions & 26 deletions test/hls/hls_parser_unit.js
Expand Up @@ -1935,6 +1935,44 @@ describe('HlsParser', () => {
await testHlsParser(master, media, manifest);
});

it('falls back to mp4 if HEAD request fails', async () => {
const master = [
'#EXTM3U\n',
'#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1,mp4a",',
'RESOLUTION=960x540,FRAME-RATE=60,VIDEO="vid"\n',
'audio\n',
'#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid",URI="video"',
].join('');

const media = [
'#EXTM3U\n',
'#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
'#EXT-X-PLAYLIST-TYPE:VOD\n',
'#EXTINF:5,\n',
'#EXT-X-BYTERANGE:121090@616\n',
'main.test',
].join('');

const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.anyTimeline();
manifest.addPartialVariant((variant) => {
variant.addPartialStream(ContentType.VIDEO, (stream) => {
stream.mime('video/mp4', 'avc1');
});
variant.addPartialStream(ContentType.AUDIO, (stream) => {
stream.mime('audio/mp4', 'mp4a');
});
});
});

fakeNetEngine.setHeaders(
'test:/main.test', {
'content-type': '',
});

await testHlsParser(master, media, manifest);
});

describe('Errors out', () => {
const Code = shaka.util.Error.Code;

Expand All @@ -1956,32 +1994,6 @@ describe('HlsParser', () => {
.toBeRejectedWith(Util.jasmineError(error));
}

it('if unable to guess mime type', async () => {
const master = [
'#EXTM3U\n',
'#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1,mp4a",',
'RESOLUTION=960x540,FRAME-RATE=60,VIDEO="vid"\n',
'audio\n',
'#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid",URI="video"',
].join('');

const media = [
'#EXTM3U\n',
'#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
'#EXT-X-PLAYLIST-TYPE:VOD\n',
'#EXTINF:5,\n',
'#EXT-X-BYTERANGE:121090@616\n',
'main.exe',
].join('');

const error = new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.MANIFEST,
Code.HLS_COULD_NOT_GUESS_MIME_TYPE, 'exe');

await verifyError(master, media, error);
});

it('if unable to guess codecs', async () => {
const master = [
'#EXTM3U\n',
Expand Down

0 comments on commit 7714099

Please sign in to comment.