Blame extras/webp_quality.c

Packit 9c6abc
// Simple tool to roughly evaluate the quality encoding of a webp bitstream
Packit 9c6abc
//
Packit 9c6abc
// Result is a *rough* estimation of the quality. You should just consider
Packit 9c6abc
// the bucket it's in (q > 80? > 50? > 20?) and not take it for face value.
Packit 9c6abc
/*
Packit 9c6abc
 gcc -o webp_quality webp_quality.c -O3 -I../ -L. -L../imageio \
Packit 9c6abc
    -limageio_util -lwebpextras -lwebp -lm -lpthread
Packit 9c6abc
*/
Packit 9c6abc
Packit 9c6abc
#include <stdio.h>
Packit 9c6abc
#include <stdlib.h>
Packit 9c6abc
#include <string.h>
Packit 9c6abc
Packit 9c6abc
#include "extras/extras.h"
Packit 9c6abc
#include "imageio/imageio_util.h"
Packit 9c6abc
Packit 9c6abc
int main(int argc, const char *argv[]) {
Packit 9c6abc
  int c;
Packit 9c6abc
  int quiet = 0;
Packit 9c6abc
  int ok = 1;
Packit 9c6abc
  for (c = 1; ok && c < argc; ++c) {
Packit 9c6abc
    if (!strcmp(argv[c], "-quiet")) {
Packit 9c6abc
      quiet = 1;
Packit 9c6abc
    } else if (!strcmp(argv[c], "-help") || !strcmp(argv[c], "-h")) {
Packit 9c6abc
      printf("webp_quality [-h][-quiet] webp_files...\n");
Packit 9c6abc
      return 0;
Packit 9c6abc
    } else {
Packit 9c6abc
      const char* const filename = argv[c];
Packit 9c6abc
      const uint8_t* data = NULL;
Packit 9c6abc
      size_t data_size = 0;
Packit 9c6abc
      int q;
Packit 9c6abc
      ok = ImgIoUtilReadFile(filename, &data, &data_size);
Packit 9c6abc
      if (!ok) break;
Packit 9c6abc
      q = VP8EstimateQuality(data, data_size);
Packit 9c6abc
      if (!quiet) printf("[%s] ", filename);
Packit 9c6abc
      if (q < 0) {
Packit 9c6abc
        fprintf(stderr, "Not a WebP file, or not a lossy WebP file.\n");
Packit 9c6abc
        ok = 0;
Packit 9c6abc
      } else {
Packit 9c6abc
        if (!quiet) {
Packit 9c6abc
          printf("Estimated quality factor: %d\n", q);
Packit 9c6abc
        } else {
Packit 9c6abc
          printf("%d\n", q);   // just print the number
Packit 9c6abc
        }
Packit 9c6abc
      }
Packit 9c6abc
      free((void*)data);
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
  return ok ? 0 : 1;
Packit 9c6abc
}