static void PrintExtraInfoLossy(const WebPPicture* const pic, int short_output, int full_details, const char* const file_name) { const WebPAuxStats* const stats = pic->stats; if (short_output) { fprintf(stderr, "%7d %2.2f\n", stats->coded_size, stats->PSNR[3]); } else { const int num_i4 = stats->block_count[0]; const int num_i16 = stats->block_count[1]; const int num_skip = stats->block_count[2]; const int total = num_i4 + num_i16; fprintf(stderr, "File: %s\n", file_name); fprintf(stderr, "Dimension: %d x %d%s\n", pic->width, pic->height, stats->alpha_data_size ? " (with alpha)" : ""); fprintf(stderr, "Output: " "%d bytes Y-U-V-All-PSNR %2.2f %2.2f %2.2f %2.2f dB\n", stats->coded_size, stats->PSNR[0], stats->PSNR[1], stats->PSNR[2], stats->PSNR[3]); if (total > 0) { int totals[4] = { 0, 0, 0, 0 }; fprintf(stderr, "block count: intra4: %d\n" " intra16: %d (-> %.2f%%)\n", num_i4, num_i16, 100.f * num_i16 / total); fprintf(stderr, " skipped block: %d (%.2f%%)\n", num_skip, 100.f * num_skip / total); fprintf(stderr, "bytes used: header: %6d (%.1f%%)\n" " mode-partition: %6d (%.1f%%)\n", stats->header_bytes[0], 100.f * stats->header_bytes[0] / stats->coded_size, stats->header_bytes[1], 100.f * stats->header_bytes[1] / stats->coded_size); if (stats->alpha_data_size > 0) { fprintf(stderr, " transparency: %6d (%.1f dB)\n", stats->alpha_data_size, stats->PSNR[4]); } fprintf(stderr, " Residuals bytes " "|segment 1|segment 2|segment 3" "|segment 4| total\n"); if (full_details) { fprintf(stderr, " intra4-coeffs: "); PrintByteCount(stats->residual_bytes[0], stats->coded_size, totals); fprintf(stderr, " intra16-coeffs: "); PrintByteCount(stats->residual_bytes[1], stats->coded_size, totals); fprintf(stderr, " chroma coeffs: "); PrintByteCount(stats->residual_bytes[2], stats->coded_size, totals); } fprintf(stderr, " macroblocks: "); PrintPercents(stats->segment_size, total); fprintf(stderr, " quantizer: "); PrintValues(stats->segment_quant); fprintf(stderr, " filter level: "); PrintValues(stats->segment_level); if (full_details) { fprintf(stderr, "------------------+---------"); fprintf(stderr, "+---------+---------+---------+-----------------\n"); fprintf(stderr, " segments total: "); PrintByteCount(totals, stats->coded_size, NULL); } } if (stats->lossless_size > 0) { PrintFullLosslessInfo(stats, "alpha"); } } }
static void PrintExtraInfoLossy(const WebPPicture* const pic, int short_output, int full_details, const char* const file_name) { const WebPAuxStats* const stats = pic->stats; if (short_output) { fprintf(stderr, "%7d %2.2f\n", stats->coded_size, stats->PSNR[3]); } else { const int num_i4 = stats->block_count[0]; const int num_i16 = stats->block_count[1]; const int num_skip = stats->block_count[2]; const int total = num_i4 + num_i16; fprintf(stderr, "File: %s\n", file_name); fprintf(stderr, "Dimension: %d x %d%s\n", pic->width, pic->height, stats->alpha_data_size ? " (with alpha)" : ""); fprintf(stderr, "Output: " "%d bytes Y-U-V-All-PSNR %2.2f %2.2f %2.2f %2.2f dB\n", stats->coded_size, stats->PSNR[0], stats->PSNR[1], stats->PSNR[2], stats->PSNR[3]); if (total > 0) { int totals[4] = { 0, 0, 0, 0 }; fprintf(stderr, "block count: intra4: %d\n" " intra16: %d (-> %.2f%%)\n", num_i4, num_i16, 100.f * num_i16 / total); fprintf(stderr, " skipped block: %d (%.2f%%)\n", num_skip, 100.f * num_skip / total); fprintf(stderr, "bytes used: header: %6d (%.1f%%)\n" " mode-partition: %6d (%.1f%%)\n", stats->header_bytes[0], 100.f * stats->header_bytes[0] / stats->coded_size, stats->header_bytes[1], 100.f * stats->header_bytes[1] / stats->coded_size); if (stats->alpha_data_size > 0) { fprintf(stderr, " transparency: %6d (%.1f dB)\n", stats->alpha_data_size, stats->PSNR[4]); } if (stats->layer_data_size) { fprintf(stderr, " enhancement: %6d\n", stats->layer_data_size); } fprintf(stderr, " Residuals bytes " "|segment 1|segment 2|segment 3" "|segment 4| total\n"); if (full_details) { fprintf(stderr, " intra4-coeffs: "); PrintByteCount(stats->residual_bytes[0], stats->coded_size, totals); fprintf(stderr, " intra16-coeffs: "); PrintByteCount(stats->residual_bytes[1], stats->coded_size, totals); fprintf(stderr, " chroma coeffs: "); PrintByteCount(stats->residual_bytes[2], stats->coded_size, totals); } fprintf(stderr, " macroblocks: "); PrintPercents(stats->segment_size, total); fprintf(stderr, " quantizer: "); PrintValues(stats->segment_quant); fprintf(stderr, " filter level: "); PrintValues(stats->segment_level); if (full_details) { fprintf(stderr, "------------------+---------"); fprintf(stderr, "+---------+---------+---------+-----------------\n"); fprintf(stderr, " segments total: "); PrintByteCount(totals, stats->coded_size, NULL); } } if (stats->lossless_size > 0) { PrintFullLosslessInfo(stats, "alpha"); } } if (pic->extra_info != NULL) { const int mb_w = (pic->width + 15) / 16; const int mb_h = (pic->height + 15) / 16; const int type = pic->extra_info_type; int x, y; for (y = 0; y < mb_h; ++y) { for (x = 0; x < mb_w; ++x) { const int c = pic->extra_info[x + y * mb_w]; if (type == 1) { // intra4/intra16 printf("%c", "+."[c]); } else if (type == 2) { // segments printf("%c", ".-*X"[c]); } else if (type == 3) { // quantizers printf("%.2d ", c); } else if (type == 6 || type == 7) { printf("%3d ", c); } else { printf("0x%.2x ", c); } } printf("\n"); } } }