annotate libvo/vo_png.c @ 28835:6f5824a39ada

Make pausing_keep_force the default for the set_mouse_pos and key_down_event - different behaviour is unlikely to make sense but it is better to handle this in input.c instead of adding special cases to mplayer.c and being able to override the default behaviour at least should not hurt.
author reimar
date Sat, 07 Mar 2009 13:25:55 +0000
parents 56eee6ffba9b
children 9dd905e52639
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28446
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
1 /*
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
2 * Portable Network Graphics renderer
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
3 *
530
670d47b4ce10 changed copyroght message to correct stuff :)
atmosfear
parents: 527
diff changeset
4 * Copyright 2001 by Felix Buenemann <atmosfear@users.sourceforge.net>
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
5 *
530
670d47b4ce10 changed copyroght message to correct stuff :)
atmosfear
parents: 527
diff changeset
6 * Uses libpng (which uses zlib), so see according licenses.
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
7 *
28446
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
8 * This file is part of MPlayer.
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
9 *
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
10 * MPlayer is free software; you can redistribute it and/or modify
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
11 * it under the terms of the GNU General Public License as published by
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
13 * (at your option) any later version.
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
14 *
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
15 * MPlayer is distributed in the hope that it will be useful,
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
18 * GNU General Public License for more details.
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
19 *
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
20 * You should have received a copy of the GNU General Public License along
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
21 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
7681eab10aea Add standard license headers, unify header formatting.
diego
parents: 28092
diff changeset
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
23 */
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
24
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
25 #include <stdio.h>
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
26 #include <stdlib.h>
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
27 #include <string.h>
612
77e0094f0cce some warnings killed
szabii
parents: 530
diff changeset
28 #include <errno.h>
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
29 #include <sys/stat.h>
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
30 #include <sys/types.h>
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
31 #include <unistd.h>
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
32
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
33 #include <png.h>
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
34
26203
0d255d03016f #include config.h before all other headers.
diego
parents: 25220
diff changeset
35 #include "config.h"
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16171
diff changeset
36 #include "mp_msg.h"
18234
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
37 #include "mp_msg.h"
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
38 #include "help_mp.h"
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
39 #include "video_out.h"
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
40 #include "video_out_internal.h"
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
41 #include "subopt-helper.h"
27655
710704af0926 Add missing #include for mplayer.h, fixes the warning:
diego
parents: 27618
diff changeset
42 #include "mplayer.h"
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
43
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
44 #define BUFLENGTH 512
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
45
25216
3aee342be929 Make vo info structs const
reimar
parents: 24671
diff changeset
46 static const vo_info_t info =
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
47 {
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
48 "PNG file",
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
49 "png",
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
50 "Felix Buenemann <atmosfear@users.sourceforge.net>",
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
51 ""
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
52 };
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
53
25220
c9e9ac2008c2 Mark the vo_functions_t definitions as const where possible.
reimar
parents: 25216
diff changeset
54 const LIBVO_EXTERN (png)
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 7926
diff changeset
55
24669
ec55ecbbd702 Make a local-only variable static in vo_png
reimar
parents: 18950
diff changeset
56 static int z_compression = Z_NO_COMPRESSION;
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
57 static char *png_outdir = NULL;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
58 static int framenum = 0;
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
59 static int use_alpha;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
60
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
61 struct pngdata {
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
62 FILE * fp;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
63 png_structp png_ptr;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
64 png_infop info_ptr;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
65 enum {OK,ERROR} status;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
66 };
3950
e92653caf5d7 osd support, zlib range fix. by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents: 2732
diff changeset
67
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
68 static void png_mkdir(char *buf, int verbose) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
69 struct stat stat_p;
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
70
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
71 #ifndef __MINGW32__
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
72 if ( mkdir(buf, 0755) < 0 ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
73 #else
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
74 if ( mkdir(buf) < 0 ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
75 #endif
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
76 switch (errno) { /* use switch in case other errors need to be caught
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
77 and handled in the future */
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
78 case EEXIST:
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
79 if ( stat(buf, &stat_p ) < 0 ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
80 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
81 MSGTR_VO_GenericError, strerror(errno) );
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
82 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
83 MSGTR_VO_UnableToAccess,buf);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
84 exit_player(MSGTR_Exit_error);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
85 }
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
86 if ( !S_ISDIR(stat_p.st_mode) ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
87 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
88 buf, MSGTR_VO_ExistsButNoDirectory);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
89 exit_player(MSGTR_Exit_error);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
90 }
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
91 if ( !(stat_p.st_mode & S_IWUSR) ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
92 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s - %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
93 buf, MSGTR_VO_DirExistsButNotWritable);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
94 exit_player(MSGTR_Exit_error);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
95 }
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
96
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
97 mp_msg(MSGT_VO, MSGL_INFO, "%s: %s - %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
98 buf, MSGTR_VO_DirExistsAndIsWritable);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
99 break;
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
100
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
101 default:
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
102 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
103 MSGTR_VO_GenericError, strerror(errno) );
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
104 mp_msg(MSGT_VO, MSGL_ERR, "%s: %s - %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
105 buf, MSGTR_VO_CantCreateDirectory);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
106 exit_player(MSGTR_Exit_error);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
107 } /* end switch */
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
108 } else if ( verbose ) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
109 mp_msg(MSGT_VO, MSGL_INFO, "%s: %s - %s\n", info.short_name,
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
110 buf, MSGTR_VO_DirectoryCreateSuccess);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
111 } /* end if */
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
112 }
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
113
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
114 static int
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 14451
diff changeset
115 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
116 {
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
117 char buf[BUFLENGTH];
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
118
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
119 if(z_compression == 0) {
18234
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
120 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_PNG_Warning1);
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
121 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_PNG_Warning2);
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
122 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_PNG_Warning3);
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
123 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
124
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
125 snprintf(buf, BUFLENGTH, "%s", png_outdir);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
126 png_mkdir(buf, 1);
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
127 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Compression level %i\n", z_compression);
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
128
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
129 return 0;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
130 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
131
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
132
18950
a943bc3f26c8 Make some functions static.
uau
parents: 18234
diff changeset
133 static struct pngdata create_png (char * fname, int image_width, int image_height, int swapped)
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
134 {
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
135 struct pngdata png;
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
136
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
137 /*png_structp png_ptr = png_create_write_struct
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
138 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
139 user_error_fn, user_warning_fn);*/
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
140 //png_byte *row_pointers[image_height];
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
141 png.png_ptr = png_create_write_struct
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
142 (PNG_LIBPNG_VER_STRING, NULL,
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
143 NULL, NULL);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
144 png.info_ptr = png_create_info_struct(png.png_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
145
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
146 if (!png.png_ptr) {
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
147 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Failed to init png pointer\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
148 png.status = ERROR;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
149 return png;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
150 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
151
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
152 if (!png.info_ptr) {
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
153 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Failed to init png infopointer\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
154 png_destroy_write_struct(&png.png_ptr,
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
155 (png_infopp)NULL);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
156 png.status = ERROR;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
157 return png;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
158 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
159
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
160 if (setjmp(png.png_ptr->jmpbuf)) {
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
161 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Internal error!\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
162 png_destroy_write_struct(&png.png_ptr, &png.info_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
163 fclose(png.fp);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
164 png.status = ERROR;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
165 return png;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
166 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
167
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
168 png.fp = fopen (fname, "wb");
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
169 if (png.fp == NULL) {
18234
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
170 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_PNG_ErrorOpeningForWriting, strerror(errno));
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
171 png.status = ERROR;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
172 return png;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
173 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
174
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
175 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Init IO\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
176 png_init_io(png.png_ptr, png.fp);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
177
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
178 /* set the zlib compression level */
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
179 png_set_compression_level(png.png_ptr, z_compression);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
180
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
181
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
182 /*png_set_IHDR(png_ptr, info_ptr, width, height,
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
183 bit_depth, color_type, interlace_type,
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
184 compression_type, filter_type)*/
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
185 png_set_IHDR(png.png_ptr, png.info_ptr, image_width, image_height,
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
186 8, use_alpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
187 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
188
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
189 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Write Info\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
190 png_write_info(png.png_ptr, png.info_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
191
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
192 if(swapped) {
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
193 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Set BGR Conversion\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
194 png_set_bgr(png.png_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
195 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
196
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
197 png.status = OK;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
198 return png;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
199 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
200
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
201 static uint8_t destroy_png(struct pngdata png) {
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
202
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
203 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Write End\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
204 png_write_end(png.png_ptr, png.info_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
205
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
206 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Destroy Write Struct\n");
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
207 png_destroy_write_struct(&png.png_ptr, &png.info_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
208
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
209 fclose (png.fp);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
210
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
211 return 0;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
212 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
213
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
214 static uint32_t draw_image(mp_image_t* mpi){
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
215 char buf[100];
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
216 int k;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
217 struct pngdata png;
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
218 png_byte *row_pointers[mpi->h];
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
219
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
220 // if -dr or -slices then do nothing:
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
221 if(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK)) return VO_TRUE;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
222
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
223 snprintf (buf, 100, "%s/%08d.png", png_outdir, ++framenum);
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
224
24670
a2599160737c Use IMGFMT_IS_BGR instead of mpi->flags&MP_IMGFLAG_SWAPPED, this is easier
reimar
parents: 24669
diff changeset
225 png = create_png(buf, mpi->w, mpi->h, IMGFMT_IS_BGR(mpi->imgfmt));
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
226
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
227 if(png.status){
18234
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
228 mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_PNG_ErrorInCreatePng);
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
229 return 1;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
230 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
231
24671
fbcd9dcb0daf Get rid of mp_msg_test in vo_png, only reason to use it is performance and
reimar
parents: 24670
diff changeset
232 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Creating Row Pointers\n");
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
233 for ( k = 0; k < mpi->h; k++ )
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
234 row_pointers[k] = mpi->planes[0]+mpi->stride[0]*k;
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
235
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
236 //png_write_flush(png.png_ptr);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
237 //png_set_flush(png.png_ptr, nrows);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
238
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 16171
diff changeset
239 if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) {
18234
a107276371a8 Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents: 17932
diff changeset
240 mp_msg(MSGT_VO,MSGL_DBG2, "PNG Writing Image Data\n"); }
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
241 png_write_image(png.png_ptr, row_pointers);
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
242
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
243 destroy_png(png);
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
244
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
245 return VO_TRUE;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
246 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
247
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
248 static void draw_osd(void){}
1501
d40f2b686846 changes according to -utf8 option, draw_osd() function added
atlka
parents: 1078
diff changeset
249
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
250 static void flip_page (void){}
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
251
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
252 static int draw_frame(uint8_t * src[])
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
253 {
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
254 return -1;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
255 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
256
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
257 static int draw_slice( uint8_t *src[],int stride[],int w,int h,int x,int y )
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
258 {
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
259 return -1;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
260 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
261
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
262 static int
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
263 query_format(uint32_t format)
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
264 {
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
265 const int supported_flags = VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_ACCEPT_STRIDE;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
266 switch(format){
27873
80a16d26acda Use the proper IMGFMT_RGB24 and IMGFMT_BGR24 defines instead of
reimar
parents: 27655
diff changeset
267 case IMGFMT_RGB24:
80a16d26acda Use the proper IMGFMT_RGB24 and IMGFMT_BGR24 defines instead of
reimar
parents: 27655
diff changeset
268 case IMGFMT_BGR24:
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
269 return use_alpha ? 0 : supported_flags;
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
270 case IMGFMT_RGBA:
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
271 case IMGFMT_BGRA:
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
272 return use_alpha ? supported_flags : 0;
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
273 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
274 return 0;
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
275 }
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
276
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
277 static void uninit(void){
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
278 if (png_outdir) {
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
279 free(png_outdir);
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
280 png_outdir = NULL;
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
281 }
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
282 }
527
a38decaa04ec png video out renderer initial release
atmosfear
parents:
diff changeset
283
7926
7d2542838d24 - removed YV12 support (builtin yv12->rgb conversion)
arpi
parents: 7694
diff changeset
284 static void check_events(void){}
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
285
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
286 static int int_zero_to_nine(int *sh)
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
287 {
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
288 if ( (*sh < 0) || (*sh > 9) )
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
289 return 0;
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
290 return 1;
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
291 }
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
292
28828
56eee6ffba9b Make data related to suboption parsing const in libvo
reimar
parents: 28446
diff changeset
293 static const opt_t subopts[] = {
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
294 {"alpha", OPT_ARG_BOOL, &use_alpha, NULL, 0},
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
295 {"z", OPT_ARG_INT, &z_compression, (opt_test_f)int_zero_to_nine},
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
296 {"outdir", OPT_ARG_MSTRZ, &png_outdir, NULL, 0},
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
297 {NULL}
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
298 };
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
299
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
300 static int preinit(const char *arg)
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
301 {
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
302 z_compression = 0;
27618
9badbf52f33c add outdir sub-option to vo png
ben
parents: 26203
diff changeset
303 png_outdir = strdup(".");
28092
77c7b422a49d Add support for writing PNG files with alpha channel in -vo png
reimar
parents: 27873
diff changeset
304 use_alpha = 0;
14451
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
305 if (subopt_parse(arg, subopts) != 0) {
4a6f25e88dbb Implementation of vo_png suboption parser with subopt-helper and removal
ivo
parents: 12857
diff changeset
306 return -1;
4737
32e1f5042f65 I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents: 4596
diff changeset
307 }
32e1f5042f65 I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents: 4596
diff changeset
308 return 0;
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
309 }
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
310
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
311 static int control(uint32_t request, void *data, ...)
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
312 {
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
313 switch (request) {
7693
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
314 case VOCTRL_DRAW_IMAGE:
3f218f3172f3 draw_image()
arpi
parents: 7472
diff changeset
315 return draw_image(data);
4592
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
316 case VOCTRL_QUERY_FORMAT:
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
317 return query_format(*((uint32_t*)data));
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
318 }
5fbfd8545c3b query_ stuff replaced by new control() - patch by David Holm
arpi
parents: 4433
diff changeset
319 return VO_NOTIMPL;
4352
ed5b85b713a3 Extensions for video accelerated architecture
nick
parents: 4060
diff changeset
320 }