1 /* 2 * Copyright 2011 castLabs, Berlin 3 * 4 * Licensed under the Apache License, Version 2.0 (the License); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an AS IS BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.googlecode.mp4parser.boxes.mp4.objectdescriptors; 18 19 import com.coremedia.iso.IsoTypeReader; 20 21 import java.io.IOException; 22 import java.nio.ByteBuffer; 23 24 /* 25 abstract aligned(8) expandable(228-1) class BaseDescriptor : bit(8) tag=0 { 26 // empty. To be filled by classes extending this class. 27 } 28 29 int sizeOfInstance = 0; 30 bit(1) nextByte; 31 bit(7) sizeOfInstance; 32 while(nextByte) { 33 bit(1) nextByte; 34 bit(7) sizeByte; 35 sizeOfInstance = sizeOfInstance<<7 | sizeByte; 36 } 37 */ 38 @Descriptor(tags = 0x00) 39 public abstract class BaseDescriptor { 40 int tag; 41 int sizeOfInstance; 42 int sizeBytes; 43 BaseDescriptor()44 public BaseDescriptor() { 45 } 46 getTag()47 public int getTag() { 48 return tag; 49 } 50 getSize()51 public int getSize() { 52 return sizeOfInstance 53 + 1//1 for the tag 54 + sizeBytes; 55 } 56 getSizeOfInstance()57 public int getSizeOfInstance() { 58 return sizeOfInstance; 59 } 60 getSizeBytes()61 public int getSizeBytes() { 62 return sizeBytes; 63 } 64 parse(int tag, ByteBuffer bb)65 public final void parse(int tag, ByteBuffer bb) throws IOException { 66 this.tag = tag; 67 68 int i = 0; 69 int tmp = IsoTypeReader.readUInt8(bb); 70 i++; 71 sizeOfInstance = tmp & 0x7f; 72 while (tmp >>> 7 == 1) { //nextbyte indicator bit 73 tmp = IsoTypeReader.readUInt8(bb); 74 i++; 75 //sizeOfInstance = sizeOfInstance<<7 | sizeByte; 76 sizeOfInstance = sizeOfInstance << 7 | tmp & 0x7f; 77 } 78 sizeBytes = i; 79 ByteBuffer detailSource = bb.slice(); 80 detailSource.limit(sizeOfInstance); 81 parseDetail(detailSource); 82 assert detailSource.remaining() == 0: this.getClass().getSimpleName() + " has not been fully parsed"; 83 bb.position(bb.position() + sizeOfInstance); 84 } 85 parseDetail(ByteBuffer bb)86 public abstract void parseDetail(ByteBuffer bb) throws IOException; 87 88 89 90 @Override toString()91 public String toString() { 92 final StringBuilder sb = new StringBuilder(); 93 sb.append("BaseDescriptor"); 94 sb.append("{tag=").append(tag); 95 sb.append(", sizeOfInstance=").append(sizeOfInstance); 96 sb.append('}'); 97 return sb.toString(); 98 } 99 } 100