Skip to content

Commit 23d58fa

Browse files
committed
Do not pre-load compressed frame size table on DS & DS Lite to reduce memory usage
1 parent 705ee81 commit 23d58fa

1 file changed

Lines changed: 34 additions & 15 deletions

File tree

arm9/source/main.cpp

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -553,13 +553,13 @@ ITCM_CODE void sndUpdateStream(void) {
553553
}
554554

555555
ITCM_CODE static u32 getFrameOffset(const int num) {
556-
static int previousNum = 0;
557-
static u32 offset = 0;
558-
559556
if (isDSiMode()) {
560557
return frameOffsets[num];
561558
}
562559

560+
static int previousNum = 0;
561+
static u32 offset = 0;
562+
563563
if (rvidHeaderCheck.ver < 3) {
564564
return 0x200 + ((0x200*rvidVRes) * num);
565565
}
@@ -574,6 +574,25 @@ ITCM_CODE static u32 getFrameOffset(const int num) {
574574
return offset;
575575
}
576576

577+
ITCM_CODE static u32 getCompressedFrameSize(const int num) {
578+
if (isDSiMode()) {
579+
return rvidOver256Colors ? compressedFrameSizes32[num] : compressedFrameSizes16[num];
580+
}
581+
582+
static int previousNum = 0;
583+
static u32 size = 0;
584+
585+
if (size > 0 && previousNum == num) {
586+
return size;
587+
}
588+
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;
594+
}
595+
577596
ITCM_CODE static void loadFramePal(const int num, const u32 frameOffset, const int rvidPart) {
578597
if (rvidOver256Colors) return;
579598

@@ -623,6 +642,7 @@ ITCM_CODE void loadFrame(const int num) {
623642
for (int b = 0; b < 2; b++) {
624643
const int pos = (num*2)+b;
625644
const u32 frameOffset = getFrameOffset(loadedSingleFrames);
645+
const u32 size = rvidCompressed ? getCompressedFrameSize(loadedSingleFrames) : 0;
626646
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffset % 4) : 0;
627647
const u32 frameOffsetSeek = frameOffset - rvidPart;
628648
fseek(rvid[rvidPart], frameOffsetSeek, SEEK_SET);
@@ -638,8 +658,6 @@ ITCM_CODE void loadFrame(const int num) {
638658
const u8* src = frameBuffer+(previousNum[1]*(rvidHRes*rvidVRes));
639659
tonccpy(dst, src, rvidHRes*rvidVRes);
640660
} else {
641-
const int loadedFramesPos = (loadedFrames*2)+b;
642-
const u32 size = rvidOver256Colors ? compressedFrameSizes32[loadedFramesPos] : compressedFrameSizes16[loadedFramesPos];
643661
if (size == (unsigned)rvidHRes*rvidVRes) {
644662
fread(dst, 1, rvidHRes*rvidVRes, rvid[rvidPart]);
645663
} else {
@@ -690,6 +708,7 @@ ITCM_CODE void loadFrame(const int num) {
690708
}
691709
} else {
692710
const u32 frameOffset = getFrameOffset(loadedFrames);
711+
const u32 size = rvidCompressed ? getCompressedFrameSize(loadedFrames) : 0;
693712
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffset % 4) : 0;
694713
const u32 frameOffsetSeek = frameOffset - rvidPart;
695714
fseek(rvid[rvidPart], frameOffsetSeek, SEEK_SET);
@@ -706,7 +725,6 @@ ITCM_CODE void loadFrame(const int num) {
706725
tonccpy(dst, src, rvidHRes*rvidVRes);
707726
} else {
708727
if (rvidCompressed) {
709-
const u32 size = rvidOver256Colors ? compressedFrameSizes32[loadedFrames] : compressedFrameSizes16[loadedFrames];
710728
if (size == (unsigned)rvidHRes*rvidVRes) {
711729
fread(dst, 1, rvidHRes*rvidVRes, rvid[rvidPart]);
712730
} else {
@@ -922,18 +940,19 @@ int playRvid(const char* filename) {
922940
// }
923941
}
924942
}
925-
}
926943

927-
if (rvidCompressed) {
928-
fseek(rvid[0], rvidCompressedFrameSizeTableOffset, SEEK_SET);
929-
if (rvidOver256Colors) {
930-
compressedFrameSizes32 = new u32[rvidFrames];
931-
fread(compressedFrameSizes32, 4, rvidFrames, rvid[0]);
932-
} else {
933-
compressedFrameSizes16 = new u16[rvidFrames];
934-
fread(compressedFrameSizes16, 2, rvidFrames, rvid[0]);
944+
if (rvidCompressed) {
945+
fseek(rvid[0], rvidCompressedFrameSizeTableOffset, SEEK_SET);
946+
if (rvidOver256Colors) {
947+
compressedFrameSizes32 = new u32[rvidFrames];
948+
fread(compressedFrameSizes32, 4, rvidFrames, rvid[0]);
949+
} else {
950+
compressedFrameSizes16 = new u16[rvidFrames];
951+
fread(compressedFrameSizes16, 2, rvidFrames, rvid[0]);
952+
}
935953
}
936954
}
955+
937956
rvidPreviousOffset = 0;
938957
rvidCurrentOffset = 0;
939958
// fseek(rvid[0], frameOffsets[0], SEEK_SET);

0 commit comments

Comments
 (0)