Commit f1207b60 authored by Michael Bebenita's avatar Michael Bebenita
Browse files

Compress analyzer data using RLE.

This significantly reduces the size of the exported
data and improves analyzer decoding time.

Change-Id: I0553c76630009754038a86b634b545db24fb3dd6
parent a631722c
......@@ -62,10 +62,13 @@ typedef enum {
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 usage_arg = ARG_DEF("h", "help", 0, "Help");
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 @@ int put_reference_frame(char *buffer) {
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 @@ int put_reference_frame(char *buffer) {
*(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 @@ int put_motion_vectors(char *buffer) {
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 @@ int put_block_info(char *buffer, const map_entry *map, const char *name,
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 @@ int put_block_info(char *buffer, const map_entry *map, const char *name,
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 @@ static void parse_args(char **argv) {
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 @@ void quit() {
EMSCRIPTEN_KEEPALIVE
void set_layers(LayerType v) { layers = v; }
EMSCRIPTEN_KEEPALIVE
void set_compress(int v) { compress = v; }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment