2 * Portable Network Graphics renderer
4 * Copyright 2001 by Felix Buenemann <atmosfear@users.sourceforge.net>
6 * Uses libpng (which uses zlib), so see according licenses.
8 * This file is part of MPlayer.
10 * MPlayer is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * MPlayer is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33 #include "video_out.h"
34 #include "video_out_internal.h"
35 #include "subopt-helper.h"
36 #include "libavcodec/avcodec.h"
37 #include "fmt-conversion.h"
39 static const vo_info_t info
=
43 "Felix Buenemann <atmosfear@users.sourceforge.net>",
47 const LIBVO_EXTERN (png
)
49 static int z_compression
;
52 static AVCodecContext
*avctx
;
53 static uint8_t *outbuffer
;
57 config(uint32_t width
, uint32_t height
, uint32_t d_width
, uint32_t d_height
, uint32_t flags
, char *title
, uint32_t format
)
59 if(z_compression
== 0) {
60 mp_tmsg(MSGT_VO
,MSGL_INFO
, "[VO_PNG] Warning: compression level set to 0, compression disabled!\n");
61 mp_tmsg(MSGT_VO
,MSGL_INFO
, "[VO_PNG] Info: Use -vo png:z=<n> to set compression level from 0 to 9.\n");
62 mp_tmsg(MSGT_VO
,MSGL_INFO
, "[VO_PNG] Info: (0 = no compression, 1 = fastest, lowest - 9 best, slowest compression)\n");
65 mp_msg(MSGT_VO
,MSGL_DBG2
, "PNG Compression level %i\n", z_compression
);
71 static uint32_t draw_image(mp_image_t
* mpi
){
78 // if -dr or -slices then do nothing:
79 if(mpi
->flags
&(MP_IMGFLAG_DIRECT
|MP_IMGFLAG_DRAW_CALLBACK
)) return VO_TRUE
;
81 snprintf (buf
, 100, "%08d.png", ++framenum
);
82 outfile
= fopen(buf
, "wb");
84 mp_msg(MSGT_VO
,MSGL_WARN
, "\n[VO_PNG] Error opening '%s' for writing!\n", strerror(errno
));
88 avctx
->width
= mpi
->w
;
89 avctx
->height
= mpi
->h
;
90 avctx
->pix_fmt
= imgfmt2pixfmt(mpi
->imgfmt
);
91 pic
.data
[0] = mpi
->planes
[0];
92 pic
.linesize
[0] = mpi
->stride
[0];
93 buffersize
= mpi
->w
* mpi
->h
* 8;
94 if (outbuffer_size
< buffersize
) {
96 outbuffer
= av_malloc(buffersize
);
97 outbuffer_size
= buffersize
;
99 res
= avcodec_encode_video(avctx
, outbuffer
, outbuffer_size
, &pic
);
102 mp_msg(MSGT_VO
,MSGL_WARN
, "[VO_PNG] Error in create_png.\n");
107 fwrite(outbuffer
, res
, 1, outfile
);
113 static void draw_osd(void){}
115 static void flip_page (void){}
117 static int draw_frame(uint8_t * src
[])
122 static int draw_slice( uint8_t *src
[],int stride
[],int w
,int h
,int x
,int y
)
128 query_format(uint32_t format
)
130 const int supported_flags
= VFCAP_CSP_SUPPORTED
|VFCAP_CSP_SUPPORTED_BY_HW
|VFCAP_ACCEPT_STRIDE
;
133 return use_alpha
? 0 : supported_flags
;
135 return use_alpha
? supported_flags
: 0;
140 static void uninit(void){
141 avcodec_close(avctx
);
143 av_freep(&outbuffer
);
147 static void check_events(void){}
149 static int int_zero_to_nine(void *value
)
152 return *sh
>= 0 && *sh
<= 9;
155 static const opt_t subopts
[] = {
156 {"alpha", OPT_ARG_BOOL
, &use_alpha
, NULL
},
157 {"z", OPT_ARG_INT
, &z_compression
, int_zero_to_nine
},
161 static int preinit(const char *arg
)
165 if (subopt_parse(arg
, subopts
) != 0) {
168 avcodec_register_all();
169 avctx
= avcodec_alloc_context();
170 if (avcodec_open(avctx
, avcodec_find_encoder(CODEC_ID_PNG
)) < 0) {
174 avctx
->compression_level
= z_compression
;
178 static int control(uint32_t request
, void *data
)
181 case VOCTRL_DRAW_IMAGE
:
182 return draw_image(data
);
183 case VOCTRL_QUERY_FORMAT
:
184 return query_format(*((uint32_t*)data
));