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