1package com.coremedia.iso.boxes.apple;
2
3import com.googlecode.mp4parser.AbstractFullBox;
4
5import java.nio.ByteBuffer;
6
7/**
8 * Most stupid box of the world. Encapsulates actual data within
9 */
10public final class AppleDataBox extends AbstractFullBox {
11    public static final String TYPE = "data";
12
13    private byte[] fourBytes = new byte[4];
14    private byte[] data;
15
16    private static AppleDataBox getEmpty() {
17        AppleDataBox appleDataBox = new AppleDataBox();
18        appleDataBox.setVersion(0);
19        appleDataBox.setFourBytes(new byte[4]);
20        return appleDataBox;
21    }
22
23    public static AppleDataBox getStringAppleDataBox() {
24        AppleDataBox appleDataBox = getEmpty();
25        appleDataBox.setFlags(1);
26        appleDataBox.setData(new byte[]{0});
27        return appleDataBox;
28    }
29
30    public static AppleDataBox getUint8AppleDataBox() {
31        AppleDataBox appleDataBox = new AppleDataBox();
32        appleDataBox.setFlags(21);
33        appleDataBox.setData(new byte[]{0});
34        return appleDataBox;
35    }
36
37    public static AppleDataBox getUint16AppleDataBox() {
38        AppleDataBox appleDataBox = new AppleDataBox();
39        appleDataBox.setFlags(21);
40        appleDataBox.setData(new byte[]{0, 0});
41        return appleDataBox;
42    }
43
44    public static AppleDataBox getUint32AppleDataBox() {
45        AppleDataBox appleDataBox = new AppleDataBox();
46        appleDataBox.setFlags(21);
47        appleDataBox.setData(new byte[]{0, 0, 0, 0});
48        return appleDataBox;
49    }
50
51    public AppleDataBox() {
52        super(TYPE);
53    }
54
55    protected long getContentSize() {
56        return data.length + 8;
57    }
58
59    public void setData(byte[] data) {
60        this.data = new byte[data.length];
61        System.arraycopy(data, 0, this.data, 0, data.length);
62    }
63
64    public void setFourBytes(byte[] fourBytes) {
65        System.arraycopy(fourBytes, 0, this.fourBytes, 0, 4);
66    }
67
68    @Override
69    public void _parseDetails(ByteBuffer content) {
70        parseVersionAndFlags(content);
71        fourBytes = new byte[4];
72        content.get(fourBytes);
73        data = new byte[content.remaining()];
74        content.get(data);
75    }
76
77
78    @Override
79    protected void getContent(ByteBuffer byteBuffer) {
80        writeVersionAndFlags(byteBuffer);
81        byteBuffer.put(fourBytes, 0, 4);
82        byteBuffer.put(data);
83    }
84
85    public byte[] getFourBytes() {
86        return fourBytes;
87    }
88
89    public byte[] getData() {
90        return data;
91    }
92}
93