Index: media/formats/mp2t/descriptors.cc |
diff --git a/media/formats/mp2t/descriptors.cc b/media/formats/mp2t/descriptors.cc |
index ecfee57532f3dfac2a26669264fca4df38f28cc4..859ec84d4a9e04739a8f1d8737b9889aaaba6b3b 100644 |
--- a/media/formats/mp2t/descriptors.cc |
+++ b/media/formats/mp2t/descriptors.cc |
@@ -8,6 +8,7 @@ |
#include "base/logging.h" |
#include "media/base/bit_reader.h" |
+#include "media/base/encryption_scheme.h" |
#include "media/formats/mp2t/mp2t_common.h" |
namespace media { |
@@ -24,6 +25,7 @@ enum DescriptorTag { |
}; |
const int kCASystemIdCenc = 0x6365; // 'ce' |
+const uint32_t kFourccCbcs = 0x63626373; // 'cbcs' |
class StringBitReader : public BitReader { |
public: |
@@ -110,7 +112,9 @@ bool Descriptors::HasCADescriptor(int* system_id, |
return true; |
} |
-bool Descriptors::HasCADescriptorCenc(int* ca_pid, int* pssh_pid) const { |
+bool Descriptors::HasCADescriptorCenc(int* ca_pid, |
+ int* pssh_pid, |
+ EncryptionScheme* scheme) const { |
DCHECK(ca_pid); |
DCHECK(pssh_pid); |
int system_id; |
@@ -125,10 +129,12 @@ bool Descriptors::HasCADescriptorCenc(int* ca_pid, int* pssh_pid) const { |
int num_systems; |
int encryption_algorithm; |
char pssh_system_id[16]; |
- // TODO(dougsteed). Currently we don't check many of the following values. |
+ // TODO(dougsteed). Currently we don't check many of the following values, |
+ // and we only support the 'cbcs' scheme (which involves AES-CBC encryption). |
// When we flesh out this implementation to cover all of ISO/IEC 23001-9 we |
- // will need to use and check these values. |
+ // will need to use and check these values more comprehensively. |
RCHECK(reader.ReadBits(32, &scheme_type)); |
+ RCHECK(scheme_type == kFourccCbcs); |
RCHECK(reader.ReadBits(32, &scheme_version)); |
RCHECK(reader.ReadBits(8, &num_systems)); |
RCHECK(num_systems == 1); |
@@ -137,6 +143,10 @@ bool Descriptors::HasCADescriptorCenc(int* ca_pid, int* pssh_pid) const { |
RCHECK(reader.ReadBits(8, &pssh_system_id[i])); |
} |
RCHECK(reader.ReadBits(13, pssh_pid)); |
+ // The pattern is actually set differently for audio and video, so OK not to |
+ // set it here. Important thing is to set the cipher mode. |
+ *scheme = EncryptionScheme(EncryptionScheme::CIPHER_MODE_AES_CBC, |
+ EncryptionScheme::Pattern()); |
return true; |
} |