From 04b135895770db08d8b485f66380bd2fb40628c0 Mon Sep 17 00:00:00 2001 From: sillysagiri Date: Sat, 30 Dec 2023 12:27:11 +0700 Subject: [PATCH] refactor part 3 --- encoder/main.cpp | 14 +++----- src/main.cpp | 86 ++++++++++++++++++++++++++---------------------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/encoder/main.cpp b/encoder/main.cpp index 4cd79f2..577f086 100644 --- a/encoder/main.cpp +++ b/encoder/main.cpp @@ -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(&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++; diff --git a/src/main.cpp b/src/main.cpp index a0f3b02..29a46db 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,8 +5,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -15,6 +17,7 @@ #include #include #include +#include #include #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(); } \ No newline at end of file