Esempio n. 1
0
uint8_t * ReadToPNGPicture(uint8_t * buf, size_t buf_len, size_t * buf_out, int bit_depth, int * returnValue)
{
	mem_encode mempng;

	BPGDecoderContext *img;

	img = bpg_decoder_open();

	if (bpg_decoder_decode(img, buf, buf_len) < 0) {
		fprintf(stderr, "Could not decode image\n");
		return 0;
	}

	*returnValue = png_save(img, &mempng, bit_depth);


	bpg_decoder_close(img);

	buf_out = mempng.size;

	return mempng.buffer;
}
Esempio n. 2
0
int main(int argc, char **argv)
{
    FILE *f;
    BPGDecoderContext *img;
    uint8_t *buf;
    int buf_len, bit_depth, c, show_info;
    const char *outfilename, *filename, *p;
    
    outfilename = "out.png";
    bit_depth = 8;
    show_info = 0;
    for(;;) {
        c = getopt(argc, argv, "ho:b:i");
        if (c == -1)
            break;
        switch(c) {
        case 'h':
        show_help:
            help();
            break;
        case 'o':
            outfilename = optarg;
            break;
        case 'b':
            bit_depth = atoi(optarg);
            break;
        case 'i':
            show_info = 1;
            break;
        default:
            exit(1);
        }
    }

    if (optind >= argc)
        goto show_help;

    filename = argv[optind++];

    if (show_info) {
        bpg_show_info(filename, 1);
        return 0;
    }

    f = fopen(filename, "rb");
    if (!f) {
        fprintf(stderr, "Could not open %s\n", filename);
        exit(1);
    }

    fseek(f, 0, SEEK_END);
    buf_len = ftell(f);
    fseek(f, 0, SEEK_SET);

    buf = malloc(buf_len);
    if (fread(buf, 1, buf_len, f) != buf_len) {
        fprintf(stderr, "Error while reading file\n");
        exit(1);
    }
    
    fclose(f);

    img = bpg_decoder_open();

    if (bpg_decoder_decode(img, buf, buf_len) < 0) {
        fprintf(stderr, "Could not decode image\n");
        exit(1);
    }
    free(buf);

#ifdef USE_PNG
    p = strrchr(outfilename, '.');
    if (p)
        p++;

    if (p && strcasecmp(p, "ppm") != 0) {
        png_save(img, outfilename, bit_depth);
    } else 
#endif
    {
        ppm_save(img, outfilename);
    }

    bpg_decoder_close(img);

    return 0;
}
Esempio n. 3
0
static int grab_command(shell_t *shell, shell_argv_t *cmd_argv, char *tag)
{
  int argc = cmd_argv->argc;
  char **argv = cmd_argv->argv;
  char *hdr = log_hdr_(tag);
  int ret = -1;

  /* Set error reporting tag */
  error_default_tag(tag);

  /* The 'stop' qualifier */
  if ( (argc > 1) && (strcmp(argv[1], "stop") == 0) ) {
    /* Check number of arguments */
    if ( check_argc(shell, cmd_argv, tag, 2, 2) )
      return -1;

    grab_end = 0;

    if ( grab_n > 0 ) {
      printf("%s%d frames recorded\n", hdr, grab_n);
      grab_n = 0;
    }
    else {
      printf("%sNo recording in progress\n", hdr);
    }

    ret = 0;
  }

  /* Unknown qualifier */
  else {
    frame_t *frame = grab_display->root;
    char *window_str = NULL;
    frame_geometry_t window;
    char *fname = NULL;
    int grab_animation = 0;
    long grab_dt = 0;
    int n;

    /* Check number of arguments */
    if ( check_argc(shell, cmd_argv, tag, 1, 4) )
      return -1;

    for (n = 1; n < argc; n++) {
      char *str = argv[n];
      char *eq = strchr(str, '=');

      if ( eq != NULL ) {
	*(eq++) = '\0';
	if ( strcmp(str, "frame") == 0 ) {
	  frame = frame_get_child_by_id(grab_display->root, eq);
	  if ( frame == NULL ) {
	    error(NULL, "Unknown frame '%s'", eq);
	    return -1;
	  }
	}
	else if ( strcmp(str, "window") == 0 ) {
	  window_str = eq;
	}
	else if ( strcmp(str, "t") == 0 ) {
	  grab_begin = (tstamp_get() / 1000);
	  grab_end = 0;
	  grab_n = 0;
	  grab_dt = (atoi(eq) * 1000);
	  if ( grab_dt < 0 )
	    grab_dt = 0;

	  grab_end = grab_begin + grab_dt;
	  grab_animation = 1;
	}
	else {
	  error(tag, "Illegal qualifier '%s'", str);
	  return -1;
	}
      }
      else {
	fname = str;
      }
    }

    /* Set source frame */
    if ( window_str != NULL ) {
      if ( frame_rgb_parse_geometry(&(frame->hdr.fb->rgb), window_str, &window) ) {
	error(NULL, "Syntax error in window geometry");
	return -1;
      }
    }
    else {
      window = frame->g;
      window.x = 0;
      window.y = 0;
    }

    /* Retrieve output format */
    grab_ppm = (ppm_filename_suffix(fname) != NULL);

    /* Construct an image file name */
    fname = grab_ppm ? ppm_filename(fname) : png_filename(fname);
    if ( fname == NULL ) {
      error(tag, "Failed to construct a valid image file name");
      return -1;
    }

    if ( grab_animation ) {
      char *suffix_str;
      char *suffix;

      if ( grab_ppm ) {
	suffix_str = PPM_SUFFIX;
	suffix = ppm_filename_suffix(fname);
      }
      else {
	suffix_str = PNG_SUFFIX;
	suffix = png_filename_suffix(fname);
      }

      if ( suffix != NULL )
	*suffix = '\0';

      grab_fname_size = strlen(fname) + 16;
      if ( grab_fname_fmt != NULL )
	free(grab_fname_fmt);
      grab_fname_fmt = (char *) malloc(grab_fname_size);
      snprintf(grab_fname_fmt, grab_fname_size, "%s.%%09lu%s", fname, suffix_str);

      grab_frame = frame;
      grab_window = window;

      ret = grab_save(0);
      if ( ret == 0 ) {
	printf("%sframe=%s window=%s t=%ld %s.*%s\n", hdr,
	       frame->hdr.id, frame_geometry_str(&window),
	       grab_dt / 1000, fname, suffix_str);
      }
      else {
	printf("%sFailed to write image file '%s'", hdr, grab_fname);

	grab_end = 0;
      }
    }
    else {
      if ( grab_ppm )
	ret = ppm_save(&(frame->hdr.fb->rgb), &window, fname);
      else
	ret = png_save(&(frame->hdr.fb->rgb), &window, fname);

      if ( ret == 0 )
	printf("%sframe=%s window=%s %s\n", hdr, frame->hdr.id, frame_geometry_str(&window), fname);
      else
	printf("%sFailed to write image file '%s'", hdr, fname);
    }

    free(fname);
  }

  return ret;
}