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);
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];
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;
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);
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;
}
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;
}
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