/* * 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.IsoBufferWrapper; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; /* class ES_Descriptor extends BaseDescriptor : bit(8) tag=ES_DescrTag { bit(16) ES_ID; bit(1) streamDependenceFlag; bit(1) URL_Flag; bit(1) OCRstreamFlag; bit(5) streamPriority; if (streamDependenceFlag) bit(16) dependsOn_ES_ID; if (URL_Flag) { bit(8) URLlength; bit(8) URLstring[URLlength]; } if (OCRstreamFlag) bit(16) OCR_ES_Id; DecoderConfigDescriptor decConfigDescr; if (ODProfileLevelIndication==0x01) //no SL extension. { SLConfigDescriptor slConfigDescr; } else // SL extension is possible. { SLConfigDescriptor slConfigDescr; } IPI_DescrPointer ipiPtr[0 .. 1]; IP_IdentificationDataSet ipIDS[0 .. 255]; IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; LanguageDescriptor langDescr[0 .. 255]; QoS_Descriptor qosDescr[0 .. 1]; RegistrationDescriptor regDescr[0 .. 1]; ExtensionDescriptor extDescr[0 .. 255]; } */ @Descriptor(tags = {0x03}) public class ESDescriptor extends BaseDescriptor { private static Logger log = Logger.getLogger(ESDescriptor.class.getName()); int esId; int streamDependenceFlag; int URLFlag; int oCRstreamFlag; int streamPriority; int URLLength = 0; String URLString; int remoteODFlag; int dependsOnEsId; int oCREsId; DecoderConfigDescriptor decoderConfigDescriptor; SLConfigDescriptor slConfigDescriptor; List<BaseDescriptor> otherDescriptors = new ArrayList<BaseDescriptor>(); @Override public void parse(int tag, IsoBufferWrapper in, int maxLength) throws IOException { super.parse(tag, in, maxLength); esId = in.readUInt16(); int data = in.readUInt8(); streamDependenceFlag = data >>> 7; URLFlag = (data >>> 6) & 0x1; oCRstreamFlag = (data >>> 5) & 0x1; streamPriority = data & 0x1f; if (streamDependenceFlag == 1) { dependsOnEsId = in.readUInt16(); } if (URLFlag == 1) { URLLength = in.readUInt8(); URLString = new String(in.read(URLLength)); } if (oCRstreamFlag == 1) { oCREsId = in.readUInt16(); } int baseSize = 1 /*tag*/ + getSizeBytes() + 2 + 1 + (streamDependenceFlag == 1 ? 2 : 0) + (URLFlag == 1 ? 1 + URLLength : 0) + (oCRstreamFlag == 1 ? 2 : 0); long begin = in.position(); if (getSize() > baseSize + 2) { BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, in, getSize() - baseSize); final long read = in.position() - begin; log.finer(descriptor + " - ESDescriptor1 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null)); if (descriptor != null) { final int size = descriptor.getSize(); in.position(begin + size); baseSize += size; } else { baseSize += read; } if (descriptor instanceof DecoderConfigDescriptor) { decoderConfigDescriptor = (DecoderConfigDescriptor) descriptor; } } begin = in.position(); if (getSize() > baseSize + 2) { BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, in, getSize() - baseSize); final long read = in.position() - begin; log.finer(descriptor + " - ESDescriptor2 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null)); if (descriptor != null) { final int size = descriptor.getSize(); in.position(begin + size); baseSize += size; } else { baseSize += read; } if (descriptor instanceof SLConfigDescriptor) { slConfigDescriptor = (SLConfigDescriptor) descriptor; } } else { log.warning("SLConfigDescriptor is missing!"); } while (getSize() - baseSize > 2) { begin = in.position(); BaseDescriptor descriptor = ObjectDescriptorFactory.createFrom(-1, in, getSize() - baseSize); final long read = in.position() - begin; log.finer(descriptor + " - ESDescriptor3 read: " + read + ", size: " + (descriptor != null ? descriptor.getSize() : null)); if (descriptor != null) { final int size = descriptor.getSize(); in.position(begin + size); baseSize += size; } else { baseSize += read; } otherDescriptors.add(descriptor); } } // @Override // public int getSize() { // return 3 + (streamDependenceFlag == 1 ? 2 : 0) + // (URLFlag == 1 ? 1 + 8 * URLLength : 0) + // (oCRstreamFlag == 1 ? 2 : 0); // } public DecoderConfigDescriptor getDecoderConfigDescriptor() { return decoderConfigDescriptor; } public SLConfigDescriptor getSlConfigDescriptor() { return slConfigDescriptor; } public List<BaseDescriptor> getOtherDescriptors() { return otherDescriptors; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("ESDescriptor"); sb.append("{esId=").append(esId); sb.append(", streamDependenceFlag=").append(streamDependenceFlag); sb.append(", URLFlag=").append(URLFlag); sb.append(", oCRstreamFlag=").append(oCRstreamFlag); sb.append(", streamPriority=").append(streamPriority); sb.append(", URLLength=").append(URLLength); sb.append(", URLString='").append(URLString).append('\''); sb.append(", remoteODFlag=").append(remoteODFlag); sb.append(", dependsOnEsId=").append(dependsOnEsId); sb.append(", oCREsId=").append(oCREsId); sb.append(", decoderConfigDescriptor=").append(decoderConfigDescriptor); sb.append(", slConfigDescriptor=").append(slConfigDescriptor); sb.append('}'); return sb.toString(); } }