@@ -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