Skip to content

Commit 705ee81

Browse files
committed
Do not pre-load frame offset table on DS & DS Lite to reduce memory usage
1 parent 42d8e3f commit 705ee81

1 file changed

Lines changed: 67 additions & 46 deletions

File tree

arm9/source/main.cpp

Lines changed: 67 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -552,14 +552,36 @@ ITCM_CODE void sndUpdateStream(void) {
552552
updateSoundBuffer = false;
553553
}
554554

555-
ITCM_CODE static void loadFramePal(const int num, const int loadedFrameNum, const int rvidPart) {
555+
ITCM_CODE static u32 getFrameOffset(const int num) {
556+
static int previousNum = 0;
557+
static u32 offset = 0;
558+
559+
if (isDSiMode()) {
560+
return frameOffsets[num];
561+
}
562+
563+
if (rvidHeaderCheck.ver < 3) {
564+
return 0x200 + ((0x200*rvidVRes) * num);
565+
}
566+
567+
if (offset > 0 && previousNum == num) {
568+
return offset;
569+
}
570+
571+
previousNum = num;
572+
fseek(rvid[0], 0x200 + (4 * num), SEEK_SET);
573+
fread(&offset, 4, 1, rvid[0]);
574+
return offset;
575+
}
576+
577+
ITCM_CODE static void loadFramePal(const int num, const u32 frameOffset, const int rvidPart) {
556578
if (rvidOver256Colors) return;
557579

558580
static int previousNum[2] = {0};
559581

560-
if (rvidPreviousOffset == frameOffsets[loadedFrameNum]) {
582+
if (rvidPreviousOffset == frameOffset) {
561583
tonccpy(palBuffer[num], palBuffer[previousNum[0]], 256*2);
562-
} else if (rvidCurrentOffset == frameOffsets[loadedFrameNum]) {
584+
} else if (rvidCurrentOffset == frameOffset) {
563585
tonccpy(palBuffer[num], palBuffer[previousNum[1]], 256*2);
564586
} else {
565587
fread(palBuffer[num], 2, 256, rvid[rvidPart]);
@@ -600,17 +622,18 @@ ITCM_CODE void loadFrame(const int num) {
600622
if (rvidCompressed) {
601623
for (int b = 0; b < 2; b++) {
602624
const int pos = (num*2)+b;
603-
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffsets[loadedSingleFrames] % 4) : 0;
604-
const u32 frameOffsetSeek = frameOffsets[loadedSingleFrames] - rvidPart;
625+
const u32 frameOffset = getFrameOffset(loadedSingleFrames);
626+
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffset % 4) : 0;
627+
const u32 frameOffsetSeek = frameOffset - rvidPart;
605628
fseek(rvid[rvidPart], frameOffsetSeek, SEEK_SET);
606629

607-
loadFramePal(pos, loadedSingleFrames, rvidPart);
630+
loadFramePal(pos, frameOffset, rvidPart);
608631
u8* dst = frameBuffer+(pos*(rvidHRes*rvidVRes));
609-
if (rvidPreviousOffset == frameOffsets[loadedSingleFrames]) {
632+
if (rvidPreviousOffset == frameOffset) {
610633
// Duplicate/Last recent frame found
611634
const u8* src = frameBuffer+(previousNum[0]*(rvidHRes*rvidVRes));
612635
tonccpy(dst, src, rvidHRes*rvidVRes);
613-
} else if (rvidCurrentOffset == frameOffsets[loadedSingleFrames]) {
636+
} else if (rvidCurrentOffset == frameOffset) {
614637
// Duplicate frame found
615638
const u8* src = frameBuffer+(previousNum[1]*(rvidHRes*rvidVRes));
616639
tonccpy(dst, src, rvidHRes*rvidVRes);
@@ -629,25 +652,26 @@ ITCM_CODE void loadFrame(const int num) {
629652
DC_FlushRange(dst, rvidHRes*rvidVRes);
630653
sndUpdateStream();
631654
rvidPreviousOffset = rvidCurrentOffset;
632-
rvidCurrentOffset = frameOffsets[loadedSingleFrames];
655+
rvidCurrentOffset = frameOffset;
633656
loadedSingleFrames++;
634657
previousNum[0] = previousNum[1];
635658
previousNum[1] = pos;
636659
}
637660
} else {
638661
for (int b = 0; b < 2; b++) {
639662
const int pos = (num*2)+b;
640-
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffsets[loadedSingleFrames] % 4) : 0;
641-
const u32 frameOffsetSeek = frameOffsets[loadedSingleFrames] - rvidPart;
663+
const u32 frameOffset = getFrameOffset(loadedSingleFrames);
664+
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffset % 4) : 0;
665+
const u32 frameOffsetSeek = frameOffset - rvidPart;
642666
fseek(rvid[rvidPart], frameOffsetSeek, SEEK_SET);
643667

644-
loadFramePal(pos, loadedSingleFrames, rvidPart);
668+
loadFramePal(pos, frameOffset, rvidPart);
645669
u8* dst = frameBuffer+(pos*(rvidHRes*rvidVRes));
646-
if (rvidPreviousOffset == frameOffsets[loadedSingleFrames]) {
670+
if (rvidPreviousOffset == frameOffset) {
647671
// Duplicate/Last recent frame found
648672
const u8* src = frameBuffer+(previousNum[0]*(rvidHRes*rvidVRes));
649673
tonccpy(dst, src, rvidHRes*rvidVRes);
650-
} else if (rvidCurrentOffset == frameOffsets[loadedSingleFrames]) {
674+
} else if (rvidCurrentOffset == frameOffset) {
651675
// Duplicate frame found
652676
const u8* src = frameBuffer+(previousNum[1]*(rvidHRes*rvidVRes));
653677
tonccpy(dst, src, rvidHRes*rvidVRes);
@@ -658,24 +682,25 @@ ITCM_CODE void loadFrame(const int num) {
658682
DC_FlushRange(dst, rvidHRes*rvidVRes);
659683
sndUpdateStream();
660684
rvidPreviousOffset = rvidCurrentOffset;
661-
rvidCurrentOffset = frameOffsets[loadedSingleFrames];
685+
rvidCurrentOffset = frameOffset;
662686
loadedSingleFrames++;
663687
previousNum[0] = previousNum[1];
664688
previousNum[1] = pos;
665689
}
666690
}
667691
} else {
668-
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffsets[loadedFrames] % 4) : 0;
669-
const u32 frameOffsetSeek = frameOffsets[loadedFrames] - rvidPart;
692+
const u32 frameOffset = getFrameOffset(loadedFrames);
693+
const int rvidPart = (rvidHeaderCheck.ver >= 4) ? (frameOffset % 4) : 0;
694+
const u32 frameOffsetSeek = frameOffset - rvidPart;
670695
fseek(rvid[rvidPart], frameOffsetSeek, SEEK_SET);
671696

672-
loadFramePal(num, loadedFrames, rvidPart);
697+
loadFramePal(num, frameOffset, rvidPart);
673698
u8* dst = frameBuffer+(num*(rvidHRes*rvidVRes));
674-
if (rvidPreviousOffset == frameOffsets[loadedFrames]) {
699+
if (rvidPreviousOffset == frameOffset) {
675700
// Duplicate/Last recent frame found
676701
const u8* src = frameBuffer+(previousNum[0]*(rvidHRes*rvidVRes));
677702
tonccpy(dst, src, rvidHRes*rvidVRes);
678-
} else if (rvidCurrentOffset == frameOffsets[loadedFrames]) {
703+
} else if (rvidCurrentOffset == frameOffset) {
679704
// Duplicate frame found
680705
const u8* src = frameBuffer+(previousNum[1]*(rvidHRes*rvidVRes));
681706
tonccpy(dst, src, rvidHRes*rvidVRes);
@@ -697,7 +722,7 @@ ITCM_CODE void loadFrame(const int num) {
697722
DC_FlushRange(dst, rvidHRes*rvidVRes);
698723
sndUpdateStream();
699724
rvidPreviousOffset = rvidCurrentOffset;
700-
rvidCurrentOffset = frameOffsets[loadedFrames];
725+
rvidCurrentOffset = frameOffset;
701726
previousNum[0] = previousNum[1];
702727
previousNum[1] = num;
703728
}
@@ -877,24 +902,25 @@ int playRvid(const char* filename) {
877902
frameBuffer = new u8[0xC000*32];
878903
}
879904

880-
if (rvidDualScreen) {
881-
frameOffsets = new u32[rvidFrames*2];
882-
fread(frameOffsets, 4, rvidFrames*2, rvid[0]);
883-
} else {
884-
frameOffsets = new u32[rvidFrames];
885-
if (rvidHeaderCheck.ver >= 3) {
886-
fread(frameOffsets, 4, rvidFrames, rvid[0]);
905+
if (isDSiMode()) {
906+
if (rvidDualScreen) {
907+
frameOffsets = new u32[rvidFrames*2];
908+
fread(frameOffsets, 4, rvidFrames*2, rvid[0]);
887909
} else {
888-
/* if (rvidCompressed) {
889-
fseek(rvid[0], rvidCompressedFrameSizeTableOffset, SEEK_SET);
890-
compressedFrameSizes32 = new u32[rvidFrames];
891-
fread(compressedFrameSizes32, 4, rvidFrames, rvid[0]);
892-
} else { */
893-
frameOffsets[0] = 0x200;
894-
for (int i = 1; i < rvidFrames; i++) {
895-
frameOffsets[i] = frameOffsets[i-1] + 0x200*rvidVRes;
896-
}
897-
// }
910+
frameOffsets = new u32[rvidFrames];
911+
if (rvidHeaderCheck.ver >= 3) {
912+
fread(frameOffsets, 4, rvidFrames, rvid[0]);
913+
} else {
914+
/* if (rvidCompressed) {
915+
fseek(rvid[0], rvidCompressedFrameSizeTableOffset, SEEK_SET);
916+
compressedFrameSizes32 = new u32[rvidFrames];
917+
fread(compressedFrameSizes32, 4, rvidFrames, rvid[0]);
918+
} else { */
919+
for (int i = 0; i < rvidFrames; i++) {
920+
frameOffsets[i] = 0x200 + ((0x200*rvidVRes) * i);
921+
}
922+
// }
923+
}
898924
}
899925
}
900926

@@ -1229,13 +1255,6 @@ int playRvid(const char* filename) {
12291255
// Reload video
12301256
rvidPreviousOffset = 0;
12311257
rvidCurrentOffset = 0;
1232-
/* u32 rvidNextOffset = 0;
1233-
if (rvidDualScreen) {
1234-
rvidNextOffset = frameOffsets[currentFrame*2];
1235-
} else {
1236-
rvidNextOffset = frameOffsets[currentFrame];
1237-
}
1238-
fseek(rvid[0], rvidNextOffset, SEEK_SET); */
12391258
loadedSingleFrames = loadedFrames = currentFrame;
12401259
if (rvidDualScreen) {
12411260
loadedSingleFrames *= 2;
@@ -1298,7 +1317,9 @@ int playRvid(const char* filename) {
12981317
delete[] compressedFrameSizes16;
12991318
}
13001319
}
1301-
delete[] frameOffsets;
1320+
if (isDSiMode()) {
1321+
delete[] frameOffsets;
1322+
}
13021323
if (rvidOver256Colors == 2) {
13031324
delete[] savedFrameBuffer[0];
13041325
if (rvidDualScreen) {

0 commit comments

Comments
 (0)