1 /*
2  * Copyright 2008 CoreMedia AG, Hamburg
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.coremedia.iso.boxes;
18 
19 import com.coremedia.iso.IsoTypeReader;
20 import com.coremedia.iso.IsoTypeWriter;
21 import com.googlecode.mp4parser.AbstractContainerBox;
22 import com.googlecode.mp4parser.util.ByteBufferByteChannel;
23 
24 import java.io.IOException;
25 import java.nio.ByteBuffer;
26 
27 
28 /**
29  * A common base structure to contain general metadata. See ISO/IEC 14496-12 Ch. 8.44.1.
30  */
31 public class MetaBox extends AbstractContainerBox {
32     private int version = 0;
33     private int flags = 0;
34 
35     public static final String TYPE = "meta";
36 
MetaBox()37     public MetaBox() {
38         super(TYPE);
39     }
40 
41     @Override
getContentSize()42     public long getContentSize() {
43         if (isMp4Box()) {
44             // it's a fullbox
45             return 4 + super.getContentSize();
46         } else {
47             // it's an apple metabox
48             return super.getContentSize();
49         }
50     }
51 
52     @Override
getNumOfBytesToFirstChild()53     public long getNumOfBytesToFirstChild() {
54         if (isMp4Box()) {
55             // it's a fullbox
56             return 12;
57         } else {
58             // it's an apple metabox
59             return 8;
60         }
61     }
62 
63     @Override
_parseDetails(ByteBuffer content)64     public void _parseDetails(ByteBuffer content) {
65         int pos = content.position();
66         content.get(new byte[4]);
67         String isHdlr = IsoTypeReader.read4cc(content);
68         if ("hdlr".equals(isHdlr)) {
69             //  this is apple bullshit - it's NO FULLBOX
70             content.position(pos);
71             version = -1;
72             flags = -1;
73         } else {
74             content.position(pos);
75             version = IsoTypeReader.readUInt8(content);
76             flags = IsoTypeReader.readUInt24(content);
77         }
78         while (content.remaining() >= 8) {
79             try {
80                 boxes.add(boxParser.parseBox(new ByteBufferByteChannel(content), this));
81             } catch (IOException e) {
82                 throw new RuntimeException("Sebastian needs to fix 7518765283");
83             }
84         }
85         if (content.remaining() > 0) {
86             throw new RuntimeException("Sebastian needs to fix it 90732r26537");
87         }
88     }
89 
90     @Override
getContent(ByteBuffer byteBuffer)91     protected void getContent(ByteBuffer byteBuffer) {
92         if (isMp4Box()) {
93             IsoTypeWriter.writeUInt8(byteBuffer, version);
94             IsoTypeWriter.writeUInt24(byteBuffer, flags);
95         }
96         writeChildBoxes(byteBuffer);
97     }
98 
99 
isMp4Box()100     public boolean isMp4Box() {
101         return version != -1 && flags != -1;
102     }
103 
setMp4Box(boolean mp4)104     public void setMp4Box(boolean mp4) {
105         if (mp4) {
106             version = 0;
107             flags = 0;
108         } else {
109             version = -1;
110             flags = -1;
111         }
112     }
113 }
114