]> git.sesse.net Git - narabu/blobdiff - narabu.cpp
More fixes of hard-coded values.
[narabu] / narabu.cpp
index 81b0726cfd4aed5ae27f956ffd75f1d035796113..0ac4f71d75ab58794da432e64c22ea0811cdb437 100644 (file)
@@ -44,9 +44,19 @@ RansDecodeTable decode_tables[NUM_TABLES];
 optional<uint32_t> read_varint(const char **ptr, const char *end)
 {
        uint32_t x = 0;
-       memcpy(&x, *ptr, 4);
-       *ptr += 4;
-       return x;
+       int shift = 0;
+       while (*ptr < end) {
+               int ch = **ptr;
+               ++(*ptr);       
+
+               x |= (ch & 0x7f) << shift;
+               if ((ch & 0x80) == 0) return x;
+               shift += 7;
+               if (shift >= 32) {
+                       return nullopt;  // Error: Overlong int.
+               }
+       }
+       return nullopt;  // Error: EOF.
 }
 
 const unsigned num_blocks = ((NUM_BLOCKS + BLOCKS_PER_STREAM - 1) / BLOCKS_PER_STREAM);
@@ -103,7 +113,6 @@ int main(int argc, char **argv)
 
        string coded = ::read_file(argc >= 2 ? argv[1] : "coded.dat");
        const char *ptr = &coded[0];
-       //assert((intptr_t)ptr % 4 == 0);
        const char *end = ptr + coded.size();
        GLuint sign_bias[NUM_TABLES];
 
@@ -178,21 +187,7 @@ int main(int argc, char **argv)
        check_error();
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        check_error();
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, WIDTH, HEIGHT, 0, GL_RED_INTEGER, GL_INT, nullptr);
-       check_error();
-
-       GLuint coeff2_tex;
-       glGenTextures(1, &coeff2_tex);
-        glBindTexture(GL_TEXTURE_2D, coeff2_tex);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-       check_error();
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       check_error();
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-       check_error();
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-       check_error();
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, WIDTH, HEIGHT, 0, GL_RED_INTEGER, GL_INT, nullptr);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, WIDTH, HEIGHT, 0, GL_RED_INTEGER, GL_SHORT, nullptr);
        check_error();
 
        GLuint out_tex;
@@ -210,7 +205,6 @@ int main(int argc, char **argv)
        GLint dsyms_tex_pos = glGetUniformLocation(glsl_program_num, "dsyms_tex");
        GLint out_tex_pos = glGetUniformLocation(glsl_program_num, "out_tex");
        GLint coeff_tex_pos = glGetUniformLocation(glsl_program_num, "coeff_tex");
-       GLint coeff2_tex_pos = glGetUniformLocation(glsl_program_num, "coeff2_tex");
        GLint sign_bias_pos = glGetUniformLocation(glsl_program_num, "sign_bias_per_model");
        GLint num_blocks_pos = glGetUniformLocation(glsl_program_num, "num_blocks");
        printf("%d err=0x%x pos=%d,%d,%d,%d\n", __LINE__, glGetError(), cum2sym_tex_pos, dsyms_tex_pos, out_tex_pos, sign_bias_pos);
@@ -220,17 +214,16 @@ int main(int argc, char **argv)
        glUniform1i(dsyms_tex_pos, 1);
        glUniform1i(out_tex_pos, 2);
        glUniform1i(coeff_tex_pos, 3);
-       glUniform1i(coeff2_tex_pos, 4);
        glUniform1uiv(sign_bias_pos, 16, sign_bias);
        glUniform1i(num_blocks_pos, num_blocks);
         glBindImageTexture(0, cum2sym_tex, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8UI);
         glBindImageTexture(1, dsyms_tex, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RG16UI);
         glBindImageTexture(2, out_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R8);
-        glBindImageTexture(3, coeff_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32I);
-        glBindImageTexture(4, coeff2_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32I);
+        glBindImageTexture(3, coeff_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R16I);
        printf("%d err=0x%x\n", __LINE__, glGetError());
 
        // Decode all luma blocks.
+       size_t last_src_offset = 0, last_src_len = 0;
        for (unsigned y = 0; y < 8; ++y) {
                 for (unsigned x = 0; x < 8; ++x) {
                        unsigned coeff_num = y * 8 + x;
@@ -243,9 +236,16 @@ int main(int argc, char **argv)
                                }
 
                                CoeffStream *stream = &streams[coeff_num * num_blocks + block_idx / BLOCKS_PER_STREAM];
-                               stream->src_offset = ptr - coded.data();
-                               stream->src_len = *num_rans_bytes;
-                               //assert(stream->src_offset % 4 == 0);
+                               if (*num_rans_bytes == 0) {
+                                       // Repeat last stream.
+                                       stream->src_offset = last_src_offset;
+                                       stream->src_len = last_src_len;
+                               } else {
+                                       stream->src_offset = ptr - coded.data();
+                                       stream->src_len = *num_rans_bytes;
+                                       last_src_offset = stream->src_offset;
+                                       last_src_len = last_src_len;
+                               }
 
                                // TODO: check len
                                ptr += *num_rans_bytes;
@@ -362,22 +362,22 @@ int main(int argc, char **argv)
        }
        fclose(fp);
 
-#if 0
-       uint32_t *coeff_data = new uint32_t[WIDTH * HEIGHT];
+       int16_t *coeff_data = new int16_t[WIDTH * HEIGHT];
         glBindTexture(GL_TEXTURE_2D, coeff_tex);
        check_error();
-       glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_INT, coeff_data);
-       check_error();
-       uint32_t *coeff2_data = new uint32_t[WIDTH * HEIGHT];
-        glBindTexture(GL_TEXTURE_2D, coeff2_tex);
-       check_error();
-       glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_INT, coeff2_data);
+       glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_SHORT, coeff_data);
        check_error();
-       for (int x = 0; x < 320; ++x) {
-               printf("%08x.%08x ", coeff2_data[x], coeff_data[x]);
+       for (int k = 0; k < 4; ++k) {
+               for (int y = 0; y < 8; ++y) {
+                       for (int x = 0; x < 8; ++x) {
+                               printf("%3d ", coeff_data[y * WIDTH + x + k*8]);
+                       }
+                       printf("\n");
+               }
+               printf("\n");
        }
        printf("\n");
-#endif
+       
        
        check_error();
        glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // unbind