1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/*
2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2008 CoreMedia AG, Hamburg
3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the License);
5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * you may not use this file except in compliance with the License.
6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * You may obtain a copy of the License at
7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *     http://www.apache.org/licenses/LICENSE-2.0
9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu *
10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software
11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * distributed under the License is distributed on an AS IS BASIS,
12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * See the License for the specific language governing permissions and
14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * limitations under the License.
15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.coremedia.iso.boxes.h264;
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.Hex;
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeWriter;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.AbstractBox;
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitReaderBuffer;
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.boxes.mp4.objectdescriptors.BitWriterBuffer;
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.model.PictureParameterSet;
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.model.SeqParameterSet;
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.ByteArrayInputStream;
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException;
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.ArrayList;
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.Collections;
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List;
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Defined in ISO/IEC 14496-15:2004.
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic final class AvcConfigurationBox extends AbstractBox {
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static final String TYPE = "avcC";
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public AVCDecoderConfigurationRecord avcDecoderConfigurationRecord = new AVCDecoderConfigurationRecord();
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public AvcConfigurationBox() {
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        super(TYPE);
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getConfigurationVersion() {
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.configurationVersion;
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getAvcProfileIndication() {
53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.avcProfileIndication;
54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getProfileCompatibility() {
57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.profileCompatibility;
58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getAvcLevelIndication() {
61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.avcLevelIndication;
62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getLengthSizeMinusOne() {
65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.lengthSizeMinusOne;
66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<byte[]> getSequenceParameterSets() {
69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return Collections.unmodifiableList(avcDecoderConfigurationRecord.sequenceParameterSets);
70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<byte[]> getPictureParameterSets() {
73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return Collections.unmodifiableList(avcDecoderConfigurationRecord.pictureParameterSets);
74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setConfigurationVersion(int configurationVersion) {
77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.configurationVersion = configurationVersion;
78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setAvcProfileIndication(int avcProfileIndication) {
81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.avcProfileIndication = avcProfileIndication;
82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setProfileCompatibility(int profileCompatibility) {
85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.profileCompatibility = profileCompatibility;
86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setAvcLevelIndication(int avcLevelIndication) {
89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.avcLevelIndication = avcLevelIndication;
90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setLengthSizeMinusOne(int lengthSizeMinusOne) {
93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.lengthSizeMinusOne = lengthSizeMinusOne;
94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSequenceParameterSets(List<byte[]> sequenceParameterSets) {
97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.sequenceParameterSets = sequenceParameterSets;
98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setPictureParameterSets(List<byte[]> pictureParameterSets) {
101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.pictureParameterSets = pictureParameterSets;
102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getChromaFormat() {
105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.chromaFormat;
106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setChromaFormat(int chromaFormat) {
109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.chromaFormat = chromaFormat;
110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getBitDepthLumaMinus8() {
113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.bitDepthLumaMinus8;
114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBitDepthLumaMinus8(int bitDepthLumaMinus8) {
117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.bitDepthLumaMinus8 = bitDepthLumaMinus8;
118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public int getBitDepthChromaMinus8() {
121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.bitDepthChromaMinus8;
122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setBitDepthChromaMinus8(int bitDepthChromaMinus8) {
125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.bitDepthChromaMinus8 = bitDepthChromaMinus8;
126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<byte[]> getSequenceParameterSetExts() {
129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.sequenceParameterSetExts;
130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setSequenceParameterSetExts(List<byte[]> sequenceParameterSetExts) {
133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.sequenceParameterSetExts = sequenceParameterSetExts;
134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public boolean hasExts() {
137dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.hasExts;
138dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
139dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
140dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void setHasExts(boolean hasExts) {
141dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        this.avcDecoderConfigurationRecord.hasExts = hasExts;
142dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
143dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
144dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
145dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void _parseDetails(ByteBuffer content) {
146dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        avcDecoderConfigurationRecord = new AVCDecoderConfigurationRecord(content);
147dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
148dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
149dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
150dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
151dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public long getContentSize() {
152dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getContentSize();
153dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
154dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
155dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
156dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    @Override
157dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public void getContent(ByteBuffer byteBuffer) {
158dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        avcDecoderConfigurationRecord.getContent(byteBuffer);
159dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
160dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
161dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    // just to display sps in isoviewer no practical use
162dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String[] getSPS() {
163dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getSPS();
164dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
165dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
166dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public String[] getPPS() {
167dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getPPS();
168dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
169dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
170dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<String> getSequenceParameterSetsAsStrings() {
171dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getSequenceParameterSetsAsStrings();
172dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
173dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
174dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<String> getSequenceParameterSetExtsAsStrings() {
175dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getSequenceParameterSetExtsAsStrings();
176dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
177dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
178dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public List<String> getPictureParameterSetsAsStrings() {
179dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord.getPictureParameterSetsAsStrings();
180dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
181dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
182dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public AVCDecoderConfigurationRecord getavcDecoderConfigurationRecord() {
183dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return avcDecoderConfigurationRecord;
184dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
185dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
186dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
187dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static class AVCDecoderConfigurationRecord {
188dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int configurationVersion;
189dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int avcProfileIndication;
190dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int profileCompatibility;
191dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int avcLevelIndication;
192dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int lengthSizeMinusOne;
193dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<byte[]> sequenceParameterSets = new ArrayList<byte[]>();
194dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<byte[]> pictureParameterSets = new ArrayList<byte[]>();
195dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
196dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public boolean hasExts = true;
197dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int chromaFormat = 1;
198dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bitDepthLumaMinus8 = 0;
199dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bitDepthChromaMinus8 = 0;
200dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<byte[]> sequenceParameterSetExts = new ArrayList<byte[]>();
201dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
202dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        /**
203dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu         * Just for non-spec-conform encoders
204dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu         */
205dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int lengthSizeMinusOnePaddingBits = 60;
206dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int numberOfSequenceParameterSetsPaddingBits = 7;
207dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int chromaFormatPaddingBits = 31;
208dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bitDepthLumaMinus8PaddingBits = 31;
209dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public int bitDepthChromaMinus8PaddingBits = 31;
210dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
211dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public AVCDecoderConfigurationRecord() {
212dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
213dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
214dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public AVCDecoderConfigurationRecord(ByteBuffer content) {
215dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            configurationVersion = IsoTypeReader.readUInt8(content);
216dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            avcProfileIndication = IsoTypeReader.readUInt8(content);
217dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            profileCompatibility = IsoTypeReader.readUInt8(content);
218dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            avcLevelIndication = IsoTypeReader.readUInt8(content);
219dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            BitReaderBuffer brb = new BitReaderBuffer(content);
220dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            lengthSizeMinusOnePaddingBits = brb.readBits(6);
221dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            lengthSizeMinusOne = brb.readBits(2);
222dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            numberOfSequenceParameterSetsPaddingBits = brb.readBits(3);
223dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            int numberOfSeuqenceParameterSets = brb.readBits(5);
224dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (int i = 0; i < numberOfSeuqenceParameterSets; i++) {
225dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int sequenceParameterSetLength = IsoTypeReader.readUInt16(content);
226dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
227dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                byte[] sequenceParameterSetNALUnit = new byte[sequenceParameterSetLength];
228dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                content.get(sequenceParameterSetNALUnit);
229dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                sequenceParameterSets.add(sequenceParameterSetNALUnit);
230dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
231dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            long numberOfPictureParameterSets = IsoTypeReader.readUInt8(content);
232dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (int i = 0; i < numberOfPictureParameterSets; i++) {
233dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                int pictureParameterSetLength = IsoTypeReader.readUInt16(content);
234dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                byte[] pictureParameterSetNALUnit = new byte[pictureParameterSetLength];
235dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                content.get(pictureParameterSetNALUnit);
236dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                pictureParameterSets.add(pictureParameterSetNALUnit);
237dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
238dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (content.remaining() < 4) {
239dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                hasExts = false;
240dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
241dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (hasExts && (avcProfileIndication == 100 || avcProfileIndication == 110 || avcProfileIndication == 122 || avcProfileIndication == 144)) {
242dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                // actually only some bits are interesting so masking with & x would be good but not all Mp4 creating tools set the reserved bits to 1.
243dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                // So we need to store all bits
244dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                brb = new BitReaderBuffer(content);
245dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                chromaFormatPaddingBits = brb.readBits(6);
246dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                chromaFormat = brb.readBits(2);
247dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthLumaMinus8PaddingBits = brb.readBits(5);
248dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthLumaMinus8 = brb.readBits(3);
249dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthChromaMinus8PaddingBits = brb.readBits(5);
250dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthChromaMinus8 = brb.readBits(3);
251dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                long numOfSequenceParameterSetExt = IsoTypeReader.readUInt8(content);
252dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (int i = 0; i < numOfSequenceParameterSetExt; i++) {
253dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    int sequenceParameterSetExtLength = IsoTypeReader.readUInt16(content);
254dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    byte[] sequenceParameterSetExtNALUnit = new byte[sequenceParameterSetExtLength];
255dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    content.get(sequenceParameterSetExtNALUnit);
256dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    sequenceParameterSetExts.add(sequenceParameterSetExtNALUnit);
257dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
258dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
259dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                chromaFormat = -1;
260dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthLumaMinus8 = -1;
261dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bitDepthChromaMinus8 = -1;
262dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
263dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
264dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
265dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public void getContent(ByteBuffer byteBuffer) {
266dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, configurationVersion);
267dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, avcProfileIndication);
268dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, profileCompatibility);
269dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, avcLevelIndication);
270dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            BitWriterBuffer bwb = new BitWriterBuffer(byteBuffer);
271dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(lengthSizeMinusOnePaddingBits, 6);
272dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(lengthSizeMinusOne, 2);
273dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(numberOfSequenceParameterSetsPaddingBits, 3);
274dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            bwb.writeBits(pictureParameterSets.size(), 5);
275dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] sequenceParameterSetNALUnit : sequenceParameterSets) {
276dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                IsoTypeWriter.writeUInt16(byteBuffer, sequenceParameterSetNALUnit.length);
277dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                byteBuffer.put(sequenceParameterSetNALUnit);
278dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
279dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            IsoTypeWriter.writeUInt8(byteBuffer, pictureParameterSets.size());
280dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] pictureParameterSetNALUnit : pictureParameterSets) {
281dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                IsoTypeWriter.writeUInt16(byteBuffer, pictureParameterSetNALUnit.length);
282dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                byteBuffer.put(pictureParameterSetNALUnit);
283dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
284dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (hasExts && (avcProfileIndication == 100 || avcProfileIndication == 110 || avcProfileIndication == 122 || avcProfileIndication == 144)) {
285dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
286dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb = new BitWriterBuffer(byteBuffer);
287dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(chromaFormatPaddingBits, 6);
288dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(chromaFormat, 2);
289dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(bitDepthLumaMinus8PaddingBits, 5);
290dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(bitDepthLumaMinus8, 3);
291dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(bitDepthChromaMinus8PaddingBits, 5);
292dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                bwb.writeBits(bitDepthChromaMinus8, 3);
293dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (byte[] sequenceParameterSetExtNALUnit : sequenceParameterSetExts) {
294dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    IsoTypeWriter.writeUInt16(byteBuffer, sequenceParameterSetExtNALUnit.length);
295dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    byteBuffer.put(sequenceParameterSetExtNALUnit);
296dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
297dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
298dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
299dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
300dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public long getContentSize() {
301dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            long size = 5;
302dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            size += 1; // sequenceParamsetLength
303dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] sequenceParameterSetNALUnit : sequenceParameterSets) {
304dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += 2; //lengthSizeMinusOne field
305dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += sequenceParameterSetNALUnit.length;
306dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
307dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            size += 1; // pictureParamsetLength
308dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] pictureParameterSetNALUnit : pictureParameterSets) {
309dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += 2; //lengthSizeMinusOne field
310dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += pictureParameterSetNALUnit.length;
311dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
312dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (hasExts && (avcProfileIndication == 100 || avcProfileIndication == 110 || avcProfileIndication == 122 || avcProfileIndication == 144)) {
313dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                size += 4;
314dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                for (byte[] sequenceParameterSetExtNALUnit : sequenceParameterSetExts) {
315dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    size += 2;
316dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    size += sequenceParameterSetExtNALUnit.length;
317dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
318dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
319dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
320dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return size;
321dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
322dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
323dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public String[] getPPS() {
324dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            ArrayList<String> l = new ArrayList<String>();
325dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] pictureParameterSet : pictureParameterSets) {
326dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                String details = "not parsable";
327dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                try {
328dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    details = PictureParameterSet.read(pictureParameterSet).toString();
329dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                } catch (IOException e) {
330dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    throw new RuntimeException(e);
331dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
332dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
333dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                l.add(details);
334dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
335dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return l.toArray(new String[l.size()]);
336dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
337dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
338dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public String[] getSPS() {
339dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            ArrayList<String> l = new ArrayList<String>();
340dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] sequenceParameterSet : sequenceParameterSets) {
341dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                String detail = "not parsable";
342dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                try {
343dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    detail = SeqParameterSet.read(new ByteArrayInputStream(sequenceParameterSet)).toString();
344dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                } catch (IOException e) {
345dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
346dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                }
347dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                l.add(detail);
348dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
349dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return l.toArray(new String[l.size()]);
350dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
351dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
352dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<String> getSequenceParameterSetsAsStrings() {
353dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            List <String> result = new ArrayList<String>(sequenceParameterSets.size());
354dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] parameterSet : sequenceParameterSets) {
355dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                result.add(Hex.encodeHex(parameterSet));
356dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
357dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return result;
358dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
359dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
360dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<String> getSequenceParameterSetExtsAsStrings() {
361dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            List <String> result = new ArrayList<String>(sequenceParameterSetExts.size());
362dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] parameterSet : sequenceParameterSetExts) {
363dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                result.add(Hex.encodeHex(parameterSet));
364dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
365dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return result;
366dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
367dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
368dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        public List<String> getPictureParameterSetsAsStrings() {
369dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            List <String> result = new ArrayList<String>(pictureParameterSets.size());
370dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            for (byte[] parameterSet : pictureParameterSets) {
371dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                result.add(Hex.encodeHex(parameterSet));
372dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
373dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            return result;
374dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
375dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
376dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
377dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
378dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
379