| /* |
| * Copyright 2008 CoreMedia AG, Hamburg |
| * |
| * 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.coremedia.iso.boxes; |
| |
| import com.coremedia.iso.IsoTypeReader; |
| import com.coremedia.iso.IsoTypeWriter; |
| import com.googlecode.mp4parser.AbstractContainerBox; |
| import com.googlecode.mp4parser.util.ByteBufferByteChannel; |
| |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| |
| |
| /** |
| * A common base structure to contain general metadata. See ISO/IEC 14496-12 Ch. 8.44.1. |
| */ |
| public class MetaBox extends AbstractContainerBox { |
| private int version = 0; |
| private int flags = 0; |
| |
| public static final String TYPE = "meta"; |
| |
| public MetaBox() { |
| super(TYPE); |
| } |
| |
| @Override |
| public long getContentSize() { |
| if (isMp4Box()) { |
| // it's a fullbox |
| return 4 + super.getContentSize(); |
| } else { |
| // it's an apple metabox |
| return super.getContentSize(); |
| } |
| } |
| |
| @Override |
| public long getNumOfBytesToFirstChild() { |
| if (isMp4Box()) { |
| // it's a fullbox |
| return 12; |
| } else { |
| // it's an apple metabox |
| return 8; |
| } |
| } |
| |
| @Override |
| public void _parseDetails(ByteBuffer content) { |
| int pos = content.position(); |
| content.get(new byte[4]); |
| String isHdlr = IsoTypeReader.read4cc(content); |
| if ("hdlr".equals(isHdlr)) { |
| // this is apple bullshit - it's NO FULLBOX |
| content.position(pos); |
| version = -1; |
| flags = -1; |
| } else { |
| content.position(pos); |
| version = IsoTypeReader.readUInt8(content); |
| flags = IsoTypeReader.readUInt24(content); |
| } |
| while (content.remaining() >= 8) { |
| try { |
| boxes.add(boxParser.parseBox(new ByteBufferByteChannel(content), this)); |
| } catch (IOException e) { |
| throw new RuntimeException("Sebastian needs to fix 7518765283"); |
| } |
| } |
| if (content.remaining() > 0) { |
| throw new RuntimeException("Sebastian needs to fix it 90732r26537"); |
| } |
| } |
| |
| @Override |
| protected void getContent(ByteBuffer byteBuffer) { |
| if (isMp4Box()) { |
| IsoTypeWriter.writeUInt8(byteBuffer, version); |
| IsoTypeWriter.writeUInt24(byteBuffer, flags); |
| } |
| writeChildBoxes(byteBuffer); |
| } |
| |
| |
| public boolean isMp4Box() { |
| return version != -1 && flags != -1; |
| } |
| |
| public void setMp4Box(boolean mp4) { |
| if (mp4) { |
| version = 0; |
| flags = 0; |
| } else { |
| version = -1; |
| flags = -1; |
| } |
| } |
| } |