1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.coremedia.iso.boxes;
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractFullBox;
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * The optional composition shift least greatest atom summarizes the calculated
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * minimum and maximum offsets between decode and composition time, as well as
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * the start and end times, for all samples. This allows a reader to determine
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * the minimum required time for decode to obtain proper presentation order without
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * needing to scan the sample table for the range of offsets. The type of the
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * composition shift least greatest atom is ‘cslg’.
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class CompositionShiftLeastGreatestAtom extends AbstractFullBox {
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public CompositionShiftLeastGreatestAtom() {
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        super("cslg");
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // A 32-bit unsigned integer that specifies the calculated value.
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int compositionOffsetToDisplayOffsetShift;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // A 32-bit signed integer that specifies the calculated value.
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int leastDisplayOffset;
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // A 32-bit signed integer that specifies the calculated value.
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int greatestDisplayOffset;
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    //A 32-bit signed integer that specifies the calculated value.
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int displayStartTime;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    //A 32-bit signed integer that specifies the calculated value.
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    int displayEndTime;
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected long getContentSize() {
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return 24;
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void _parseDetails(ByteBuffer content) {
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        parseVersionAndFlags(content);
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        compositionOffsetToDisplayOffsetShift = content.getInt();
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        leastDisplayOffset = content.getInt();
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        greatestDisplayOffset = content.getInt();
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        displayStartTime = content.getInt();
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        displayEndTime = content.getInt();
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    protected void getContent(ByteBuffer byteBuffer) {
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        writeVersionAndFlags(byteBuffer);
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.putInt(compositionOffsetToDisplayOffsetShift);
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.putInt(leastDisplayOffset);
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.putInt(greatestDisplayOffset);
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.putInt(displayStartTime);
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        byteBuffer.putInt(displayEndTime);
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getCompositionOffsetToDisplayOffsetShift() {
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return compositionOffsetToDisplayOffsetShift;
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setCompositionOffsetToDisplayOffsetShift(int compositionOffsetToDisplayOffsetShift) {
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.compositionOffsetToDisplayOffsetShift = compositionOffsetToDisplayOffsetShift;
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getLeastDisplayOffset() {
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return leastDisplayOffset;
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setLeastDisplayOffset(int leastDisplayOffset) {
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.leastDisplayOffset = leastDisplayOffset;
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getGreatestDisplayOffset() {
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return greatestDisplayOffset;
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setGreatestDisplayOffset(int greatestDisplayOffset) {
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.greatestDisplayOffset = greatestDisplayOffset;
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getDisplayStartTime() {
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return displayStartTime;
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setDisplayStartTime(int displayStartTime) {
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.displayStartTime = displayStartTime;
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getDisplayEndTime() {
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return displayEndTime;
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setDisplayEndTime(int displayEndTime) {
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.displayEndTime = displayEndTime;
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
102