/* * Copyright 2011 castLabs, Berlin * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.googlecode.mp4parser.boxes.mp4.objectdescriptors; import com.coremedia.iso.IsoTypeReader; import java.io.IOException; import java.nio.ByteBuffer; /* abstract aligned(8) expandable(228-1) class BaseDescriptor : bit(8) tag=0 { // empty. To be filled by classes extending this class. } int sizeOfInstance = 0; bit(1) nextByte; bit(7) sizeOfInstance; while(nextByte) { bit(1) nextByte; bit(7) sizeByte; sizeOfInstance = sizeOfInstance<<7 | sizeByte; } */ @Descriptor(tags = 0x00) public abstract class BaseDescriptor { int tag; int sizeOfInstance; int sizeBytes; public BaseDescriptor() { } public int getTag() { return tag; } public int getSize() { return sizeOfInstance + 1//1 for the tag + sizeBytes; } public int getSizeOfInstance() { return sizeOfInstance; } public int getSizeBytes() { return sizeBytes; } public final void parse(int tag, ByteBuffer bb) throws IOException { this.tag = tag; int i = 0; int tmp = IsoTypeReader.readUInt8(bb); i++; sizeOfInstance = tmp & 0x7f; while (tmp >>> 7 == 1) { //nextbyte indicator bit tmp = IsoTypeReader.readUInt8(bb); i++; //sizeOfInstance = sizeOfInstance<<7 | sizeByte; sizeOfInstance = sizeOfInstance << 7 | tmp & 0x7f; } sizeBytes = i; ByteBuffer detailSource = bb.slice(); detailSource.limit(sizeOfInstance); parseDetail(detailSource); assert detailSource.remaining() == 0: this.getClass().getSimpleName() + " has not been fully parsed"; bb.position(bb.position() + sizeOfInstance); } public abstract void parseDetail(ByteBuffer bb) throws IOException; @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("BaseDescriptor"); sb.append("{tag=").append(tag); sb.append(", sizeOfInstance=").append(sizeOfInstance); sb.append('}'); return sb.toString(); } }