4 #include <libavutil/avutil.h>
5 #include <libswscale/swscale.h>
17 int open_file_png(char *psz_filename
, hnd_t
*p_handle
, int i_compression
)
19 png_output_t
*h
= NULL
;
20 if( (h
= calloc(1, sizeof(*h
))) == NULL
)
23 if( !strcmp(psz_filename
, "-") )
25 else if( (h
->fh
= fopen(psz_filename
, "wb")) == NULL
)
30 if( (h
->p_png
= png_create_write_struct( PNG_LIBPNG_VER_STRING
, NULL
, NULL
, NULL
)) == NULL
)
35 if( (h
->p_info
= png_create_info_struct(h
->p_png
)) == NULL
)
37 png_destroy_write_struct(&(h
->p_png
), (png_infopp
)NULL
);
41 png_init_io( h
->p_png
, h
->fh
);
43 png_set_compression_level( h
->p_png
, i_compression
);
50 if( h
->fh
!= NULL
&& h
->fh
!= stdout
)
57 int close_file_png( hnd_t handle
)
60 png_output_t
*h
= handle
;
62 png_destroy_write_struct( &(h
->p_png
), &(h
->p_info
) );
64 if ((h
->fh
== NULL
) || (h
->fh
== stdout
))
74 int write_image_png( hnd_t handle
, picture_t
*p_pic
, config_t
*p_config
)
76 png_output_t
*h
= handle
;
77 uint8_t *out_data
= malloc(p_config
->i_width
* p_config
->i_height
* 4);
78 uint8_t **pp_rows
= calloc(p_config
->i_height
, sizeof(*pp_rows
));
80 struct SwsContext
*p_sws
;
83 pic_out
.img
.plane
[0] = out_data
;
84 pic_out
.img
.plane
[1] = pic_out
.img
.plane
[2] = pic_out
.img
.plane
[3] = NULL
;
85 pic_out
.img
.i_stride
[0] = 3*p_config
->i_width
;
86 pic_out
.img
.i_stride
[1] = pic_out
.img
.i_stride
[2] = pic_out
.img
.i_stride
[3] = 0;
88 p_sws
= sws_getContext( p_config
->i_width
, p_config
->i_height
, PIX_FMT_YUV420P
,
89 p_config
->i_width
, p_config
->i_height
, PIX_FMT_RGB24
,
90 SWS_FAST_BILINEAR
| SWS_ACCURATE_RND
,
93 sws_scale(p_sws
, p_pic
->img
.plane
, p_pic
->img
.i_stride
, 0, p_config
->i_height
, pic_out
.img
.plane
, pic_out
.img
.i_stride
);
95 __asm__
volatile ("emms\n\t");
98 png_set_IHDR( h
->p_png
, h
->p_info
, p_config
->i_width
, p_config
->i_height
,
99 8, PNG_COLOR_TYPE_RGB
, PNG_INTERLACE_NONE
,
100 PNG_COMPRESSION_TYPE_DEFAULT
, PNG_FILTER_TYPE_DEFAULT
);
102 for(i
=0; i
< p_config
->i_height
; i
++)
103 pp_rows
[i
] = pic_out
.img
.plane
[0] + i
* pic_out
.img
.i_stride
[0];
105 png_set_rows( h
->p_png
, h
->p_info
, pp_rows
);
107 png_write_png( h
->p_png
, h
->p_info
, 0, NULL
);