• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.sampleentry;
18 
19 import com.coremedia.iso.IsoTypeReader;
20 import com.coremedia.iso.IsoTypeWriter;
21 import com.coremedia.iso.boxes.Box;
22 
23 import java.io.IOException;
24 import java.nio.ByteBuffer;
25 
26 /**
27  * Entry type for timed text samples defined in the timed text specification (ISO/IEC 14496-17).
28  */
29 public class TextSampleEntry extends SampleEntry {
30 
31     public static final String TYPE1 = "tx3g";
32 
33     public static final String TYPE_ENCRYPTED = "enct";
34 
35 /*  class TextSampleEntry() extends SampleEntry ('tx3g') {
36     unsigned int(32)  displayFlags;
37     signed int(8)     horizontal-justification;
38     signed int(8)     vertical-justification;
39     unsigned int(8)   background-color-rgba[4];
40     BoxRecord         default-text-box;
41     StyleRecord       default-style;
42     FontTableBox      font-table;
43   }
44   */
45 
46     private long displayFlags; // 32 bits
47     private int horizontalJustification; // 8 bit
48     private int verticalJustification;  // 8 bit
49     private int[] backgroundColorRgba = new int[4]; // 4 bytes
50     private BoxRecord boxRecord = new BoxRecord();
51     private StyleRecord styleRecord = new StyleRecord();
52 
TextSampleEntry(String type)53     public TextSampleEntry(String type) {
54         super(type);
55     }
56 
57     @Override
_parseDetails(ByteBuffer content)58     public void _parseDetails(ByteBuffer content) {
59         _parseReservedAndDataReferenceIndex(content);
60         displayFlags = IsoTypeReader.readUInt32(content);
61         horizontalJustification = IsoTypeReader.readUInt8(content);
62         verticalJustification = IsoTypeReader.readUInt8(content);
63         backgroundColorRgba = new int[4];
64         backgroundColorRgba[0] = IsoTypeReader.readUInt8(content);
65         backgroundColorRgba[1] = IsoTypeReader.readUInt8(content);
66         backgroundColorRgba[2] = IsoTypeReader.readUInt8(content);
67         backgroundColorRgba[3] = IsoTypeReader.readUInt8(content);
68         boxRecord = new BoxRecord();
69         boxRecord.parse(content);
70 
71         styleRecord = new StyleRecord();
72         styleRecord.parse(content);
73         _parseChildBoxes(content);
74     }
75 
76 
getContentSize()77     protected long getContentSize() {
78         long contentSize = 18;
79         contentSize += boxRecord.getSize();
80         contentSize += styleRecord.getSize();
81         for (Box boxe : boxes) {
82             contentSize += boxe.getSize();
83         }
84         return contentSize;
85     }
86 
toString()87     public String toString() {
88         return "TextSampleEntry";
89     }
90 
91     @Override
getContent(ByteBuffer byteBuffer)92     protected void getContent(ByteBuffer byteBuffer) {
93         _writeReservedAndDataReferenceIndex(byteBuffer);
94         IsoTypeWriter.writeUInt32(byteBuffer, displayFlags);
95         IsoTypeWriter.writeUInt8(byteBuffer, horizontalJustification);
96         IsoTypeWriter.writeUInt8(byteBuffer, verticalJustification);
97         IsoTypeWriter.writeUInt8(byteBuffer, backgroundColorRgba[0]);
98         IsoTypeWriter.writeUInt8(byteBuffer, backgroundColorRgba[1]);
99         IsoTypeWriter.writeUInt8(byteBuffer, backgroundColorRgba[2]);
100         IsoTypeWriter.writeUInt8(byteBuffer, backgroundColorRgba[3]);
101         boxRecord.getContent(byteBuffer);
102         styleRecord.getContent(byteBuffer);
103 
104         _writeChildBoxes(byteBuffer);
105     }
106 
getBoxRecord()107     public BoxRecord getBoxRecord() {
108         return boxRecord;
109     }
110 
setBoxRecord(BoxRecord boxRecord)111     public void setBoxRecord(BoxRecord boxRecord) {
112         this.boxRecord = boxRecord;
113     }
114 
getStyleRecord()115     public StyleRecord getStyleRecord() {
116         return styleRecord;
117     }
118 
setStyleRecord(StyleRecord styleRecord)119     public void setStyleRecord(StyleRecord styleRecord) {
120         this.styleRecord = styleRecord;
121     }
122 
isScrollIn()123     public boolean isScrollIn() {
124         return (displayFlags & 0x00000020) == 0x00000020;
125     }
126 
setScrollIn(boolean scrollIn)127     public void setScrollIn(boolean scrollIn) {
128         if (scrollIn) {
129             displayFlags |= 0x00000020;
130         } else {
131             displayFlags &= ~0x00000020;
132         }
133     }
134 
isScrollOut()135     public boolean isScrollOut() {
136         return (displayFlags & 0x00000040) == 0x00000040;
137     }
138 
setScrollOut(boolean scrollOutIn)139     public void setScrollOut(boolean scrollOutIn) {
140         if (scrollOutIn) {
141             displayFlags |= 0x00000040;
142         } else {
143             displayFlags &= ~0x00000040;
144         }
145     }
146 
isScrollDirection()147     public boolean isScrollDirection() {
148         return (displayFlags & 0x00000180) == 0x00000180;
149     }
150 
setScrollDirection(boolean scrollOutIn)151     public void setScrollDirection(boolean scrollOutIn) {
152         if (scrollOutIn) {
153             displayFlags |= 0x00000180;
154         } else {
155             displayFlags &= ~0x00000180;
156         }
157     }
158 
isContinuousKaraoke()159     public boolean isContinuousKaraoke() {
160         return (displayFlags & 0x00000800) == 0x00000800;
161     }
162 
setContinuousKaraoke(boolean continuousKaraoke)163     public void setContinuousKaraoke(boolean continuousKaraoke) {
164         if (continuousKaraoke) {
165             displayFlags |= 0x00000800;
166         } else {
167             displayFlags &= ~0x00000800;
168         }
169     }
170 
isWriteTextVertically()171     public boolean isWriteTextVertically() {
172         return (displayFlags & 0x00020000) == 0x00020000;
173     }
174 
setWriteTextVertically(boolean writeTextVertically)175     public void setWriteTextVertically(boolean writeTextVertically) {
176         if (writeTextVertically) {
177             displayFlags |= 0x00020000;
178         } else {
179             displayFlags &= ~0x00020000;
180         }
181     }
182 
183 
isFillTextRegion()184     public boolean isFillTextRegion() {
185         return (displayFlags & 0x00040000) == 0x00040000;
186     }
187 
setFillTextRegion(boolean fillTextRegion)188     public void setFillTextRegion(boolean fillTextRegion) {
189         if (fillTextRegion) {
190             displayFlags |= 0x00040000;
191         } else {
192             displayFlags &= ~0x00040000;
193         }
194     }
195 
196 
getHorizontalJustification()197     public int getHorizontalJustification() {
198         return horizontalJustification;
199     }
200 
setHorizontalJustification(int horizontalJustification)201     public void setHorizontalJustification(int horizontalJustification) {
202         this.horizontalJustification = horizontalJustification;
203     }
204 
getVerticalJustification()205     public int getVerticalJustification() {
206         return verticalJustification;
207     }
208 
setVerticalJustification(int verticalJustification)209     public void setVerticalJustification(int verticalJustification) {
210         this.verticalJustification = verticalJustification;
211     }
212 
getBackgroundColorRgba()213     public int[] getBackgroundColorRgba() {
214         return backgroundColorRgba;
215     }
216 
setBackgroundColorRgba(int[] backgroundColorRgba)217     public void setBackgroundColorRgba(int[] backgroundColorRgba) {
218         this.backgroundColorRgba = backgroundColorRgba;
219     }
220 
221     public static class BoxRecord {
222         int top;
223         int left;
224         int bottom;
225         int right;
226 
parse(ByteBuffer in)227         public void parse(ByteBuffer in) {
228             top = IsoTypeReader.readUInt16(in);
229             left = IsoTypeReader.readUInt16(in);
230             bottom = IsoTypeReader.readUInt16(in);
231             right = IsoTypeReader.readUInt16(in);
232         }
233 
getContent(ByteBuffer bb)234         public void getContent(ByteBuffer bb)  {
235             IsoTypeWriter.writeUInt16(bb, top);
236             IsoTypeWriter.writeUInt16(bb, left);
237             IsoTypeWriter.writeUInt16(bb, bottom);
238             IsoTypeWriter.writeUInt16(bb, right);
239         }
240 
getSize()241         public int getSize() {
242             return 8;
243         }
244     }
245 
246     /*
247     class FontRecord {
248 	unsigned int(16) 	font-ID;
249 	unsigned int(8)	font-name-length;
250 	unsigned int(8)	font[font-name-length];
251 }
252      */
253 
254 
255     /*
256    aligned(8) class StyleRecord {
257    unsigned int(16) 	startChar;
258    unsigned int(16)	endChar;
259    unsigned int(16)	font-ID;
260    unsigned int(8)	face-style-flags;
261    unsigned int(8)	font-size;
262    unsigned int(8)	text-color-rgba[4];
263 }
264     */
265     public static class StyleRecord {
266         int startChar;
267         int endChar;
268         int fontId;
269         int faceStyleFlags;
270         int fontSize;
271         int[] textColor = new int[]{0xff, 0xff, 0xff, 0xff};
272 
parse(ByteBuffer in)273         public void parse(ByteBuffer in) {
274             startChar = IsoTypeReader.readUInt16(in);
275             endChar = IsoTypeReader.readUInt16(in);
276             fontId = IsoTypeReader.readUInt16(in);
277             faceStyleFlags = IsoTypeReader.readUInt8(in);
278             fontSize = IsoTypeReader.readUInt8(in);
279             textColor = new int[4];
280             textColor[0] = IsoTypeReader.readUInt8(in);
281             textColor[1] = IsoTypeReader.readUInt8(in);
282             textColor[2] = IsoTypeReader.readUInt8(in);
283             textColor[3] = IsoTypeReader.readUInt8(in);
284         }
285 
286 
getContent(ByteBuffer bb)287         public void getContent(ByteBuffer bb) {
288             IsoTypeWriter.writeUInt16(bb, startChar);
289             IsoTypeWriter.writeUInt16(bb, endChar);
290             IsoTypeWriter.writeUInt16(bb, fontId);
291             IsoTypeWriter.writeUInt8(bb, faceStyleFlags);
292             IsoTypeWriter.writeUInt8(bb, fontSize);
293             IsoTypeWriter.writeUInt8(bb, textColor[0]);
294             IsoTypeWriter.writeUInt8(bb, textColor[1]);
295             IsoTypeWriter.writeUInt8(bb, textColor[2]);
296             IsoTypeWriter.writeUInt8(bb, textColor[3]);
297         }
298 
getSize()299         public int getSize() {
300             return 12;
301         }
302     }
303 
304 
305 }
306