Blimp v.0.2 (2004-11-10)
Christian Heimke authored 13 years ago
|
4) * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5) * a blinkenarea.org project
6) * powered by eventphone.de
7) */
8)
9) import java.util.*;
10) import java.util.regex.*;
11) import java.io.*;
12)
13) public class BlinkenMovie
14) {
15)
16) private int height;
17) private int width;
18) private int channels;
19) private int maxval;
20) private int infoCnt;
21) private String[][] infos;
22) private int frameCnt;
23) private BlinkenFrame[] frames;
24)
25) BlinkenMovie( int height, int width, int channels, int maxval )
26) {
27) if( height < 1 ) height = 1;
28) if( height > 1024 ) height = 1024;
29) if( width < 1 ) width = 1;
30) if( width > 1024 ) width = 1024;
31) if( channels < 1 ) channels = 1;
32) if( channels > 16 ) channels = 16;
33) if( maxval < 1 ) maxval = 1;
34) if( maxval > 255 ) maxval = 255;
35)
36) this.height = height;
37) this.width = width;
38) this.channels = channels;
39) this.maxval = maxval;
40) infoCnt = 0;
41) infos = new String[0][2];
42) frameCnt = 0;
43) frames = new BlinkenFrame[0];
44) }
45)
46) BlinkenMovie( BlinkenMovie movie )
47) {
48) int i;
49)
50) height = movie.height;
51) width = movie.width;
52) channels = movie.channels;
53) maxval = movie.maxval;
54) infoCnt = 0;
55) infos = new String[0][2];
56) frameCnt = 0;
57) frames = new BlinkenFrame[0];
58)
59) for( i = 0; i < movie.infoCnt; i++ )
60) appendInfo( new String( movie.infos[i][0] ), new String( movie.infos[i][1] ) );
61)
62) for( i = 0; i < movie.frameCnt; i++ )
63) appendFrame( new BlinkenFrame( movie.frames[i] ) );
64) }
65)
66) public int getHeight( )
67) {
68) return height;
69) }
70)
71) public int getWidth( )
72) {
73) return width;
74) }
75)
76) public int getChannels( )
77) {
78) return channels;
79) }
80)
81) public int getMaxval( )
82) {
83) return maxval;
84) }
85)
86) public int getDuration( )
87) {
88) int duration, i;
89) duration = 0;
90) for( i = 0; i < frameCnt; i++ )
91) duration += frames[i].getDuration( );
92) return duration;
93) }
94)
95) public int getInfoCnt( )
96) {
97) return infoCnt;
98) }
99)
100) public String getInfoType( int infoNo )
101) {
102) if( infoCnt < 1 ) return "";
103) if( infoNo < 0 ) infoNo = 0;
104) if( infoNo >= infoCnt ) infoNo = infoCnt - 1;
105) return infos[infoNo][0];
106) }
107)
108) public String getInfoData( int infoNo )
109) {
110) if( infoCnt < 1 ) return "";
111) if( infoNo < 0 ) infoNo = 0;
112) if( infoNo >= infoCnt ) infoNo = infoCnt - 1;
113) return infos[infoNo][1];
114) }
115)
116) public void setInfo( int infoNo, String infoType, String infoData )
117) {
118) if( infoNo < 0 || infoNo >= infoCnt )
119) return;
120) infos[infoNo][0] = infoType;
121) infos[infoNo][1] = infoData;
122) }
123)
124) public void insertInfo( int infoNo, String infoType, String infoData )
125) {
126) String[][] infos;
127) int i;
128)
129) if( infoNo < 0 || infoNo > infoCnt )
130) return;
131)
132) infos = new String[infoCnt+1][2];
133)
134) for( i = 0; i < infoNo; i++ )
135) {
136) infos[i][0] = this.infos[i][0];
137) infos[i][1] = this.infos[i][1];
138) }
139)
140) infos[infoNo][0] = infoType;
141) infos[infoNo][1] = infoData;
142)
143) for( i = infoNo; i < infoCnt; i++ )
144) {
145) infos[i+1][0] = this.infos[i][0];
146) infos[i+1][1] = this.infos[i][1];
147) }
148)
149) this.infos = infos;
150) infoCnt++;
151) }
152)
153) public void appendInfo( String infoType, String infoData )
154) {
155) insertInfo( infoCnt, infoType, infoData );
156) }
157)
158) public void deleteInfo( int infoNo )
159) {
160) String[][] infos;
161) int i;
162)
163) if( infoNo < 0 || infoNo >= infoCnt )
164) return;
165)
166) infos = new String[infoCnt-1][2];
167)
168) for( i = 0; i < infoNo; i++ )
169) {
170) infos[i][0] = this.infos[i][0];
171) infos[i][1] = this.infos[i][1];
172) }
173)
174) for( i = infoNo; i < infoCnt-1; i++ )
175) {
176) infos[i][0] = this.infos[i+1][0];
177) infos[i][1] = this.infos[i+1][1];
178) }
179)
180) this.infos = infos;
181) infoCnt--;
182) }
183)
184) public void deleteInfos( )
185) {
186) infos = new String[0][2];
187) infoCnt = 0;
188) }
189)
190) public int getFrameCnt( )
191) {
192) return frameCnt;
193) }
194)
195) public BlinkenFrame getFrame( int frameNo )
196) {
197) BlinkenFrame frame;
198) if( frameCnt < 1 )
199) {
200) frame = new BlinkenFrame( height, width, channels, maxval, 0 );
201) frame.clear( );
202) return frame;
203) }
204) if( frameNo < 0 ) frameNo = 0;
205) if( frameNo >= frameCnt ) frameNo = frameCnt - 1;
206) return frames[frameNo];
207) }
208)
209) public void setFrame( int frameNo, BlinkenFrame frame )
210) {
211) if( frameNo < 0 || frameNo >= frameCnt )
212) return;
213) frame.resize( height, width, channels, maxval );
214) frames[frameNo] = frame;
215) }
216)
217) public void insertFrame( int frameNo, BlinkenFrame frame )
218) {
219) BlinkenFrame[] frames;
220) int i;
221)
222) if( frameNo < 0 || frameNo > frameCnt )
223) return;
224)
225) frames = new BlinkenFrame[frameCnt+1];
226)
227) for( i = 0; i < frameNo; i++ )
228) frames[i] = this.frames[i];
229)
230) frame.resize( height, width, channels, maxval );
231) frames[frameNo] = frame;
232)
233) for( i = frameNo; i < frameCnt; i++ )
234) frames[i+1] = this.frames[i];
235)
236) this.frames = frames;
237) frameCnt++;
238) }
239)
240) public void appendFrame( BlinkenFrame frame )
241) {
242) insertFrame( frameCnt, frame );
243) }
244)
245) public void deleteFrame( int frameNo )
246) {
247) BlinkenFrame[] frames;
248) int i;
249)
250) if( frameNo < 0 || frameNo >= frameCnt )
251) return;
252)
253) frames = new BlinkenFrame[frameCnt-1];
254)
255) for( i = 0; i < frameNo; i++ )
256) frames[i] = this.frames[i];
257)
258) for( i = frameNo; i < frameCnt-1; i++ )
259) frames[i] = this.frames[i+1];
260)
261) this.frames = frames;
262) frameCnt--;
263) }
264)
265) public void deleteFrames( )
266) {
267) frames = new BlinkenFrame[0];
268) frameCnt = 0;
269) }
270)
271) public void resize( int height, int width, int channels, int maxval )
272) {
273) int i;
274)
275) if( height < 1 ) height = 1;
276) if( height > 1024 ) height = 1024;
277) if( width < 1 ) width = 1;
278) if( width > 1024 ) width = 1024;
279) if( channels < 1 ) channels = 1;
280) if( channels > 16 ) channels = 16;
281) if( maxval < 1 ) maxval = 1;
282) if( maxval > 255 ) maxval = 255;
283)
284) this.height = height;
285) this.width = width;
286) this.channels = channels;
287) this.maxval = maxval;
288)
289) for( i = 0; i < frameCnt; i++ )
290) frames[i].resize( height, width, channels, maxval );
291) }
292)
|
Blimp v.0.2 (2004-11-10)
Christian Heimke authored 13 years ago
|
309) public String toString( )
310) {
311) String str = "BlinkenMovie " + width + "x" + height + "-" + channels + "/" + (maxval + 1) + "\n";
312) int i;
313) for( i = 0; i < infoCnt; i++ )
314) str += infos[i][0] + " = " + infos[i][1] + "\n";
315) for( i = 0; i < frameCnt; i++ )
316) str += "frame " + i + "\n" + frames[i].toString( );
317) return str;
318) }
319)
320) public boolean loadBlm( String filename )
321) {
322) Pattern header, infoLine, startOfFrame, dataLine;
323) BufferedReader file;
324) String line, pixel;
325) Matcher matcher;
326) int width, height, duration, y, x, val;
327) BlinkenFrame frame;
328)
329) //initialize needed regexp patterns
330) header = Pattern.compile( "^ *# BlinkenLights Movie ([0-9]+)x([0-9]+)" );
331) infoLine = Pattern.compile( "^ *# ?([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
332) startOfFrame = Pattern.compile( "^ *@([0-9]+)" );
333) dataLine = Pattern.compile( " *([01])" );
334)
335) //delete all frames
336) deleteInfos( );
337) deleteFrames( );
338) resize( 0, 0, 0, 0 );
339)
340) //try to read file
341) try
342) {
343) //open file
344) file = new BufferedReader( new FileReader( filename ) );
345)
346) //read magic and size
347) if( (line = file.readLine( )) != null )
348) {
349) if( (matcher = header.matcher( line )).find( ) )
350) {
351) width = Integer.parseInt( matcher.group( 1 ) );
352) height = Integer.parseInt( matcher.group( 2 ) );
353) resize( height, width, 1, 1 );
354)
355) //create unused dummy frame for beginning
356) frame = new BlinkenFrame( height, width, 1, 1, 0 );
357) y = 0;
358)
359) //read frames
360) while( (line = file.readLine( )) != null )
361) {
362)
363) //info line
364) if( (matcher = infoLine.matcher( line )).find( ) )
365) {
366) appendInfo( matcher.group( 1 ), matcher.group( 2 ) );
367) }
368)
369) //start of frame
370) else if( (matcher = startOfFrame.matcher( line )).find( ) )
371) {
372) duration = Integer.parseInt( matcher.group( 1 ) );
373) //create new frame and append it to movie
374) frame = new BlinkenFrame( this.height, this.width, 1, 1, duration );
375) frame.clear( );
376) appendFrame( frame );
377) y = 0;
378) }
379)
380) //data line
381) else if( (matcher = dataLine.matcher( line )).find( ) )
382) {
383) x = 0;
384) while( true )
385) {
386) pixel = matcher.group( 1 );
387) val = Integer.parseInt( pixel );
388) frame.setPixel( y, x, 0, (byte)val ); //set pixel
389) if( ! matcher.find( ) ) //get next pixel
390) break;
391) x++; //next pixel
392) }
393) y++; //next row
394) }
395)
396) } //while( (line = ...
397) } //if( matcher = header..matcher( ...
398) } //if( (line = ...
399)
400) //close file
401) file.close( );
402)
403) //success
404) return true;
405) }
406) catch( IOException e ) { }
407)
408) //some error
409) return false;
410) }
411)
412) public boolean loadBmm( String filename )
413) {
414) Pattern header, infoLine, startOfFrame, dataLine;
415) BufferedReader file;
416) String line, pixel;
417) Matcher matcher;
418) int width, height, duration, y, x, val;
419) BlinkenFrame frame;
420)
421) //initialize needed regexp patterns
422) header = Pattern.compile( "^ *# BlinkenMini Movie ([0-9]+)x([0-9]+)" );
423) infoLine = Pattern.compile( "^ *# ?([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
424) startOfFrame = Pattern.compile( "^ *@([0-9]+)" );
425) dataLine = Pattern.compile( " *(0x[0-9A-Fa-f]+|[0-9]+)" );
426)
427) //delete all frames
428) deleteInfos( );
429) deleteFrames( );
430) resize( 0, 0, 0, 0 );
431)
432) //try to read file
433) try
434) {
435) //open file
436) file = new BufferedReader( new FileReader( filename ) );
437)
438) //read magic and size
439) if( (line = file.readLine( )) != null )
440) {
441) if( (matcher = header.matcher( line )).find( ) )
442) {
443) width = Integer.parseInt( matcher.group( 1 ) );
444) height = Integer.parseInt( matcher.group( 2 ) );
445) resize( height, width, 1, 255 );
446)
447) //create unused dummy frame for beginning
448) frame = new BlinkenFrame( height, width, 1, 255, 0 );
449) y = 0;
450)
451) //read frames
452) while( (line = file.readLine( )) != null )
453) {
454)
455) //info line
456) if( (matcher = infoLine.matcher( line )).find( ) )
457) {
458) appendInfo( matcher.group( 1 ), matcher.group( 2 ) );
459) }
460)
461) //start of frame
462) else if( (matcher = startOfFrame.matcher( line )).find( ) )
463) {
464) duration = Integer.parseInt( matcher.group( 1 ) );
465) //create new frame and append it to movie
466) frame = new BlinkenFrame( this.height, this.width, 1, 255, duration );
467) frame.clear( );
468) appendFrame( frame );
469) y = 0;
470) }
471)
472) //data line
473) else if( (matcher = dataLine.matcher( line )).find( ) )
474) {
475) x = 0;
476) while( true )
477) {
478) pixel = matcher.group( 1 );
479) if( pixel.length( ) >= 2 && pixel.substring( 0, 2 ).equals( "0x" ) )
480) val = Integer.parseInt( pixel.substring( 2 ), 0x10 );
481) else
482) val = Integer.parseInt( pixel );
483) frame.setPixel( y, x, 0, (byte)val ); //set pixel
484) if( ! matcher.find( ) ) //get next pixel
485) break;
486) x++; //next pixel
487) }
488) y++; //next row
489) }
490)
491) } //while( (line = ...
492) } //if( matcher = header..matcher( ...
493) } //if( (line = ...
494)
495) //close file
496) file.close( );
497)
498) //success
499) return true;
500) }
501) catch( IOException e ) { }
502)
503) //some error
504) return false;
505) }
506)
507) public boolean loadBml( String filename )
508) {
509) Pattern blmTag, blmHeight, blmWidth, blmChannels, blmBits;
510) Pattern infoTitle, infoDescription, infoGeneric, infoCreator, infoAuthor, infoEmail, infoUrl;
511) Pattern frameTag, frameDuration, rowTag, tag;
512) BufferedReader file;
513) String line, data, row;
514) boolean blmTagFound;
515) Matcher matcher, submatcher;
516) int height, width, channels, bits, maxval, chrs, duration, y, x, c, len, i, val;
517) BlinkenFrame frame;
518)
519) //initialize needed regexp patterns
520) blmTag = Pattern.compile( "^[^<]*<blm([^>]*)>" );
521) blmHeight = Pattern.compile( "height=\"?([0-9]*)\"?" );
522) blmWidth = Pattern.compile( "width=\"?([0-9]*)\"?" );
523) blmChannels = Pattern.compile( "channels=\"?([0-9]*)\"?" );
524) blmBits = Pattern.compile( "bits=\"?([0-9]*)\"?" );
525) infoTitle = Pattern.compile( "^[^<]*<title>([^<]*)</title>" );
526) infoDescription = Pattern.compile( "[^<]*<description>([^<]*)</description>" );
527) infoGeneric = Pattern.compile( "^([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
528) infoCreator = Pattern.compile( "^[^<]*<creator>([^<]*)</creator>" );
529) infoAuthor = Pattern.compile( "^[^<]*<author>([^<]*)</author>" );
530) infoEmail = Pattern.compile( "^[^<]*<email>([^<]*)</email>" );
531) infoUrl = Pattern.compile( "^[^<]*<url>([^<]*)</url>" );
532) frameTag = Pattern.compile( "^[^<]*<frame([^>]*)>" );
533) frameDuration = Pattern.compile( "duration=\"?([0-9]*)\"?" );
534) rowTag = Pattern.compile( "^[^<]*<row>([0-9A-Fa-f]*)</row>" );
535) tag = Pattern.compile( "^[^<]*<[^>]*>" );
536)
537) //delete all frames
538) deleteInfos( );
539) deleteFrames( );
540) resize( 0, 0, 0, 0 );
541)
542) //try to read file
543) try
544) {
545) //open file
546) file = new BufferedReader( new FileReader( filename ) );
547)
548) //create unused dummy frame for beginning
549) frame = new BlinkenFrame( 0, 0, 0, 0, 0 );
550) y = 0;
551) chrs = 1;
552)
553) //read file
554) data = "";
555) blmTagFound = false;
556) while( (line = file.readLine( )) != null )
557) {
558) data += " " + line; //add new line to data
559)
560) //match tags
561) while( true )
562) {
563)
564) //no blm tag yet
565) if( ! blmTagFound )
566) {
567)
568) //blm tag
569) if( (matcher = blmTag.matcher( data )).find( ) )
570) {
571) //remove matched part
572) data = data.substring( matcher.end( ) );
573) //get attributes
574) width = 0;
575) height = 0;
|
Blimp v.0.2 (2004-11-10)
Christian Heimke authored 13 years ago
|
579) if( (submatcher = blmHeight.matcher( matcher.group( 1 ) )).find( ) ) //height
580) height = Integer.parseInt( submatcher.group( 1 ) );
581) if( (submatcher = blmWidth.matcher( matcher.group( 1 ) )).find( ) ) //width
582) width = Integer.parseInt( submatcher.group( 1 ) );
583) if( (submatcher = blmChannels.matcher( matcher.group( 1 ) )).find( ) ) //channels
584) channels = Integer.parseInt( submatcher.group( 1 ) );
585) if( (submatcher = blmBits.matcher( matcher.group( 1 ) )).find( ) ) //bits
586) maxval = (1 << (bits = Integer.parseInt( submatcher.group( 1 ) ))) - 1;
587) //remember that blm tag was found
588) blmTagFound = true;
589) //set movie size
590) resize( height, width, channels, maxval );
591) //get number of characters per channel
592) chrs = (bits + 3) >> 2;
593) }
594)
595) //unknown tag
596) else if( (matcher = tag.matcher( data )).find( ) )
597) //remove matched part
598) data = data.substring( matcher.end( ) );
599)
600) //nothing matches
601) else
602) //end loop
603) break;
604)
605) } //if( ! blmTagFound )
606)
607) //blm tag was already found
608) else
609) {
610)
611) //title tag
612) if( (matcher = infoTitle.matcher( data )).find( ) )
613) {
614) //remove matched part
615) data = data.substring( matcher.end( ) );
616) //add info to movie
617) appendInfo( "title", matcher.group( 1 ) );
618) }
619)
620) //description tag
621) else if( (matcher = infoDescription.matcher( data )).find( ) )
622) {
623) //remove matched part
624) data = data.substring( matcher.end( ) );
625) //check if generic info
626) if( (submatcher = infoGeneric.matcher( matcher.group( 1 ) )).find( ) )
627) //add info to movie
628) appendInfo( submatcher.group( 1 ), submatcher.group( 2 ) );
629) else
630) //add info to movie
631) appendInfo( "description", matcher.group( 1 ) );
632) }
633)
634) //creator tag
635) else if( (matcher = infoCreator.matcher( data )).find( ) )
636) {
637) //remove matched part
638) data = data.substring( matcher.end( ) );
639) //add info to movie
640) appendInfo( "creator", matcher.group( 1 ) );
641) }
642)
643) //author tag
644) else if( (matcher = infoAuthor.matcher( data )).find( ) )
645) {
646) //remove matched part
647) data = data.substring( matcher.end( ) );
648) //add info to movie
649) appendInfo( "author", matcher.group( 1 ) );
650) }
651)
652) //email tag
653) else if( (matcher = infoEmail.matcher( data )).find( ) )
654) {
655) //remove matched part
656) data = data.substring( matcher.end( ) );
657) //add info to movie
658) appendInfo( "email", matcher.group( 1 ) );
659) }
660)
661) //url tag
662) else if( (matcher = infoUrl.matcher( data )).find( ) )
663) {
664) //remove matched part
665) data = data.substring( matcher.end( ) );
666) //add info to movie
667) appendInfo( "url", matcher.group( 1 ) );
668) }
669)
670) //frame tag
671) else if( (matcher = frameTag.matcher( data )).find( ) )
672) {
673) //remove matched part
674) data = data.substring( matcher.end( ) );
675) //get attributes
676) duration = 0;
677) if( (submatcher = frameDuration.matcher( matcher.group( 1 ) )).find( ) ) //duration
678) duration = Integer.parseInt( submatcher.group( 1 ) );
679) //create new frame and append it to movie
680) frame = new BlinkenFrame( this.height, this.width, this.channels, this.maxval, duration );
681) frame.clear( );
682) appendFrame( frame );
683) y = 0;
684) }
685)
686) //row tag
687) else if( (matcher = rowTag.matcher( data )).find( ) )
688) {
689) //remove matched part
690) data = data.substring( matcher.end( ) );
691) //parse row
692) row = matcher.group( 1 );
693) len = row.length( );
694) i = 0;
695) for( x = 0; x < this.width && i + chrs <= len; x++ )
696) {
697) for( c = 0; c < this.channels && i + chrs <= len; c++, i += chrs )
698) {
699) val = Integer.parseInt( row.substring( i, i + chrs ), 0x10 );
700) frame.setPixel( y, x, c, (byte)val ); //set pixel
701) }
702) }
703) y++; //next row
704) }
705)
706) //unknown tag
707) else if( (matcher = tag.matcher( data )).find( ) )
708) //remove matched part
709) data = data.substring( matcher.end( ) );
710)
711) //nothing matches
712) else
713) //end loop
714) break;
715)
716) } //if( ! blmTagFound ) ... else
717)
718) } //while( true )
719)
720) } //while( (line = ...
721)
722) //close file
723) file.close( );
724)
725) //success
726) return true;
727) }
728) catch( IOException e ) { }
729)
730) //some error
731) return false;
732) }
733)
734) public boolean loadBbm( String filename )
735) {
736) RandomAccessFile file;
737) byte[] header, subHeader, infoHeader, frameStartMarker, frameData;
738) int headerMagic, headerHeight, headerWidth, headerChannels, headerMaxval;
739) int headerFrameCnt, headerDuration, headerFramePtr;
740) int subHeaderMagic, subHeaderSize;
741) int frameStartMarkerMagic;
742) StringTokenizer tokenizer;
743) String infoType, infoData;
744) int fileLength, frameLength;
745) int duration, i, y, x, c;
746) BlinkenFrame frame;
747)
748) //delete all frames
749) deleteInfos( );
750) deleteFrames( );
751) resize( 0, 0, 0, 0 );
752)
753) //try to read file
754) try
755) {
756) //open file
757) file = new RandomAccessFile( filename, "r" );
758)
759) //read header
760) header = new byte[24];
761) file.readFully( header );
762) headerMagic = ((int)header[0] & 0xFF) << 24 | ((int)header[1] & 0xFF) << 16 | ((int)header[2] & 0xFF) << 8 | ((int)header[3] & 0xFF);
763) headerHeight = ((int)header[4] & 0xFF) << 8 | ((int)header[5] & 0xFF);
764) headerWidth = ((int)header[6] & 0xFF) << 8 | ((int)header[7] & 0xFF);
765) headerChannels = ((int)header[8] & 0xFF) << 8 | ((int)header[9] & 0xFF);
766) headerMaxval = ((int)header[10] & 0xFF) << 8 | ((int)header[11] & 0xFF);
767) headerFrameCnt = ((int)header[12] & 0xFF) << 24 | ((int)header[13] & 0xFF) << 16 | ((int)header[14] & 0xFF) << 8 | ((int)header[15] & 0xFF);
768) headerDuration = ((int)header[16] & 0xFF) << 24 | ((int)header[17] & 0xFF) << 16 | ((int)header[18] & 0xFF) << 8 | ((int)header[19] & 0xFF);
769) headerFramePtr = ((int)header[20] & 0xFF) << 24 | ((int)header[21] & 0xFF) << 16 | ((int)header[22] & 0xFF) << 8 | ((int)header[23] & 0xFF);
770) //check magic
771) if( headerMagic == 0x23542666 )
772) {
773)
774) //adapt movie format
775) resize( headerHeight, headerWidth, headerChannels, headerMaxval );
776)
777) //read subheaders
778) subHeader = new byte[6];
779) while( file.getFilePointer( ) + 6 <= headerFramePtr )
780) {
781) file.readFully( subHeader );
782) subHeaderMagic = ((int)subHeader[0] & 0xFF) << 24 | ((int)subHeader[1] & 0xFF) << 16 | ((int)subHeader[2] & 0xFF) << 8 | ((int)subHeader[3] & 0xFF);
783) subHeaderSize = ((int)subHeader[4] & 0xFF) << 8 | ((int)subHeader[5] & 0xFF);
784)
785) //header fits into gap to frame start
|