1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.boxes.cenc; 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.BoxParser; 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoFile; 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader; 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeWriter; 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.boxes.Box; 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractFullBox; 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.util.UUIDConverter; 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.UUID; 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/** 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * This box contains information needed by a Content Protection System to play back the content. The 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * data format is specified by the system identified by the ‘pssh’ parameter SystemID, and is considered 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * opaque for the purposes of this specification. 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * <p/> 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * The data encapsulated in the Data field may be read by the identified Content Protection System to 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * enable decryption key acquisition and decryption of media data. For license/rights-based systems, the 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * header information may include data such as the URL of license server(s) or rights issuer(s) used, 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * embedded licenses/rights, and/or other protection system specific metadata. 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * <p/> 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * A single file may be constructed to be playable by multiple key and digital rights management (DRM) 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * systems, by including one Protection System-Specific Header box for each system supported. Readers 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * that process such presentations must match the SystemID field in this box to the SystemID(s) of the 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * DRM System(s) they support, and select or create the matching Protection System-Specific Header 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * box(es) for storage and retrieval of Protection-Specific information interpreted or created by that DRM 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * system. 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ProtectionSystemSpecificHeaderBox extends AbstractFullBox { 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static final String TYPE = "pssh"; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static byte[] OMA2_SYSTEM_ID = UUIDConverter.convert(UUID.fromString("A2B55680-6F43-11E0-9A3F-0002A5D5C51B")); 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static byte[] PLAYREADY_SYSTEM_ID = UUIDConverter.convert(UUID.fromString("9A04F079-9840-4286-AB92-E65BE0885F95")); 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byte[] content; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byte[] systemId; 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public byte[] getSystemId() { 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return systemId; 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void setSystemId(byte[] systemId) { 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu assert systemId.length == 16; 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.systemId = systemId; 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public byte[] getContent() { 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return content; 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void setContent(byte[] content) { 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.content = content; 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public ProtectionSystemSpecificHeaderBox() { 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu super(TYPE); 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu protected long getContentSize() { 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return 24 + content.length; 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu protected void getContent(ByteBuffer byteBuffer) { 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeVersionAndFlags(byteBuffer); 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu assert systemId.length == 16; 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byteBuffer.put(systemId, 0, 16); 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu IsoTypeWriter.writeUInt32(byteBuffer, content.length); 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu byteBuffer.put(content); 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu protected void _parseDetails(ByteBuffer content) { 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu parseVersionAndFlags(content); 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu systemId = new byte[16]; 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu content.get(systemId); 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu long length = IsoTypeReader.readUInt32(content); 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.content = new byte[content.remaining()]; 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu content.get(this.content); 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu assert length == this.content.length; 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 90