/*
 * This fuction loads the given ppm file 
 * and returns a pointer to it
*/
PPMImage* load_ppm_image(PPMImage* img, const char* filename, int prevAlloc)
{

  //printf("Loading file: %s\n",filename);
          
  if(strlen(filename) <= 3)
  {
    fprintf(ERROR_OUT, "ERROR: Invalid filename. %s \nPress Enter To Exit...",filename);
	//char c = getc(stdin);
    exit(20);                  
  }
  
  FILE* in;
  
  in = fopen(filename,"r");
  if(in == NULL)
  {
     fprintf(ERROR_OUT, "ERROR %d: Unable to read file.\nPress Enter To Exit...", errno);
	 //char c = getc(stdin);
	 assert (0 == 1);
     exit(30);                    
  }  
  
  strcpy(img->filename, filename);
  
  read_ppm_header(img, in);
  
  //Allocate memory on the heap for the image array.
  img->size = img->width * img->height;
  if (prevAlloc == NEW_ALLOC) {
    img->pixels = (Pixel*)malloc(img->size * sizeof(Pixel));
  }
  
  if(img->p == '6')
  {
     fread(img->pixels, sizeof(Pixel), img->size, in);
  }
  else if(img->p == '3')
  {
     read_P3_to_P6(img, in);     
  }
  fclose(in);
   
return img;
}
Beispiel #2
0
static
int read_ppm_frame(int fd, ppm_info_t *ppm,
		   uint8_t *buffers[], uint8_t *buffers2[],
		   int ilace, int ileave, int bgr)
{
  int width, height;
  static uint8_t *rowbuffer = NULL;
  int err;

  err = read_ppm_header(fd, &width, &height);
  if (err > 0) return 1;  /* EOF */
  if (err < 0) return -1; /* error */
  mjpeg_debug("Got PPM header:  %dx%d", width, height);

  if (ppm->width == 0) {
    /* first time */
    mjpeg_debug("Initializing PPM read_frame");
    ppm->width = width;
    ppm->height = height;
    rowbuffer = malloc(width * 3 * sizeof(rowbuffer[0]));
  } else {
    /* make sure everything matches */
    if ( (ppm->width != width) ||
	 (ppm->height != height) )
      mjpeg_error_exit1("One of these frames is not like the others!");
  }
  if (buffers[0] == NULL) 
    alloc_buffers(buffers, width, height);
  if ((buffers2[0] == NULL) && (ilace != Y4M_ILACE_NONE))
    alloc_buffers(buffers2, width, height);

  mjpeg_debug("Reading rows");

  if ((ilace != Y4M_ILACE_NONE) && (ileave)) {
    /* Interlaced and Interleaved:
       --> read image and deinterleave fields at same time */
    if (ilace == Y4M_ILACE_TOP_FIRST) {
      /* 1st buff arg == top field == temporally first == "buffers" */
      read_ppm_into_two_buffers(fd, buffers, buffers2,
				rowbuffer, width, height, bgr);
    } else {
      /* bottom-field-first */
      /* 1st buff art == top field == temporally second == "buffers2" */
      read_ppm_into_two_buffers(fd, buffers2, buffers,
				rowbuffer, width, height, bgr);
    }      
  } else if ((ilace == Y4M_ILACE_NONE) || (!ileave)) {
    /* Not Interlaced, or Not Interleaved:
       --> read image into first buffer... */
    read_ppm_into_one_buffer(fd, buffers, rowbuffer, width, height, bgr);
    if ((ilace != Y4M_ILACE_NONE) && (!ileave)) {
      /* ...Actually Interlaced:
	 --> read the second image/field into second buffer */
      err = read_ppm_header(fd, &width, &height);
      if (err > 0) return 1;  /* EOF */
      if (err < 0) return -1; /* error */
      mjpeg_debug("Got PPM header:  %dx%d", width, height);
      
      /* make sure everything matches */
      if ( (ppm->width != width) ||
	   (ppm->height != height) )
	mjpeg_error_exit1("One of these frames is not like the others!");
      read_ppm_into_one_buffer(fd, buffers2, rowbuffer, width, height, bgr);
    }
  }
  return 0;
}