Skip to content

Commit f76fdf8

Browse files
aveladjoeyparrish
authored andcommitted
fix: Prefer Dolby Vision p5 over Dolby Vision p8 (#7745)
1 parent b0c8b05 commit f76fdf8

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

lib/util/mime_utils.js

+3
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ shaka.util.MimeUtils = class {
179179
return 'vvc'; // H266
180180
case base === 'dvh1':
181181
case base === 'dvhe':
182+
if (profile && profile.startsWith('05')) {
183+
return 'dovi-p5'; // Dolby Vision profile 5
184+
}
182185
return 'dovi-hevc'; // Dolby Vision based in HEVC
183186
case base === 'dvav':
184187
case base === 'dva1':

lib/util/stream_utils.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,10 @@ shaka.util.StreamUtils = class {
146146
'vp09': 0.9,
147147
'hevc': 0.85,
148148
'dovi-hevc': 0.8,
149-
'av01': 0.75,
150-
'dovi-av1': 0.7,
151-
'vvc': 0.65,
149+
'dovi-p5': 0.75,
150+
'av01': 0.7,
151+
'dovi-av1': 0.65,
152+
'vvc': 0.6,
152153
};
153154

154155
const videoStreams = Array.from(videoStreamsSet)

test/util/mime_utils_unit.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,11 @@ describe('MimeUtils', () => {
5454
expect(getNormalizedCodec('vvc1')).toBe('vvc');
5555
expect(getNormalizedCodec('vvi1')).toBe('vvc');
5656

57-
expect(getNormalizedCodec('dvh1.05')).toBe('dovi-hevc');
58-
expect(getNormalizedCodec('dvhe.05')).toBe('dovi-hevc');
57+
expect(getNormalizedCodec('dvh1.05')).toBe('dovi-p5');
58+
expect(getNormalizedCodec('dvhe.05')).toBe('dovi-p5');
59+
60+
expect(getNormalizedCodec('dvh1.08')).toBe('dovi-hevc');
61+
expect(getNormalizedCodec('dvhe.08')).toBe('dovi-hevc');
5962

6063
expect(getNormalizedCodec('dva1.05')).toBe('dovi-avc');
6164
expect(getNormalizedCodec('dvav.05')).toBe('dovi-avc');

test/util/stream_utils_unit.js

+39
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,45 @@ describe('StreamUtils', () => {
10841084
expect(manifest.variants[0].video.codecs).toBe('dav1.10.01');
10851085
});
10861086

1087+
it('prefer Dolby Vision p5 over Dolby Vision p8', async () => {
1088+
// Dolby Vision profile 5 has a proprietary color space that produces a
1089+
// better image than Dolby Vision profile 8 which must be backward
1090+
// compatible with HEVC.
1091+
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
1092+
manifest.addVariant(1, (variant) => {
1093+
variant.addVideo(2, (stream) => {
1094+
stream.bandwidth = 4000000;
1095+
stream.size(1920, 1080);
1096+
stream.mime('video/mp4', 'dvh1.08.06');
1097+
});
1098+
});
1099+
manifest.addVariant(2, (variant) => {
1100+
variant.addVideo(3, (stream) => {
1101+
stream.bandwidth = 4000000;
1102+
stream.size(1920, 1080);
1103+
stream.mime('video/mp4', 'dvh1.05.06');
1104+
});
1105+
});
1106+
});
1107+
navigator.mediaCapabilities.decodingInfo =
1108+
shaka.test.Util.spyFunc(decodingInfoSpy);
1109+
decodingInfoSpy.and.callFake((config) => {
1110+
return Promise.resolve({supported: true, smooth: true});
1111+
});
1112+
1113+
await StreamUtils.getDecodingInfosForVariants(manifest.variants,
1114+
/* usePersistentLicenses= */false, /* srcEquals= */ false,
1115+
/* preferredKeySystems= */ []);
1116+
1117+
shaka.util.StreamUtils.chooseCodecsAndFilterManifest(manifest,
1118+
/* preferredVideoCodecs= */[],
1119+
/* preferredAudioCodecs= */[],
1120+
/* preferredDecodingAttributes= */[],
1121+
/* preferredTextFormats= */ []);
1122+
expect(manifest.variants.length).toBe(1);
1123+
expect(manifest.variants[0].video.codecs).toBe('dvh1.05.06');
1124+
});
1125+
10871126
it('chooses variants by decoding attributes', async () => {
10881127
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
10891128
manifest.addVariant(0, (variant) => {

0 commit comments

Comments
 (0)