1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2011 castLabs, Berlin 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.googlecode.mp4parser.boxes.mp4.objectdescriptors; 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader; 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.ArrayList; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List; 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass ObjectDescriptor extends ObjectDescriptorBase : bit(8) tag=ObjectDescrTag { 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(10) ObjectDescriptorID; 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(1) URL_Flag; 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconst bit(5) reserved=0b1111.1; 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuif (URL_Flag) { 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLlength; 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLstring[URLlength]; 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} else { 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuES_Descriptor esDescr[1 .. 255]; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOCI_Descriptor ociDescr[0 .. 255]; 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_Descriptor ipmpDescr [0 .. 255]; 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuExtensionDescriptor extDescr[0 .. 255]; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/ 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu@Descriptor(tags = {0x01, 0x11}) 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ObjectDescriptor extends ObjectDescriptorBase { 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int objectDescriptorId; 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int objectDescriptorUrlFlag; 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int objectDescriptorUrlLength; 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu String objectDescriptorUrlString; 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int streamCount; 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int extensionFlag; 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private List<ESDescriptor> esDescriptors = new ArrayList<ESDescriptor>(); 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int descriptorLength; 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private List<ExtensionDescriptor> extensionDescriptors = new ArrayList<ExtensionDescriptor>(); 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static ObjectDescriptor createFrom(ByteBuffer in) throws IOException { 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu tmp = in.readUInt16(); 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu esDescriptor.objectDescriptorId = tmp & 0x3f; 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu esDescriptor.objectDescriptorUrlFlag = (tmp >> 5) & 0x1; 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (esDescriptor.objectDescriptorUrlFlag == 1) { 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu esDescriptor.objectDescriptorUrlLength = in.readUInt8(); 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu esDescriptor.objectDescriptorUrlString = new String(in.read(esDescriptor.objectDescriptorUrlLength)); 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ObjectDescriptor objectDescriptor = new ObjectDescriptor(); 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int data = IsoTypeReader.readUInt16(in); 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu objectDescriptor.objectDescriptorId = data & 0xFFC0; 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu objectDescriptor.streamCount = data & 0x3E; 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu objectDescriptor.extensionFlag = data & 0x1; 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// for (int i = 0; i < objectDescriptor.streamCount; i++) { 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// objectDescriptor.esDescriptors.add(ESDescriptor.createFrom(in)); 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// } 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// if (objectDescriptor.extensionFlag == 1) { 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// objectDescriptor.descriptorLength = in.readUInt8(); 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// for (int i = 0; i < objectDescriptor.descriptorLength;) { 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// ExtensionDescriptor extensionDescriptor = ExtensionDescriptor.createFrom(in); 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// objectDescriptor.extensionDescriptors.add(extensionDescriptor); 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// i = i + extensionDescriptor.descriptorDataLength + 1; 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// } 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu// } 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return objectDescriptor; 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public String toString() { 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return "ObjectDescriptor{" + 96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu "objectDescriptorId=" + objectDescriptorId + 97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", streamCount=" + streamCount + 98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", extensionFlag=" + extensionFlag + 99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", esDescriptors=" + esDescriptors + 100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", descriptorLength=" + descriptorLength + 101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ", extensionDescriptors=" + extensionDescriptors + 102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu '}'; 103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 105