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