Windows build working
Change-Id: I6d9cfa0a310c4c6125c839e4d6a085903e981c9c
This commit is contained in:
parent
5278f9cb89
commit
336ea5cb34
2
DEPS
2
DEPS
|
@ -55,7 +55,7 @@ deps = {
|
||||||
Var("chromium_git") + "/chromium/src/third_party/tcmalloc/chromium@fa1492f75861094061043a17c0f779c3d35780bf",
|
Var("chromium_git") + "/chromium/src/third_party/tcmalloc/chromium@fa1492f75861094061043a17c0f779c3d35780bf",
|
||||||
|
|
||||||
"src/packager/third_party/zlib":
|
"src/packager/third_party/zlib":
|
||||||
Var("chromium_git") + "/chromium/src/third_party/zlib@bcf81d2e5f3a62b698d179c1fadba94604c5dad3",
|
Var("chromium_git") + "/chromium/src/third_party/zlib@830b5c25b5fbe37e032ea09dd011d57042dd94df",
|
||||||
|
|
||||||
"src/packager/tools/clang":
|
"src/packager/tools/clang":
|
||||||
Var("chromium_git") + "/chromium/src/tools/clang@0de8f3bb6af64e13876273c601704795d5e00faf",
|
Var("chromium_git") + "/chromium/src/tools/clang@0de8f3bb6af64e13876273c601704795d5e00faf",
|
||||||
|
|
|
@ -14,6 +14,12 @@
|
||||||
#include "packager/mpd/util/mpd_writer.h"
|
#include "packager/mpd/util/mpd_writer.h"
|
||||||
#include "packager/version/version.h"
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include <codecvt>
|
||||||
|
#include <functional>
|
||||||
|
#include <locale>
|
||||||
|
#endif // defined(OS_WIN)
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace {
|
namespace {
|
||||||
const char kUsage[] =
|
const char kUsage[] =
|
||||||
|
@ -103,6 +109,29 @@ int MpdMain(int argc, char** argv) {
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
// Windows wmain, which converts wide character arguments to UTF-8.
|
||||||
|
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
|
||||||
|
std::unique_ptr<char* [], std::function<void(char**)>> utf8_argv(
|
||||||
|
new char*[argc], [argc](char** utf8_args) {
|
||||||
|
// TODO(tinskip): This leaks, but if this code is enabled, it crashes.
|
||||||
|
// Figure out why. I suspect gflags does something funny with the
|
||||||
|
// argument array.
|
||||||
|
// for (int idx = 0; idx < argc; ++idx)
|
||||||
|
// delete[] utf8_args[idx];
|
||||||
|
delete[] utf8_args;
|
||||||
|
});
|
||||||
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
|
||||||
|
for (int idx = 0; idx < argc; ++idx) {
|
||||||
|
std::string utf8_arg(converter.to_bytes(argv[idx]));
|
||||||
|
utf8_arg += '\0';
|
||||||
|
utf8_argv[idx] = new char[utf8_arg.size()];
|
||||||
|
memcpy(utf8_argv[idx], &utf8_arg[0], utf8_arg.size());
|
||||||
|
}
|
||||||
|
return shaka::MpdMain(argc, utf8_argv.get());
|
||||||
|
}
|
||||||
|
#else
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
return shaka::MpdMain(argc, argv);
|
return shaka::MpdMain(argc, argv);
|
||||||
}
|
}
|
||||||
|
#endif // !defined(OS_WIN)
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "packager/base/command_line.h"
|
#include "packager/base/command_line.h"
|
||||||
#include "packager/base/files/file_path.h"
|
#include "packager/base/files/file_path.h"
|
||||||
#include "packager/base/logging.h"
|
#include "packager/base/logging.h"
|
||||||
|
#include "packager/base/path_service.h"
|
||||||
#include "packager/base/stl_util.h"
|
#include "packager/base/stl_util.h"
|
||||||
#include "packager/base/strings/string_split.h"
|
#include "packager/base/strings/string_split.h"
|
||||||
#include "packager/base/strings/stringprintf.h"
|
#include "packager/base/strings/stringprintf.h"
|
||||||
|
@ -46,6 +47,12 @@
|
||||||
#include "packager/mpd/base/simple_mpd_notifier.h"
|
#include "packager/mpd/base/simple_mpd_notifier.h"
|
||||||
#include "packager/version/version.h"
|
#include "packager/version/version.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include <codecvt>
|
||||||
|
#include <functional>
|
||||||
|
#include <locale>
|
||||||
|
#endif // defined(OS_WIN)
|
||||||
|
|
||||||
DEFINE_bool(use_fake_clock_for_muxer,
|
DEFINE_bool(use_fake_clock_for_muxer,
|
||||||
false,
|
false,
|
||||||
"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, "
|
||||||
|
@ -480,13 +487,14 @@ bool RunPackager(const StreamDescriptorList& stream_descriptors) {
|
||||||
|
|
||||||
scoped_ptr<hls::HlsNotifier> hls_notifier;
|
scoped_ptr<hls::HlsNotifier> hls_notifier;
|
||||||
if (!FLAGS_hls_master_playlist_output.empty()) {
|
if (!FLAGS_hls_master_playlist_output.empty()) {
|
||||||
base::FilePath master_playlist_path(FLAGS_hls_master_playlist_output);
|
base::FilePath master_playlist_path(
|
||||||
|
base::FilePath::FromUTF8Unsafe(FLAGS_hls_master_playlist_output));
|
||||||
base::FilePath master_playlist_name = master_playlist_path.BaseName();
|
base::FilePath master_playlist_name = master_playlist_path.BaseName();
|
||||||
|
|
||||||
hls_notifier.reset(new hls::SimpleHlsNotifier(
|
hls_notifier.reset(new hls::SimpleHlsNotifier(
|
||||||
hls::HlsNotifier::HlsProfile::kOnDemandProfile, FLAGS_hls_base_url,
|
hls::HlsNotifier::HlsProfile::kOnDemandProfile, FLAGS_hls_base_url,
|
||||||
master_playlist_path.DirName().AsEndingWithSeparator().value(),
|
master_playlist_path.DirName().AsEndingWithSeparator().AsUTF8Unsafe(),
|
||||||
master_playlist_name.value()));
|
master_playlist_name.AsUTF8Unsafe()));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<RemuxJob*> remux_jobs;
|
std::vector<RemuxJob*> remux_jobs;
|
||||||
|
@ -521,7 +529,16 @@ int PackagerMain(int argc, char** argv) {
|
||||||
base::AtExitManager exit;
|
base::AtExitManager exit;
|
||||||
// Needed to enable VLOG/DVLOG through --vmodule or --v.
|
// Needed to enable VLOG/DVLOG through --vmodule or --v.
|
||||||
base::CommandLine::Init(argc, argv);
|
base::CommandLine::Init(argc, argv);
|
||||||
CHECK(logging::InitLogging(logging::LoggingSettings()));
|
|
||||||
|
// Set up logging.
|
||||||
|
logging::LoggingSettings log_settings;
|
||||||
|
base::FilePath log_filename;
|
||||||
|
PathService::Get(base::DIR_EXE, &log_filename);
|
||||||
|
log_filename = log_filename.AppendASCII("packager.log");
|
||||||
|
log_settings.logging_dest = logging::LOG_TO_ALL;
|
||||||
|
log_settings.log_file = log_filename.value().c_str();
|
||||||
|
log_settings.delete_old = logging::DELETE_OLD_LOG_FILE;
|
||||||
|
CHECK(logging::InitLogging(log_settings));
|
||||||
|
|
||||||
google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
|
google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
|
||||||
google::ParseCommandLineFlags(&argc, &argv, true);
|
google::ParseCommandLineFlags(&argc, &argv, true);
|
||||||
|
@ -552,6 +569,29 @@ int PackagerMain(int argc, char** argv) {
|
||||||
} // namespace media
|
} // namespace media
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
// Windows wmain, which converts wide character arguments to UTF-8.
|
||||||
|
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
|
||||||
|
std::unique_ptr<char* [], std::function<void(char**)>> utf8_argv(
|
||||||
|
new char*[argc], [argc](char** utf8_args) {
|
||||||
|
// TODO(tinskip): This leaks, but if this code is enabled, it crashes.
|
||||||
|
// Figure out why. I suspect gflags does something funny with the
|
||||||
|
// argument array.
|
||||||
|
// for (int idx = 0; idx < argc; ++idx)
|
||||||
|
// delete[] utf8_args[idx];
|
||||||
|
delete[] utf8_args;
|
||||||
|
});
|
||||||
|
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
|
||||||
|
for (int idx = 0; idx < argc; ++idx) {
|
||||||
|
std::string utf8_arg(converter.to_bytes(argv[idx]));
|
||||||
|
utf8_arg += '\0';
|
||||||
|
utf8_argv[idx] = new char[utf8_arg.size()];
|
||||||
|
memcpy(utf8_argv[idx], &utf8_arg[0], utf8_arg.size());
|
||||||
|
}
|
||||||
|
return shaka::media::PackagerMain(argc, utf8_argv.get());
|
||||||
|
}
|
||||||
|
#else
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
return shaka::media::PackagerMain(argc, argv);
|
return shaka::media::PackagerMain(argc, argv);
|
||||||
}
|
}
|
||||||
|
#endif // defined(OS_WIN)
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
"""Test wrapper for the sample packager binary."""
|
"""Test wrapper for the sample packager binary."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
import test_env
|
import test_env
|
||||||
|
@ -17,7 +18,10 @@ class PackagerApp(object):
|
||||||
"""Main integration class for testing the packager binary."""
|
"""Main integration class for testing the packager binary."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.binary = os.path.join(test_env.SCRIPT_DIR, 'packager')
|
packager_name = 'packager'
|
||||||
|
if platform.system() == 'Windows':
|
||||||
|
packager_name += '.exe'
|
||||||
|
self.binary = os.path.join(test_env.SCRIPT_DIR, packager_name)
|
||||||
assert os.path.exists(self.binary), ('Please run from output directory, '
|
assert os.path.exists(self.binary), ('Please run from output directory, '
|
||||||
'e.g. out/Debug/packager_test.py')
|
'e.g. out/Debug/packager_test.py')
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
import filecmp
|
import filecmp
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
|
@ -66,6 +67,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
' num_channels: 2\n'
|
' num_channels: 2\n'
|
||||||
' sampling_frequency: 44100\n'
|
' sampling_frequency: 44100\n'
|
||||||
' language: und\n')
|
' language: und\n')
|
||||||
|
stream_info = stream_info.replace('\r\n', '\n')
|
||||||
self.assertIn(expected_stream_info, stream_info,
|
self.assertIn(expected_stream_info, stream_info,
|
||||||
'\nExpecting: \n %s\n\nBut seeing: \n%s' %
|
'\nExpecting: \n %s\n\nBut seeing: \n%s' %
|
||||||
(expected_stream_info, stream_info))
|
(expected_stream_info, stream_info))
|
||||||
|
@ -527,7 +529,10 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
match = filecmp.cmp(test_output, golden_file)
|
match = filecmp.cmp(test_output, golden_file)
|
||||||
if not match:
|
if not match:
|
||||||
p = subprocess.Popen(['git', '--no-pager', 'diff', '--color=auto',
|
git = 'git'
|
||||||
|
if platform.system() == 'Windows':
|
||||||
|
git += '.bat'
|
||||||
|
p = subprocess.Popen([git, '--no-pager', 'diff', '--color=auto',
|
||||||
'--no-ext-diff', '--no-index', golden_file,
|
'--no-ext-diff', '--no-index', golden_file,
|
||||||
test_output],
|
test_output],
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
|
@ -538,11 +543,13 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
# '*.media_info' outputs contain media file names, which is changing for
|
# '*.media_info' outputs contain media file names, which is changing for
|
||||||
# every test run. These needs to be replaced for comparison.
|
# every test run. These needs to be replaced for comparison.
|
||||||
def _DiffMediaInfoGold(self, test_output, golden_file_name):
|
def _DiffMediaInfoGold(self, test_output, golden_file_name):
|
||||||
|
if platform.system() == 'Windows':
|
||||||
|
test_output = test_output.replace('\\', '\\\\')
|
||||||
media_info_output = test_output + '.media_info'
|
media_info_output = test_output + '.media_info'
|
||||||
# Replaces filename, which is changing for every test run.
|
# Replaces filename, which is changing for every test run.
|
||||||
with open(media_info_output, 'r') as f:
|
with open(media_info_output, 'rb') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
with open(media_info_output, 'w') as f:
|
with open(media_info_output, 'wb') as f:
|
||||||
f.write(content.replace(test_output, 'place_holder'))
|
f.write(content.replace(test_output, 'place_holder'))
|
||||||
self._DiffGold(media_info_output, golden_file_name + '.media_info')
|
self._DiffGold(media_info_output, golden_file_name + '.media_info')
|
||||||
|
|
||||||
|
@ -565,7 +572,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
# Live mpd contains current availabilityStartTime and publishTime, which
|
# Live mpd contains current availabilityStartTime and publishTime, which
|
||||||
# needs to be replaced for comparison.
|
# needs to be replaced for comparison.
|
||||||
def _DiffLiveMpdGold(self, test_output, golden_file_name):
|
def _DiffLiveMpdGold(self, test_output, golden_file_name):
|
||||||
with open(test_output, 'r') as f:
|
with open(test_output, 'rb') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
|
|
||||||
# Extract availabilityStartTime.
|
# Extract availabilityStartTime.
|
||||||
|
@ -579,7 +586,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self.assertIsNotNone(m)
|
self.assertIsNotNone(m)
|
||||||
publish_time = m.group(0)
|
publish_time = m.group(0)
|
||||||
print publish_time
|
print publish_time
|
||||||
with open(test_output, 'w') as f:
|
with open(test_output, 'wb') as f:
|
||||||
f.write(content.replace(
|
f.write(content.replace(
|
||||||
availability_start_time,
|
availability_start_time,
|
||||||
'availabilityStartTime="some_availability_start_time"').replace(
|
'availabilityStartTime="some_availability_start_time"').replace(
|
||||||
|
|
|
@ -32,6 +32,14 @@
|
||||||
'-Wno-reserved-user-defined-literal',
|
'-Wno-reserved-user-defined-literal',
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
|
['OS == "win"', {
|
||||||
|
'msvs_settings': {
|
||||||
|
'VCCLCompilerTool': {
|
||||||
|
'WarnAsError': 'true',
|
||||||
|
'DisableSpecificWarnings': ['4125']
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ using ::testing::AtLeast;
|
||||||
using ::testing::Return;
|
using ::testing::Return;
|
||||||
using ::testing::ReturnRef;
|
using ::testing::ReturnRef;
|
||||||
using ::testing::_;
|
using ::testing::_;
|
||||||
|
using base::FilePath;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const char kDefaultMasterPlaylistName[] = "playlist.m3u8";
|
const char kDefaultMasterPlaylistName[] = "playlist.m3u8";
|
||||||
|
@ -39,7 +40,7 @@ class MasterPlaylistTest : public ::testing::Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
MasterPlaylist master_playlist_;
|
MasterPlaylist master_playlist_;
|
||||||
base::FilePath test_output_dir_path_;
|
FilePath test_output_dir_path_;
|
||||||
std::string test_output_dir_;
|
std::string test_output_dir_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -48,12 +49,13 @@ class MasterPlaylistTest : public ::testing::Test {
|
||||||
// using base::File* related API.
|
// using base::File* related API.
|
||||||
// |output_dir| is set to an equivalent value to |temp_dir_path| but formatted
|
// |output_dir| is set to an equivalent value to |temp_dir_path| but formatted
|
||||||
// so that media::File interface can Open it.
|
// so that media::File interface can Open it.
|
||||||
void GetOutputDir(base::FilePath* temp_dir_path, std::string* output_dir) {
|
void GetOutputDir(FilePath* temp_dir_path, std::string* output_dir) {
|
||||||
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
||||||
ASSERT_TRUE(temp_dir_.IsValid());
|
ASSERT_TRUE(temp_dir_.IsValid());
|
||||||
*temp_dir_path = temp_dir_.path();
|
*temp_dir_path = temp_dir_.path();
|
||||||
// TODO(rkuroiwa): Use memory file sys once prefix is exposed.
|
// TODO(rkuroiwa): Use memory file sys once prefix is exposed.
|
||||||
*output_dir = media::kLocalFilePrefix + temp_dir_.path().value() + "/";
|
*output_dir = media::kLocalFilePrefix + temp_dir_.path().AsUTF8Unsafe()
|
||||||
|
+ "/";
|
||||||
}
|
}
|
||||||
|
|
||||||
base::ScopedTempDir temp_dir_;
|
base::ScopedTempDir temp_dir_;
|
||||||
|
@ -78,8 +80,9 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistOneVideo) {
|
||||||
const char kBaseUrl[] = "http://myplaylistdomain.com/";
|
const char kBaseUrl[] = "http://myplaylistdomain.com/";
|
||||||
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
||||||
|
|
||||||
base::FilePath master_playlist_path =
|
FilePath master_playlist_path =
|
||||||
test_output_dir_path_.Append(kDefaultMasterPlaylistName);
|
test_output_dir_path_.Append(FilePath::FromUTF8Unsafe(
|
||||||
|
kDefaultMasterPlaylistName));
|
||||||
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
||||||
<< "Cannot find " << master_playlist_path.value();
|
<< "Cannot find " << master_playlist_path.value();
|
||||||
|
|
||||||
|
@ -149,8 +152,9 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistVideoAndAudio) {
|
||||||
const char kBaseUrl[] = "http://playlists.org/";
|
const char kBaseUrl[] = "http://playlists.org/";
|
||||||
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
||||||
|
|
||||||
base::FilePath master_playlist_path =
|
FilePath master_playlist_path =
|
||||||
test_output_dir_path_.Append(kDefaultMasterPlaylistName);
|
test_output_dir_path_.Append(FilePath::FromUTF8Unsafe(
|
||||||
|
kDefaultMasterPlaylistName));
|
||||||
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
||||||
<< "Cannot find " << master_playlist_path.value();
|
<< "Cannot find " << master_playlist_path.value();
|
||||||
|
|
||||||
|
@ -216,8 +220,8 @@ TEST_F(MasterPlaylistTest, WriteMasterPlaylistMultipleAudioGroups) {
|
||||||
const char kBaseUrl[] = "http://anydomain.com/";
|
const char kBaseUrl[] = "http://anydomain.com/";
|
||||||
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
EXPECT_TRUE(master_playlist_.WriteMasterPlaylist(kBaseUrl, test_output_dir_));
|
||||||
|
|
||||||
base::FilePath master_playlist_path =
|
FilePath master_playlist_path = test_output_dir_path_.Append(
|
||||||
test_output_dir_path_.Append(kDefaultMasterPlaylistName);
|
FilePath::FromUTF8Unsafe(kDefaultMasterPlaylistName));
|
||||||
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
||||||
<< "Cannot find " << master_playlist_path.value();
|
<< "Cannot find " << master_playlist_path.value();
|
||||||
|
|
||||||
|
@ -266,15 +270,17 @@ TEST_F(MasterPlaylistTest, WriteAllPlaylists) {
|
||||||
EXPECT_CALL(mock_playlist, SetTargetDuration(10)).WillOnce(Return(true));
|
EXPECT_CALL(mock_playlist, SetTargetDuration(10)).WillOnce(Return(true));
|
||||||
master_playlist_.AddMediaPlaylist(&mock_playlist);
|
master_playlist_.AddMediaPlaylist(&mock_playlist);
|
||||||
|
|
||||||
EXPECT_CALL(mock_playlist,
|
EXPECT_CALL(
|
||||||
|
mock_playlist,
|
||||||
WriteToFile(FileNameMatches(
|
WriteToFile(FileNameMatches(
|
||||||
test_output_dir_path_.Append("media1.m3u8").value())))
|
test_output_dir_path_.Append(FilePath::FromUTF8Unsafe("media1.m3u8"))
|
||||||
|
.AsUTF8Unsafe())))
|
||||||
.WillOnce(Return(true));
|
.WillOnce(Return(true));
|
||||||
|
|
||||||
const char kBaseUrl[] = "http://domain.com/";
|
const char kBaseUrl[] = "http://domain.com/";
|
||||||
EXPECT_TRUE(master_playlist_.WriteAllPlaylists(kBaseUrl, test_output_dir_));
|
EXPECT_TRUE(master_playlist_.WriteAllPlaylists(kBaseUrl, test_output_dir_));
|
||||||
base::FilePath master_playlist_path =
|
FilePath master_playlist_path = test_output_dir_path_.Append(
|
||||||
test_output_dir_path_.Append(kDefaultMasterPlaylistName);
|
FilePath::FromUTF8Unsafe(kDefaultMasterPlaylistName));
|
||||||
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
ASSERT_TRUE(base::PathExists(master_playlist_path))
|
||||||
<< "Cannot find master playlist at " << master_playlist_path.value();
|
<< "Cannot find master playlist at " << master_playlist_path.value();
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,9 +53,9 @@ void MakePathsRelativeToOutputDirectory(const std::string& output_dir,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string directory_with_separator(
|
std::string directory_with_separator(
|
||||||
base::FilePath(prefix_stripped_output_dir)
|
base::FilePath::FromUTF8Unsafe(prefix_stripped_output_dir)
|
||||||
.AsEndingWithSeparator()
|
.AsEndingWithSeparator()
|
||||||
.value());
|
.AsUTF8Unsafe());
|
||||||
if (directory_with_separator.empty())
|
if (directory_with_separator.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,15 @@ class BitReader {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Explicit T=bool overload to make MSVC happy.
|
||||||
|
bool ReadBits(int num_bits, bool* out) {
|
||||||
|
DCHECK_EQ(num_bits, 1);
|
||||||
|
uint64_t temp;
|
||||||
|
bool ret = ReadBitsInternal(num_bits, &temp);
|
||||||
|
*out = temp != 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/// Skip a number of bits from stream.
|
/// Skip a number of bits from stream.
|
||||||
/// @param num_bits specifies the number of bits to be skipped.
|
/// @param num_bits specifies the number of bits to be skipped.
|
||||||
/// @return false if the given number of bits cannot be skipped (not enough
|
/// @return false if the given number of bits cannot be skipped (not enough
|
||||||
|
|
|
@ -164,7 +164,7 @@ TEST_F(BufferWriterTest, WriteToFile) {
|
||||||
LOG(INFO) << "Created temporary file: " << path.value();
|
LOG(INFO) << "Created temporary file: " << path.value();
|
||||||
|
|
||||||
// Append an array to buffer and then write to the temporary file.
|
// Append an array to buffer and then write to the temporary file.
|
||||||
File* const output_file = File::Open(path.value().c_str(), "w");
|
File* const output_file = File::Open(path.AsUTF8Unsafe().c_str(), "w");
|
||||||
writer_->AppendArray(kuint8Array, sizeof(kuint8Array));
|
writer_->AppendArray(kuint8Array, sizeof(kuint8Array));
|
||||||
ASSERT_EQ(sizeof(kuint8Array), writer_->Size());
|
ASSERT_EQ(sizeof(kuint8Array), writer_->Size());
|
||||||
ASSERT_OK(writer_->WriteToFile(output_file));
|
ASSERT_OK(writer_->WriteToFile(output_file));
|
||||||
|
@ -172,12 +172,11 @@ TEST_F(BufferWriterTest, WriteToFile) {
|
||||||
ASSERT_TRUE(output_file->Close());
|
ASSERT_TRUE(output_file->Close());
|
||||||
|
|
||||||
// Read the file and verify.
|
// Read the file and verify.
|
||||||
File* const input_file = File::Open(path.value().c_str(), "r");
|
File* const input_file = File::Open(path.AsUTF8Unsafe().c_str(), "r");
|
||||||
ASSERT_TRUE(input_file != NULL);
|
ASSERT_TRUE(input_file != NULL);
|
||||||
std::vector<uint8_t> data_read(sizeof(kuint8Array), 0);
|
std::vector<uint8_t> data_read(sizeof(kuint8Array), 0);
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(sizeof(kuint8Array), static_cast<size_t>(input_file->Read(
|
||||||
sizeof(kuint8Array),
|
&data_read[0], data_read.size())));
|
||||||
static_cast<size_t>(input_file->Read(&data_read[0], data_read.size())));
|
|
||||||
ASSERT_TRUE(input_file->Close());
|
ASSERT_TRUE(input_file->Close());
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(kuint8Array); ++i)
|
for (size_t i = 0; i < sizeof(kuint8Array); ++i)
|
||||||
|
|
|
@ -142,9 +142,9 @@ bool AACAudioSpecificConfig::ConvertToADTS(std::vector<uint8_t>* buffer) const {
|
||||||
adts[1] = 0xf1;
|
adts[1] = 0xf1;
|
||||||
adts[2] = ((audio_object_type_ - 1) << 6) + (frequency_index_ << 2) +
|
adts[2] = ((audio_object_type_ - 1) << 6) + (frequency_index_ << 2) +
|
||||||
(channel_config_ >> 2);
|
(channel_config_ >> 2);
|
||||||
adts[3] = ((channel_config_ & 0x3) << 6) + (size >> 11);
|
adts[3] = ((channel_config_ & 0x3) << 6) + static_cast<uint8_t>(size >> 11);
|
||||||
adts[4] = (size & 0x7ff) >> 3;
|
adts[4] = static_cast<uint8_t>((size & 0x7ff) >> 3);
|
||||||
adts[5] = ((size & 7) << 5) + 0x1f;
|
adts[5] = static_cast<uint8_t>(((size & 7) << 5) + 0x1f);
|
||||||
adts[6] = 0xfc;
|
adts[6] = 0xfc;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -140,15 +140,17 @@ void ESDescriptor::Write(BufferWriter* writer) const {
|
||||||
const std::vector<uint8_t> kEmptyDecodingBufferSize(3, 0);
|
const std::vector<uint8_t> kEmptyDecodingBufferSize(3, 0);
|
||||||
const uint8_t kNoEsFlags = 0;
|
const uint8_t kNoEsFlags = 0;
|
||||||
|
|
||||||
const uint8_t decoder_specific_info_size = decoder_specific_info_.size();
|
const uint8_t decoder_specific_info_size =
|
||||||
|
static_cast<uint8_t>(decoder_specific_info_.size());
|
||||||
|
|
||||||
// 6 bit stream type. The last bit is reserved with 1.
|
// 6 bit stream type. The last bit is reserved with 1.
|
||||||
const uint8_t stream_type = (kAudioStreamType << 2) | 1;
|
const uint8_t stream_type = (kAudioStreamType << 2) | 1;
|
||||||
const uint8_t decoder_config_size = decoder_specific_info_size + kHeaderSize +
|
const uint8_t decoder_config_size =
|
||||||
|
static_cast<uint8_t>(decoder_specific_info_size + kHeaderSize +
|
||||||
sizeof(uint8_t) + // object_type_.
|
sizeof(uint8_t) + // object_type_.
|
||||||
sizeof(stream_type) +
|
sizeof(stream_type) +
|
||||||
kEmptyDecodingBufferSize.size() +
|
kEmptyDecodingBufferSize.size() +
|
||||||
sizeof(kUnknownBitrate) * 2;
|
sizeof(kUnknownBitrate) * 2);
|
||||||
|
|
||||||
const uint8_t sl_config_size = sizeof(uint8_t); // predefined.
|
const uint8_t sl_config_size = sizeof(uint8_t); // predefined.
|
||||||
const uint8_t es_size = decoder_config_size + kHeaderSize + sl_config_size +
|
const uint8_t es_size = decoder_config_size + kHeaderSize + sl_config_size +
|
||||||
|
@ -178,7 +180,8 @@ void ESDescriptor::Write(BufferWriter* writer) const {
|
||||||
|
|
||||||
size_t ESDescriptor::ComputeSize() const {
|
size_t ESDescriptor::ComputeSize() const {
|
||||||
// A bit magical. Refer to ESDescriptor::Write for details.
|
// A bit magical. Refer to ESDescriptor::Write for details.
|
||||||
const uint8_t decoder_specific_info_size = decoder_specific_info_.size();
|
const uint8_t decoder_specific_info_size =
|
||||||
|
static_cast<uint8_t>(decoder_specific_info_.size());
|
||||||
const uint8_t decoder_config_size = decoder_specific_info_size + kHeaderSize +
|
const uint8_t decoder_config_size = decoder_specific_info_size + kHeaderSize +
|
||||||
sizeof(uint8_t) * 5 +
|
sizeof(uint8_t) * 5 +
|
||||||
sizeof(uint32_t) * 2;
|
sizeof(uint32_t) * 2;
|
||||||
|
|
|
@ -161,7 +161,8 @@ void VPCodecConfigurationRecord::WriteMP4(std::vector<uint8_t>* data) const {
|
||||||
uint8_t chroma = (chroma_subsampling_ << 4) | (transfer_function_ << 1) |
|
uint8_t chroma = (chroma_subsampling_ << 4) | (transfer_function_ << 1) |
|
||||||
(video_full_range_flag_ ? 1 : 0);
|
(video_full_range_flag_ ? 1 : 0);
|
||||||
writer.AppendInt(chroma);
|
writer.AppendInt(chroma);
|
||||||
uint16_t codec_initialization_data_size = codec_initialization_data_.size();
|
uint16_t codec_initialization_data_size =
|
||||||
|
static_cast<uint16_t>(codec_initialization_data_.size());
|
||||||
writer.AppendInt(codec_initialization_data_size);
|
writer.AppendInt(codec_initialization_data_size);
|
||||||
writer.AppendVector(codec_initialization_data_);
|
writer.AppendVector(codec_initialization_data_);
|
||||||
writer.SwapBuffer(data);
|
writer.SwapBuffer(data);
|
||||||
|
|
|
@ -65,7 +65,8 @@ class VodMediaInfoDumpMuxerListenerTest : public ::testing::Test {
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
||||||
DLOG(INFO) << "Created temp file: " << temp_file_path_.value();
|
DLOG(INFO) << "Created temp file: " << temp_file_path_.value();
|
||||||
|
|
||||||
listener_.reset(new VodMediaInfoDumpMuxerListener(temp_file_path_.value()));
|
listener_.reset(new VodMediaInfoDumpMuxerListener(temp_file_path_
|
||||||
|
.AsUTF8Unsafe()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TearDown() override {
|
void TearDown() override {
|
||||||
|
@ -106,7 +107,7 @@ class VodMediaInfoDumpMuxerListenerTest : public ::testing::Test {
|
||||||
|
|
||||||
void ExpectTempFileToEqual(const std::string& expected_protobuf) {
|
void ExpectTempFileToEqual(const std::string& expected_protobuf) {
|
||||||
std::string temp_file_media_info_str;
|
std::string temp_file_media_info_str;
|
||||||
ASSERT_TRUE(File::ReadFileToString(temp_file_path_.value().c_str(),
|
ASSERT_TRUE(File::ReadFileToString(temp_file_path_.AsUTF8Unsafe().c_str(),
|
||||||
&temp_file_media_info_str));
|
&temp_file_media_info_str));
|
||||||
ASSERT_TRUE(!temp_file_media_info_str.empty());
|
ASSERT_TRUE(!temp_file_media_info_str.empty());
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,11 @@ DEFINE_uint64(io_block_size,
|
||||||
2ULL << 20,
|
2ULL << 20,
|
||||||
"Size of the block size used for threaded I/O, in bytes.");
|
"Size of the block size used for threaded I/O, in bytes.");
|
||||||
|
|
||||||
|
// Needed for Windows weirdness which somewhere defines CopyFile as CopyFileW.
|
||||||
|
#ifdef CopyFile
|
||||||
|
#undef CopyFile
|
||||||
|
#endif // CopyFile
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@ const int kDataSize = 1024;
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
|
using base::FilePath;
|
||||||
|
|
||||||
class LocalFileTest : public testing::Test {
|
class LocalFileTest : public testing::Test {
|
||||||
protected:
|
protected:
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
|
@ -29,7 +31,7 @@ class LocalFileTest : public testing::Test {
|
||||||
|
|
||||||
// Test file path for file_util API.
|
// Test file path for file_util API.
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&test_file_path_));
|
ASSERT_TRUE(base::CreateTemporaryFile(&test_file_path_));
|
||||||
local_file_name_no_prefix_ = test_file_path_.value();
|
local_file_name_no_prefix_ = test_file_path_.AsUTF8Unsafe();
|
||||||
|
|
||||||
// Local file name with prefix for File API.
|
// Local file name with prefix for File API.
|
||||||
local_file_name_ = kLocalFilePrefix;
|
local_file_name_ = kLocalFilePrefix;
|
||||||
|
@ -38,13 +40,14 @@ class LocalFileTest : public testing::Test {
|
||||||
|
|
||||||
void TearDown() override {
|
void TearDown() override {
|
||||||
// Remove test file if created.
|
// Remove test file if created.
|
||||||
base::DeleteFile(base::FilePath(local_file_name_no_prefix_), false);
|
base::DeleteFile(FilePath::FromUTF8Unsafe(local_file_name_no_prefix_),
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string data_;
|
std::string data_;
|
||||||
|
|
||||||
// Path to the temporary file for this test.
|
// Path to the temporary file for this test.
|
||||||
base::FilePath test_file_path_;
|
FilePath test_file_path_;
|
||||||
// Same as |test_file_path_| but in string form.
|
// Same as |test_file_path_| but in string form.
|
||||||
std::string local_file_name_no_prefix_;
|
std::string local_file_name_no_prefix_;
|
||||||
|
|
||||||
|
@ -54,7 +57,8 @@ class LocalFileTest : public testing::Test {
|
||||||
|
|
||||||
TEST_F(LocalFileTest, ReadNotExist) {
|
TEST_F(LocalFileTest, ReadNotExist) {
|
||||||
// Remove test file if it exists.
|
// Remove test file if it exists.
|
||||||
base::DeleteFile(base::FilePath(local_file_name_no_prefix_), false);
|
base::DeleteFile(FilePath::FromUTF8Unsafe(local_file_name_no_prefix_),
|
||||||
|
false);
|
||||||
ASSERT_TRUE(File::Open(local_file_name_.c_str(), "r") == NULL);
|
ASSERT_TRUE(File::Open(local_file_name_.c_str(), "r") == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,13 +72,16 @@ TEST_F(LocalFileTest, Copy) {
|
||||||
ASSERT_EQ(kDataSize,
|
ASSERT_EQ(kDataSize,
|
||||||
base::WriteFile(test_file_path_, data_.data(), kDataSize));
|
base::WriteFile(test_file_path_, data_.data(), kDataSize));
|
||||||
|
|
||||||
base::FilePath temp_dir;
|
FilePath temp_dir;
|
||||||
ASSERT_TRUE(base::CreateNewTempDirectory("", &temp_dir));
|
ASSERT_TRUE(base::CreateNewTempDirectory(FilePath::StringType(),
|
||||||
|
&temp_dir));
|
||||||
|
|
||||||
// Copy the test file to temp dir as filename "a".
|
// Copy the test file to temp dir as filename "a".
|
||||||
base::FilePath destination = temp_dir.Append("a");
|
FilePath destination =
|
||||||
|
temp_dir.Append(FilePath::FromUTF8Unsafe("a"));
|
||||||
ASSERT_TRUE(
|
ASSERT_TRUE(
|
||||||
File::Copy(local_file_name_.c_str(), destination.value().c_str()));
|
File::Copy(FilePath::FromUTF8Unsafe(local_file_name_).AsUTF8Unsafe().c_str(),
|
||||||
|
destination.AsUTF8Unsafe().c_str()));
|
||||||
|
|
||||||
// Make a buffer bigger than the expected file content size to make sure that
|
// Make a buffer bigger than the expected file content size to make sure that
|
||||||
// there isn't extra stuff appended.
|
// there isn't extra stuff appended.
|
||||||
|
|
|
@ -7,15 +7,25 @@
|
||||||
#include "packager/media/file/local_file.h"
|
#include "packager/media/file/local_file.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif // defined(OS_WIN)
|
||||||
#include "packager/base/files/file_util.h"
|
#include "packager/base/files/file_util.h"
|
||||||
#include "packager/base/logging.h"
|
#include "packager/base/logging.h"
|
||||||
|
|
||||||
namespace shaka {
|
namespace shaka {
|
||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
|
// Always open files in binary mode.
|
||||||
|
const char kAdditionalFileMode[] = "b";
|
||||||
|
|
||||||
LocalFile::LocalFile(const char* file_name, const char* mode)
|
LocalFile::LocalFile(const char* file_name, const char* mode)
|
||||||
: File(file_name), file_mode_(mode), internal_file_(NULL) {}
|
: File(file_name),
|
||||||
|
file_mode_(mode),
|
||||||
|
internal_file_(NULL) {
|
||||||
|
if (file_mode_.find(kAdditionalFileMode) == std::string::npos)
|
||||||
|
file_mode_ += kAdditionalFileMode;
|
||||||
|
}
|
||||||
|
|
||||||
bool LocalFile::Close() {
|
bool LocalFile::Close() {
|
||||||
bool result = true;
|
bool result = true;
|
||||||
|
@ -49,7 +59,8 @@ int64_t LocalFile::Size() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t file_size;
|
int64_t file_size;
|
||||||
if (!base::GetFileSize(base::FilePath(file_name()), &file_size)) {
|
if (!base::GetFileSize(base::FilePath::FromUTF8Unsafe(file_name()),
|
||||||
|
&file_size)) {
|
||||||
LOG(ERROR) << "Cannot get file size.";
|
LOG(ERROR) << "Cannot get file size.";
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -62,14 +73,23 @@ bool LocalFile::Flush() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalFile::Seek(uint64_t position) {
|
bool LocalFile::Seek(uint64_t position) {
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
return _fseeki64(internal_file_, static_cast<__int64>(position),
|
||||||
|
SEEK_SET) == 0;
|
||||||
|
#else
|
||||||
return fseeko(internal_file_, position, SEEK_SET) >= 0;
|
return fseeko(internal_file_, position, SEEK_SET) >= 0;
|
||||||
|
#endif // !defined(OS_WIN)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalFile::Tell(uint64_t* position) {
|
bool LocalFile::Tell(uint64_t* position) {
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
__int64 offset = _ftelli64(internal_file_);
|
||||||
|
#else
|
||||||
off_t offset = ftello(internal_file_);
|
off_t offset = ftello(internal_file_);
|
||||||
|
#endif // !defined(OS_WIN)
|
||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
return false;
|
return false;
|
||||||
*position = offset;
|
*position = static_cast<uint64_t>(offset);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,12 +97,12 @@ LocalFile::~LocalFile() {}
|
||||||
|
|
||||||
bool LocalFile::Open() {
|
bool LocalFile::Open() {
|
||||||
internal_file_ =
|
internal_file_ =
|
||||||
base::OpenFile(base::FilePath(file_name()), file_mode_.c_str());
|
base::OpenFile(base::FilePath::FromUTF8Unsafe(file_name()), file_mode_.c_str());
|
||||||
return (internal_file_ != NULL);
|
return (internal_file_ != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalFile::Delete(const char* file_name) {
|
bool LocalFile::Delete(const char* file_name) {
|
||||||
return base::DeleteFile(base::FilePath(file_name), false);
|
return base::DeleteFile(base::FilePath::FromUTF8Unsafe(file_name), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
|
|
|
@ -171,7 +171,7 @@ void EsParserH26xTest::RunTest(const H265NaluType* types,
|
||||||
cur_sample_data.push_back(0);
|
cur_sample_data.push_back(0);
|
||||||
cur_sample_data.push_back(0);
|
cur_sample_data.push_back(0);
|
||||||
cur_sample_data.push_back(0);
|
cur_sample_data.push_back(0);
|
||||||
cur_sample_data.push_back(es_data.size());
|
cur_sample_data.push_back(static_cast<uint8_t>(es_data.size()));
|
||||||
cur_sample_data.insert(cur_sample_data.end(), es_data.begin(),
|
cur_sample_data.insert(cur_sample_data.end(), es_data.begin(),
|
||||||
es_data.end());
|
es_data.end());
|
||||||
es_data.insert(es_data.begin(), kStartCode,
|
es_data.insert(es_data.begin(), kStartCode,
|
||||||
|
|
|
@ -378,7 +378,7 @@ bool AacProgramMapTableWriter::EncryptedSegmentPmtWithParameters(
|
||||||
// -12 because there are 12 bytes between 'descriptor_length' in
|
// -12 because there are 12 bytes between 'descriptor_length' in
|
||||||
// registration_descriptor and 'setup_data_length' in audio_setup_information.
|
// registration_descriptor and 'setup_data_length' in audio_setup_information.
|
||||||
if (aac_audio_specific_config_.size() >
|
if (aac_audio_specific_config_.size() >
|
||||||
std::numeric_limits<uint8_t>::max() - 12) {
|
std::numeric_limits<uint8_t>::max() - 12U) {
|
||||||
LOG(ERROR) << "AACAudioSpecificConfig of size: "
|
LOG(ERROR) << "AACAudioSpecificConfig of size: "
|
||||||
<< aac_audio_specific_config_.size()
|
<< aac_audio_specific_config_.size()
|
||||||
<< " will not fit in the descriptor.";
|
<< " will not fit in the descriptor.";
|
||||||
|
|
|
@ -108,7 +108,8 @@ class TsWriterTest : public ::testing::Test {
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
base::CreateTemporaryFile(&test_file_path_);
|
base::CreateTemporaryFile(&test_file_path_);
|
||||||
// TODO(rkuroiwa): Use memory file prefix once its exposed.
|
// TODO(rkuroiwa): Use memory file prefix once its exposed.
|
||||||
test_file_name_ = kLocalFilePrefix + test_file_path_.value();
|
test_file_name_ =
|
||||||
|
std::string(kLocalFilePrefix) + test_file_path_.AsUTF8Unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TearDown() override {
|
void TearDown() override {
|
||||||
|
|
|
@ -46,7 +46,7 @@ const size_t kInvalidIvSize = 1;
|
||||||
// According to ISO/IEC FDIS 23001-7: CENC spec, IV should be either
|
// According to ISO/IEC FDIS 23001-7: CENC spec, IV should be either
|
||||||
// 64-bit (8-byte) or 128-bit (16-byte).
|
// 64-bit (8-byte) or 128-bit (16-byte).
|
||||||
// |per_sample_iv_size| of 0 means constant_iv is used.
|
// |per_sample_iv_size| of 0 means constant_iv is used.
|
||||||
bool IsIvSizeValid(size_t per_sample_iv_size) {
|
bool IsIvSizeValid(uint8_t per_sample_iv_size) {
|
||||||
return per_sample_iv_size == 0 || per_sample_iv_size == 8 ||
|
return per_sample_iv_size == 0 || per_sample_iv_size == 8 ||
|
||||||
per_sample_iv_size == 16;
|
per_sample_iv_size == 16;
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,7 @@ bool SampleEncryptionEntry::ReadWrite(uint8_t iv_size,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t subsample_count = subsamples.size();
|
uint16_t subsample_count = static_cast<uint16_t>(subsamples.size());
|
||||||
RCHECK(buffer->ReadWriteUInt16(&subsample_count));
|
RCHECK(buffer->ReadWriteUInt16(&subsample_count));
|
||||||
RCHECK(subsample_count > 0);
|
RCHECK(subsample_count > 0);
|
||||||
subsamples.resize(subsample_count);
|
subsamples.resize(subsample_count);
|
||||||
|
@ -289,7 +289,7 @@ bool SampleEncryptionEntry::ParseFromBuffer(uint8_t iv_size,
|
||||||
|
|
||||||
uint32_t SampleEncryptionEntry::ComputeSize() const {
|
uint32_t SampleEncryptionEntry::ComputeSize() const {
|
||||||
const uint32_t subsample_entry_size = sizeof(uint16_t) + sizeof(uint32_t);
|
const uint32_t subsample_entry_size = sizeof(uint16_t) + sizeof(uint32_t);
|
||||||
const uint16_t subsample_count = subsamples.size();
|
const uint16_t subsample_count = static_cast<uint16_t>(subsamples.size());
|
||||||
return initialization_vector.size() +
|
return initialization_vector.size() +
|
||||||
(subsample_count > 0 ? (sizeof(subsample_count) +
|
(subsample_count > 0 ? (sizeof(subsample_count) +
|
||||||
subsample_entry_size * subsample_count)
|
subsample_entry_size * subsample_count)
|
||||||
|
@ -331,7 +331,7 @@ bool SampleEncryption::ReadWriteInternal(BoxBuffer* buffer) {
|
||||||
sample_encryption_entries.resize(sample_count);
|
sample_encryption_entries.resize(sample_count);
|
||||||
for (auto& sample_encryption_entry : sample_encryption_entries) {
|
for (auto& sample_encryption_entry : sample_encryption_entries) {
|
||||||
RCHECK(sample_encryption_entry.ReadWrite(
|
RCHECK(sample_encryption_entry.ReadWrite(
|
||||||
iv_size, flags & kUseSubsampleEncryption, buffer));
|
iv_size, (flags & kUseSubsampleEncryption) != 0, buffer) != 0);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -357,7 +357,7 @@ uint32_t SampleEncryption::ComputeSizeInternal() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SampleEncryption::ParseFromSampleEncryptionData(
|
bool SampleEncryption::ParseFromSampleEncryptionData(
|
||||||
size_t iv_size,
|
uint8_t iv_size,
|
||||||
std::vector<SampleEncryptionEntry>* sample_encryption_entries) const {
|
std::vector<SampleEncryptionEntry>* sample_encryption_entries) const {
|
||||||
DCHECK(IsIvSizeValid(iv_size));
|
DCHECK(IsIvSizeValid(iv_size));
|
||||||
|
|
||||||
|
@ -369,7 +369,7 @@ bool SampleEncryption::ParseFromSampleEncryptionData(
|
||||||
sample_encryption_entries->resize(sample_count);
|
sample_encryption_entries->resize(sample_count);
|
||||||
for (auto& sample_encryption_entry : *sample_encryption_entries) {
|
for (auto& sample_encryption_entry : *sample_encryption_entries) {
|
||||||
RCHECK(sample_encryption_entry.ParseFromBuffer(
|
RCHECK(sample_encryption_entry.ParseFromBuffer(
|
||||||
iv_size, flags & kUseSubsampleEncryption, &reader));
|
iv_size, (flags & kUseSubsampleEncryption) != 0, &reader) != 0);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -439,7 +439,8 @@ bool TrackEncryption::ReadWriteInternal(BoxBuffer* buffer) {
|
||||||
|
|
||||||
if (default_is_protected == 1) {
|
if (default_is_protected == 1) {
|
||||||
if (default_per_sample_iv_size == 0) { // For constant iv.
|
if (default_per_sample_iv_size == 0) { // For constant iv.
|
||||||
uint8_t default_constant_iv_size = default_constant_iv.size();
|
uint8_t default_constant_iv_size =
|
||||||
|
static_cast<uint8_t>(default_constant_iv.size());
|
||||||
RCHECK(buffer->ReadWriteUInt8(&default_constant_iv_size));
|
RCHECK(buffer->ReadWriteUInt8(&default_constant_iv_size));
|
||||||
RCHECK(default_constant_iv_size == 8 || default_constant_iv_size == 16);
|
RCHECK(default_constant_iv_size == 8 || default_constant_iv_size == 16);
|
||||||
RCHECK(buffer->ReadWriteVector(&default_constant_iv,
|
RCHECK(buffer->ReadWriteVector(&default_constant_iv,
|
||||||
|
@ -960,7 +961,7 @@ bool CencSampleEncryptionInfoEntry::ReadWrite(BoxBuffer* buffer) {
|
||||||
|
|
||||||
if (is_protected == 1) {
|
if (is_protected == 1) {
|
||||||
if (per_sample_iv_size == 0) { // For constant iv.
|
if (per_sample_iv_size == 0) { // For constant iv.
|
||||||
uint8_t constant_iv_size = constant_iv.size();
|
uint8_t constant_iv_size = static_cast<uint8_t>(constant_iv.size());
|
||||||
RCHECK(buffer->ReadWriteUInt8(&constant_iv_size));
|
RCHECK(buffer->ReadWriteUInt8(&constant_iv_size));
|
||||||
RCHECK(constant_iv_size == 8 || constant_iv_size == 16);
|
RCHECK(constant_iv_size == 8 || constant_iv_size == 16);
|
||||||
RCHECK(buffer->ReadWriteVector(&constant_iv, constant_iv_size));
|
RCHECK(buffer->ReadWriteVector(&constant_iv, constant_iv_size));
|
||||||
|
@ -2369,7 +2370,7 @@ bool TrackFragmentRun::ReadWriteInternal(BoxBuffer* buffer) {
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t first_sample_flags;
|
uint32_t first_sample_flags(0);
|
||||||
|
|
||||||
if (buffer->Reading()) {
|
if (buffer->Reading()) {
|
||||||
if (first_sample_flags_present)
|
if (first_sample_flags_present)
|
||||||
|
@ -2541,7 +2542,7 @@ bool SegmentIndex::ReadWriteInternal(BoxBuffer* buffer) {
|
||||||
buffer->ReadWriteUInt64NBytes(&earliest_presentation_time, num_bytes) &&
|
buffer->ReadWriteUInt64NBytes(&earliest_presentation_time, num_bytes) &&
|
||||||
buffer->ReadWriteUInt64NBytes(&first_offset, num_bytes));
|
buffer->ReadWriteUInt64NBytes(&first_offset, num_bytes));
|
||||||
|
|
||||||
uint16_t reference_count = references.size();
|
uint16_t reference_count = static_cast<uint16_t>(references.size());
|
||||||
RCHECK(buffer->IgnoreBytes(2) && // reserved.
|
RCHECK(buffer->IgnoreBytes(2) && // reserved.
|
||||||
buffer->ReadWriteUInt16(&reference_count));
|
buffer->ReadWriteUInt16(&reference_count));
|
||||||
references.resize(reference_count);
|
references.resize(reference_count);
|
||||||
|
|
|
@ -117,14 +117,14 @@ struct SampleEncryption : FullBox {
|
||||||
/// entries.
|
/// entries.
|
||||||
/// @return true on success, false otherwise.
|
/// @return true on success, false otherwise.
|
||||||
bool ParseFromSampleEncryptionData(
|
bool ParseFromSampleEncryptionData(
|
||||||
size_t iv_size,
|
uint8_t iv_size,
|
||||||
std::vector<SampleEncryptionEntry>* sample_encryption_entries) const;
|
std::vector<SampleEncryptionEntry>* sample_encryption_entries) const;
|
||||||
|
|
||||||
/// We may not know @a iv_size before reading this box. In this case, we will
|
/// We may not know @a iv_size before reading this box. In this case, we will
|
||||||
/// store sample encryption data for parsing later when @a iv_size is known.
|
/// store sample encryption data for parsing later when @a iv_size is known.
|
||||||
std::vector<uint8_t> sample_encryption_data;
|
std::vector<uint8_t> sample_encryption_data;
|
||||||
|
|
||||||
size_t iv_size;
|
uint8_t iv_size;
|
||||||
std::vector<SampleEncryptionEntry> sample_encryption_entries;
|
std::vector<SampleEncryptionEntry> sample_encryption_entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -452,7 +452,7 @@ class BoxDefinitionsTestGeneral : public testing::Test {
|
||||||
|
|
||||||
void Modify(WebVTTConfigurationBox* vttc) {
|
void Modify(WebVTTConfigurationBox* vttc) {
|
||||||
vttc->config = "WEBVTT\n"
|
vttc->config = "WEBVTT\n"
|
||||||
"Region: id=someting width=40\% lines=3";
|
"Region: id=someting width=40% lines=3";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fill(WebVTTSourceLabelBox* vlab) {
|
void Fill(WebVTTSourceLabelBox* vlab) {
|
||||||
|
|
|
@ -173,8 +173,9 @@ void EncryptingFragmenter::FinalizeFragmentForEncryption() {
|
||||||
traf()->auxiliary_offset.offsets.push_back(0);
|
traf()->auxiliary_offset.offsets.push_back(0);
|
||||||
|
|
||||||
// For 'cbcs' scheme, Constant IVs SHALL be used.
|
// For 'cbcs' scheme, Constant IVs SHALL be used.
|
||||||
const size_t per_sample_iv_size =
|
const uint8_t per_sample_iv_size =
|
||||||
(protection_scheme_ == FOURCC_cbcs) ? 0 : encryptor_->iv().size();
|
(protection_scheme_ == FOURCC_cbcs) ? 0 :
|
||||||
|
static_cast<uint8_t>(encryptor_->iv().size());
|
||||||
traf()->sample_encryption.iv_size = per_sample_iv_size;
|
traf()->sample_encryption.iv_size = per_sample_iv_size;
|
||||||
|
|
||||||
// Optimize saiz box.
|
// Optimize saiz box.
|
||||||
|
@ -189,7 +190,7 @@ void EncryptingFragmenter::FinalizeFragmentForEncryption() {
|
||||||
// |sample_info_sizes| table is filled in only for subsample encryption,
|
// |sample_info_sizes| table is filled in only for subsample encryption,
|
||||||
// otherwise |sample_info_size| is just the IV size.
|
// otherwise |sample_info_size| is just the IV size.
|
||||||
DCHECK(!IsSubsampleEncryptionRequired());
|
DCHECK(!IsSubsampleEncryptionRequired());
|
||||||
saiz.default_sample_info_size = per_sample_iv_size;
|
saiz.default_sample_info_size = static_cast<uint8_t>(per_sample_iv_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// It should only happen with full sample encryption + constant iv, i.e.
|
// It should only happen with full sample encryption + constant iv, i.e.
|
||||||
|
@ -266,7 +267,8 @@ Status EncryptingFragmenter::EncryptSample(scoped_refptr<MediaSample> sample) {
|
||||||
const bool is_superframe = vpx_frames.size() > 1;
|
const bool is_superframe = vpx_frames.size() > 1;
|
||||||
for (const VPxFrameInfo& frame : vpx_frames) {
|
for (const VPxFrameInfo& frame : vpx_frames) {
|
||||||
SubsampleEntry subsample;
|
SubsampleEntry subsample;
|
||||||
subsample.clear_bytes = frame.uncompressed_header_size;
|
subsample.clear_bytes =
|
||||||
|
static_cast<uint16_t>(frame.uncompressed_header_size);
|
||||||
subsample.cipher_bytes =
|
subsample.cipher_bytes =
|
||||||
frame.frame_size - frame.uncompressed_header_size;
|
frame.frame_size - frame.uncompressed_header_size;
|
||||||
|
|
||||||
|
@ -296,7 +298,7 @@ Status EncryptingFragmenter::EncryptSample(scoped_refptr<MediaSample> sample) {
|
||||||
DCHECK_LE(index_size, 2 + vpx_frames.size() * 4);
|
DCHECK_LE(index_size, 2 + vpx_frames.size() * 4);
|
||||||
DCHECK_GE(index_size, 2 + vpx_frames.size() * 1);
|
DCHECK_GE(index_size, 2 + vpx_frames.size() * 1);
|
||||||
SubsampleEntry subsample;
|
SubsampleEntry subsample;
|
||||||
subsample.clear_bytes = index_size;
|
subsample.clear_bytes = static_cast<uint16_t>(index_size);
|
||||||
subsample.cipher_bytes = 0;
|
subsample.cipher_bytes = 0;
|
||||||
sample_encryption_entry.subsamples.push_back(subsample);
|
sample_encryption_entry.subsamples.push_back(subsample);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ Status KeyRotationFragmenter::PrepareFragmentForEncryption(
|
||||||
bool enable_encryption) {
|
bool enable_encryption) {
|
||||||
bool need_to_refresh_encryptor = !encryptor();
|
bool need_to_refresh_encryptor = !encryptor();
|
||||||
|
|
||||||
size_t current_crypto_period_index =
|
int64_t current_crypto_period_index =
|
||||||
traf()->decode_time.decode_time / crypto_period_duration_;
|
traf()->decode_time.decode_time / crypto_period_duration_;
|
||||||
if (current_crypto_period_index != prev_crypto_period_index_) {
|
if (current_crypto_period_index != prev_crypto_period_index_) {
|
||||||
scoped_ptr<EncryptionKey> encryption_key(new EncryptionKey());
|
scoped_ptr<EncryptionKey> encryption_key(new EncryptionKey());
|
||||||
|
@ -123,7 +123,8 @@ Status KeyRotationFragmenter::PrepareFragmentForEncryption(
|
||||||
sample_group_entry.per_sample_iv_size = 0;
|
sample_group_entry.per_sample_iv_size = 0;
|
||||||
sample_group_entry.constant_iv = encryptor()->iv();
|
sample_group_entry.constant_iv = encryptor()->iv();
|
||||||
} else {
|
} else {
|
||||||
sample_group_entry.per_sample_iv_size = encryptor()->iv().size();
|
sample_group_entry.per_sample_iv_size =
|
||||||
|
static_cast<uint8_t>(encryptor()->iv().size());
|
||||||
}
|
}
|
||||||
sample_group_entry.crypt_byte_block = crypt_byte_block();
|
sample_group_entry.crypt_byte_block = crypt_byte_block();
|
||||||
sample_group_entry.skip_byte_block = skip_byte_block();
|
sample_group_entry.skip_byte_block = skip_byte_block();
|
||||||
|
|
|
@ -66,7 +66,7 @@ class KeyRotationFragmenter : public EncryptingFragmenter {
|
||||||
KeySource* encryption_key_source_;
|
KeySource* encryption_key_source_;
|
||||||
KeySource::TrackType track_type_;
|
KeySource::TrackType track_type_;
|
||||||
const int64_t crypto_period_duration_;
|
const int64_t crypto_period_duration_;
|
||||||
size_t prev_crypto_period_index_;
|
int64_t prev_crypto_period_index_;
|
||||||
|
|
||||||
// For notifying new pssh boxes to the event handler.
|
// For notifying new pssh boxes to the event handler.
|
||||||
MuxerListener* const muxer_listener_;
|
MuxerListener* const muxer_listener_;
|
||||||
|
|
|
@ -99,7 +99,7 @@ class MP4MediaParserTest : public testing::Test {
|
||||||
|
|
||||||
bool ParseMP4File(const std::string& filename, int append_bytes) {
|
bool ParseMP4File(const std::string& filename, int append_bytes) {
|
||||||
InitializeParser(NULL);
|
InitializeParser(NULL);
|
||||||
if (!parser_->LoadMoov(GetTestDataFilePath(filename).value()))
|
if (!parser_->LoadMoov(GetTestDataFilePath(filename).AsUTF8Unsafe()))
|
||||||
return false;
|
return false;
|
||||||
std::vector<uint8_t> buffer = ReadTestDataFile(filename);
|
std::vector<uint8_t> buffer = ReadTestDataFile(filename);
|
||||||
return AppendDataInPieces(buffer.data(), buffer.size(), append_bytes);
|
return AppendDataInPieces(buffer.data(), buffer.size(), append_bytes);
|
||||||
|
|
|
@ -304,8 +304,8 @@ void MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info,
|
||||||
// values.
|
// values.
|
||||||
const uint64_t kNanosecondsPerSecond = 1000000000ull;
|
const uint64_t kNanosecondsPerSecond = 1000000000ull;
|
||||||
sample_group_description.audio_roll_recovery_entries[0].roll_distance =
|
sample_group_description.audio_roll_recovery_entries[0].roll_distance =
|
||||||
-(audio_info->seek_preroll_ns() * audio.samplerate +
|
(0 - (audio_info->seek_preroll_ns() * audio.samplerate +
|
||||||
kNanosecondsPerSecond / 2) /
|
kNanosecondsPerSecond / 2)) /
|
||||||
kNanosecondsPerSecond;
|
kNanosecondsPerSecond;
|
||||||
|
|
||||||
sample_table.sample_to_groups.resize(1);
|
sample_table.sample_to_groups.resize(1);
|
||||||
|
|
|
@ -102,7 +102,8 @@ void GenerateSinf(const EncryptionKey& encryption_key,
|
||||||
track_encryption.default_per_sample_iv_size = 0;
|
track_encryption.default_per_sample_iv_size = 0;
|
||||||
track_encryption.default_constant_iv = encryption_key.iv;
|
track_encryption.default_constant_iv = encryption_key.iv;
|
||||||
} else {
|
} else {
|
||||||
track_encryption.default_per_sample_iv_size = encryption_key.iv.size();
|
track_encryption.default_per_sample_iv_size =
|
||||||
|
static_cast<uint8_t>(encryption_key.iv.size());
|
||||||
}
|
}
|
||||||
track_encryption.default_crypt_byte_block = pattern.crypt_byte_block;
|
track_encryption.default_crypt_byte_block = pattern.crypt_byte_block;
|
||||||
track_encryption.default_skip_byte_block = pattern.skip_byte_block;
|
track_encryption.default_skip_byte_block = pattern.skip_byte_block;
|
||||||
|
|
|
@ -83,10 +83,11 @@ Status SingleSegmentSegmenter::DoInitialize() {
|
||||||
LOG(ERROR) << "Failed to create temporary file.";
|
LOG(ERROR) << "Failed to create temporary file.";
|
||||||
return Status(error::FILE_FAILURE, "Unable to create temporary file.");
|
return Status(error::FILE_FAILURE, "Unable to create temporary file.");
|
||||||
}
|
}
|
||||||
temp_file_name_ = temp_file_path.value();
|
temp_file_name_ = temp_file_path.AsUTF8Unsafe();
|
||||||
} else {
|
} else {
|
||||||
temp_file_name_ =
|
temp_file_name_ =
|
||||||
base::FilePath(options().temp_dir).Append(TempFileName()).value();
|
base::FilePath::FromUTF8Unsafe(options().temp_dir)
|
||||||
|
.Append(base::FilePath::FromUTF8Unsafe(TempFileName())).AsUTF8Unsafe();
|
||||||
}
|
}
|
||||||
temp_file_.reset(File::Open(temp_file_name_.c_str(), "w"));
|
temp_file_.reset(File::Open(temp_file_name_.c_str(), "w"));
|
||||||
return temp_file_
|
return temp_file_
|
||||||
|
|
|
@ -57,7 +57,7 @@ int64_t MkvWriter::WriteFromFile(File* source) {
|
||||||
return WriteFromFile(source, kWholeFile);
|
return WriteFromFile(source, kWholeFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t MkvWriter::WriteFromFile(File* source, uint64_t max_copy) {
|
int64_t MkvWriter::WriteFromFile(File* source, int64_t max_copy) {
|
||||||
DCHECK(file_);
|
DCHECK(file_);
|
||||||
|
|
||||||
const int64_t size = File::CopyFile(source, file_.get(), max_copy);
|
const int64_t size = File::CopyFile(source, file_.get(), max_copy);
|
||||||
|
|
|
@ -56,7 +56,7 @@ class MkvWriter : public mkvmuxer::IMkvWriter {
|
||||||
/// Writes the contents of the given file to this file, up to a maximum
|
/// Writes the contents of the given file to this file, up to a maximum
|
||||||
/// number of bytes. If @a max_copy is negative, will copy to EOF.
|
/// number of bytes. If @a max_copy is negative, will copy to EOF.
|
||||||
/// @return The number of bytes written; or < 0 on error.
|
/// @return The number of bytes written; or < 0 on error.
|
||||||
int64_t WriteFromFile(File* source, uint64_t max_copy);
|
int64_t WriteFromFile(File* source, int64_t max_copy);
|
||||||
|
|
||||||
File* file() { return file_.get(); }
|
File* file() { return file_.get(); }
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ std::string TempFileName(const MuxerOptions& options) {
|
||||||
}
|
}
|
||||||
std::string file_prefix =
|
std::string file_prefix =
|
||||||
base::StringPrintf("packager-tempfile-%x-%" PRIx64 ".tmp", tid, rand);
|
base::StringPrintf("packager-tempfile-%x-%" PRIx64 ".tmp", tid, rand);
|
||||||
return base::FilePath(options.temp_dir).Append(file_prefix).value();
|
return base::FilePath::FromUTF8Unsafe(options.temp_dir).Append(
|
||||||
|
base::FilePath::FromUTF8Unsafe(file_prefix)).AsUTF8Unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skips a given number of bytes in a file by reading. This allows
|
// Skips a given number of bytes in a file by reading. This allows
|
||||||
|
|
|
@ -88,7 +88,7 @@ class WvmMediaParserTest : public testing::Test {
|
||||||
int video_frame_count_;
|
int video_frame_count_;
|
||||||
int encrypted_sample_count_;
|
int encrypted_sample_count_;
|
||||||
int64_t video_max_dts_;
|
int64_t video_max_dts_;
|
||||||
uint32_t current_track_id_;
|
int32_t current_track_id_;
|
||||||
EncryptionKey encryption_key_;
|
EncryptionKey encryption_key_;
|
||||||
|
|
||||||
void OnInit(const std::vector<scoped_refptr<StreamInfo> >& stream_infos) {
|
void OnInit(const std::vector<scoped_refptr<StreamInfo> >& stream_infos) {
|
||||||
|
@ -103,7 +103,7 @@ class WvmMediaParserTest : public testing::Test {
|
||||||
bool OnNewSample(uint32_t track_id,
|
bool OnNewSample(uint32_t track_id,
|
||||||
const scoped_refptr<MediaSample>& sample) {
|
const scoped_refptr<MediaSample>& sample) {
|
||||||
std::string stream_type;
|
std::string stream_type;
|
||||||
if (track_id != current_track_id_) {
|
if (static_cast<int32_t>(track_id) != current_track_id_) {
|
||||||
// onto next track.
|
// onto next track.
|
||||||
video_max_dts_ = kNoTimestamp;
|
video_max_dts_ = kNoTimestamp;
|
||||||
current_track_id_ = track_id;
|
current_track_id_ = track_id;
|
||||||
|
|
|
@ -87,7 +87,8 @@ class PackagerTestBasic : public ::testing::TestWithParam<const char*> {
|
||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
// Create a test directory for testing, will be deleted after test.
|
// Create a test directory for testing, will be deleted after test.
|
||||||
ASSERT_TRUE(base::CreateNewTempDirectory("packager_", &test_directory_));
|
ASSERT_TRUE(base::CreateNewTempDirectory(
|
||||||
|
base::FilePath::FromUTF8Unsafe("packager_").value(), &test_directory_));
|
||||||
|
|
||||||
// Copy the input to test directory for easy reference.
|
// Copy the input to test directory for easy reference.
|
||||||
ASSERT_TRUE(base::CopyFile(GetTestDataFilePath(GetParam()),
|
ASSERT_TRUE(base::CopyFile(GetTestDataFilePath(GetParam()),
|
||||||
|
@ -118,7 +119,8 @@ class PackagerTestBasic : public ::testing::TestWithParam<const char*> {
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string PackagerTestBasic::GetFullPath(const std::string& file_name) {
|
std::string PackagerTestBasic::GetFullPath(const std::string& file_name) {
|
||||||
return test_directory_.AppendASCII(file_name).value();
|
return test_directory_.Append(
|
||||||
|
base::FilePath::FromUTF8Unsafe(file_name)).AsUTF8Unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PackagerTestBasic::ContentsEqual(const std::string& file1,
|
bool PackagerTestBasic::ContentsEqual(const std::string& file1,
|
||||||
|
@ -140,7 +142,7 @@ MuxerOptions PackagerTestBasic::SetupOptions(const std::string& output,
|
||||||
|
|
||||||
options.output_file_name = GetFullPath(output);
|
options.output_file_name = GetFullPath(output);
|
||||||
options.segment_template = GetFullPath(kSegmentTemplate);
|
options.segment_template = GetFullPath(kSegmentTemplate);
|
||||||
options.temp_dir = test_directory_.value();
|
options.temp_dir = test_directory_.AsUTF8Unsafe();
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,15 +8,27 @@
|
||||||
|
|
||||||
#include "packager/base/at_exit.h"
|
#include "packager/base/at_exit.h"
|
||||||
#include "packager/base/command_line.h"
|
#include "packager/base/command_line.h"
|
||||||
|
#include "packager/base/files/file_path.h"
|
||||||
#include "packager/base/logging.h"
|
#include "packager/base/logging.h"
|
||||||
|
#include "packager/base/path_service.h"
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
base::AtExitManager exit;
|
||||||
|
|
||||||
// Needed to enable VLOG/DVLOG through --vmodule or --v.
|
// Needed to enable VLOG/DVLOG through --vmodule or --v.
|
||||||
base::CommandLine::Init(argc, argv);
|
base::CommandLine::Init(argc, argv);
|
||||||
CHECK(logging::InitLogging(logging::LoggingSettings()));
|
|
||||||
|
|
||||||
base::AtExitManager exit;
|
// Set up logging.
|
||||||
|
logging::LoggingSettings log_settings;
|
||||||
|
base::FilePath log_filename;
|
||||||
|
PathService::Get(base::DIR_EXE, &log_filename);
|
||||||
|
log_filename = log_filename.AppendASCII("test.log");
|
||||||
|
log_settings.logging_dest = logging::LOG_TO_ALL;
|
||||||
|
log_settings.log_file = log_filename.value().c_str();
|
||||||
|
log_settings.delete_old = logging::DELETE_OLD_LOG_FILE;
|
||||||
|
CHECK(logging::InitLogging(log_settings));
|
||||||
|
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ class DashIopMpdNotifierTest
|
||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
||||||
output_path_ = temp_file_path_.value();
|
output_path_ = temp_file_path_.AsUTF8Unsafe();
|
||||||
ON_CALL(*default_mock_adaptation_set_, Group())
|
ON_CALL(*default_mock_adaptation_set_, Group())
|
||||||
.WillByDefault(Return(kDefaultGroupId));
|
.WillByDefault(Return(kDefaultGroupId));
|
||||||
}
|
}
|
||||||
|
|
|
@ -332,8 +332,7 @@ std::string RoleToText(AdaptationSet::Role role) {
|
||||||
case AdaptationSet::kRoleDub:
|
case AdaptationSet::kRoleDub:
|
||||||
return "dub";
|
return "dub";
|
||||||
default:
|
default:
|
||||||
NOTREACHED();
|
break;
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
|
@ -653,8 +652,8 @@ void MpdBuilder::MakePathsRelativeToMpd(const std::string& mpd_path,
|
||||||
: mpd_path;
|
: mpd_path;
|
||||||
|
|
||||||
if (!mpd_file_path.empty()) {
|
if (!mpd_file_path.empty()) {
|
||||||
std::string mpd_dir(
|
std::string mpd_dir(FilePath::FromUTF8Unsafe(mpd_file_path)
|
||||||
FilePath(mpd_file_path).DirName().AsEndingWithSeparator().value());
|
.DirName().AsEndingWithSeparator().AsUTF8Unsafe());
|
||||||
if (!mpd_dir.empty()) {
|
if (!mpd_dir.empty()) {
|
||||||
if (media_info->has_media_file_name()) {
|
if (media_info->has_media_file_name()) {
|
||||||
media_info->set_media_file_name(
|
media_info->set_media_file_name(
|
||||||
|
|
|
@ -194,14 +194,14 @@ class DynamicMpdBuilderTest : public MpdBuilderTest<MpdBuilder::kDynamic> {
|
||||||
|
|
||||||
// Injects a clock that always returns 2016 Jan 11 15:10:24 in UTC.
|
// Injects a clock that always returns 2016 Jan 11 15:10:24 in UTC.
|
||||||
void InjectTestClock() {
|
void InjectTestClock() {
|
||||||
base::Time::Exploded test_time = {.year = 2016,
|
base::Time::Exploded test_time = { 2016, // year.
|
||||||
.month = 1,
|
1, // month
|
||||||
.day_of_week = 1, // Monday.
|
1, // day_of_week = Monday.
|
||||||
.day_of_month = 11,
|
11, // day_of_month
|
||||||
.hour = 15,
|
15, // hour.
|
||||||
.minute = 10,
|
10, // minute.
|
||||||
.second = 24,
|
24, // second.
|
||||||
.millisecond = 0};
|
0 }; // millisecond.
|
||||||
ASSERT_TRUE(test_time.HasValidValues());
|
ASSERT_TRUE(test_time.HasValidValues());
|
||||||
mpd_.InjectClockForTesting(scoped_ptr<base::Clock>(
|
mpd_.InjectClockForTesting(scoped_ptr<base::Clock>(
|
||||||
new TestClock(base::Time::FromUTCExploded(test_time))));
|
new TestClock(base::Time::FromUTCExploded(test_time))));
|
||||||
|
@ -1975,7 +1975,7 @@ TEST_F(StaticMpdBuilderTest, WriteToFile) {
|
||||||
|
|
||||||
base::FilePath file_path;
|
base::FilePath file_path;
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&file_path));
|
ASSERT_TRUE(base::CreateTemporaryFile(&file_path));
|
||||||
media::File* file = media::File::Open(file_path.value().data(), "w");
|
media::File* file = media::File::Open(file_path.AsUTF8Unsafe().c_str(), "w");
|
||||||
ASSERT_TRUE(file);
|
ASSERT_TRUE(file);
|
||||||
ASSERT_TRUE(mpd_.WriteMpdToFile(file));
|
ASSERT_TRUE(mpd_.WriteMpdToFile(file));
|
||||||
ASSERT_TRUE(file->Close());
|
ASSERT_TRUE(file->Close());
|
||||||
|
@ -2472,17 +2472,22 @@ TEST_F(TimeShiftBufferDepthTest, ManySegments) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(RelativePaths, PathsModified) {
|
TEST(RelativePaths, PathsModified) {
|
||||||
const std::string kCommonPath(FilePath("foo").Append("bar").value());
|
const FilePath kCommonPath(
|
||||||
|
FilePath::FromUTF8Unsafe("foo").Append(FilePath::FromUTF8Unsafe("bar")));
|
||||||
const std::string kMediaFileBase("media.mp4");
|
const std::string kMediaFileBase("media.mp4");
|
||||||
const std::string kInitSegmentBase("init.mp4");
|
const std::string kInitSegmentBase("init.mp4");
|
||||||
const std::string kSegmentTemplateBase("segment-$Number$.mp4");
|
const std::string kSegmentTemplateBase("segment-$Number$.mp4");
|
||||||
const std::string kMediaFile(
|
const std::string kMediaFile(
|
||||||
FilePath(kCommonPath).Append(kMediaFileBase).value());
|
kCommonPath.Append(FilePath::FromUTF8Unsafe(kMediaFileBase))
|
||||||
|
.AsUTF8Unsafe());
|
||||||
const std::string kInitSegment(
|
const std::string kInitSegment(
|
||||||
FilePath(kCommonPath).Append(kInitSegmentBase).value());
|
kCommonPath.Append(FilePath::FromUTF8Unsafe(kInitSegmentBase))
|
||||||
|
.AsUTF8Unsafe());
|
||||||
const std::string kSegmentTemplate(
|
const std::string kSegmentTemplate(
|
||||||
FilePath(kCommonPath).Append(kSegmentTemplateBase).value());
|
kCommonPath.Append(FilePath::FromUTF8Unsafe(kSegmentTemplateBase))
|
||||||
const std::string kMpd(FilePath(kCommonPath).Append("media.mpd").value());
|
.AsUTF8Unsafe());
|
||||||
|
const std::string kMpd(
|
||||||
|
kCommonPath.Append(FilePath::FromUTF8Unsafe("media.mpd")).AsUTF8Unsafe());
|
||||||
MediaInfo media_info;
|
MediaInfo media_info;
|
||||||
|
|
||||||
media_info.set_media_file_name(kMediaFile);
|
media_info.set_media_file_name(kMediaFile);
|
||||||
|
@ -2495,18 +2500,24 @@ TEST(RelativePaths, PathsModified) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(RelativePaths, PathsNotModified) {
|
TEST(RelativePaths, PathsNotModified) {
|
||||||
const std::string kMediaCommon(FilePath("foo").Append("bar").value());
|
const FilePath kMediaCommon(
|
||||||
|
FilePath::FromUTF8Unsafe("foo").Append(FilePath::FromUTF8Unsafe("bar")));
|
||||||
const std::string kMediaFileBase("media.mp4");
|
const std::string kMediaFileBase("media.mp4");
|
||||||
const std::string kInitSegmentBase("init.mp4");
|
const std::string kInitSegmentBase("init.mp4");
|
||||||
const std::string kSegmentTemplateBase("segment-$Number$.mp4");
|
const std::string kSegmentTemplateBase("segment-$Number$.mp4");
|
||||||
const std::string kMediaFile(
|
const std::string kMediaFile(
|
||||||
FilePath(kMediaCommon).Append(kMediaFileBase).value());
|
kMediaCommon.Append(FilePath::FromUTF8Unsafe(kMediaFileBase))
|
||||||
|
.AsUTF8Unsafe());
|
||||||
const std::string kInitSegment(
|
const std::string kInitSegment(
|
||||||
FilePath(kMediaCommon).Append(kInitSegmentBase).value());
|
kMediaCommon.Append(FilePath::FromUTF8Unsafe(kInitSegmentBase))
|
||||||
|
.AsUTF8Unsafe());
|
||||||
const std::string kSegmentTemplate(
|
const std::string kSegmentTemplate(
|
||||||
FilePath(kMediaCommon).Append(kSegmentTemplateBase).value());
|
kMediaCommon.Append(FilePath::FromUTF8Unsafe(kSegmentTemplateBase))
|
||||||
const std::string kMpd(
|
.AsUTF8Unsafe());
|
||||||
FilePath("foo").Append("baz").Append("media.mpd").value());
|
const std::string kMpd(FilePath::FromUTF8Unsafe("foo")
|
||||||
|
.Append(FilePath::FromUTF8Unsafe("baz"))
|
||||||
|
.Append(FilePath::FromUTF8Unsafe("media.mpd"))
|
||||||
|
.AsUTF8Unsafe());
|
||||||
MediaInfo media_info;
|
MediaInfo media_info;
|
||||||
|
|
||||||
media_info.set_media_file_name(kMediaFile);
|
media_info.set_media_file_name(kMediaFile);
|
||||||
|
|
|
@ -44,7 +44,7 @@ class SimpleMpdNotifierTest
|
||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path_));
|
||||||
output_path_ = temp_file_path_.value();
|
output_path_ = temp_file_path_.AsUTF8Unsafe();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TearDown() override {
|
void TearDown() override {
|
||||||
|
|
|
@ -78,7 +78,7 @@ bool ValidateMpdSchema(const std::string& mpd) {
|
||||||
xml::scoped_xml_ptr<xmlDoc> schema_as_doc(
|
xml::scoped_xml_ptr<xmlDoc> schema_as_doc(
|
||||||
xmlReadMemory(schema_str.data(),
|
xmlReadMemory(schema_str.data(),
|
||||||
schema_str.size(),
|
schema_str.size(),
|
||||||
schema_path.value().c_str(),
|
schema_path.AsUTF8Unsafe().c_str(),
|
||||||
NULL,
|
NULL,
|
||||||
0));
|
0));
|
||||||
DCHECK(schema_as_doc);
|
DCHECK(schema_as_doc);
|
||||||
|
|
|
@ -92,14 +92,14 @@ TEST_F(MpdWriterTest, WriteMpdToFile) {
|
||||||
GetTestDataFilePath(kFileNameVideoMediaInfo2);
|
GetTestDataFilePath(kFileNameVideoMediaInfo2);
|
||||||
|
|
||||||
SetMpdNotifierFactoryForTest();
|
SetMpdNotifierFactoryForTest();
|
||||||
EXPECT_TRUE(mpd_writer_.AddFile(media_info_file1.value(), ""));
|
EXPECT_TRUE(mpd_writer_.AddFile(media_info_file1.AsUTF8Unsafe(), ""));
|
||||||
EXPECT_TRUE(mpd_writer_.AddFile(media_info_file2.value(), ""));
|
EXPECT_TRUE(mpd_writer_.AddFile(media_info_file2.AsUTF8Unsafe(), ""));
|
||||||
mpd_writer_.AddBaseUrl(kBaseUrl1);
|
mpd_writer_.AddBaseUrl(kBaseUrl1);
|
||||||
mpd_writer_.AddBaseUrl(kBaseUrl2);
|
mpd_writer_.AddBaseUrl(kBaseUrl2);
|
||||||
|
|
||||||
base::FilePath mpd_file_path;
|
base::FilePath mpd_file_path;
|
||||||
ASSERT_TRUE(base::CreateTemporaryFile(&mpd_file_path));
|
ASSERT_TRUE(base::CreateTemporaryFile(&mpd_file_path));
|
||||||
EXPECT_TRUE(mpd_writer_.WriteMpdToFile(mpd_file_path.value().c_str()));
|
EXPECT_TRUE(mpd_writer_.WriteMpdToFile(mpd_file_path.AsUTF8Unsafe().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace shaka
|
} // namespace shaka
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
# https://developers.google.com/open-source/licenses/bsd
|
# https://developers.google.com/open-source/licenses/bsd
|
||||||
"""This script is used to generate version string for packager."""
|
"""This script is used to generate version string for packager."""
|
||||||
|
|
||||||
|
import platform
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
# To support python version before 2.7, which does not have
|
# To support python version before 2.7, which does not have
|
||||||
|
@ -30,9 +31,13 @@ if 'check_output' not in dir(subprocess):
|
||||||
subprocess.check_output = check_output_implementation
|
subprocess.check_output = check_output_implementation
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
git = 'git'
|
||||||
|
if platform.system() == 'Windows':
|
||||||
|
git += '.bat'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
version_tag = subprocess.check_output(
|
version_tag = subprocess.check_output(
|
||||||
['git', 'tag', '--points-at', 'HEAD'],
|
[git, 'tag', '--points-at', 'HEAD'],
|
||||||
stderr=subprocess.STDOUT).rstrip()
|
stderr=subprocess.STDOUT).rstrip()
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
# git tag --points-at is not supported in old versions of git. Just ignore
|
# git tag --points-at is not supported in old versions of git. Just ignore
|
||||||
|
@ -41,7 +46,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
try:
|
try:
|
||||||
version_hash = subprocess.check_output(
|
version_hash = subprocess.check_output(
|
||||||
['git', 'rev-parse', '--short', 'HEAD'],
|
[git, 'rev-parse', '--short', 'HEAD'],
|
||||||
stderr=subprocess.STDOUT).rstrip()
|
stderr=subprocess.STDOUT).rstrip()
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
version_hash = 'unknown-version'
|
version_hash = 'unknown-version'
|
||||||
|
|
Loading…
Reference in New Issue