refactor part 3

This commit is contained in:
sillysagiri 2023-12-30 12:27:11 +07:00
parent 95c12d0f02
commit 04b1358957
2 changed files with 51 additions and 49 deletions

View File

@ -125,12 +125,6 @@ int main()
printf("%i) frame %i/%i (%1.f%s)> done\n", chunk_counter, frame_counter, frame_total, ((float)frame_counter/frame_total)*100, "%");
chunk_counter++;
// int size;
// char *batch_map_compress = LZS_Fast(batch_map, 256*192, &size);
// out.write(reinterpret_cast<const char*>(&size), sizeof(size));
// out.write(batch_map_compress, size);
if (chunk_counter >= chunk_size)
{
@ -143,13 +137,13 @@ int main()
if (isRLE)
{
char *temp = RLE_Code(compress_data, frame_size*chunk_size, (int*)&compress_size);
compress_flag = (compress_size << 1) | 0x01;
compress_flag = (compress_size << 2) | 0xfffffffd;
if (compress_size > frame_size*chunk_size)
{
free(temp);
compress_size = frame_size*chunk_size;
compress_flag = (compress_size << 1) | 0x10;
compress_flag = (compress_size << 2) | 0xfffffffe;
memcpy(compress_data, frame_map, compress_size);
printf("raw > ");
raw_total++;
@ -166,12 +160,12 @@ int main()
else
{
compress_size = fastlz_compress_level(1, frame_map, frame_size*chunk_size, compress_data);
compress_flag = (compress_size << 1);
compress_flag = (compress_size << 2);
if (compress_size > frame_size*chunk_size)
{
compress_size = frame_size*chunk_size;
compress_flag = (compress_size << 1) | 0x10;
compress_flag = (compress_size << 2) | 0xfffffffe;
memcpy(compress_data, frame_map, compress_size);
printf("raw > ");
raw_total++;

View File

@ -5,8 +5,10 @@
#include <mm_types.h>
#include <nds.h>
#include <filesystem.h>
#include <nds/arm9/background.h>
#include <nds/arm9/cache.h>
#include <nds/arm9/decompress.h>
#include <nds/arm9/video.h>
#include <nds/bios.h>
#include <nds/debug.h>
#include <nds/dma.h>
@ -15,6 +17,7 @@
#include <stdio.h>
#include <maxmod9.h>
#include <fcntl.h>
#include <sys/_intsup.h>
#include <sys/_stdint.h>
#define TIMER_SPEED (BUS_CLOCK/1024)
@ -43,7 +46,7 @@ public:
void push() {
if (isFull()) {
fprintf(stdout, "Queue is full. Cannot push\n");
fprintf(stderr, "Queue is full. Cannot push\n");
return;
}
@ -58,7 +61,7 @@ public:
void pop() {
if (isEmpty()) {
fprintf(stdout, "Queue is empty. Cannot pop\n");
fprintf(stderr, "Queue is empty. Cannot pop\n");
return;
}
@ -73,25 +76,25 @@ public:
};
int ptr_background;
int ptr_subbackground;
volatile int file_image = -1;
volatile int file_music = -1;
volatile bool noQueue = false;
constexpr int queue_size = 6;
constexpr int chunk_size = 256*192*10;
constexpr int chunk_total = 6;
constexpr int chunk_size = 10;
volatile int chunk_counter = 0;
volatile int chunk_current = 0;
constexpr int frame_size = 256*192;
volatile int frame_counter = 0;
uint8_t frame_decompress[chunk_size];
uint8_t frame_buffer[chunk_size*chunk_total];
CircularQueue frame_queue(chunk_total);
uint8_t frame_decompress[frame_size*chunk_size];
uint8_t frame_buffer[frame_size*chunk_size*queue_size];
CircularQueue frame_queue(queue_size);
constexpr int music_buffer_size = 4000*16;
mm_word on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) {
if(file_music){
size_t samplesize = 1;
@ -146,7 +149,7 @@ int main(void) {
// DC_FlushAll();
// fprintf(stdout, "start debug\n");
// fprintf(stderr, "start debug\n");
// int cframe = 0;
// int hframe = 0;
// int ticks = 0;
@ -159,21 +162,21 @@ int main(void) {
// ticks = timerStop(0);
// int milis = ((ticks%TIMER_SPEED)*1000) /TIMER_SPEED;
// if (milis > 50) fprintf(stdout, "%i\n", cframe);
// if (milis > 50) fprintf(stderr, "%i\n", cframe);
// cframe++;
// }
// fprintf(stdout, "%i\n", hframe);
// fprintf(stderr, "%i\n", hframe);
// fseek(in, 0, SEEK_SET);
fprintf(stdout, "preload start\n");
fprintf(stderr, "preload start\n");
while(!frame_queue.isFull()) {
frame_queue.push();
LoadNextChunk(&frame_buffer[chunk_size*frame_queue.rear]);
LoadNextChunk(&frame_buffer[frame_size*chunk_size*frame_queue.rear]);
}
fprintf(stdout, "preload done %i\n", frame_queue.current);
fprintf(stderr, "preload done %i\n", frame_queue.current);
DC_FlushAll();
@ -184,7 +187,6 @@ int main(void) {
sys.fifo_channel = FIFO_MAXMOD;
mmInit( &sys );
mm_stream mystream;
mystream.sampling_rate = 22050;
mystream.buffer_length = music_buffer_size;
@ -197,14 +199,17 @@ int main(void) {
mmStreamOpen( &mystream );
// free(pal);
// free(sagiri_bg);
while(1) {
irqSet(IRQ_VBLANK, onVBL);
if (!frame_queue.isFull()) {
frame_queue.push();
LoadNextChunk(&frame_buffer[chunk_size*frame_queue.rear]);
// fprintf(stdout, "read %i\n", queue.rear);
LoadNextChunk(&frame_buffer[frame_size*chunk_size*frame_queue.rear]);
// fprintf(stderr, "read %i\n", queue.rear);
}
if (!(frame_counter % 4)) mmStreamUpdate();
@ -216,23 +221,23 @@ int main(void) {
void onVBL()
{
// DC_FlushRange(&chunk[256*192*4 * queue.front + 256*192*chunk_counter], 256*192*4);
if (!noQueue) dmaCopyAsynch(&frame_buffer[chunk_size*frame_queue.front + 256*192*chunk_counter], bgGetGfxPtr(ptr_background), 256*192);
if (frame_queue.current < frame_queue.size*0.4) {
fprintf(stdout, "%i\n ", chunk_counter);
// fprintf(stdout, "count: %i, %i\n ", chunk_counter, frame_queue.current);
}
dmaCopyAsynch(&frame_buffer[frame_size*chunk_size*frame_queue.front + frame_size*chunk_counter], bgGetGfxPtr(ptr_background), frame_size);
// if (frame_queue.current < frame_queue.size*0.4) {
// fprintf(stderr, "%i\n ", chunk_counter);
// fprintf(stderr, "count: %i, %i\n ", chunk_counter, frame_queue.current);
// }
chunk_counter++;
frame_counter++;
if (chunk_counter >= 10) {
if (chunk_counter >= chunk_size) {
if (!frame_queue.isEmpty()) {
frame_queue.pop();
chunk_counter = 0;
} else {
chunk_counter = 10;
chunk_counter = chunk_size;
noQueue = true;
fprintf(stdout, "NO QUEUE!!!!!\n");
fprintf(stderr, "NO QUEUE!!!!!\n");
}
}
}
@ -241,24 +246,27 @@ void LoadNextChunk(void *output)
{
uint32_t compress_size;
read(file_image, &compress_size, sizeof(uint32_t));
uint32_t flag = compress_size & 0x3;
compress_size = compress_size >> 2;
bool isRLE = compress_size & 0x01;
compress_size = compress_size >> 1;
if (frame_queue.current < frame_queue.size*0.4)
fprintf(stdout, "%i\n ", chunk_current);
if (isRLE)
if (flag == 0x01) // RLE
{
read(file_image, frame_decompress, compress_size);
decompress(frame_decompress, output, RLE);
// fprintf(stderr, "RLE\n");
}
else if (flag == 0x10) // RAW
{
read(file_image, output, compress_size);
// fread(output, 1, chunk_len, input);
// decompress(buffer, output, RLE);
// fprintf(stderr, "RAW\n");
}
else
else if (flag == 0x00) // fastlz
{
// fread(buffer, 1, chunk_len, input);
read(file_image, frame_decompress, compress_size);
fastlz_decompress(frame_decompress, compress_size, output, chunk_size);
fastlz_decompress(frame_decompress, compress_size, output, frame_size*chunk_size);
// fprintf(stderr, "fastlz\n");
}
chunk_current++;
noQueue = false;
@ -290,7 +298,7 @@ size_t LoadFile(const char* file, unsigned char **buffer)
void wait_forever(const char* msg)
{
fprintf(stdout, "%s\n", msg);
fprintf(stdout, "%s\n", msg);
fprintf(stderr, "%s\n", msg);
fprintf(stderr, "%s\n", msg);
while (1) swiWaitForVBlank();
}