mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 18:35:41 +01:00 
			
		
		
		
	use ExReadFile() for ReadYUV()
this allows read-from-stdin. + report error on invalid -s option Change-Id: I0cbb2e7ab95442f9fa5891b47fc3ab71ca07d78b
This commit is contained in:
		
				
					committed by
					
						 James Zern
						James Zern
					
				
			
			
				
	
			
			
			
						parent
						
							c13245c7d8
						
					
				
				
					commit
					1c1702d818
				
			| @@ -48,33 +48,43 @@ extern void* VP8GetCPUInfo;   // opaque forward declaration. | ||||
|  | ||||
| static int verbose = 0; | ||||
|  | ||||
| static int ReadYUV(FILE* in_file, WebPPicture* const pic) { | ||||
| static int ReadYUV(const char filename[], WebPPicture* const pic) { | ||||
|   const int use_argb = pic->use_argb; | ||||
|   const int uv_width = (pic->width + 1) / 2; | ||||
|   const int uv_height = (pic->height + 1) / 2; | ||||
|   int y; | ||||
|   const int uv_plane_size = uv_width * uv_height; | ||||
|   const uint8_t* data = NULL; | ||||
|   size_t data_size = 0; | ||||
|   const size_t expected_data_size = | ||||
|       pic->width * pic->height + 2 * uv_plane_size; | ||||
|   int ok = 0; | ||||
|  | ||||
|   pic->use_argb = 0; | ||||
|   if (!WebPPictureAlloc(pic)) return ok; | ||||
|  | ||||
|   for (y = 0; y < pic->height; ++y) { | ||||
|     if (fread(pic->y + y * pic->y_stride, pic->width, 1, in_file) != 1) { | ||||
|       goto End; | ||||
|     } | ||||
|   } | ||||
|   for (y = 0; y < uv_height; ++y) { | ||||
|     if (fread(pic->u + y * pic->uv_stride, uv_width, 1, in_file) != 1) | ||||
|       goto End; | ||||
|   } | ||||
|   for (y = 0; y < uv_height; ++y) { | ||||
|     if (fread(pic->v + y * pic->uv_stride, uv_width, 1, in_file) != 1) | ||||
|       goto End; | ||||
|   ok = ExUtilReadFile(filename, &data, &data_size); | ||||
|   if (!ok) goto End; | ||||
|  | ||||
|   if (data_size != expected_data_size) { | ||||
|     fprintf(stderr, | ||||
|             "file '%s' doesn't have the expected size (%d instead of %d)\n", | ||||
|             filename, (int)data_size, (int)expected_data_size); | ||||
|     ok = 0; | ||||
|     goto End; | ||||
|   } | ||||
|   pic->y_stride = pic->width; | ||||
|   pic->uv_stride = uv_width; | ||||
|   pic->y = (uint8_t*)data; | ||||
|   pic->u = pic->y + pic->height * pic->y_stride; | ||||
|   pic->v = pic->u + uv_plane_size; | ||||
|   // Grab ownership 'data' | ||||
|   pic->memory_ = (void*)data; | ||||
|   data = NULL; | ||||
|   ok = 1; | ||||
|  | ||||
|   if (use_argb) ok = WebPPictureYUVAToARGB(pic); | ||||
|  | ||||
|  End: | ||||
|   free((void*)data); | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| @@ -84,14 +94,7 @@ static int ReadPicture(const char* const filename, WebPPicture* const pic, | ||||
|                        int keep_alpha, Metadata* const metadata) { | ||||
|   int ok; | ||||
|   if (pic->width != 0 && pic->height != 0) { | ||||
|     // If image size is specified, infer it as YUV format. | ||||
|     FILE* in_file = fopen(filename, "rb"); | ||||
|     if (in_file == NULL) { | ||||
|       fprintf(stderr, "Error! Cannot open input file '%s'\n", filename); | ||||
|       return 0; | ||||
|     } | ||||
|     ok = ReadYUV(in_file, pic); | ||||
|     fclose(in_file); | ||||
|     ok = ReadYUV(filename, pic); | ||||
|   } else { | ||||
|     // If no size specified, try to decode it using WIC. | ||||
|     ok = ReadPictureWithWIC(filename, pic, keep_alpha, metadata); | ||||
| @@ -142,15 +145,15 @@ static InputFileFormat GetImageType(FILE* in_file) { | ||||
| static int ReadPicture(const char* const filename, WebPPicture* const pic, | ||||
|                        int keep_alpha, Metadata* const metadata) { | ||||
|   int ok = 0; | ||||
|   FILE* in_file = fopen(filename, "rb"); | ||||
|   if (in_file == NULL) { | ||||
|     fprintf(stderr, "Error! Cannot open input file '%s'\n", filename); | ||||
|     return ok; | ||||
|   } | ||||
|  | ||||
|   if (pic->width == 0 || pic->height == 0) { | ||||
|     InputFileFormat format; | ||||
|     // If no size specified, try to decode it as PNG/JPEG (as appropriate). | ||||
|     const InputFileFormat format = GetImageType(in_file); | ||||
|     FILE* in_file = fopen(filename, "rb"); | ||||
|     if (in_file == NULL) { | ||||
|       fprintf(stderr, "Error! Cannot open input file '%s'\n", filename); | ||||
|       return ok; | ||||
|     } | ||||
|     format = GetImageType(in_file); | ||||
|     if (format == PNG_) { | ||||
|       ok = ReadPNG(in_file, pic, keep_alpha, metadata); | ||||
|     } else if (format == JPEG_) { | ||||
| @@ -160,15 +163,15 @@ static int ReadPicture(const char* const filename, WebPPicture* const pic, | ||||
|     } else if (format == WEBP_) { | ||||
|       ok = ReadWebP(filename, pic, keep_alpha, metadata); | ||||
|     } | ||||
|     fclose(in_file); | ||||
|   } else { | ||||
|     // If image size is specified, infer it as YUV format. | ||||
|     ok = ReadYUV(in_file, pic); | ||||
|     ok = ReadYUV(filename, pic); | ||||
|   } | ||||
|   if (!ok) { | ||||
|     fprintf(stderr, "Error! Could not process file %s\n", filename); | ||||
|   } | ||||
|  | ||||
|   fclose(in_file); | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| @@ -739,6 +742,13 @@ int main(int argc, const char *argv[]) { | ||||
|     } else if (!strcmp(argv[c], "-s") && c < argc - 2) { | ||||
|       picture.width = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       picture.height = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       if (picture.width > WEBP_MAX_DIMENSION || picture.width < 0 || | ||||
|           picture.height > WEBP_MAX_DIMENSION ||  picture.height < 0) { | ||||
|         fprintf(stderr, | ||||
|                 "Specified dimension (%d x %d) is out of range.\n", | ||||
|                 picture.width, picture.height); | ||||
|         goto Error; | ||||
|       } | ||||
|     } else if (!strcmp(argv[c], "-m") && c < argc - 1) { | ||||
|       config.method = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       use_lossless_preset = 0;   // disable -z option | ||||
|   | ||||
		Reference in New Issue
	
	Block a user