22 $ThisFileInfo[
'bonk'] = array();
23 $thisfile_bonk = &$ThisFileInfo[
'bonk'];
25 $thisfile_bonk[
'dataoffset'] = $ThisFileInfo[
'avdataoffset'];
26 $thisfile_bonk[
'dataend'] = $ThisFileInfo[
'avdataend'];
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 "Ø return false;
}
$BonkTagName = substr($TagHeaderTest, 1, 4);
$thisfile_bonk[$BonkTagName]['size'] = $BonkTagSize;
$thisfile_bonk[$BonkTagName]['offset'] = $BonkTagOffset;
$this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo);
$NextTagEndOffset = $BonkTagOffset - 8;
if ($NextTagEndOffset < $thisfile_bonk['dataoffset']) {
if (empty($ThisFileInfo['audio']['encoder'])) {
$ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+';
}
return true;
}
fseek($fd, $NextTagEndOffset, SEEK_SET);
$PossibleBonkTag = fread($fd, 8);
}
// seek-from-beginning method for v0.4 and v0.5
if (empty($thisfile_bonk['BONK'])) {
fseek($fd, $thisfile_bonk['dataoffset'], SEEK_SET);
do {
$TagHeaderTest = fread($fd, 5);
switch ($TagHeaderTest) {
case "\x00".'BONK':
if (empty($ThisFileInfo['audio']['encoder'])) {
$ThisFileInfo['audio']['encoder'] = 'BONK v0.4';
}
break;
case "\x00".'INFO':
$ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.5';
break;
default:
break 2;
}
$BonkTagName = substr($TagHeaderTest, 1, 4);
$thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset'];
$thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset'];
$this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo);
} while (true);
}
// parse META block for v0.6 - v0.8
if (empty($thisfile_bonk['INFO']) && isset($thisfile_bonk['META']['tags']['info'])) {
fseek($fd, $thisfile_bonk['META']['tags']['info'], SEEK_SET);
$TagHeaderTest = fread($fd, 5);
if ($TagHeaderTest == "\x00".'INFO') {
$ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.6 - v0.8';
$BonkTagName = substr($TagHeaderTest, 1, 4);
$thisfile_bonk[$BonkTagName]['size'] = $thisfile_bonk['dataend'] - $thisfile_bonk['dataoffset'];
$thisfile_bonk[$BonkTagName]['offset'] = $thisfile_bonk['dataoffset'];
$this->HandleBonkTags($fd, $BonkTagName, $ThisFileInfo);
}
}
if (empty($ThisFileInfo['audio']['encoder'])) {
$ThisFileInfo['audio']['encoder'] = 'Extended BONK v0.9+';
}
if (empty($thisfile_bonk['BONK'])) {
unset($ThisFileInfo['bonk']);
}
return true;
}
'.strtoupper(substr($PossibleBonkTag, 4, 4)).
'" at offset '.$BonkTagOffset.
', found "'.$TagHeaderTest.
'"';
40 $BonkTagName = substr($TagHeaderTest, 1, 4);
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+';
52 fseek($fd, $NextTagEndOffset, SEEK_SET);
53 $PossibleBonkTag = fread($fd, 8);
57 if (empty($thisfile_bonk[
'BONK'])) {
58 fseek($fd, $thisfile_bonk[
'dataoffset'], SEEK_SET);
60 $TagHeaderTest = fread($fd, 5);
61 switch ($TagHeaderTest) {
63 if (empty($ThisFileInfo[
'audio'][
'encoder'])) {
64 $ThisFileInfo[
'audio'][
'encoder'] =
'BONK v0.4';
69 $ThisFileInfo[
'audio'][
'encoder'] =
'Extended BONK v0.5';
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'];
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';
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'];
97 if (empty($ThisFileInfo[
'audio'][
'encoder'])) {
98 $ThisFileInfo[
'audio'][
'encoder'] =
'Extended BONK v0.9+';
100 if (empty($thisfile_bonk[
'BONK'])) {
101 unset($ThisFileInfo[
'bonk']);
LittleEndian2Int($byteword, $signed=false)
BonkIsValidTagName($PossibleBonkTag, $ignorecase=false)
HandleBonkTags(&$fd, &$BonkTagName, &$ThisFileInfo)