7#include <packager/app/packager_util.h>
12#include <absl/log/log.h>
14#include <packager/crypto_params.h>
15#include <packager/media/base/cpix_key_source.h>
16#include <packager/media/base/fourccs.h>
17#include <packager/media/base/playready_key_source.h>
18#include <packager/media/base/raw_key_source.h>
19#include <packager/media/base/request_signer.h>
20#include <packager/media/base/widevine_key_source.h>
21#include <packager/mpd/base/mpd_options.h>
27std::unique_ptr<RequestSigner> CreateSigner(
const WidevineSigner& signer) {
28 std::unique_ptr<RequestSigner> request_signer;
29 switch (signer.signing_key_type) {
30 case WidevineSigner::SigningKeyType::kAes:
32 signer.signer_name, signer.aes.key, signer.aes.iv));
34 case WidevineSigner::SigningKeyType::kRsa:
38 case WidevineSigner::SigningKeyType::kNone:
42 LOG(ERROR) <<
"Failed to create the signer object.";
43 return request_signer;
48std::unique_ptr<KeySource> CreateEncryptionKeySource(
49 FourCC protection_scheme,
50 const EncryptionParams& encryption_params) {
51 std::unique_ptr<KeySource> encryption_key_source;
52 switch (encryption_params.key_provider) {
53 case KeyProvider::kWidevine: {
54 const WidevineEncryptionParams& widevine = encryption_params.widevine;
55 if (widevine.key_server_url.empty()) {
56 LOG(ERROR) <<
"'key_server_url' should not be empty.";
59 if (widevine.content_id.empty()) {
60 LOG(ERROR) <<
"'content_id' should not be empty.";
63 std::unique_ptr<WidevineKeySource> widevine_key_source(
64 new WidevineKeySource(widevine.key_server_url,
65 encryption_params.protection_systems,
67 if (!widevine.signer.signer_name.empty()) {
68 std::unique_ptr<RequestSigner> request_signer(
69 CreateSigner(widevine.signer));
72 widevine_key_source->set_signer(std::move(request_signer));
74 widevine_key_source->set_group_id(widevine.group_id);
75 widevine_key_source->set_enable_entitlement_license(
76 widevine.enable_entitlement_license);
79 widevine_key_source->FetchKeys(widevine.content_id, widevine.policy);
81 LOG(ERROR) <<
"Widevine encryption key source failed to fetch keys: "
85 encryption_key_source = std::move(widevine_key_source);
88 case KeyProvider::kRawKey: {
92 case KeyProvider::kPlayReady: {
93 const PlayReadyEncryptionParams& playready = encryption_params.playready;
94 if (!playready.key_server_url.empty() ||
95 !playready.program_identifier.empty()) {
96 if (playready.key_server_url.empty() ||
97 playready.program_identifier.empty()) {
98 LOG(ERROR) <<
"Either PlayReady key_server_url or program_identifier "
102 std::unique_ptr<PlayReadyKeySource> playready_key_source;
104 playready_key_source.reset(
new PlayReadyKeySource(
105 playready.key_server_url, encryption_params.protection_systems));
106 Status status = playready_key_source->FetchKeysWithProgramIdentifier(
107 playready.program_identifier);
109 LOG(ERROR) <<
"PlayReady encryption key source failed to fetch keys: "
110 << status.ToString();
113 encryption_key_source = std::move(playready_key_source);
115 LOG(ERROR) <<
"Error creating PlayReady key source.";
120 case KeyProvider::kCpix: {
127 return encryption_key_source;
130std::unique_ptr<KeySource> CreateDecryptionKeySource(
131 const DecryptionParams& decryption_params) {
132 std::unique_ptr<KeySource> decryption_key_source;
133 switch (decryption_params.key_provider) {
134 case KeyProvider::kWidevine: {
135 const WidevineDecryptionParams& widevine = decryption_params.widevine;
136 if (widevine.key_server_url.empty()) {
137 LOG(ERROR) <<
"'key_server_url' should not be empty.";
138 return std::unique_ptr<KeySource>();
140 std::unique_ptr<WidevineKeySource> widevine_key_source(
141 new WidevineKeySource(
142 widevine.key_server_url,
143 ProtectionSystem::kWidevine ,
145 if (!widevine.signer.signer_name.empty()) {
146 std::unique_ptr<RequestSigner> request_signer(
147 CreateSigner(widevine.signer));
149 return std::unique_ptr<KeySource>();
150 widevine_key_source->set_signer(std::move(request_signer));
153 decryption_key_source = std::move(widevine_key_source);
156 case KeyProvider::kRawKey: {
160 case KeyProvider::kCpix: {
161 decryption_key_source =
168 return decryption_key_source;
171MpdOptions GetMpdOptions(
bool on_demand_profile,
const MpdParams& mpd_params) {
172 MpdOptions mpd_options;
173 mpd_options.dash_profile =
174 on_demand_profile ? DashProfile::kOnDemand : DashProfile::kLive;
175 mpd_options.mpd_type =
176 (on_demand_profile || mpd_params.generate_static_live_mpd)
179 mpd_options.mpd_params = mpd_params;
All the methods that are virtual are virtual for mocking.