1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuCopyright (c) 2011 Stanislav Vitvitskiy
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPermission is hereby granted, free of charge, to any person obtaining a copy of this
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusoftware and associated documentation files (the "Software"), to deal in the Software
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuwithout restriction, including without limitation the rights to use, copy, modify,
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhumerge, publish, distribute, sublicense, and/or sell copies of the Software, and to
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupermit persons to whom the Software is furnished to do so, subject to the following
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconditions:
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuThe above copyright notice and this permission notice shall be included in all copies or
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusubstantial portions of the Software.
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOR OTHER DEALINGS IN THE SOFTWARE.
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.h264.model;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.read.CAVLCReader;
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.write.CAVLCWriter;
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException;
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Scaling list entity
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * <p/>
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * capable to serialize / deserialize with CAVLC bitstream
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @author Stanislav Vitvitskiy
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ScalingList {
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int[] scalingList;
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean useDefaultScalingMatrixFlag;
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void write(CAVLCWriter out) throws IOException {
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        if (useDefaultScalingMatrixFlag) {
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            out.writeSE(0, "SPS: ");
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return;
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int lastScale = 8;
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int nextScale = 8;
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (int j = 0; j < scalingList.length; j++) {
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (nextScale != 0) {
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int deltaScale = scalingList[j] - lastScale - 256;
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                out.writeSE(deltaScale, "SPS: ");
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            lastScale = scalingList[j];
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static ScalingList read(CAVLCReader is, int sizeOfScalingList)
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            throws IOException {
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        ScalingList sl = new ScalingList();
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        sl.scalingList = new int[sizeOfScalingList];
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int lastScale = 8;
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        int nextScale = 8;
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (int j = 0; j < sizeOfScalingList; j++) {
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (nextScale != 0) {
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int deltaScale = is.readSE("deltaScale");
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                nextScale = (lastScale + deltaScale + 256) % 256;
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                sl.useDefaultScalingMatrixFlag = (j == 0 && nextScale == 0);
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            sl.scalingList[j] = nextScale == 0 ? lastScale : nextScale;
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            lastScale = sl.scalingList[j];
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return sl;
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String toString() {
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return "ScalingList{" +
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                "scalingList=" + scalingList +
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ", useDefaultScalingMatrixFlag=" + useDefaultScalingMatrixFlag +
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                '}';
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}