X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=narabu.cpp;h=0ac4f71d75ab58794da432e64c22ea0811cdb437;hb=daf421e32981645e551621551c6b82697ad078de;hp=81b0726cfd4aed5ae27f956ffd75f1d035796113;hpb=3fb87c6b953be3382cd216c74ff6aa025c8eaa2a;p=narabu diff --git a/narabu.cpp b/narabu.cpp index 81b0726..0ac4f71 100644 --- a/narabu.cpp +++ b/narabu.cpp @@ -44,9 +44,19 @@ RansDecodeTable decode_tables[NUM_TABLES]; optional 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