Compress analyzer data using RLE. This significantly reduces the size of the exported data and improves analyzer decoding time. Change-Id: I0553c76630009754038a86b634b545db24fb3dd6
diff --git a/examples/inspect.c b/examples/inspect.c index 5159e90..8335272 100644 --- a/examples/inspect.c +++ b/examples/inspect.c
@@ -62,10 +62,13 @@ static LayerType layers = 0; static int stop_after = 0; +static int compress = 0; static const arg_def_t limit_arg = ARG_DEF(NULL, "limit", 1, "Stop decoding after n frames"); static const arg_def_t dump_all_arg = ARG_DEF("A", "all", 0, "Dump All"); +static const arg_def_t compress_arg = + ARG_DEF("x", "compress", 0, "Compress JSON using RLE"); static const arg_def_t dump_accounting_arg = ARG_DEF("a", "accounting", 0, "Dump Accounting"); static const arg_def_t dump_block_size_arg = @@ -89,6 +92,7 @@ static const arg_def_t *main_args[] = { &limit_arg, &dump_all_arg, + &compress_arg, #if CONFIG_ACCOUNTING &dump_accounting_arg, #endif @@ -297,7 +301,7 @@ const int mi_rows = frame_data.mi_rows; const int mi_cols = frame_data.mi_cols; char *buf = buffer; - int r, c; + int r, c, t; buf += put_str(buf, " \"referenceFrameMap\": {"); buf += put_map(buf, refs_map); buf += put_str(buf, "},\n"); @@ -306,9 +310,23 @@ *(buf++) = '['; for (c = 0; c < mi_cols; ++c) { insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - if (c) *(buf++) = ','; buf += put_num(buf, '[', mi->ref_frame[0], 0); buf += put_num(buf, ',', mi->ref_frame[1], ']'); + if (compress) { // RLE + for (t = c + 1; t < mi_cols; ++t) { + insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; + if (mi->ref_frame[0] != next_mi->ref_frame[0] || + mi->ref_frame[1] != next_mi->ref_frame[1]) { + break; + } + } + if (t - c > 1) { + *(buf++) = ','; + buf += put_num(buf, '[', t - c - 1, ']'); + c = t - 1; + } + } + if (c < mi_cols - 1) *(buf++) = ','; } *(buf++) = ']'; if (r < mi_rows - 1) *(buf++) = ','; @@ -321,17 +339,33 @@ const int mi_rows = frame_data.mi_rows; const int mi_cols = frame_data.mi_cols; char *buf = buffer; - int r, c; + int r, c, t; buf += put_str(buf, " \"motionVectors\": ["); for (r = 0; r < mi_rows; ++r) { *(buf++) = '['; for (c = 0; c < mi_cols; ++c) { insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - if (c) *(buf++) = ','; buf += put_num(buf, '[', mi->mv[0].col, 0); buf += put_num(buf, ',', mi->mv[0].row, 0); buf += put_num(buf, ',', mi->mv[1].col, 0); buf += put_num(buf, ',', mi->mv[1].row, ']'); + if (compress) { // RLE + for (t = c + 1; t < mi_cols; ++t) { + insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; + if (mi->mv[0].col != next_mi->mv[0].col || + mi->mv[0].row != next_mi->mv[0].row || + mi->mv[1].col != next_mi->mv[1].col || + mi->mv[1].row != next_mi->mv[1].row) { + break; + } + } + if (t - c > 1) { + *(buf++) = ','; + buf += put_num(buf, '[', t - c - 1, ']'); + c = t - 1; + } + } + if (c < mi_cols - 1) *(buf++) = ','; } *(buf++) = ']'; if (r < mi_rows - 1) *(buf++) = ','; @@ -345,7 +379,7 @@ const int mi_rows = frame_data.mi_rows; const int mi_cols = frame_data.mi_cols; char *buf = buffer; - int r, c, v; + int r, c, t, v; if (map) { buf += snprintf(buf, MAX_BUFFER, " \"%sMap\": {", name); buf += put_map(buf, map); @@ -355,10 +389,23 @@ for (r = 0; r < mi_rows; ++r) { *(buf++) = '['; for (c = 0; c < mi_cols; ++c) { - insp_mi_data *mi = &frame_data.mi_grid[r * mi_cols + c]; - v = *(((int8_t *)mi) + offset); - if (c) *(buf++) = ','; + insp_mi_data *curr_mi = &frame_data.mi_grid[r * mi_cols + c]; + v = *(((int8_t *)curr_mi) + offset); buf += put_num(buf, 0, v, 0); + if (compress) { // RLE + for (t = c + 1; t < mi_cols; ++t) { + insp_mi_data *next_mi = &frame_data.mi_grid[r * mi_cols + t]; + if (v != *(((int8_t *)next_mi) + offset)) { + break; + } + } + if (t - c > 1) { + *(buf++) = ','; + buf += put_num(buf, '[', t - c - 1, ']'); + c = t - 1; + } + } + if (c < mi_cols - 1) *(buf++) = ','; } *(buf++) = ']'; if (r < mi_rows - 1) *(buf++) = ','; @@ -589,6 +636,8 @@ layers |= MOTION_VECTORS_LAYER; else if (arg_match(&arg, &dump_all_arg, argi)) layers |= ALL_LAYERS; + else if (arg_match(&arg, &compress_arg, argi)) + compress = 1; else if (arg_match(&arg, &usage_arg, argi)) usage_exit(); else if (arg_match(&arg, &limit_arg, argi)) @@ -633,3 +682,6 @@ EMSCRIPTEN_KEEPALIVE void set_layers(LayerType v) { layers = v; } + +EMSCRIPTEN_KEEPALIVE +void set_compress(int v) { compress = v; }