annotate libvo/vo_gif89a.c @ 25317:7f3cb5408f28

Fixed VIDIX color bug that was introduced when Radeon VIDIX driver was synchronized with vidix.sf.net. The red color was saturating. Corrected value fixes the issue and restore the color to the level it used to have before synchronization. Meaning of the value remains unknow but was retrieved from register's value of a Radeon 9000 card, so it may need further testing. Patch by Guillaume Lecerf (foxcore at gmail dot com)
author ben
date Mon, 10 Dec 2007 19:27:46 +0000
parents c9e9ac2008c2
children 2113bd9c6bd9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
1 /*
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
2 MPlayer video driver for animated gif output
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
3
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
4 (C) 2002
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
5
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
6 Written by Joey Parrish <joey@nicewarrior.org>
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
7 Based on vo_directfb2.c
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
8
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
9 This library is free software; you can redistribute it and/or
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
10 modify it under the terms of the GNU Lesser General Public
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
11 License as published by the Free Software Foundation; either
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
12 version 2 of the License, or (at your option) any later version.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
13
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
14 This library is distributed in the hope that it will be useful,
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
17 Lesser General Public License for more details.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
18
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
19 You should have received a copy of the GNU Lesser General Public
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
20 License along with this library; if not, write to the
19614
36589811e5d0 The FSF changed postal address.
diego
parents: 17970
diff changeset
21 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
36589811e5d0 The FSF changed postal address.
diego
parents: 17970
diff changeset
22 Boston, MA 02110-1301 USA.
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
23 */
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
24
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
25 /* Notes:
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
26 * when setting output framerate, frames will be ignored as needed
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
27 * to achieve the desired rate. no frames will be duplicated.
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
28 *
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
29 * output framerate can be specified as a float
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
30 * value now, instead of just an int.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
31 *
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
32 * adjustments will be made to both the frame drop cycle and the
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
33 * delay per frame to achieve the desired output framerate.
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
34 *
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
35 * time values are in centiseconds, because that's
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
36 * what the gif spec uses for it's delay values.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
37 *
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
38 * preinit looks for arguments in one of the following formats (in this order):
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
39 * fps:filename -- sets the framerate (float) and output file
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
40 * fps -- sets the framerate (float), default file out.gif
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
41 * filename -- defaults to 5 fps, sets output file
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
42 * (none) -- defaults to 5 fps, output file out.gif
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
43 *
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
44 * trying to put the filename before the framerate will result in the
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
45 * entire argument being interpretted as the filename.
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
46 */
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
47
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
48 #include <gif_lib.h>
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
49
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
50 #include <stdio.h>
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
51 #include <stdlib.h>
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
52 #include <string.h>
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
53 #include <unistd.h>
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
54
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
55 #include "config.h"
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
56 #include "subopt-helper.h"
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
57 #include "video_out.h"
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
58 #include "video_out_internal.h"
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
59 #include "mp_msg.h"
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
60
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
61 #define MPLAYER_VERSION 0.90
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
62 #define VO_GIF_REVISION 6
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
63
25216
3aee342be929 Make vo info structs const
reimar
parents: 19614
diff changeset
64 static const vo_info_t info = {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
65 "animated GIF output",
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
66 "gif89a",
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
67 "Joey Parrish joey@nicewarrior.org",
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
68 ""
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
69 };
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
70
25220
c9e9ac2008c2 Mark the vo_functions_t definitions as const where possible.
reimar
parents: 25216
diff changeset
71 const LIBVO_EXTERN(gif89a)
8148
5b39e79af5fe removed get_info, using the same sheme as in libmpcodecs instead
alex
parents: 8123
diff changeset
72
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
73
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
74 // how many frames per second we are aiming for during output.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
75 static float target_fps;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
76 // default value for output fps.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
77 static const float default_fps = 5.00;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
78 // the ideal gif delay per frame.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
79 static float ideal_delay;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
80 // the ideal time thus far.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
81 static float ideal_time;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
82 // actual time thus far.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
83 static int real_time;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
84 // nominal framedrop cycle length in frames
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
85 static float frame_cycle;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
86 // position in the framedrop cycle
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
87 static int cycle_pos;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
88 // adjustment of the framedrop cycle
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
89 static float frame_adj;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
90
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
91 // the output width and height
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
92 static uint32_t img_width;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
93 static uint32_t img_height;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
94 // image data for slice rendering
8665
8b572238f63e sig11 (in free() in uninit) fixed
arpi
parents: 8514
diff changeset
95 static uint8_t *slice_data = NULL;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
96 // reduced image data for flip_page
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
97 static uint8_t *reduce_data = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
98 // reduced color map for flip_page
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
99 static ColorMapObject *reduce_cmap = NULL;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
100
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
101 // a pointer to the gif structure
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
102 static GifFileType *new_gif = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
103 // a string to contain the filename of the output gif
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
104 static char *gif_filename = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
105 // the default output filename
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
106 #define DEFAULT_FILE "out.gif"
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
107
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
108 static opt_t subopts[] = {
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
109 {"output", OPT_ARG_MSTRZ, &gif_filename, NULL, 0},
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
110 {"fps", OPT_ARG_FLOAT, &target_fps, NULL, 0},
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
111 {NULL, 0, NULL, NULL, 0}
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
112 };
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
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 preinit(const char *arg)
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
115 {
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
116 target_fps = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
117
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
118 if (subopt_parse(arg, subopts) != 0) {
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
119 mp_msg(MSGT_VO, MSGL_FATAL,
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
120 "\n-vo gif89a command line help:\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
121 "Example: mplayer -vo gif89a:output=file.gif:fps=4.9\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
122 "\nOptions:\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
123 " output=<filename>\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
124 " Specify the output file. The default is out.gif.\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
125 " fps=<rate>\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
126 " Specify the target framerate. The default is 5.0.\n"
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
127 "\n");
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
128 return -1;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
129 }
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
130
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
131 if (target_fps > vo_fps)
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
132 target_fps = vo_fps; // i will not duplicate frames.
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
133
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
134 if (target_fps <= 0) {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
135 target_fps = default_fps;
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
136 mp_msg(MSGT_VO, MSGL_V, "GIF89a: default, %.2f fps\n", target_fps);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
137 } else {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
138 mp_msg(MSGT_VO, MSGL_V, "GIF89a: output fps forced to %.2f\n", target_fps);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
139 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
140
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
141 ideal_delay = 100 / target_fps; // in centiseconds
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
142 frame_cycle = vo_fps / target_fps;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
143 // we make one output frame every (frame_cycle) frames, on average.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
144
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
145 if (gif_filename == NULL) {
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
146 gif_filename = strdup(DEFAULT_FILE);
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
147 mp_msg(MSGT_VO, MSGL_V, "GIF89a: default, file \"%s\"\n", gif_filename);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
148 } else {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
149 mp_msg(MSGT_VO, MSGL_V, "GIF89a: file forced to \"%s\"\n", gif_filename);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
150 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
151
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
152 mp_msg(MSGT_VO, MSGL_DBG2, "GIF89a: Preinit OK\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
153 return 0;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
154 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
155
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
156 static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width,
15212
05aa13cdf92f replace VO and VF numeric flags with #defined identifiers
henry
parents: 11865
diff changeset
157 uint32_t d_height, uint32_t flags, char *title,
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
158 uint32_t format)
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
159 {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
160 #ifdef HAVE_GIF_4
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
161 // these are control blocks for the gif looping extension.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
162 char LB1[] = "NETSCAPE2.0";
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
163 char LB2[] = { 1, 0, 0 };
6078
4a9c7041141d cleanups, removed swscaler, osd support - by Joey Parrish <joey@yunamusic.com>
arpi
parents: 6053
diff changeset
164 #endif
4a9c7041141d cleanups, removed swscaler, osd support - by Joey Parrish <joey@yunamusic.com>
arpi
parents: 6053
diff changeset
165
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 16721
diff changeset
166 mp_msg(MSGT_VO, MSGL_DBG2, "GIF89a: Config entered [%dx%d]\n", s_width,s_height);
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
167 mp_msg(MSGT_VO, MSGL_DBG2, "GIF89a: With requested format: %s\n", vo_format_name(format));
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
168
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
169 // save these for later.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
170 img_width = s_width;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
171 img_height = s_height;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
172
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
173 // multiple configs without uninit are not allowed.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
174 // this is because config opens a new gif file.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
175 if (vo_config_count > 0) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
176 mp_msg(MSGT_VO, MSGL_V, "GIF89a: Reconfigure attempted.\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
177 return 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
178 }
8665
8b572238f63e sig11 (in free() in uninit) fixed
arpi
parents: 8514
diff changeset
179 // reconfigure need not be a fatal error, so return 0.
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
180 // multiple configs without uninit will result in two
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
181 // movies concatenated in one gif file. the output
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
182 // gif will have the dimensions of the first movie.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
183
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
184 if (format != IMGFMT_RGB24) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
185 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Error - given unsupported colorspace.\n");
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
186 return 1;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
187 }
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
188
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
189 // the EGifSetGifVersion line causes segfaults in certain
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
190 // earlier versions of libungif. i don't know exactly which,
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
191 // but certainly in all those before v4. if you have problems,
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
192 // you need to upgrade your gif library.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
193 #ifdef HAVE_GIF_4
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
194 EGifSetGifVersion("89a");
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
195 #else
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
196 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Your version of libungif needs to be upgraded.\n");
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
197 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Some functionality has been disabled.\n");
6078
4a9c7041141d cleanups, removed swscaler, osd support - by Joey Parrish <joey@yunamusic.com>
arpi
parents: 6053
diff changeset
198 #endif
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
199
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
200 new_gif = EGifOpenFileName(gif_filename, 0);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
201 if (new_gif == NULL) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
202 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: error opening file \"%s\" for output.\n", gif_filename);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
203 return 1;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
204 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
205
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
206 slice_data = malloc(img_width * img_height * 3);
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
207 if (slice_data == NULL) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
208 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: malloc failed.\n");
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
209 return 1;
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
210 }
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
211
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
212 reduce_data = malloc(img_width * img_height);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
213 if (reduce_data == NULL) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
214 free(slice_data); slice_data = NULL;
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
215 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: malloc failed.\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
216 return 1;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
217 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
218
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
219 reduce_cmap = MakeMapObject(256, NULL);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
220 if (reduce_cmap == NULL) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
221 free(slice_data); slice_data = NULL;
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
222 free(reduce_data); reduce_data = NULL;
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
223 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: malloc failed.\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
224 return 1;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
225 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
226
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
227 // initialize the delay and framedrop variables.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
228 ideal_time = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
229 real_time = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
230 cycle_pos = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
231 frame_adj = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
232
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
233 // set the initial width and height info.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
234 EGifPutScreenDesc(new_gif, s_width, s_height, 256, 0, reduce_cmap);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
235 #ifdef HAVE_GIF_4
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
236 // version 3 of libungif does not support multiple control blocks.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
237 // looping requires multiple control blocks.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
238 // therefore, looping is only enabled for v4 and up.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
239 EGifPutExtensionFirst(new_gif, 0xFF, 11, LB1);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
240 EGifPutExtensionLast(new_gif, 0, 3, LB2);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
241 #endif
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
242
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
243 mp_msg(MSGT_VO, MSGL_DBG2, "GIF89a: Config finished.\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
244 return 0;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
245 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
246
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
247 // we do not draw osd.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
248 void draw_osd() {}
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
249
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
250 // we do not handle events.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
251 static void check_events(void) {}
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
252
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
253 static int gif_reduce(int width, int height, uint8_t *src, uint8_t *dst, GifColorType *colors)
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
254 {
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
255 unsigned char Ra[width * height];
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
256 unsigned char Ga[width * height];
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
257 unsigned char Ba[width * height];
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
258 unsigned char *R, *G, *B;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
259 int size = 256;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
260 int i;
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
261
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
262 R = Ra; G = Ga; B = Ba;
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
263 for (i = 0; i < width * height; i++)
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
264 {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
265 *R++ = *src++;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
266 *G++ = *src++;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
267 *B++ = *src++;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
268 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
269
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
270 R = Ra; G = Ga; B = Ba;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
271 return QuantizeBuffer(width, height, &size, R, G, B, dst, colors);
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
272 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
273
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
274 static void flip_page(void)
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
275 {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
276 char CB[4]; // control block
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
277 int delay = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
278 int ret;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
279
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
280 cycle_pos++;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
281 if (cycle_pos < frame_cycle - frame_adj)
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
282 return; // we are skipping this frame
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
283
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
284 // quantize the image
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
285 ret = gif_reduce(img_width, img_height, slice_data, reduce_data, reduce_cmap->Colors);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
286 if (ret == GIF_ERROR) {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
287 mp_msg(MSGT_VO, MSGL_ERR, "GIF89a: Quantize failed.\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
288 return;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
289 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
290
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
291 // calculate frame delays and frame skipping
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
292 ideal_time += ideal_delay;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
293 delay = (int)(ideal_time - real_time);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
294 real_time += delay;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
295 frame_adj += cycle_pos;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
296 frame_adj -= frame_cycle;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
297 cycle_pos = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
298
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
299 // set up the delay control block
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
300 CB[0] = (char)(delay >> 8);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
301 CB[1] = (char)(delay & 0xff);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
302 CB[2] = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
303 CB[3] = 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
304
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
305 // put the control block with delay info
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
306 EGifPutExtension(new_gif, 0xF9, 0x04, CB);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
307 // put the image description
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
308 EGifPutImageDesc(new_gif, 0, 0, img_width, img_height, 0, reduce_cmap);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
309 // put the image itself
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
310 EGifPutLine(new_gif, reduce_data, img_width * img_height);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
311 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
312
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
313 static int draw_frame(uint8_t *src[])
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
314 {
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
315 return 1;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
316 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
317
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
318 static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y)
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
319 {
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
320 uint8_t *dst, *frm;
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
321 int i;
8665
8b572238f63e sig11 (in free() in uninit) fixed
arpi
parents: 8514
diff changeset
322 dst = slice_data + (img_width * y + x) * 3;
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
323 frm = src[0];
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
324 for (i = 0; i < h; i++) {
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
325 memcpy(dst, frm, w * 3);
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
326 dst += (img_width * 3);
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
327 frm += stride[0];
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
328 }
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
329 return 0;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
330 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
331
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
332 static int query_format(uint32_t format)
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
333 {
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
334 if (format == IMGFMT_RGB24)
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
335 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_TIMER | VFCAP_ACCEPT_STRIDE;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
336 return 0;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
337 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
338
16171
fd51fd1ff231 Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents: 15212
diff changeset
339 static int control(uint32_t request, void *data, ...)
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
340 {
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
341 if (request == VOCTRL_QUERY_FORMAT) {
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
342 return query_format(*((uint32_t*)data));
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
343 }
9540
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
344 if (request == VOCTRL_DUPLICATE_FRAME) {
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
345 flip_page();
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
346 return VO_TRUE;
ea4ca6a17d96 remove yuv2rgb and support frame duplication
joey
parents: 8665
diff changeset
347 }
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
348 return VO_NOTIMPL;
6053
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
349 }
759c5a3314a2 -vo gif - by Joey Parrish <joey@yunamusic.com>
arpi
parents:
diff changeset
350
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
351 static void uninit(void)
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
352 {
16721
bd815e9973f2 use subopt parser for arguments.
joey
parents: 16280
diff changeset
353 mp_msg(MSGT_VO, MSGL_DBG2, "GIF89a: Uninit entered\n");
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
354
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
355 if (new_gif != NULL) {
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
356 char temp[256];
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
357 // comment the gif and close it
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
358 snprintf(temp, 256, "MPlayer gif output v%2.2f-%d (c) %s\r\n",
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
359 MPLAYER_VERSION, VO_GIF_REVISION,
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
360 "joey@nicewarrior.org");
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
361 EGifPutComment(new_gif, temp);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
362 EGifCloseFile(new_gif); // also frees gif storage space.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
363 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
364
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
365 // free our allocated ram
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
366 if (gif_filename != NULL) free(gif_filename);
8665
8b572238f63e sig11 (in free() in uninit) fixed
arpi
parents: 8514
diff changeset
367 if (slice_data != NULL) free(slice_data);
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
368 if (reduce_data != NULL) free(reduce_data);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
369 if (reduce_cmap != NULL) FreeMapObject(reduce_cmap);
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
370
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
371 // set the pointers back to null.
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
372 new_gif = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
373 gif_filename = NULL;
8665
8b572238f63e sig11 (in free() in uninit) fixed
arpi
parents: 8514
diff changeset
374 slice_data = NULL;
8514
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
375 reduce_data = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
376 reduce_cmap = NULL;
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
377 }
a1ff87c254ff I have rewritten the gif89a vo in order to solve some problems I had
arpi
parents: 8148
diff changeset
378