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 Zhu 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.coremedia.iso.IsoTypeReader; 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.ArrayList; 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List; 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuclass InitialObjectDescriptor extends ObjectDescriptorBase : bit(8) 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhutag=InitialObjectDescrTag { 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(10) ObjectDescriptorID; 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(1) URL_Flag; 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(1) includeInlineProfileLevelFlag; 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconst bit(4) reserved=0b1111; 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuif (URL_Flag) { 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLlength; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) URLstring[URLlength]; 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} else { 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) ODProfileLevelIndication; 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) sceneProfileLevelIndication; 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) audioProfileLevelIndication; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) visualProfileLevelIndication; 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhubit(8) graphicsProfileLevelIndication; 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuES_Descriptor esDescr[1 .. 255]; 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOCI_Descriptor ociDescr[0 .. 255]; 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_Descriptor ipmpDescr [0 .. 255]; 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuIPMP_ToolListDescriptor toolListDescr[0 .. 1]; 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuExtensionDescriptor extDescr[0 .. 255]; 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/ 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu//@Descriptor(tags = {0x02, 0x10}) 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class InitialObjectDescriptor extends ObjectDescriptorBase { 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int objectDescriptorId; 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int urlFlag; 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int includeInlineProfileLevelFlag; 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int urlLength; 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu String urlString; 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int oDProfileLevelIndication; 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int sceneProfileLevelIndication; 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int audioProfileLevelIndication; 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int visualProfileLevelIndication; 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int graphicsProfileLevelIndication; 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu List<ESDescriptor> esDescriptors = new ArrayList<ESDescriptor>(); 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu List<ExtensionDescriptor> extensionDescriptors = new ArrayList<ExtensionDescriptor>(); 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu List<BaseDescriptor> unknownDescriptors = new ArrayList<BaseDescriptor>(); 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void parseDetail(ByteBuffer bb) throws IOException { 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int data = IsoTypeReader.readUInt16(bb); 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu objectDescriptorId = (data & 0xFFC0) >> 6; 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu urlFlag = (data & 0x3F) >> 5; 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu includeInlineProfileLevelFlag = (data & 0x1F) >> 4; 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int sizeLeft = getSize() - 2; 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (urlFlag == 1) { 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu urlLength = IsoTypeReader.readUInt8(bb); 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu urlString = IsoTypeReader.readString(bb, urlLength); 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sizeLeft = sizeLeft - (1 + urlLength); 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu oDProfileLevelIndication = IsoTypeReader.readUInt8(bb); 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sceneProfileLevelIndication = IsoTypeReader.readUInt8(bb); 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu audioProfileLevelIndication = IsoTypeReader.readUInt8(bb); 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu visualProfileLevelIndication = IsoTypeReader.readUInt8(bb); 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu graphicsProfileLevelIndication = IsoTypeReader.readUInt8(bb); 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sizeLeft = sizeLeft - 5; 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sizeLeft > 2) { 96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu final BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb); 97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sizeLeft = sizeLeft - descriptor.getSize(); 98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (descriptor instanceof ESDescriptor) { 99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu esDescriptors.add((ESDescriptor) descriptor); 100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu unknownDescriptors.add(descriptor); 102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (sizeLeft > 2) { 107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu final BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, bb); 108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (descriptor instanceof ExtensionDescriptor) { 109dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu extensionDescriptors.add((ExtensionDescriptor) descriptor); 110dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 111dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu unknownDescriptors.add(descriptor); 112dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 113dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 114dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 115dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 116dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu @Override 117dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public String toString() { 118dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu final StringBuilder sb = new StringBuilder(); 119dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append("InitialObjectDescriptor"); 120dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append("{objectDescriptorId=").append(objectDescriptorId); 121dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", urlFlag=").append(urlFlag); 122dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", includeInlineProfileLevelFlag=").append(includeInlineProfileLevelFlag); 123dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", urlLength=").append(urlLength); 124dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", urlString='").append(urlString).append('\''); 125dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", oDProfileLevelIndication=").append(oDProfileLevelIndication); 126dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", sceneProfileLevelIndication=").append(sceneProfileLevelIndication); 127dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", audioProfileLevelIndication=").append(audioProfileLevelIndication); 128dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", visualProfileLevelIndication=").append(visualProfileLevelIndication); 129dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", graphicsProfileLevelIndication=").append(graphicsProfileLevelIndication); 130dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", esDescriptors=").append(esDescriptors); 131dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", extensionDescriptors=").append(extensionDescriptors); 132dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append(", unknownDescriptors=").append(unknownDescriptors); 133dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu sb.append('}'); 134dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return sb.toString(); 135dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 136dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu} 137