cdm_type_conversion.cc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "media/cdm/cdm_type_conversion.h"
  5. #include <stdint.h>
  6. #include "base/logging.h"
  7. #include "base/numerics/safe_conversions.h"
  8. #include "ui/gfx/color_space.h"
  9. #include "ui/gfx/geometry/size.h"
  10. // Note: Unexpected values must be handled explicitly since some of these
  11. // functions may be used at either side of the CDM interface, and it's possible
  12. // invalid values are passed in. For example, Chromium loading an older CDM, or
  13. // the CDM is loaded by a non-Chromium browser.
  14. namespace media {
  15. namespace {
  16. cdm::ColorRange ToCdmColorRange(gfx::ColorSpace::RangeID range) {
  17. switch (range) {
  18. case gfx::ColorSpace::RangeID::INVALID:
  19. return cdm::ColorRange::kInvalid;
  20. case gfx::ColorSpace::RangeID::LIMITED:
  21. return cdm::ColorRange::kLimited;
  22. case gfx::ColorSpace::RangeID::FULL:
  23. return cdm::ColorRange::kFull;
  24. case gfx::ColorSpace::RangeID::DERIVED:
  25. return cdm::ColorRange::kDerived;
  26. }
  27. NOTREACHED() << "Unexpected color range";
  28. return cdm::ColorRange::kInvalid;
  29. }
  30. gfx::ColorSpace::RangeID ToGfxColorRange(cdm::ColorRange range) {
  31. switch (range) {
  32. case cdm::ColorRange::kInvalid:
  33. return gfx::ColorSpace::RangeID::INVALID;
  34. case cdm::ColorRange::kLimited:
  35. return gfx::ColorSpace::RangeID::LIMITED;
  36. case cdm::ColorRange::kFull:
  37. return gfx::ColorSpace::RangeID::FULL;
  38. case cdm::ColorRange::kDerived:
  39. return gfx::ColorSpace::RangeID::DERIVED;
  40. }
  41. NOTREACHED() << "Unexpected color range";
  42. return gfx::ColorSpace::RangeID::INVALID;
  43. }
  44. } // namespace
  45. // Color Converters
  46. cdm::ColorSpace ToCdmColorSpace(const VideoColorSpace& color_space) {
  47. // Cast is okay because both VideoColorSpace and cdm::ColorSpace follow the
  48. // standard ISO 23001-8:2016.
  49. return {base::checked_cast<uint8_t>(color_space.primaries),
  50. base::checked_cast<uint8_t>(color_space.transfer),
  51. base::checked_cast<uint8_t>(color_space.matrix),
  52. ToCdmColorRange(color_space.range)};
  53. }
  54. VideoColorSpace ToMediaColorSpace(const cdm::ColorSpace& color_space) {
  55. return VideoColorSpace(color_space.primary_id, color_space.transfer_id,
  56. color_space.matrix_id,
  57. ToGfxColorRange(color_space.range));
  58. }
  59. // CDM Converters
  60. cdm::HdcpVersion ToCdmHdcpVersion(HdcpVersion hdcp_version) {
  61. switch (hdcp_version) {
  62. case HdcpVersion::kHdcpVersionNone:
  63. return cdm::kHdcpVersionNone;
  64. case HdcpVersion::kHdcpVersion1_0:
  65. return cdm::kHdcpVersion1_0;
  66. case HdcpVersion::kHdcpVersion1_1:
  67. return cdm::kHdcpVersion1_1;
  68. case HdcpVersion::kHdcpVersion1_2:
  69. return cdm::kHdcpVersion1_2;
  70. case HdcpVersion::kHdcpVersion1_3:
  71. return cdm::kHdcpVersion1_3;
  72. case HdcpVersion::kHdcpVersion1_4:
  73. return cdm::kHdcpVersion1_4;
  74. case HdcpVersion::kHdcpVersion2_0:
  75. return cdm::kHdcpVersion2_0;
  76. case HdcpVersion::kHdcpVersion2_1:
  77. return cdm::kHdcpVersion2_1;
  78. case HdcpVersion::kHdcpVersion2_2:
  79. return cdm::kHdcpVersion2_2;
  80. case HdcpVersion::kHdcpVersion2_3:
  81. return cdm::kHdcpVersion2_3;
  82. }
  83. NOTREACHED() << "Unexpected HdcpVersion";
  84. return cdm::kHdcpVersion2_3;
  85. }
  86. cdm::SessionType ToCdmSessionType(CdmSessionType session_type) {
  87. switch (session_type) {
  88. case CdmSessionType::kTemporary:
  89. return cdm::kTemporary;
  90. case CdmSessionType::kPersistentLicense:
  91. return cdm::kPersistentLicense;
  92. }
  93. NOTREACHED() << "Unexpected session type " << static_cast<int>(session_type);
  94. return cdm::kTemporary;
  95. }
  96. CdmSessionType ToMediaSessionType(cdm::SessionType session_type) {
  97. switch (session_type) {
  98. case cdm::kTemporary:
  99. return CdmSessionType::kTemporary;
  100. case cdm::kPersistentLicense:
  101. return CdmSessionType::kPersistentLicense;
  102. // TODO(crbug.com/1181029): Remove after `kPersistentUsageRecord` is removed
  103. // from the CDM interface.
  104. case cdm::kPersistentUsageRecord:
  105. break;
  106. }
  107. NOTREACHED() << "Unexpected cdm::SessionType " << session_type;
  108. return CdmSessionType::kTemporary;
  109. }
  110. cdm::InitDataType ToCdmInitDataType(EmeInitDataType init_data_type) {
  111. switch (init_data_type) {
  112. case EmeInitDataType::CENC:
  113. return cdm::kCenc;
  114. case EmeInitDataType::KEYIDS:
  115. return cdm::kKeyIds;
  116. case EmeInitDataType::WEBM:
  117. return cdm::kWebM;
  118. case EmeInitDataType::UNKNOWN:
  119. break;
  120. }
  121. NOTREACHED() << "Unexpected EmeInitDataType";
  122. return cdm::kKeyIds;
  123. }
  124. EmeInitDataType ToEmeInitDataType(cdm::InitDataType init_data_type) {
  125. switch (init_data_type) {
  126. case cdm::kCenc:
  127. return EmeInitDataType::CENC;
  128. case cdm::kKeyIds:
  129. return EmeInitDataType::KEYIDS;
  130. case cdm::kWebM:
  131. return EmeInitDataType::WEBM;
  132. }
  133. NOTREACHED() << "Unexpected cdm::InitDataType " << init_data_type;
  134. return EmeInitDataType::UNKNOWN;
  135. }
  136. CdmKeyInformation::KeyStatus ToMediaKeyStatus(cdm::KeyStatus status) {
  137. switch (status) {
  138. case cdm::kUsable:
  139. return CdmKeyInformation::USABLE;
  140. case cdm::kInternalError:
  141. return CdmKeyInformation::INTERNAL_ERROR;
  142. case cdm::kExpired:
  143. return CdmKeyInformation::EXPIRED;
  144. case cdm::kOutputRestricted:
  145. return CdmKeyInformation::OUTPUT_RESTRICTED;
  146. case cdm::kOutputDownscaled:
  147. return CdmKeyInformation::OUTPUT_DOWNSCALED;
  148. case cdm::kStatusPending:
  149. return CdmKeyInformation::KEY_STATUS_PENDING;
  150. case cdm::kReleased:
  151. return CdmKeyInformation::RELEASED;
  152. }
  153. NOTREACHED() << "Unexpected cdm::KeyStatus " << status;
  154. return CdmKeyInformation::INTERNAL_ERROR;
  155. }
  156. cdm::KeyStatus ToCdmKeyStatus(CdmKeyInformation::KeyStatus status) {
  157. switch (status) {
  158. case CdmKeyInformation::KeyStatus::USABLE:
  159. return cdm::kUsable;
  160. case CdmKeyInformation::KeyStatus::INTERNAL_ERROR:
  161. return cdm::kInternalError;
  162. case CdmKeyInformation::KeyStatus::EXPIRED:
  163. return cdm::kExpired;
  164. case CdmKeyInformation::KeyStatus::OUTPUT_RESTRICTED:
  165. return cdm::kOutputRestricted;
  166. case CdmKeyInformation::KeyStatus::OUTPUT_DOWNSCALED:
  167. return cdm::kOutputDownscaled;
  168. case CdmKeyInformation::KeyStatus::KEY_STATUS_PENDING:
  169. return cdm::kStatusPending;
  170. case CdmKeyInformation::KeyStatus::RELEASED:
  171. return cdm::kReleased;
  172. }
  173. NOTREACHED() << "Unexpected CdmKeyInformation::KeyStatus " << status;
  174. return cdm::kInternalError;
  175. }
  176. cdm::EncryptionScheme ToCdmEncryptionScheme(EncryptionScheme scheme) {
  177. switch (scheme) {
  178. case EncryptionScheme::kUnencrypted:
  179. return cdm::EncryptionScheme::kUnencrypted;
  180. case EncryptionScheme::kCenc:
  181. return cdm::EncryptionScheme::kCenc;
  182. case EncryptionScheme::kCbcs:
  183. return cdm::EncryptionScheme::kCbcs;
  184. }
  185. NOTREACHED() << "Unexpected EncryptionScheme";
  186. return cdm::EncryptionScheme::kUnencrypted;
  187. }
  188. CdmPromise::Exception ToMediaCdmPromiseException(cdm::Exception exception) {
  189. switch (exception) {
  190. case cdm::kExceptionTypeError:
  191. return CdmPromise::Exception::TYPE_ERROR;
  192. case cdm::kExceptionNotSupportedError:
  193. return CdmPromise::Exception::NOT_SUPPORTED_ERROR;
  194. case cdm::kExceptionInvalidStateError:
  195. return CdmPromise::Exception::INVALID_STATE_ERROR;
  196. case cdm::kExceptionQuotaExceededError:
  197. return CdmPromise::Exception::QUOTA_EXCEEDED_ERROR;
  198. }
  199. NOTREACHED() << "Unexpected cdm::Exception " << exception;
  200. return CdmPromise::Exception::INVALID_STATE_ERROR;
  201. }
  202. cdm::Exception ToCdmException(CdmPromise::Exception exception) {
  203. switch (exception) {
  204. case CdmPromise::Exception::NOT_SUPPORTED_ERROR:
  205. return cdm::kExceptionNotSupportedError;
  206. case CdmPromise::Exception::INVALID_STATE_ERROR:
  207. return cdm::kExceptionInvalidStateError;
  208. case CdmPromise::Exception::TYPE_ERROR:
  209. return cdm::kExceptionTypeError;
  210. case CdmPromise::Exception::QUOTA_EXCEEDED_ERROR:
  211. return cdm::kExceptionQuotaExceededError;
  212. }
  213. NOTREACHED() << "Unexpected CdmPromise::Exception";
  214. return cdm::kExceptionInvalidStateError;
  215. }
  216. CdmMessageType ToMediaMessageType(cdm::MessageType message_type) {
  217. switch (message_type) {
  218. case cdm::kLicenseRequest:
  219. return CdmMessageType::LICENSE_REQUEST;
  220. case cdm::kLicenseRenewal:
  221. return CdmMessageType::LICENSE_RENEWAL;
  222. case cdm::kLicenseRelease:
  223. return CdmMessageType::LICENSE_RELEASE;
  224. case cdm::kIndividualizationRequest:
  225. return CdmMessageType::INDIVIDUALIZATION_REQUEST;
  226. }
  227. NOTREACHED() << "Unexpected cdm::MessageType " << message_type;
  228. return CdmMessageType::LICENSE_REQUEST;
  229. }
  230. cdm::MessageType ToCdmMessageType(CdmMessageType message_type) {
  231. switch (message_type) {
  232. case CdmMessageType::LICENSE_REQUEST:
  233. return cdm::kLicenseRequest;
  234. case CdmMessageType::LICENSE_RENEWAL:
  235. return cdm::kLicenseRenewal;
  236. case CdmMessageType::LICENSE_RELEASE:
  237. return cdm::kLicenseRelease;
  238. case CdmMessageType::INDIVIDUALIZATION_REQUEST:
  239. return cdm::kIndividualizationRequest;
  240. }
  241. NOTREACHED() << "Unexpected CdmMessageType";
  242. return cdm::kLicenseRequest;
  243. }
  244. cdm::StreamType ToCdmStreamType(Decryptor::StreamType stream_type) {
  245. switch (stream_type) {
  246. case Decryptor::kAudio:
  247. return cdm::kStreamTypeAudio;
  248. case Decryptor::kVideo:
  249. return cdm::kStreamTypeVideo;
  250. }
  251. NOTREACHED() << "Unexpected Decryptor::StreamType " << stream_type;
  252. return cdm::kStreamTypeVideo;
  253. }
  254. Decryptor::Status ToMediaDecryptorStatus(cdm::Status status) {
  255. switch (status) {
  256. case cdm::kSuccess:
  257. return Decryptor::kSuccess;
  258. case cdm::kNoKey:
  259. return Decryptor::kNoKey;
  260. case cdm::kNeedMoreData:
  261. return Decryptor::kNeedMoreData;
  262. case cdm::kDecryptError:
  263. return Decryptor::kError;
  264. case cdm::kDecodeError:
  265. return Decryptor::kError;
  266. case cdm::kInitializationError:
  267. case cdm::kDeferredInitialization:
  268. break;
  269. }
  270. NOTREACHED() << "Unexpected cdm::Status " << status;
  271. return Decryptor::kError;
  272. }
  273. // Audio Converters
  274. cdm::AudioCodec ToCdmAudioCodec(AudioCodec codec) {
  275. switch (codec) {
  276. case AudioCodec::kVorbis:
  277. return cdm::kCodecVorbis;
  278. case AudioCodec::kAAC:
  279. return cdm::kCodecAac;
  280. default:
  281. DVLOG(1) << "Unsupported AudioCodec " << codec;
  282. return cdm::kUnknownAudioCodec;
  283. }
  284. }
  285. SampleFormat ToMediaSampleFormat(cdm::AudioFormat format) {
  286. switch (format) {
  287. case cdm::kAudioFormatU8:
  288. return kSampleFormatU8;
  289. case cdm::kAudioFormatS16:
  290. return kSampleFormatS16;
  291. case cdm::kAudioFormatS32:
  292. return kSampleFormatS32;
  293. case cdm::kAudioFormatF32:
  294. return kSampleFormatF32;
  295. case cdm::kAudioFormatPlanarS16:
  296. return kSampleFormatPlanarS16;
  297. case cdm::kAudioFormatPlanarF32:
  298. return kSampleFormatPlanarF32;
  299. case cdm::kUnknownAudioFormat:
  300. return kUnknownSampleFormat;
  301. }
  302. NOTREACHED() << "Unexpected cdm::AudioFormat " << format;
  303. return kUnknownSampleFormat;
  304. }
  305. // Video Converters
  306. cdm::VideoCodec ToCdmVideoCodec(VideoCodec codec) {
  307. switch (codec) {
  308. case VideoCodec::kVP8:
  309. return cdm::kCodecVp8;
  310. case VideoCodec::kH264:
  311. return cdm::kCodecH264;
  312. case VideoCodec::kVP9:
  313. return cdm::kCodecVp9;
  314. case VideoCodec::kAV1:
  315. return cdm::kCodecAv1;
  316. default:
  317. DVLOG(1) << "Unsupported VideoCodec " << codec;
  318. return cdm::kUnknownVideoCodec;
  319. }
  320. }
  321. VideoCodec ToMediaVideoCodec(cdm::VideoCodec codec) {
  322. switch (codec) {
  323. case cdm::kUnknownVideoCodec:
  324. return VideoCodec::kUnknown;
  325. case cdm::kCodecVp8:
  326. return VideoCodec::kVP8;
  327. case cdm::kCodecH264:
  328. return VideoCodec::kH264;
  329. case cdm::kCodecVp9:
  330. return VideoCodec::kVP9;
  331. case cdm::kCodecAv1:
  332. return VideoCodec::kAV1;
  333. }
  334. NOTREACHED() << "Unexpected cdm::VideoCodec " << codec;
  335. return VideoCodec::kUnknown;
  336. }
  337. cdm::VideoCodecProfile ToCdmVideoCodecProfile(VideoCodecProfile profile) {
  338. switch (profile) {
  339. case VP8PROFILE_ANY:
  340. return cdm::kProfileNotNeeded;
  341. case VP9PROFILE_PROFILE0:
  342. return cdm::kVP9Profile0;
  343. case VP9PROFILE_PROFILE1:
  344. return cdm::kVP9Profile1;
  345. case VP9PROFILE_PROFILE2:
  346. return cdm::kVP9Profile2;
  347. case VP9PROFILE_PROFILE3:
  348. return cdm::kVP9Profile3;
  349. case H264PROFILE_BASELINE:
  350. return cdm::kH264ProfileBaseline;
  351. case H264PROFILE_MAIN:
  352. return cdm::kH264ProfileMain;
  353. case H264PROFILE_EXTENDED:
  354. return cdm::kH264ProfileExtended;
  355. case H264PROFILE_HIGH:
  356. return cdm::kH264ProfileHigh;
  357. case H264PROFILE_HIGH10PROFILE:
  358. return cdm::kH264ProfileHigh10;
  359. case H264PROFILE_HIGH422PROFILE:
  360. return cdm::kH264ProfileHigh422;
  361. case H264PROFILE_HIGH444PREDICTIVEPROFILE:
  362. return cdm::kH264ProfileHigh444Predictive;
  363. case AV1PROFILE_PROFILE_MAIN:
  364. return cdm::kAv1ProfileMain;
  365. case AV1PROFILE_PROFILE_HIGH:
  366. return cdm::kAv1ProfileHigh;
  367. case AV1PROFILE_PROFILE_PRO:
  368. return cdm::kAv1ProfilePro;
  369. default:
  370. DVLOG(1) << "Unsupported VideoCodecProfile " << profile;
  371. return cdm::kUnknownVideoCodecProfile;
  372. }
  373. }
  374. VideoCodecProfile ToMediaVideoCodecProfile(cdm::VideoCodecProfile profile) {
  375. switch (profile) {
  376. case cdm::kUnknownVideoCodecProfile:
  377. return VIDEO_CODEC_PROFILE_UNKNOWN;
  378. case cdm::kProfileNotNeeded:
  379. // There's no corresponding value for "not needed". Given CdmAdapter only
  380. // converts VP8PROFILE_ANY to cdm::kProfileNotNeeded, and this code is
  381. // only used for testing, it's okay to convert it back to VP8PROFILE_ANY.
  382. return VP8PROFILE_ANY;
  383. case cdm::kVP9Profile0:
  384. return VP9PROFILE_PROFILE0;
  385. case cdm::kVP9Profile1:
  386. return VP9PROFILE_PROFILE1;
  387. case cdm::kVP9Profile2:
  388. return VP9PROFILE_PROFILE2;
  389. case cdm::kVP9Profile3:
  390. return VP9PROFILE_PROFILE3;
  391. case cdm::kH264ProfileBaseline:
  392. return H264PROFILE_BASELINE;
  393. case cdm::kH264ProfileMain:
  394. return H264PROFILE_MAIN;
  395. case cdm::kH264ProfileExtended:
  396. return H264PROFILE_EXTENDED;
  397. case cdm::kH264ProfileHigh:
  398. return H264PROFILE_HIGH;
  399. case cdm::kH264ProfileHigh10:
  400. return H264PROFILE_HIGH10PROFILE;
  401. case cdm::kH264ProfileHigh422:
  402. return H264PROFILE_HIGH422PROFILE;
  403. case cdm::kH264ProfileHigh444Predictive:
  404. return H264PROFILE_HIGH444PREDICTIVEPROFILE;
  405. case cdm::kAv1ProfileMain:
  406. return AV1PROFILE_PROFILE_MAIN;
  407. case cdm::kAv1ProfileHigh:
  408. return AV1PROFILE_PROFILE_HIGH;
  409. case cdm::kAv1ProfilePro:
  410. return AV1PROFILE_PROFILE_PRO;
  411. }
  412. NOTREACHED() << "Unexpected cdm::VideoCodecProfile " << profile;
  413. return VIDEO_CODEC_PROFILE_UNKNOWN;
  414. }
  415. cdm::VideoFormat ToCdmVideoFormat(VideoPixelFormat format) {
  416. switch (format) {
  417. case PIXEL_FORMAT_YV12:
  418. return cdm::kYv12;
  419. case PIXEL_FORMAT_I420:
  420. return cdm::kI420;
  421. case PIXEL_FORMAT_YUV420P9:
  422. return cdm::kYUV420P9;
  423. case PIXEL_FORMAT_YUV420P10:
  424. return cdm::kYUV420P10;
  425. case PIXEL_FORMAT_YUV422P9:
  426. return cdm::kYUV422P9;
  427. case PIXEL_FORMAT_YUV422P10:
  428. return cdm::kYUV422P10;
  429. case PIXEL_FORMAT_YUV444P9:
  430. return cdm::kYUV444P9;
  431. case PIXEL_FORMAT_YUV444P10:
  432. return cdm::kYUV444P10;
  433. case PIXEL_FORMAT_YUV420P12:
  434. return cdm::kYUV420P12;
  435. case PIXEL_FORMAT_YUV422P12:
  436. return cdm::kYUV422P12;
  437. case PIXEL_FORMAT_YUV444P12:
  438. return cdm::kYUV444P12;
  439. default:
  440. DVLOG(1) << "Unsupported VideoPixelFormat " << format;
  441. return cdm::kUnknownVideoFormat;
  442. }
  443. }
  444. VideoPixelFormat ToMediaVideoFormat(cdm::VideoFormat format) {
  445. switch (format) {
  446. case cdm::kYv12:
  447. return PIXEL_FORMAT_YV12;
  448. case cdm::kI420:
  449. return PIXEL_FORMAT_I420;
  450. case cdm::kYUV420P9:
  451. return PIXEL_FORMAT_YUV420P9;
  452. case cdm::kYUV420P10:
  453. return PIXEL_FORMAT_YUV420P10;
  454. case cdm::kYUV422P9:
  455. return PIXEL_FORMAT_YUV422P9;
  456. case cdm::kYUV422P10:
  457. return PIXEL_FORMAT_YUV422P10;
  458. case cdm::kYUV444P9:
  459. return PIXEL_FORMAT_YUV444P9;
  460. case cdm::kYUV444P10:
  461. return PIXEL_FORMAT_YUV444P10;
  462. case cdm::kYUV420P12:
  463. return PIXEL_FORMAT_YUV420P12;
  464. case cdm::kYUV422P12:
  465. return PIXEL_FORMAT_YUV422P12;
  466. case cdm::kYUV444P12:
  467. return PIXEL_FORMAT_YUV444P12;
  468. default:
  469. DVLOG(1) << "Unsupported cdm::VideoFormat " << format;
  470. return PIXEL_FORMAT_UNKNOWN;
  471. }
  472. }
  473. // Aggregate Types
  474. // Warning: The returned config contains raw pointers to the extra data in the
  475. // input |config|. Hence, the caller must make sure the input |config| outlives
  476. // the returned config.
  477. cdm::AudioDecoderConfig_2 ToCdmAudioDecoderConfig(
  478. const AudioDecoderConfig& config) {
  479. cdm::AudioDecoderConfig_2 cdm_config = {};
  480. cdm_config.codec = ToCdmAudioCodec(config.codec());
  481. cdm_config.channel_count =
  482. ChannelLayoutToChannelCount(config.channel_layout());
  483. cdm_config.bits_per_channel = config.bits_per_channel();
  484. cdm_config.samples_per_second = config.samples_per_second();
  485. cdm_config.extra_data = const_cast<uint8_t*>(config.extra_data().data());
  486. cdm_config.extra_data_size = config.extra_data().size();
  487. cdm_config.encryption_scheme =
  488. ToCdmEncryptionScheme(config.encryption_scheme());
  489. return cdm_config;
  490. }
  491. // Warning: The returned config contains raw pointers to the extra data in the
  492. // input |config|. Hence, the caller must make sure the input |config| outlives
  493. // the returned config.
  494. cdm::VideoDecoderConfig_3 ToCdmVideoDecoderConfig(
  495. const VideoDecoderConfig& config) {
  496. cdm::VideoDecoderConfig_3 cdm_config = {};
  497. cdm_config.codec = ToCdmVideoCodec(config.codec());
  498. cdm_config.profile = ToCdmVideoCodecProfile(config.profile());
  499. // TODO(dalecurtis): CDM doesn't support alpha, so delete |format|.
  500. DCHECK_EQ(config.alpha_mode(), VideoDecoderConfig::AlphaMode::kIsOpaque);
  501. cdm_config.format = cdm::kI420;
  502. cdm_config.color_space = ToCdmColorSpace(config.color_space_info());
  503. cdm_config.coded_size.width = config.coded_size().width();
  504. cdm_config.coded_size.height = config.coded_size().height();
  505. cdm_config.extra_data = const_cast<uint8_t*>(config.extra_data().data());
  506. cdm_config.extra_data_size = config.extra_data().size();
  507. cdm_config.encryption_scheme =
  508. ToCdmEncryptionScheme(config.encryption_scheme());
  509. return cdm_config;
  510. }
  511. // Fill |input_buffer| based on the values in |encrypted|. |subsamples|
  512. // is used to hold some of the data. |input_buffer| will contain pointers
  513. // to data contained in |encrypted| and |subsamples|, so the lifetime of
  514. // |input_buffer| must be <= the lifetime of |encrypted| and |subsamples|.
  515. void ToCdmInputBuffer(const DecoderBuffer& encrypted_buffer,
  516. std::vector<cdm::SubsampleEntry>* subsamples,
  517. cdm::InputBuffer_2* input_buffer) {
  518. // End of stream buffers are represented as empty resources.
  519. DCHECK(!input_buffer->data);
  520. if (encrypted_buffer.end_of_stream())
  521. return;
  522. input_buffer->data = encrypted_buffer.data();
  523. input_buffer->data_size = encrypted_buffer.data_size();
  524. input_buffer->timestamp = encrypted_buffer.timestamp().InMicroseconds();
  525. const DecryptConfig* decrypt_config = encrypted_buffer.decrypt_config();
  526. if (!decrypt_config) {
  527. DVLOG(3) << __func__ << ": Clear buffer.";
  528. return;
  529. }
  530. input_buffer->key_id =
  531. reinterpret_cast<const uint8_t*>(decrypt_config->key_id().data());
  532. input_buffer->key_id_size = decrypt_config->key_id().size();
  533. input_buffer->iv =
  534. reinterpret_cast<const uint8_t*>(decrypt_config->iv().data());
  535. input_buffer->iv_size = decrypt_config->iv().size();
  536. DCHECK(subsamples->empty());
  537. size_t num_subsamples = decrypt_config->subsamples().size();
  538. if (num_subsamples > 0) {
  539. subsamples->reserve(num_subsamples);
  540. for (const auto& sample : decrypt_config->subsamples()) {
  541. subsamples->push_back({sample.clear_bytes, sample.cypher_bytes});
  542. }
  543. }
  544. input_buffer->subsamples = subsamples->data();
  545. input_buffer->num_subsamples = num_subsamples;
  546. input_buffer->encryption_scheme =
  547. ToCdmEncryptionScheme(decrypt_config->encryption_scheme());
  548. if (decrypt_config->HasPattern()) {
  549. input_buffer->pattern = {
  550. decrypt_config->encryption_pattern()->crypt_byte_block(),
  551. decrypt_config->encryption_pattern()->skip_byte_block()};
  552. }
  553. }
  554. } // namespace media