Lines 78-83
png_structp png_ptr;
Link Here
|
78 |
png_infop info_ptr, end_info; |
78 |
png_infop info_ptr, end_info; |
79 |
uint8_t *raw0, *raw1, *raw2; /* buffer for RGB first, and then Y/Cb/Cr planes of decoded PNG */ |
79 |
uint8_t *raw0, *raw1, *raw2; /* buffer for RGB first, and then Y/Cb/Cr planes of decoded PNG */ |
80 |
|
80 |
|
|
|
81 |
static int png_row_number = 0; |
82 |
|
81 |
/* |
83 |
/* |
82 |
* The User Interface parts |
84 |
* The User Interface parts |
83 |
*/ |
85 |
*/ |
Lines 240-248
static void parse_commandline(int argc,
Link Here
|
240 |
} |
242 |
} |
241 |
} |
243 |
} |
242 |
|
244 |
|
|
|
245 |
void read_row_callback(png_structp ptr, png_uint_32 row, int pass) |
246 |
{ |
247 |
png_row_number++; |
248 |
} |
249 |
|
243 |
void png_separation(png_structp png_ptr, png_row_infop row_info, png_bytep data) |
250 |
void png_separation(png_structp png_ptr, png_row_infop row_info, png_bytep data) |
244 |
{ |
251 |
{ |
245 |
int row_nr = png_ptr->row_number; // internal variable ? |
|
|
246 |
int i, width = row_info->width; |
252 |
int i, width = row_info->width; |
247 |
int new_width = sh_param->new_width; |
253 |
int new_width = sh_param->new_width; |
248 |
|
254 |
|
Lines 256-283
void png_separation(png_structp png_ptr,
Link Here
|
256 |
*/ |
262 |
*/ |
257 |
|
263 |
|
258 |
//mjpeg_debug("PNG YUV transformation callback; color_type is %d row_number %d\n", |
264 |
//mjpeg_debug("PNG YUV transformation callback; color_type is %d row_number %d\n", |
259 |
// row_info->color_type, row_nr); |
265 |
// row_info->color_type, png_row_number); |
260 |
|
266 |
|
261 |
if(row_info->color_type == PNG_COLOR_TYPE_GRAY) // only Z available |
267 |
if(row_info->color_type == PNG_COLOR_TYPE_GRAY) // only Z available |
262 |
{ |
268 |
{ |
263 |
//mjpeg_debug("Grayscale to YUV, row %d", row_nr); |
269 |
//mjpeg_debug("Grayscale to YUV, row %d", png_row_number); |
264 |
for (i = 0; i < width; i++) |
270 |
for (i = 0; i < width; i++) |
265 |
{ |
271 |
{ |
266 |
raw0[i + row_nr * new_width] = data[i]; |
272 |
raw0[i + png_row_number * new_width] = data[i]; |
267 |
raw1[i + row_nr * new_width] = data[i]; |
273 |
raw1[i + png_row_number * new_width] = data[i]; |
268 |
raw2[i + row_nr * new_width] = data[i]; |
274 |
raw2[i + png_row_number * new_width] = data[i]; |
269 |
} |
275 |
} |
270 |
return; |
276 |
return; |
271 |
} |
277 |
} |
272 |
|
278 |
|
273 |
if(row_info->color_type == PNG_COLOR_TYPE_RGB) // Z and Alpha available |
279 |
if(row_info->color_type == PNG_COLOR_TYPE_RGB) // Z and Alpha available |
274 |
{ |
280 |
{ |
275 |
//mjpeg_info("RGB to YUV, row %d", row_nr); |
281 |
//mjpeg_info("RGB to YUV, row %d", png_row_number); |
276 |
for (i = 0; i < width; i++) |
282 |
for (i = 0; i < width; i++) |
277 |
{ |
283 |
{ |
278 |
raw0[i + row_nr * new_width] = data[i*3]; |
284 |
raw0[i + png_row_number * new_width] = data[i*3]; |
279 |
raw1[i + row_nr * new_width] = data[i*3 + 1]; |
285 |
raw1[i + png_row_number * new_width] = data[i*3 + 1]; |
280 |
raw2[i + row_nr * new_width] = data[i*3 + 2]; |
286 |
raw2[i + png_row_number * new_width] = data[i*3 + 2]; |
281 |
} |
287 |
} |
282 |
return; |
288 |
return; |
283 |
} |
289 |
} |
Lines 352-359
int decode_png(const char *pngname, int
Link Here
|
352 |
return -1; |
358 |
return -1; |
353 |
} |
359 |
} |
354 |
|
360 |
|
355 |
if (process) |
361 |
if (process) { |
|
|
362 |
png_set_read_status_fn(png_ptr, read_row_callback); |
356 |
png_set_read_user_transform_fn(png_ptr, png_separation); |
363 |
png_set_read_user_transform_fn(png_ptr, png_separation); |
|
|
364 |
} |
357 |
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_STRIP_ALPHA, NULL); |
365 |
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_STRIP_ALPHA, NULL); |
358 |
|
366 |
|
359 |
if (png_get_IHDR(png_ptr, info_ptr, ¶m->width, ¶m->height, &bit_depth, |
367 |
if (png_get_IHDR(png_ptr, info_ptr, ¶m->width, ¶m->height, &bit_depth, |
Lines 402-408
int decode_png(const char *pngname, int
Link Here
|
402 |
} |
410 |
} |
403 |
png_read_end(png_ptr, info_ptr); |
411 |
png_read_end(png_ptr, info_ptr); |
404 |
#endif |
412 |
#endif |
405 |
if (setjmp(png_ptr->jmpbuf)) { |
413 |
if (setjmp(png_jmpbuf(png_ptr))) { |
406 |
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); |
414 |
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); |
407 |
return 2; |
415 |
return 2; |
408 |
} |
416 |
} |