19 {
20
21
22 $ThisFileInfo['bonk'] = array();
23 $thisfile_bonk = &$ThisFileInfo['bonk'];
24
25 $thisfile_bonk['dataoffset'] = $ThisFileInfo['avdataoffset'];
26 $thisfile_bonk['dataend'] = $ThisFileInfo['avdataend'];
27
28
29 fseek($fd, $thisfile_bonk['dataend'] - 8, SEEK_SET);
30 $PossibleBonkTag = fread($fd, 8);
33 fseek($fd, 0 - $BonkTagSize, SEEK_CUR);
34 $BonkTagOffset = ftell($fd);
35 $TagHeaderTest = fread($fd, 5);
36 if (($TagHeaderTest{0} != "\x00") || (substr($PossibleBonkTag, 4, 4) != strtolower(substr($PossibleBonkTag, 4, 4)))) {
37 $ThisFileInfo['error'][] = 'Expecting "Ø'.strtoupper(substr($PossibleBonkTag, 4, 4)).'" at offset '.$BonkTagOffset.', found "'.$TagHeaderTest.'"';
38 return false;
39 }
40 $BonkTagName = substr($TagHeaderTest, 1, 4);
41
42 $thisfile_bonk[$BonkTagName]['size'] = $BonkTagSize;
43 $thisfile_bonk[$BonkTagName]['offset'] = $BonkTagOffset;
45 $NextTagEndOffset = $BonkTagOffset - 8;
46 if ($NextTagEndOffset < $thisfile_bonk['dataoffset']) {
47 if (empty($ThisFileInfo['audio']['encoder'])) {
48 $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+';
49 }
50 return true;
51 }
52 fseek($fd, $NextTagEndOffset, SEEK_SET);
53 $PossibleBonkTag = fread($fd, 8);
54 }
55
56
57 if (empty($thisfile_bonk['BONK'])) {
58 fseek($fd, $thisfile_bonk['dataoffset'], SEEK_SET);
59 do {
60 $TagHeaderTest = fread($fd, 5);
61 switch ($TagHeaderTest) {
62 case "\x00".'BONK':
63 if (empty($ThisFileInfo['audio']['encoder'])) {
64 $ThisFileInfo['audio']['encoder'] = 'BONK v0.4';
65 }
66 break;
67
68 case "\x00".'INFO':
69 $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.5';
70 break;
71
72 default:
73 break 2;
74 }
75 $BonkTagName = substr($TagHeaderTest, 1, 4);
76 $thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset'];
77 $thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset'];
79
80 } while (true);
81 }
82
83
84 if (empty($thisfile_bonk['INFO']) && isset($thisfile_bonk['META']['tags']['info'])) {
85 fseek($fd, $thisfile_bonk['META']['tags']['info'], SEEK_SET);
86 $TagHeaderTest = fread($fd, 5);
87 if ($TagHeaderTest == "\x00".'INFO') {
88 $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.6 - v0.8';
89
90 $BonkTagName = substr($TagHeaderTest, 1, 4);
91 $thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset'];
92 $thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset'];
94 }
95 }
96
97 if (empty($ThisFileInfo['audio']['encoder'])) {
98 $ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+';
99 }
100 if (empty($thisfile_bonk['BONK'])) {
101 unset($ThisFileInfo['bonk']);
102 }
103 return true;
104
105 }
BonkIsValidTagName($PossibleBonkTag, $ignorecase=false)
HandleBonkTags(&$fd, &$BonkTagName, &$ThisFileInfo)
LittleEndian2Int($byteword, $signed=false)