mirror of
https://github.com/crskycode/GARbro.git
synced 2024-12-24 03:44:13 +08:00
(RHA): properly interpret MP3 extensions.
This commit is contained in:
parent
a5ba80e55f
commit
098644ff29
@ -76,25 +76,38 @@ namespace GameRes.Formats.Rugp
|
|||||||
{
|
{
|
||||||
ushort rha_header = Binary.BigEndian (input.ReadUInt16());
|
ushort rha_header = Binary.BigEndian (input.ReadUInt16());
|
||||||
uint header;
|
uint header;
|
||||||
|
int add_len = 0;
|
||||||
|
byte add_value = 0;
|
||||||
if (0 == schema)
|
if (0 == schema)
|
||||||
{
|
{
|
||||||
header = 0xFFFB0000u | rha_header;
|
header = 0xFFFB0000u | rha_header;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (0 != (rha_header & 0x3000))
|
if (0 != (rha_header & 0x1000)) // RHAF_LASTZEROADD
|
||||||
{
|
{
|
||||||
input.ReadUInt16();
|
add_len = input.ReadUInt16();
|
||||||
|
add_value = 0;
|
||||||
|
}
|
||||||
|
else if (0 != (rha_header & 0x2000)) // RHAF_LASTFULLADD
|
||||||
|
{
|
||||||
|
add_len = input.ReadUInt16();
|
||||||
|
add_value = 0xFF;
|
||||||
}
|
}
|
||||||
header = RhaToMp3Header (rha_header);
|
header = RhaToMp3Header (rha_header);
|
||||||
}
|
}
|
||||||
int frame_length = GetFrameLength (header);
|
int frame_length = GetFrameLength (header);
|
||||||
if (0 == frame_length)
|
if (0 == frame_length || add_len > frame_length)
|
||||||
return false;
|
return false;
|
||||||
if (null == frame_buffer || frame_length > frame_buffer.Length)
|
if (null == frame_buffer || frame_length > frame_buffer.Length)
|
||||||
frame_buffer = new byte[frame_length];
|
frame_buffer = new byte[frame_length];
|
||||||
if (frame_length != input.Read (frame_buffer, 0, frame_length))
|
|
||||||
|
int read_length = frame_length - add_len;
|
||||||
|
if (read_length != input.Read (frame_buffer, 0, read_length))
|
||||||
break;
|
break;
|
||||||
|
for (int i = 0; i < add_len; ++i)
|
||||||
|
frame_buffer[read_length+i] = add_value;
|
||||||
|
|
||||||
output.Write (Binary.BigEndian (header));
|
output.Write (Binary.BigEndian (header));
|
||||||
output.Write (frame_buffer, 0, frame_length);
|
output.Write (frame_buffer, 0, frame_length);
|
||||||
}
|
}
|
||||||
@ -127,8 +140,8 @@ namespace GameRes.Formats.Rugp
|
|||||||
int frame_length = BitRates[lsf, bitrate_index] * 144000;
|
int frame_length = BitRates[lsf, bitrate_index] * 144000;
|
||||||
frame_length /= Mp3Freqs[freq] << lsf;
|
frame_length /= Mp3Freqs[freq] << lsf;
|
||||||
frame_length += padding - 4;
|
frame_length += padding - 4;
|
||||||
if (0 == (header & (1 << 16)))
|
// if (0 == (header & (1 << 16)))
|
||||||
frame_length += 2;
|
// frame_length += 2;
|
||||||
return frame_length;
|
return frame_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user