mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-12-18 03:04:06 +00:00
Improve cu-visualization by arranging them to picture dimensions and colors.
This commit is contained in:
parent
681975ad4b
commit
61eb3b3b71
68
src/debug.c
68
src/debug.c
|
@ -31,23 +31,73 @@ void close_cu_file(FILE *fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void yuv2rgb(unsigned char yuv[3], unsigned char rgb[3])
|
||||||
|
{
|
||||||
|
int y = yuv[0];
|
||||||
|
int u = yuv[1];
|
||||||
|
int v = yuv[2];
|
||||||
|
|
||||||
|
int r = 1.164 * y + 1.596 * (v - 128);
|
||||||
|
int g = 1.165 * y - 0.392 * (u - 128) - 0.813 * (v - 128);
|
||||||
|
int b = 1.164 * y + 2.017 * (u - 128);
|
||||||
|
|
||||||
|
rgb[0] = CLIP(0, 255, r);
|
||||||
|
rgb[1] = CLIP(0, 255, g);
|
||||||
|
rgb[2] = CLIP(0, 255, b);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print information about the Coding Unit (CU) into the FILE* provided by open_cu_file.
|
* Print information about the Coding Unit (CU) into the FILE* provided by open_cu_file.
|
||||||
*/
|
*/
|
||||||
unsigned render_cu_file(encoder_control *encoder, unsigned depth, uint16_t xCtb, uint16_t yCtb, FILE *fp)
|
unsigned render_cu_file(encoder_control *encoder, picture *pic,
|
||||||
|
unsigned depth, uint16_t xCtb, uint16_t yCtb, FILE *fp)
|
||||||
{
|
{
|
||||||
cu_info *cu = &encoder->in.cur_pic->cu_array[depth][xCtb + yCtb * (encoder->in.width_in_lcu<<MAX_DEPTH)];
|
cu_info *cu = &pic->cu_array[depth][xCtb + yCtb * (pic->width_in_lcu<<MAX_DEPTH)];
|
||||||
cu_info *final_cu = &encoder->in.cur_pic->cu_array[MAX_DEPTH][xCtb + yCtb * (encoder->in.width_in_lcu<<MAX_DEPTH)];
|
cu_info *final_cu = &pic->cu_array[MAX_DEPTH][xCtb + yCtb * (pic->width_in_lcu<<MAX_DEPTH)];
|
||||||
unsigned lambda_cost = (4 * g_lambda_cost[encoder->QP]) << 4;
|
unsigned lambda_cost = (4 * g_lambda_cost[encoder->QP]) << 4;
|
||||||
unsigned sum = 0;
|
unsigned sum = 0;
|
||||||
unsigned best_cost = -1;
|
unsigned best_cost = -1;
|
||||||
char type = cu->type == CU_INTRA ? 'I' : 'P';
|
char type = cu->type == CU_INTRA ? 'I' : 'P';
|
||||||
|
unsigned x = xCtb * CU_MIN_SIZE_PIXELS;
|
||||||
|
unsigned y = yCtb * CU_MIN_SIZE_PIXELS;
|
||||||
|
unsigned luma = y * pic->width + x;
|
||||||
|
unsigned chroma = (y >> 1) * (pic->width >> 1) + (x >> 1);
|
||||||
|
unsigned char yuv[3] = { 0, 0, 0 };
|
||||||
|
unsigned char rgb[3] = { 0, 0, 0 };
|
||||||
|
|
||||||
|
if (x > pic->width || y > pic->width) {
|
||||||
|
// Don't output anything for CU's completely outside the botders.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (encoder->ref->used_size > 0) {
|
||||||
|
const picture *ref_pic = encoder->ref->pics[0];
|
||||||
|
yuv[0] = ref_pic->y_recdata[luma];
|
||||||
|
yuv[1] = ref_pic->u_recdata[chroma];
|
||||||
|
yuv[2] = ref_pic->v_recdata[chroma];
|
||||||
|
yuv2rgb(yuv, rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enclose everything in a table with the assumption that this function is
|
||||||
|
// called from left to right and from top to down.
|
||||||
|
if (depth == 0) {
|
||||||
|
if (yCtb == 0 && xCtb == 0) {
|
||||||
|
fprintf(fp, "<table><tr><td>");
|
||||||
|
} else if (xCtb == 0) {
|
||||||
|
fprintf(fp, "</td></tr><tr><td>");
|
||||||
|
} else if (xCtb == NO_SCU_IN_LCU(pic->width_in_lcu)
|
||||||
|
&& yCtb == NO_SCU_IN_LCU(pic->height_in_lcu)) {
|
||||||
|
fprintf(fp, "</td></tr></table>");
|
||||||
|
} else {
|
||||||
|
fprintf(fp, "</td><td>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
"\n<table class=d%u><tr><td colspan=2>"
|
"\n<table class=d%u bgcolor=#%02x%02x%02x><tr><td colspan=2>"
|
||||||
"%u (%u, %u), %c, "
|
"%u (%u, %u), %c, "
|
||||||
"c=%u, mv=(%d, %d)</td></tr>\n",
|
"c=%u, mv=(%d, %d)</td></tr>\n",
|
||||||
depth,
|
depth, rgb[0], rgb[1], rgb[2],
|
||||||
depth, xCtb, yCtb, (cu->type == CU_INTRA ? 'I' : 'P'),
|
depth, xCtb, yCtb, (cu->type == CU_INTRA ? 'I' : 'P'),
|
||||||
cu->inter.cost, cu->inter.mv[0], cu->inter.mv[1]);
|
cu->inter.cost, cu->inter.mv[0], cu->inter.mv[1]);
|
||||||
|
|
||||||
|
@ -58,15 +108,15 @@ unsigned render_cu_file(encoder_control *encoder, unsigned depth, uint16_t xCtb,
|
||||||
uint8_t change = 1<<(MAX_DEPTH-1-depth);
|
uint8_t change = 1<<(MAX_DEPTH-1-depth);
|
||||||
|
|
||||||
fprintf(fp, "<tr><td>");
|
fprintf(fp, "<tr><td>");
|
||||||
sum += render_cu_file(encoder, depth + 1, xCtb, yCtb, fp);
|
sum += render_cu_file(encoder, pic, depth + 1, xCtb, yCtb, fp);
|
||||||
fprintf(fp, "</td><td>");
|
fprintf(fp, "</td><td>");
|
||||||
sum += render_cu_file(encoder, depth + 1, xCtb + change, yCtb, fp);
|
sum += render_cu_file(encoder, pic, depth + 1, xCtb + change, yCtb, fp);
|
||||||
fprintf(fp, "</td></tr>");
|
fprintf(fp, "</td></tr>");
|
||||||
|
|
||||||
fprintf(fp, "<tr><td>");
|
fprintf(fp, "<tr><td>");
|
||||||
sum += render_cu_file(encoder, depth + 1, xCtb, yCtb + change, fp);
|
sum += render_cu_file(encoder, pic, depth + 1, xCtb, yCtb + change, fp);
|
||||||
fprintf(fp, "</td><td>");
|
fprintf(fp, "</td><td>");
|
||||||
sum += render_cu_file(encoder, depth + 1, xCtb + change, yCtb + change, fp);
|
sum += render_cu_file(encoder, pic, depth + 1, xCtb + change, yCtb + change, fp);
|
||||||
fprintf(fp, "</td></tr>");
|
fprintf(fp, "</td></tr>");
|
||||||
|
|
||||||
fprintf(fp, "<tr><td colspan=2>sum=%u, sum+lambda=%u</td></tr>",
|
fprintf(fp, "<tr><td colspan=2>sum=%u, sum+lambda=%u</td></tr>",
|
||||||
|
|
|
@ -21,6 +21,6 @@
|
||||||
|
|
||||||
FILE * open_cu_file(char *filename);
|
FILE * open_cu_file(char *filename);
|
||||||
void close_cu_file(FILE *fp);
|
void close_cu_file(FILE *fp);
|
||||||
unsigned render_cu_file(encoder_control *encoder, unsigned depth, uint16_t x_cu, uint16_t y_cu, FILE *fp);
|
unsigned render_cu_file(encoder_control *encoder, picture *pic, unsigned depth, uint16_t x_cu, uint16_t y_cu, FILE *fp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
11
src/search.c
11
src/search.c
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
// Temporarily for debugging.
|
// Temporarily for debugging.
|
||||||
#define USE_INTRA_IN_P 0
|
#define USE_INTRA_IN_P 0
|
||||||
|
//#define RENDER_CU encoder->frame==2
|
||||||
#define RENDER_CU 0
|
#define RENDER_CU 0
|
||||||
#define USE_FULL_SEARCH 0
|
#define USE_FULL_SEARCH 0
|
||||||
#define USE_CHROMA_IN_MV_SEARCH 0
|
#define USE_CHROMA_IN_MV_SEARCH 0
|
||||||
|
@ -489,7 +490,7 @@ void search_slice_data(encoder_control *encoder)
|
||||||
int16_t x_lcu, y_lcu;
|
int16_t x_lcu, y_lcu;
|
||||||
FILE *fp = 0, *fp2 = 0;
|
FILE *fp = 0, *fp2 = 0;
|
||||||
|
|
||||||
if (RENDER_CU && encoder->frame == 1) {
|
if (RENDER_CU) {
|
||||||
fp = open_cu_file("cu_search.html");
|
fp = open_cu_file("cu_search.html");
|
||||||
fp2 = open_cu_file("cu_best.html");
|
fp2 = open_cu_file("cu_best.html");
|
||||||
}
|
}
|
||||||
|
@ -500,14 +501,14 @@ void search_slice_data(encoder_control *encoder)
|
||||||
uint8_t depth = 0;
|
uint8_t depth = 0;
|
||||||
// Recursive function for looping through all the sub-blocks
|
// Recursive function for looping through all the sub-blocks
|
||||||
search_tree(encoder, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, depth);
|
search_tree(encoder, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, depth);
|
||||||
if (RENDER_CU && encoder->frame == 1) {
|
if (RENDER_CU) {
|
||||||
render_cu_file(encoder, depth, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, fp);
|
render_cu_file(encoder, encoder->in.cur_pic, depth, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decide actual coding modes
|
// Decide actual coding modes
|
||||||
search_best_mode(encoder, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, depth);
|
search_best_mode(encoder, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, depth);
|
||||||
if (RENDER_CU && encoder->frame == 1) {
|
if (RENDER_CU) {
|
||||||
render_cu_file(encoder, depth, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, fp2);
|
render_cu_file(encoder, encoder->in.cur_pic, depth, x_lcu << MAX_DEPTH, y_lcu << MAX_DEPTH, fp2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue