@@ -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
577577ITCM_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
596597ITCM_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