[HLS] Fixes attributes for DVS tracks

Always set AUTOSELECT=YES for DVS tracks and also exclude it from
standard AUTOSELECT and DEFAULT configuration logic.

Fixes #857.

Change-Id: Ie179d02390ff09f6e8c0b54892c1d6d32a3c38d6
This commit is contained in:
KongQun Yang 2020-11-04 12:56:05 -08:00
parent 1f21cc78cd
commit 4a777b6207
3 changed files with 66 additions and 4 deletions

View File

@ -366,12 +366,20 @@ void BuildMediaTags(
bool is_default = false; bool is_default = false;
bool is_autoselect = false; bool is_autoselect = false;
const std::string language = playlist->language(); if (playlist->is_dvs()) {
if (languages.find(language) == languages.end()) { // According to HLS Authoring Specification for Apple Devices
is_default = !language.empty() && language == default_language; // https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices#overview
// section 2.13 If you provide DVS, the AUTOSELECT attribute MUST have
// a value of "YES".
is_autoselect = true; is_autoselect = true;
} else {
const std::string language = playlist->language();
if (languages.find(language) == languages.end()) {
is_default = !language.empty() && language == default_language;
is_autoselect = true;
languages.insert(language); languages.insert(language);
}
} }
BuildMediaTag(*playlist, group_id, is_default, is_autoselect, base_url, BuildMediaTag(*playlist, group_id, is_default, is_autoselect, base_url,

View File

@ -523,6 +523,51 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndTextWithCharacteritics) {
ASSERT_EQ(expected, actual); ASSERT_EQ(expected, actual);
} }
TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndDvsAudio) {
// Video, sd.m3u8.
std::unique_ptr<MockMediaPlaylist> video =
CreateVideoPlaylist("sd.m3u8", "sdvideocodec", 300000, 200000);
// DVS Audio, dvs_eng.m3u8.
std::unique_ptr<MockMediaPlaylist> dvs_audio = CreateAudioPlaylist(
"dvs_eng.m3u8", "DVS english", "audiogroup", "audiocodec", "en", 2, 50000,
30000, kEC3JocComplexityZero, !kAC4IMSFlagEnabled, !kAC4CBIFlagEnabled);
dvs_audio->SetCharacteristicsForTesting(
std::vector<std::string>{"public.accessibility.describes-video"});
// Normal Audio, eng.m3u8.
std::unique_ptr<MockMediaPlaylist> audio = CreateAudioPlaylist(
"eng.m3u8", "english", "audiogroup", "audiocodec", "en", 2, 50000, 30000,
kEC3JocComplexityZero, !kAC4IMSFlagEnabled, !kAC4CBIFlagEnabled);
const char kBaseUrl[] = "http://playlists.org/";
EXPECT_TRUE(master_playlist_->WriteMasterPlaylist(
kBaseUrl, test_output_dir_, {video.get(), dvs_audio.get(), audio.get()}));
std::string actual;
ASSERT_TRUE(File::ReadFileToString(master_playlist_path_.c_str(), &actual));
const std::string expected =
"#EXTM3U\n"
"## Generated with https://github.com/google/shaka-packager version "
"test\n"
"\n"
"#EXT-X-MEDIA:TYPE=AUDIO,URI=\"http://playlists.org/dvs_eng.m3u8\","
"GROUP-ID=\"audiogroup\",LANGUAGE=\"en\",NAME=\"DVS english\","
"AUTOSELECT=YES,CHARACTERISTICS=\"public.accessibility.describes-video\","
"CHANNELS=\"2\"\n"
"#EXT-X-MEDIA:TYPE=AUDIO,URI=\"http://playlists.org/eng.m3u8\","
"GROUP-ID=\"audiogroup\",LANGUAGE=\"en\",NAME=\"english\","
"DEFAULT=YES,AUTOSELECT=YES,CHANNELS=\"2\"\n"
"\n"
"#EXT-X-STREAM-INF:BANDWIDTH=350000,AVERAGE-BANDWIDTH=230000,"
"CODECS=\"sdvideocodec,audiocodec\",RESOLUTION=800x600,"
"AUDIO=\"audiogroup\"\n"
"http://playlists.org/sd.m3u8\n";
ASSERT_EQ(expected, actual);
}
TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndTextGroups) { TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndTextGroups) {
// Video, sd.m3u8. // Video, sd.m3u8.
std::unique_ptr<MockMediaPlaylist> video = std::unique_ptr<MockMediaPlaylist> video =

View File

@ -221,6 +221,15 @@ class MediaPlaylist {
return characteristics_; return characteristics_;
} }
bool is_dvs() const {
// HLS Authoring Specification for Apple Devices
// https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices#overview
// Section 2.12.
const char DVS_CHARACTERISTICS[] = "public.accessibility.describes-video";
return characteristics_.size() == 1 &&
characteristics_[0] == DVS_CHARACTERISTICS;
}
private: private:
// Add a SegmentInfoEntry (#EXTINF). // Add a SegmentInfoEntry (#EXTINF).
void AddSegmentInfoEntry(const std::string& segment_file_name, void AddSegmentInfoEntry(const std::string& segment_file_name,