Shaka Packager SDK
Loading...
Searching...
No Matches
mpd_writer.cc
1// Copyright 2014 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/mpd/util/mpd_writer.h>
8
9#include <cstdint>
10#include <memory>
11#include <string>
12#include <utility>
13
14#include <absl/flags/flag.h>
15#include <absl/log/check.h>
16#include <absl/log/log.h>
17#include <google/protobuf/text_format.h>
18
19#include <packager/file.h>
20#include <packager/mpd/base/mpd_builder.h>
21#include <packager/mpd/base/mpd_notifier.h>
22#include <packager/mpd/base/mpd_utils.h>
23#include <packager/mpd/base/simple_mpd_notifier.h>
24
25ABSL_FLAG(bool,
26 generate_dash_if_iop_compliant_mpd,
27 true,
28 "Try to generate DASH-IF IOP compliant MPD. This is best effort "
29 "and does not guarantee compliance.");
30
31namespace shaka {
32
33namespace {
34
35// Factory that creates SimpleMpdNotifier instances.
36class SimpleMpdNotifierFactory : public MpdNotifierFactory {
37 public:
38 SimpleMpdNotifierFactory() {}
39 ~SimpleMpdNotifierFactory() override {}
40
41 std::unique_ptr<MpdNotifier> Create(const MpdOptions& mpd_options) override {
42 return std::unique_ptr<MpdNotifier>(new SimpleMpdNotifier(mpd_options));
43 }
44};
45
46} // namespace
47
48MpdWriter::MpdWriter() : notifier_factory_(new SimpleMpdNotifierFactory()) {}
49MpdWriter::~MpdWriter() {}
50
51bool MpdWriter::AddFile(const std::string& media_info_path) {
52 std::string file_content;
53 if (!File::ReadFileToString(media_info_path.c_str(), &file_content)) {
54 LOG(ERROR) << "Failed to read " << media_info_path << " to string.";
55 return false;
56 }
57
58 MediaInfo media_info;
59 if (!::google::protobuf::TextFormat::ParseFromString(file_content,
60 &media_info)) {
61 LOG(ERROR) << "Failed to parse " << file_content << " to MediaInfo.";
62 return false;
63 }
64
65 media_infos_.push_back(media_info);
66 return true;
67}
68
69void MpdWriter::AddBaseUrl(const std::string& base_url) {
70 base_urls_.push_back(base_url);
71}
72
73bool MpdWriter::WriteMpdToFile(const char* file_name) {
74 CHECK(file_name);
75 MpdOptions mpd_options;
76 mpd_options.mpd_params.base_urls = base_urls_;
77 mpd_options.mpd_params.mpd_output = file_name;
78 mpd_options.mpd_params.generate_dash_if_iop_compliant_mpd =
79 absl::GetFlag(FLAGS_generate_dash_if_iop_compliant_mpd);
80 std::unique_ptr<MpdNotifier> notifier =
81 notifier_factory_->Create(mpd_options);
82 if (!notifier->Init()) {
83 LOG(ERROR) << "failed to initialize MpdNotifier.";
84 return false;
85 }
86
87 for (const MediaInfo& media_info : media_infos_) {
88 uint32_t unused_conatiner_id;
89 if (!notifier->NotifyNewContainer(media_info, &unused_conatiner_id)) {
90 LOG(ERROR) << "Failed to add MediaInfo for media file: "
91 << media_info.media_file_name();
92 return false;
93 }
94 }
95
96 if (!notifier->Flush()) {
97 LOG(ERROR) << "Failed to flush MPD notifier.";
98 return false;
99 }
100 return true;
101}
102
103void MpdWriter::SetMpdNotifierFactoryForTest(
104 std::unique_ptr<MpdNotifierFactory> factory) {
105 notifier_factory_ = std::move(factory);
106}
107
108} // namespace shaka
All the methods that are virtual are virtual for mocking.