Skip to content

Commit 19bcfe9

Browse files
committed
Allocate 512 bytes for frame offsets and compressed frame sizes while running in DS mode
1 parent a50bba0 commit 19bcfe9

1 file changed

Lines changed: 36 additions & 21 deletions

File tree

arm9/source/main.cpp

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -557,40 +557,41 @@ ITCM_CODE static u32 getFrameOffset(const int num) {
557557
return frameOffsets[num];
558558
}
559559

560-
static int previousNum = 0;
561-
static u32 offset = 0;
562-
563560
if (rvidHeaderCheck.ver < 3) {
564561
return 0x200 + ((0x200*rvidVRes) * num);
565562
}
566563

567-
if (offset > 0 && previousNum == num) {
568-
return offset;
564+
static int previousSector = 0;
565+
const int sector = num/128;
566+
567+
if (previousSector == sector) {
568+
return frameOffsets[num % 128];
569569
}
570570

571-
previousNum = num;
572-
fseek(rvid[0], 0x200 + (4 * num), SEEK_SET);
573-
fread(&offset, 4, 1, rvid[0]);
574-
return offset;
571+
previousSector = sector;
572+
fseek(rvid[0], 0x200 + (512 * sector), SEEK_SET);
573+
fread(frameOffsets, 4, 128, rvid[0]);
574+
return frameOffsets[num % 128];
575575
}
576576

577577
ITCM_CODE static u32 getCompressedFrameSize(const int num) {
578578
if (isDSiMode()) {
579579
return rvidOver256Colors ? compressedFrameSizes32[num] : compressedFrameSizes16[num];
580580
}
581581

582-
static int previousNum = 0;
583-
static u32 size = 0;
582+
static int previousSector = 0;
583+
const int byteCount = rvidOver256Colors ? 4 : 2;
584+
const int amount = rvidOver256Colors ? 128 : 256;
585+
const int sector = num/amount;
584586

585-
if (size > 0 && previousNum == num) {
586-
return size;
587+
if (previousSector == sector) {
588+
return rvidOver256Colors ? compressedFrameSizes32[num % 128] : compressedFrameSizes16[num % 256];
587589
}
588590

589-
previousNum = num;
590-
const int byteCount = rvidOver256Colors ? 4 : 2;
591-
fseek(rvid[0], rvidCompressedFrameSizeTableOffset + (byteCount * num), SEEK_SET);
592-
fread(&size, byteCount, 1, rvid[0]);
593-
return size;
591+
previousSector = sector;
592+
fseek(rvid[0], rvidCompressedFrameSizeTableOffset + (512 * sector), SEEK_SET);
593+
fread(rvidOver256Colors ? compressedFrameSizes32 : (u32*)compressedFrameSizes16, byteCount, amount, rvid[0]);
594+
return rvidOver256Colors ? compressedFrameSizes32[num % 128] : compressedFrameSizes16[num % 256];
594595
}
595596

596597
ITCM_CODE static void loadFramePal(const int num, const u32 frameOffset, const int rvidPart) {
@@ -947,6 +948,22 @@ int playRvid(const char* filename) {
947948
fread(compressedFrameSizes16, 2, rvidFrames, rvid[0]);
948949
}
949950
}
951+
} else {
952+
frameOffsets = new u32[128];
953+
if (rvidHeaderCheck.ver >= 3) {
954+
fread(frameOffsets, 4, 128, rvid[0]);
955+
}
956+
957+
if (rvidCompressed) {
958+
fseek(rvid[0], rvidCompressedFrameSizeTableOffset, SEEK_SET);
959+
if (rvidOver256Colors) {
960+
compressedFrameSizes32 = new u32[128];
961+
fread(compressedFrameSizes32, 4, 128, rvid[0]);
962+
} else {
963+
compressedFrameSizes16 = new u16[256];
964+
fread(compressedFrameSizes16, 2, 256, rvid[0]);
965+
}
966+
}
950967
}
951968

952969
rvidPreviousOffset = 0;
@@ -1332,9 +1349,7 @@ int playRvid(const char* filename) {
13321349
delete[] compressedFrameSizes16;
13331350
}
13341351
}
1335-
if (isDSiMode()) {
1336-
delete[] frameOffsets;
1337-
}
1352+
delete[] frameOffsets;
13381353
if (rvidOver256Colors == 2) {
13391354
delete[] savedFrameBuffer[0];
13401355
if (rvidDualScreen) {

0 commit comments

Comments
 (0)