Add version information to generated HLS manifests
- Also refactor the existing version code. Change-Id: Ib409630c4f87965a37b1d6a1bcec68178a704ce6
This commit is contained in:
parent
db70721e35
commit
f3d35b730c
|
@ -91,8 +91,8 @@ int MpdMain(int argc, char** argv) {
|
||||||
|
|
||||||
ExitStatus status = CheckRequiredFlags();
|
ExitStatus status = CheckRequiredFlags();
|
||||||
if (status != kSuccess) {
|
if (status != kSuccess) {
|
||||||
std::string version_string =
|
const std::string version_string = base::StringPrintf(
|
||||||
base::StringPrintf("mpd_generator version %s", kPackagerVersion);
|
"mpd_generator version %s", GetPackagerVersion().c_str());
|
||||||
google::ShowUsageWithFlags(version_string.c_str());
|
google::ShowUsageWithFlags(version_string.c_str());
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,15 @@ DEFINE_bool(use_fake_clock_for_muxer,
|
||||||
"Set to true to use a fake clock for muxer. With this flag set, "
|
"Set to true to use a fake clock for muxer. With this flag set, "
|
||||||
"creation time and modification time in outputs are set to 0. "
|
"creation time and modification time in outputs are set to 0. "
|
||||||
"Should only be used for testing.");
|
"Should only be used for testing.");
|
||||||
|
DEFINE_bool(override_version,
|
||||||
|
false,
|
||||||
|
"Override packager version in the generated outputs with "
|
||||||
|
"--test_version if it is set to true. Should be used for "
|
||||||
|
"testing only.");
|
||||||
|
DEFINE_string(test_version,
|
||||||
|
"",
|
||||||
|
"Packager version for testing. Ignored if --override_version is "
|
||||||
|
"false. Should be used for testing only.");
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -517,8 +526,8 @@ int PackagerMain(int argc, char** argv) {
|
||||||
google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
|
google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
|
||||||
google::ParseCommandLineFlags(&argc, &argv, true);
|
google::ParseCommandLineFlags(&argc, &argv, true);
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
std::string version_string =
|
const std::string version_string = base::StringPrintf(
|
||||||
base::StringPrintf("shaka-packager version %s", kPackagerVersion);
|
"shaka-packager version %s", GetPackagerVersion().c_str());
|
||||||
google::ShowUsageWithFlags(version_string.c_str());
|
google::ShowUsageWithFlags(version_string.c_str());
|
||||||
return kSuccess;
|
return kSuccess;
|
||||||
}
|
}
|
||||||
|
@ -526,6 +535,9 @@ int PackagerMain(int argc, char** argv) {
|
||||||
if (!ValidateWidevineCryptoFlags() || !ValidateFixedCryptoFlags())
|
if (!ValidateWidevineCryptoFlags() || !ValidateFixedCryptoFlags())
|
||||||
return kArgumentValidationFailed;
|
return kArgumentValidationFailed;
|
||||||
|
|
||||||
|
if (FLAGS_override_version)
|
||||||
|
SetPackagerVersionForTesting(FLAGS_test_version);
|
||||||
|
|
||||||
LibcryptoThreading libcrypto_threading;
|
LibcryptoThreading libcrypto_threading;
|
||||||
// TODO(tinskip): Make InsertStreamDescriptor a member of
|
// TODO(tinskip): Make InsertStreamDescriptor a member of
|
||||||
// StreamDescriptorList.
|
// StreamDescriptorList.
|
||||||
|
|
|
@ -26,16 +26,6 @@
|
||||||
#include "packager/mpd/base/mpd_builder.h"
|
#include "packager/mpd/base/mpd_builder.h"
|
||||||
|
|
||||||
DEFINE_bool(dump_stream_info, false, "Dump demuxed stream info.");
|
DEFINE_bool(dump_stream_info, false, "Dump demuxed stream info.");
|
||||||
DEFINE_bool(override_version_string,
|
|
||||||
false,
|
|
||||||
"Override packager version string in the generated outputs with "
|
|
||||||
"--test_version_string if it is set to true. Should be used for "
|
|
||||||
"testing only.");
|
|
||||||
DEFINE_string(test_version_string,
|
|
||||||
"",
|
|
||||||
"Packager version string for testing. Ignored if "
|
|
||||||
"--override_version_string is false. Should be used for testing "
|
|
||||||
"only.");
|
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -159,8 +149,6 @@ bool GetMuxerOptions(MuxerOptions* muxer_options) {
|
||||||
muxer_options->fragment_sap_aligned = FLAGS_fragment_sap_aligned;
|
muxer_options->fragment_sap_aligned = FLAGS_fragment_sap_aligned;
|
||||||
muxer_options->num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
|
muxer_options->num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
|
||||||
muxer_options->temp_dir = FLAGS_temp_dir;
|
muxer_options->temp_dir = FLAGS_temp_dir;
|
||||||
if (FLAGS_override_version_string)
|
|
||||||
muxer_options->packager_version_string = FLAGS_test_version_string;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,8 +161,6 @@ bool GetMpdOptions(MpdOptions* mpd_options) {
|
||||||
mpd_options->time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
|
mpd_options->time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
|
||||||
mpd_options->suggested_presentation_delay =
|
mpd_options->suggested_presentation_delay =
|
||||||
FLAGS_suggested_presentation_delay;
|
FLAGS_suggested_presentation_delay;
|
||||||
if (FLAGS_override_version_string)
|
|
||||||
mpd_options->packager_version_string = FLAGS_test_version_string;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -504,8 +504,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
flags.append('--use_fake_clock_for_muxer')
|
flags.append('--use_fake_clock_for_muxer')
|
||||||
|
|
||||||
# Override packager version string for testing.
|
# Override packager version string for testing.
|
||||||
flags += ['--override_version_string', '--test_version_string',
|
flags += ['--override_version', '--test_version', '<tag>-<hash>-<test>']
|
||||||
'<tag>-<hash>-<test>']
|
|
||||||
return flags
|
return flags
|
||||||
|
|
||||||
def _CompareWithGold(self, test_output, golden_file_name):
|
def _CompareWithGold(self, test_output, golden_file_name):
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
#EXT-X-VERSION:5
|
#EXT-X-VERSION:5
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-TARGETDURATION:2
|
#EXT-X-TARGETDURATION:2
|
||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXTINF:1.021,
|
#EXTINF:1.021,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
#EXT-X-VERSION:5
|
#EXT-X-VERSION:5
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-TARGETDURATION:2
|
#EXT-X-TARGETDURATION:2
|
||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXTINF:1.021,
|
#EXTINF:1.021,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="stream_0",URI="audio.m3u8"
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="stream_0",URI="audio.m3u8"
|
||||||
#EXT-X-STREAM-INF:AUDIO="audio",CODECS="avc1.64001e,mp4a.40.2",BANDWIDTH=1217603
|
#EXT-X-STREAM-INF:AUDIO="audio",CODECS="avc1.64001e,mp4a.40.2",BANDWIDTH=1217603
|
||||||
video.m3u8
|
video.m3u8
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="stream_0",URI="audio.m3u8"
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="stream_0",URI="audio.m3u8"
|
||||||
#EXT-X-STREAM-INF:AUDIO="audio",CODECS="avc1.64001e,mp4a.40.2",BANDWIDTH=1217603
|
#EXT-X-STREAM-INF:AUDIO="audio",CODECS="avc1.64001e,mp4a.40.2",BANDWIDTH=1217603
|
||||||
video.m3u8
|
video.m3u8
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
#EXT-X-VERSION:5
|
#EXT-X-VERSION:5
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-TARGETDURATION:2
|
#EXT-X-TARGETDURATION:2
|
||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXTINF:1.001,
|
#EXTINF:1.001,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
#EXT-X-VERSION:5
|
#EXT-X-VERSION:5
|
||||||
|
## Generated with https://github.com/google/shaka-packager version <tag>-<hash>-<test>
|
||||||
#EXT-X-TARGETDURATION:2
|
#EXT-X-TARGETDURATION:2
|
||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXTINF:1.001,
|
#EXTINF:1.001,
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "packager/hls/base/media_playlist.h"
|
#include "packager/hls/base/media_playlist.h"
|
||||||
#include "packager/media/file/file.h"
|
#include "packager/media/file/file.h"
|
||||||
#include "packager/media/file/file_closer.h"
|
#include "packager/media/file/file_closer.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace hls {
|
namespace hls {
|
||||||
|
@ -147,7 +148,16 @@ bool MasterPlaylist::WriteMasterPlaylist(const std::string& base_url,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string content = "#EXTM3U\n" + audio_output + video_output;
|
const std::string version = GetPackagerVersion();
|
||||||
|
std::string version_line;
|
||||||
|
if (!version.empty()) {
|
||||||
|
version_line =
|
||||||
|
base::StringPrintf("## Generated with %s version %s\n",
|
||||||
|
GetPackagerProjectUrl().c_str(), version.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string content =
|
||||||
|
"#EXTM3U\n" + version_line + audio_output + video_output;
|
||||||
int64_t bytes_written = file->Write(content.data(), content.size());
|
int64_t bytes_written = file->Write(content.data(), content.size());
|
||||||
if (bytes_written < 0) {
|
if (bytes_written < 0) {
|
||||||
LOG(ERROR) << "Error while writing master playlist " << file_path;
|
LOG(ERROR) << "Error while writing master playlist " << file_path;
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "packager/hls/base/media_playlist.h"
|
#include "packager/hls/base/media_playlist.h"
|
||||||
#include "packager/hls/base/mock_media_playlist.h"
|
#include "packager/hls/base/mock_media_playlist.h"
|
||||||
#include "packager/media/file/file.h"
|
#include "packager/media/file/file.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace hls {
|
namespace hls {
|
||||||
|
@ -33,6 +34,7 @@ class MasterPlaylistTest : public ::testing::Test {
|
||||||
MasterPlaylistTest() : master_playlist_(kDefaultMasterPlaylistName) {}
|
MasterPlaylistTest() : master_playlist_(kDefaultMasterPlaylistName) {}
|
||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
|
SetPackagerVersionForTesting("test");
|
||||||
GetOutputDir(&test_output_dir_path_, &test_output_dir_);
|
GetOutputDir(&test_output_dir_path_, &test_output_dir_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +88,8 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistOneVideo) {
|
||||||
|
|
||||||
const std::string expected =
|
const std::string expected =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-STREAM-INF:CODECS=\"avc1\",BANDWIDTH=435889\n"
|
"#EXT-X-STREAM-INF:CODECS=\"avc1\",BANDWIDTH=435889\n"
|
||||||
"http://myplaylistdomain.com/media1.m3u8\n";
|
"http://myplaylistdomain.com/media1.m3u8\n";
|
||||||
|
|
||||||
|
@ -155,6 +159,8 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndAudio) {
|
||||||
|
|
||||||
const std::string expected =
|
const std::string expected =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audiogroup\",NAME=\"english\","
|
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audiogroup\",NAME=\"english\","
|
||||||
"URI=\"http://playlists.org/eng.m3u8\"\n"
|
"URI=\"http://playlists.org/eng.m3u8\"\n"
|
||||||
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audiogroup\",NAME=\"espanol\","
|
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audiogroup\",NAME=\"espanol\","
|
||||||
|
@ -220,6 +226,8 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistMultipleAudioGroups) {
|
||||||
|
|
||||||
const std::string expected =
|
const std::string expected =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_hi\",NAME=\"english_hi\","
|
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_hi\",NAME=\"english_hi\","
|
||||||
"URI=\"http://anydomain.com/eng_hi.m3u8\"\n"
|
"URI=\"http://anydomain.com/eng_hi.m3u8\"\n"
|
||||||
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_lo\",NAME=\"english_lo\","
|
"#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_lo\",NAME=\"english_lo\","
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "packager/base/logging.h"
|
#include "packager/base/logging.h"
|
||||||
#include "packager/base/strings/stringprintf.h"
|
#include "packager/base/strings/stringprintf.h"
|
||||||
#include "packager/media/file/file.h"
|
#include "packager/media/file/file.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace hls {
|
namespace hls {
|
||||||
|
@ -272,11 +273,21 @@ bool MediaPlaylist::WriteToFile(media::File* file) {
|
||||||
SetTargetDuration(ceil(GetLongestSegmentDuration()));
|
SetTargetDuration(ceil(GetLongestSegmentDuration()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string version = GetPackagerVersion();
|
||||||
|
std::string version_line;
|
||||||
|
if (!version.empty()) {
|
||||||
|
version_line =
|
||||||
|
base::StringPrintf("## Generated with %s version %s\n",
|
||||||
|
GetPackagerProjectUrl().c_str(), version.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
// KEYFORMAT and KEYFORMATVERSIONS on EXT-X-KEY requires 5 or above.
|
// KEYFORMAT and KEYFORMATVERSIONS on EXT-X-KEY requires 5 or above.
|
||||||
std::string header = base::StringPrintf("#EXTM3U\n"
|
std::string header = base::StringPrintf(
|
||||||
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"%s"
|
||||||
"#EXT-X-TARGETDURATION:%d\n",
|
"#EXT-X-TARGETDURATION:%d\n",
|
||||||
target_duration_);
|
version_line.c_str(), target_duration_);
|
||||||
if (type_ == MediaPlaylistType::kVod) {
|
if (type_ == MediaPlaylistType::kVod) {
|
||||||
header += "#EXT-X-PLAYLIST-TYPE:VOD\n";
|
header += "#EXT-X-PLAYLIST-TYPE:VOD\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "packager/media/file/file.h"
|
#include "packager/media/file/file.h"
|
||||||
#include "packager/hls/base/media_playlist.h"
|
#include "packager/hls/base/media_playlist.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace hls {
|
namespace hls {
|
||||||
|
@ -56,6 +57,8 @@ class MediaPlaylistTest : public ::testing::Test {
|
||||||
default_group_id_) {}
|
default_group_id_) {}
|
||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
|
SetPackagerVersionForTesting("test");
|
||||||
|
|
||||||
MediaInfo::VideoInfo* video_info =
|
MediaInfo::VideoInfo* video_info =
|
||||||
valid_video_media_info_.mutable_video_info();
|
valid_video_media_info_.mutable_video_info();
|
||||||
video_info->set_codec("avc1");
|
video_info->set_codec("avc1");
|
||||||
|
@ -117,6 +120,8 @@ TEST_F(MediaPlaylistTest, WriteToFile) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:0\n"
|
"#EXT-X-TARGETDURATION:0\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXT-X-ENDLIST\n";
|
"#EXT-X-ENDLIST\n";
|
||||||
|
@ -172,6 +177,8 @@ TEST_F(MediaPlaylistTest, SetTargetDuration) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:20\n"
|
"#EXT-X-TARGETDURATION:20\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXT-X-ENDLIST\n";
|
"#EXT-X-ENDLIST\n";
|
||||||
|
@ -198,6 +205,8 @@ TEST_F(MediaPlaylistTest, WriteToFileWithSegments) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:30\n"
|
"#EXT-X-TARGETDURATION:30\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXTINF:10.000,\n"
|
"#EXTINF:10.000,\n"
|
||||||
|
@ -227,6 +236,8 @@ TEST_F(MediaPlaylistTest, WriteToFileWithEncryptionInfo) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:30\n"
|
"#EXT-X-TARGETDURATION:30\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXT-X-KEY:METHOD=SAMPLE-AES,"
|
"#EXT-X-KEY:METHOD=SAMPLE-AES,"
|
||||||
|
@ -259,6 +270,8 @@ TEST_F(MediaPlaylistTest, WriteToFileWithEncryptionInfoEmptyIv) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:30\n"
|
"#EXT-X-TARGETDURATION:30\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXT-X-KEY:METHOD=SAMPLE-AES,"
|
"#EXT-X-KEY:METHOD=SAMPLE-AES,"
|
||||||
|
@ -290,6 +303,7 @@ TEST_F(MediaPlaylistTest, WriteToFileWithClearLead) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version test\n"
|
||||||
"#EXT-X-TARGETDURATION:30\n"
|
"#EXT-X-TARGETDURATION:30\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXTINF:10.000,\n"
|
"#EXTINF:10.000,\n"
|
||||||
|
@ -323,6 +337,8 @@ TEST_F(MediaPlaylistTest, RemoveOldestSegment) {
|
||||||
const std::string kExpectedOutput =
|
const std::string kExpectedOutput =
|
||||||
"#EXTM3U\n"
|
"#EXTM3U\n"
|
||||||
"#EXT-X-VERSION:5\n"
|
"#EXT-X-VERSION:5\n"
|
||||||
|
"## Generated with https://github.com/google/shaka-packager version "
|
||||||
|
"test\n"
|
||||||
"#EXT-X-TARGETDURATION:30\n"
|
"#EXT-X-TARGETDURATION:30\n"
|
||||||
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
"#EXT-X-PLAYLIST-TYPE:VOD\n"
|
||||||
"#EXTINF:30.000,\n"
|
"#EXTINF:30.000,\n"
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
// https://developers.google.com/open-source/licenses/bsd
|
// https://developers.google.com/open-source/licenses/bsd
|
||||||
|
|
||||||
#include "packager/media/base/muxer_options.h"
|
#include "packager/media/base/muxer_options.h"
|
||||||
#include "packager/version/version.h"
|
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -17,8 +16,7 @@ MuxerOptions::MuxerOptions()
|
||||||
segment_sap_aligned(false),
|
segment_sap_aligned(false),
|
||||||
fragment_sap_aligned(false),
|
fragment_sap_aligned(false),
|
||||||
num_subsegments_per_sidx(0),
|
num_subsegments_per_sidx(0),
|
||||||
bandwidth(0),
|
bandwidth(0) {}
|
||||||
packager_version_string(kPackagerVersion) {}
|
|
||||||
MuxerOptions::~MuxerOptions() {}
|
MuxerOptions::~MuxerOptions() {}
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
|
|
|
@ -66,9 +66,6 @@ struct MuxerOptions {
|
||||||
/// User-specified bit rate for the media stream. If zero, the muxer will
|
/// User-specified bit rate for the media stream. If zero, the muxer will
|
||||||
/// attempt to estimate.
|
/// attempt to estimate.
|
||||||
uint32_t bandwidth;
|
uint32_t bandwidth;
|
||||||
|
|
||||||
/// Specify the version string to be embedded in the output files.
|
|
||||||
std::string packager_version_string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "packager/media/event/progress_listener.h"
|
#include "packager/media/event/progress_listener.h"
|
||||||
#include "packager/media/formats/mp4/box_definitions.h"
|
#include "packager/media/formats/mp4/box_definitions.h"
|
||||||
#include "packager/media/formats/mp4/key_rotation_fragmenter.h"
|
#include "packager/media/formats/mp4/key_rotation_fragmenter.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -276,11 +277,13 @@ Status Segmenter::Initialize(const std::vector<MediaStream*>& streams,
|
||||||
moof_->header.sequence_number = 1;
|
moof_->header.sequence_number = 1;
|
||||||
|
|
||||||
// Fill in version information.
|
// Fill in version information.
|
||||||
|
const std::string version = GetPackagerVersion();
|
||||||
|
if (!version.empty()) {
|
||||||
moov_->metadata.handler.handler_type = FOURCC_ID32;
|
moov_->metadata.handler.handler_type = FOURCC_ID32;
|
||||||
moov_->metadata.id3v2.language.code = "eng";
|
moov_->metadata.id3v2.language.code = "eng";
|
||||||
moov_->metadata.id3v2.private_frame.owner =
|
moov_->metadata.id3v2.private_frame.owner = GetPackagerProjectUrl();
|
||||||
"https://github.com/google/shaka-packager";
|
moov_->metadata.id3v2.private_frame.value = version;
|
||||||
moov_->metadata.id3v2.private_frame.value = options_.packager_version_string;
|
}
|
||||||
return DoInitialize();
|
return DoInitialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "packager/media/event/progress_listener.h"
|
#include "packager/media/event/progress_listener.h"
|
||||||
#include "packager/third_party/libwebm/src/mkvmuxerutil.hpp"
|
#include "packager/third_party/libwebm/src/mkvmuxerutil.hpp"
|
||||||
#include "packager/third_party/libwebm/src/webmids.hpp"
|
#include "packager/third_party/libwebm/src/webmids.hpp"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -60,13 +61,15 @@ Status Segmenter::Initialize(scoped_ptr<MkvWriter> writer,
|
||||||
progress_target_ = info_->duration();
|
progress_target_ = info_->duration();
|
||||||
progress_listener_ = progress_listener;
|
progress_listener_ = progress_listener;
|
||||||
|
|
||||||
const std::string version_string =
|
|
||||||
"https://github.com/google/shaka-packager version " +
|
|
||||||
options().packager_version_string;
|
|
||||||
|
|
||||||
segment_info_.Init();
|
segment_info_.Init();
|
||||||
segment_info_.set_timecode_scale(kTimecodeScale);
|
segment_info_.set_timecode_scale(kTimecodeScale);
|
||||||
segment_info_.set_writing_app(version_string.c_str());
|
|
||||||
|
const std::string version = GetPackagerVersion();
|
||||||
|
if (!version.empty()) {
|
||||||
|
segment_info_.set_writing_app(
|
||||||
|
(GetPackagerProjectUrl() + " version " + version).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if (options().single_segment) {
|
if (options().single_segment) {
|
||||||
// Set an initial duration so the duration element is written; will be
|
// Set an initial duration so the duration element is written; will be
|
||||||
// overwritten at the end. This works because this is a float and floats
|
// overwritten at the end. This works because this is a float and floats
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "packager/media/base/muxer_util.h"
|
#include "packager/media/base/muxer_util.h"
|
||||||
#include "packager/media/file/memory_file.h"
|
#include "packager/media/file/memory_file.h"
|
||||||
#include "packager/media/formats/webm/webm_constants.h"
|
#include "packager/media/formats/webm/webm_constants.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
@ -39,6 +40,8 @@ const uint8_t kNaluLengthSize = 0;
|
||||||
SegmentTestBase::SegmentTestBase() {}
|
SegmentTestBase::SegmentTestBase() {}
|
||||||
|
|
||||||
void SegmentTestBase::SetUp() {
|
void SegmentTestBase::SetUp() {
|
||||||
|
SetPackagerVersionForTesting("test");
|
||||||
|
|
||||||
output_file_name_ = std::string(kMemoryFilePrefix) + "output-file.webm";
|
output_file_name_ = std::string(kMemoryFilePrefix) + "output-file.webm";
|
||||||
segment_template_ =
|
segment_template_ =
|
||||||
std::string(kMemoryFilePrefix) + "output-template-$Number$.webm";
|
std::string(kMemoryFilePrefix) + "output-template-$Number$.webm";
|
||||||
|
@ -78,7 +81,6 @@ MuxerOptions SegmentTestBase::CreateMuxerOptions() const {
|
||||||
ret.single_segment = single_segment_;
|
ret.single_segment = single_segment_;
|
||||||
ret.output_file_name = output_file_name_;
|
ret.output_file_name = output_file_name_;
|
||||||
ret.segment_template = segment_template_;
|
ret.segment_template = segment_template_;
|
||||||
ret.packager_version_string = "test";
|
|
||||||
ret.segment_duration = 30; // seconds
|
ret.segment_duration = 30; // seconds
|
||||||
ret.fragment_duration = 30; // seconds
|
ret.fragment_duration = 30; // seconds
|
||||||
ret.segment_sap_aligned = false;
|
ret.segment_sap_aligned = false;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "packager/mpd/base/language_utils.h"
|
#include "packager/mpd/base/language_utils.h"
|
||||||
#include "packager/mpd/base/mpd_utils.h"
|
#include "packager/mpd/base/mpd_utils.h"
|
||||||
#include "packager/mpd/base/xml/xml_node.h"
|
#include "packager/mpd/base/xml/xml_node.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
|
|
||||||
|
@ -505,13 +506,18 @@ xmlDocPtr MpdBuilder::GenerateMpd() {
|
||||||
}
|
}
|
||||||
|
|
||||||
DCHECK(doc);
|
DCHECK(doc);
|
||||||
|
const std::string version = GetPackagerVersion();
|
||||||
|
if (!version.empty()) {
|
||||||
std::string version_string =
|
std::string version_string =
|
||||||
"Generated with https://github.com/google/shaka-packager version " +
|
base::StringPrintf("Generated with %s version %s",
|
||||||
mpd_options_.packager_version_string;
|
GetPackagerProjectUrl().c_str(), version.c_str());
|
||||||
xml::scoped_xml_ptr<xmlNode> comment(
|
xml::scoped_xml_ptr<xmlNode> comment(
|
||||||
xmlNewDocComment(doc.get(), BAD_CAST version_string.c_str()));
|
xmlNewDocComment(doc.get(), BAD_CAST version_string.c_str()));
|
||||||
xmlDocSetRootElement(doc.get(), comment.get());
|
xmlDocSetRootElement(doc.get(), comment.get());
|
||||||
xmlAddSibling(comment.release(), mpd.Release());
|
xmlAddSibling(comment.release(), mpd.Release());
|
||||||
|
} else {
|
||||||
|
xmlDocSetRootElement(doc.get(), mpd.Release());
|
||||||
|
}
|
||||||
return doc.release();
|
return doc.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "packager/mpd/base/mpd_utils.h"
|
#include "packager/mpd/base/mpd_utils.h"
|
||||||
#include "packager/mpd/test/mpd_builder_test_helper.h"
|
#include "packager/mpd/test/mpd_builder_test_helper.h"
|
||||||
#include "packager/mpd/test/xml_compare.h"
|
#include "packager/mpd/test/xml_compare.h"
|
||||||
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
|
|
||||||
|
@ -184,9 +185,8 @@ class DynamicMpdBuilderTest : public MpdBuilderTest<MpdBuilder::kDynamic> {
|
||||||
// Anchors availabilityStartTime so that the test result doesn't depend on the
|
// Anchors availabilityStartTime so that the test result doesn't depend on the
|
||||||
// current time.
|
// current time.
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
|
SetPackagerVersionForTesting("<tag>-<hash>-<test>");
|
||||||
mpd_.availability_start_time_ = "2011-12-25T12:30:00";
|
mpd_.availability_start_time_ = "2011-12-25T12:30:00";
|
||||||
// Override packager version string for testing.
|
|
||||||
mpd_.mpd_options_.packager_version_string = "<tag>-<hash>-<test>";
|
|
||||||
InjectTestClock();
|
InjectTestClock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "packager/version/version.h"
|
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
|
|
||||||
/// Defines Mpd Options.
|
/// Defines Mpd Options.
|
||||||
|
@ -21,8 +19,7 @@ struct MpdOptions {
|
||||||
// TODO(tinskip): Set min_buffer_time in unit tests rather than here.
|
// TODO(tinskip): Set min_buffer_time in unit tests rather than here.
|
||||||
min_buffer_time(2.0),
|
min_buffer_time(2.0),
|
||||||
time_shift_buffer_depth(0),
|
time_shift_buffer_depth(0),
|
||||||
suggested_presentation_delay(0),
|
suggested_presentation_delay(0) {}
|
||||||
packager_version_string(kPackagerVersion) {}
|
|
||||||
|
|
||||||
~MpdOptions() {};
|
~MpdOptions() {};
|
||||||
|
|
||||||
|
@ -31,7 +28,6 @@ struct MpdOptions {
|
||||||
double min_buffer_time;
|
double min_buffer_time;
|
||||||
double time_shift_buffer_depth;
|
double time_shift_buffer_depth;
|
||||||
double suggested_presentation_delay;
|
double suggested_presentation_delay;
|
||||||
std::string packager_version_string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
|
|
||||||
#include "packager/version/version.h"
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
namespace shaka {
|
#include "packager/base/lazy_instance.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
#if defined(PACKAGER_VERSION)
|
#if defined(PACKAGER_VERSION)
|
||||||
// PACKAGER_VERSION is generated in gyp file using script
|
// PACKAGER_VERSION is generated in gyp file using script
|
||||||
|
@ -20,4 +22,36 @@ const char kPackagerVersion[] = PACKAGER_VERSION "-debug";
|
||||||
const char kPackagerVersion[] = "";
|
const char kPackagerVersion[] = "";
|
||||||
#endif // #if defined(PACKAGER_VERSION)
|
#endif // #if defined(PACKAGER_VERSION)
|
||||||
|
|
||||||
|
const char kPackagerGithubUrl[] = "https://github.com/google/shaka-packager";
|
||||||
|
|
||||||
|
class Version {
|
||||||
|
public:
|
||||||
|
Version() : version_(kPackagerVersion) {}
|
||||||
|
~Version() {}
|
||||||
|
|
||||||
|
const std::string& version() { return version_; }
|
||||||
|
void set_version(const std::string& version) { version_ = version; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string version_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace shaka {
|
||||||
|
|
||||||
|
base::LazyInstance<Version> g_packager_version;
|
||||||
|
|
||||||
|
std::string GetPackagerProjectUrl(){
|
||||||
|
return kPackagerGithubUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetPackagerVersion() {
|
||||||
|
return g_packager_version.Get().version();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetPackagerVersionForTesting(const std::string& version) {
|
||||||
|
g_packager_version.Get().set_version(version);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
'version.cc',
|
'version.cc',
|
||||||
'version.h',
|
'version.h',
|
||||||
],
|
],
|
||||||
|
'dependencies': [
|
||||||
|
'../base/base.gyp:base',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,18 @@
|
||||||
// license that can be found in the LICENSE file or at
|
// license that can be found in the LICENSE file or at
|
||||||
// https://developers.google.com/open-source/licenses/bsd
|
// https://developers.google.com/open-source/licenses/bsd
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
|
|
||||||
extern const char kPackagerVersion[];
|
/// @return URL of shaka-packager project.
|
||||||
|
std::string GetPackagerProjectUrl();
|
||||||
|
|
||||||
|
/// @return The version string.
|
||||||
|
std::string GetPackagerVersion();
|
||||||
|
|
||||||
|
/// Set version for testing.
|
||||||
|
/// @param version contains the injected testing version.
|
||||||
|
void SetPackagerVersionForTesting(const std::string& version);
|
||||||
|
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
Loading…
Reference in New Issue