Remove legacy parameter from add_string()
[vlc/asuraparaju-public.git] / modules / video_output / yuv.c
blob0aa866578f3ef0d9bcf1d31e78ac445656e4aa09
1 /*****************************************************************************
2 * yuv.c : yuv video output
3 *****************************************************************************
4 * Copyright (C) 2008, M2X BV
5 * $Id$
7 * Authors: Jean-Paul Saman <jpsaman@videolan.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
25 * Preamble
26 *****************************************************************************/
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
32 #include <vlc_common.h>
33 #include <vlc_plugin.h>
34 #include <vlc_vout_display.h>
35 #include <vlc_picture_pool.h>
36 #include <vlc_fs.h>
38 /*****************************************************************************
39 * Module descriptor
40 *****************************************************************************/
41 #define YUV_FILE_TEXT N_("device, fifo or filename")
42 #define YUV_FILE_LONGTEXT N_("device, fifo or filename to write yuv frames too.")
44 #define CHROMA_TEXT N_("Chroma used")
45 #define CHROMA_LONGTEXT N_(\
46 "Force use of a specific chroma for output. Default is I420.")
48 #define YUV4MPEG2_TEXT N_("YUV4MPEG2 header (default disabled)")
49 #define YUV4MPEG2_LONGTEXT N_("The YUV4MPEG2 header is compatible " \
50 "with mplayer yuv video ouput and requires YV12/I420 fourcc. By default "\
51 "vlc writes the fourcc of the picture frame into the output destination.")
53 #define CFG_PREFIX "yuv-"
55 static int Open (vlc_object_t *);
56 static void Close(vlc_object_t *);
58 vlc_module_begin()
59 set_shortname(N_("YUV output"))
60 set_description(N_("YUV video output"))
61 set_category(CAT_VIDEO)
62 set_subcategory(SUBCAT_VIDEO_VOUT)
63 set_capability("vout display", 0)
65 add_string(CFG_PREFIX "file", "stream.yuv",
66 YUV_FILE_TEXT, YUV_FILE_LONGTEXT, false)
67 add_string(CFG_PREFIX "chroma", NULL,
68 CHROMA_TEXT, CHROMA_LONGTEXT, true)
69 add_bool (CFG_PREFIX "yuv4mpeg2", false, NULL,
70 YUV4MPEG2_TEXT, YUV4MPEG2_LONGTEXT, true)
72 set_callbacks(Open, Close)
73 vlc_module_end()
75 /*****************************************************************************
76 * Local prototypes
77 *****************************************************************************/
78 static const char *const ppsz_vout_options[] = {
79 "file", "chroma", "yuv4mpeg2", NULL
82 /* */
83 static picture_pool_t *Pool (vout_display_t *, unsigned);
84 static void Display(vout_display_t *, picture_t *);
85 static int Control(vout_display_t *, int, va_list);
86 static void Manage (vout_display_t *);
88 /*****************************************************************************
89 * vout_display_sys_t: video output descriptor
90 *****************************************************************************/
91 struct vout_display_sys_t {
92 FILE *f;
93 bool is_first;
94 bool is_yuv4mpeg2;
96 picture_pool_t *pool;
99 /* */
100 static int Open(vlc_object_t *object)
102 vout_display_t *vd = (vout_display_t *)object;
103 vout_display_sys_t *sys;
105 /* Allocate instance and initialize some members */
106 vd->sys = sys = malloc(sizeof(*sys));
107 if (!sys)
108 return VLC_ENOMEM;
110 sys->is_first = false;
111 sys->is_yuv4mpeg2 = var_InheritBool(vd, CFG_PREFIX "yuv4mpeg2");
112 sys->pool = NULL;
114 /* */
115 char *psz_fcc = var_InheritString(vd, CFG_PREFIX "chroma");
116 const vlc_fourcc_t requested_chroma = vlc_fourcc_GetCodecFromString(VIDEO_ES,
117 psz_fcc);
118 free(psz_fcc);
120 const vlc_fourcc_t chroma = requested_chroma ? requested_chroma :
121 VLC_CODEC_I420;
122 if (sys->is_yuv4mpeg2) {
123 switch (chroma) {
124 case VLC_CODEC_YV12:
125 case VLC_CODEC_I420:
126 case VLC_CODEC_J420:
127 break;
128 default:
129 msg_Err(vd, "YUV4MPEG2 mode needs chroma YV12 not %4.4s as requested",
130 (char *)&chroma);
131 free(sys);
132 return VLC_EGENERIC;
135 msg_Dbg(vd, "Using chroma %4.4s", (char *)&chroma);
137 /* */
138 char *name = var_InheritString(vd, CFG_PREFIX "file");
139 if (!name) {
140 msg_Err(vd, "Empty file name");
141 free(sys);
142 return VLC_EGENERIC;
144 sys->f = vlc_fopen(name, "wb");
146 if (!sys->f) {
147 msg_Err(vd, "Failed to open %s", name);
148 free(name);
149 free(sys);
150 return VLC_EGENERIC;
152 msg_Dbg(vd, "Writing data to %s", name);
153 free(name);
155 /* */
156 video_format_t fmt = vd->fmt;
157 fmt.i_chroma = chroma;
158 video_format_FixRgb(&fmt);
160 /* */
161 vout_display_info_t info = vd->info;
162 info.has_hide_mouse = true;
164 /* */
165 vd->fmt = fmt;
166 vd->info = info;
167 vd->pool = Pool;
168 vd->prepare = NULL;
169 vd->display = Display;
170 vd->control = Control;
171 vd->manage = Manage;
173 vout_display_SendEventFullscreen(vd, false);
174 return VLC_SUCCESS;
177 /* */
178 static void Close(vlc_object_t *object)
180 vout_display_t *vd = (vout_display_t *)object;
181 vout_display_sys_t *sys = vd->sys;
183 if (sys->pool)
184 picture_pool_Delete(sys->pool);
185 fclose(sys->f);
186 free(sys);
189 /*****************************************************************************
191 *****************************************************************************/
192 static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
194 vout_display_sys_t *sys = vd->sys;
195 if (!sys->pool)
196 sys->pool = picture_pool_NewFromFormat(&vd->fmt, count);
197 return sys->pool;
200 static void Display(vout_display_t *vd, picture_t *picture)
202 vout_display_sys_t *sys = vd->sys;
204 /* */
205 video_format_t fmt = vd->fmt;
206 fmt.i_sar_num = vd->source.i_sar_num;
207 fmt.i_sar_den = vd->source.i_sar_den;
209 /* */
210 char type;
211 if (picture->b_progressive)
212 type = 'p';
213 else if (picture->b_top_field_first)
214 type = 't';
215 else
216 type = 'b';
218 if (type != 'p') {
219 msg_Warn(vd, "Received a non progressive frame, "
220 "it will be written as progressive.");
221 type = 'p';
224 /* */
225 if (!sys->is_first) {
226 const char *header;
227 char buffer[5];
228 if (sys->is_yuv4mpeg2) {
229 /* MPlayer compatible header, unfortunately it doesn't tell you
230 * the exact fourcc used. */
231 header = "YUV4MPEG2";
232 } else {
233 snprintf(buffer, sizeof(buffer), "%4.4s",
234 (const char*)&fmt.i_chroma);
235 header = buffer;
238 fprintf(sys->f, "%s W%d H%d F%d:%d I%c A%d:%d\n",
239 header,
240 fmt.i_visible_width, fmt.i_visible_height,
241 fmt.i_frame_rate, fmt.i_frame_rate_base,
242 type,
243 fmt.i_sar_num, fmt.i_sar_den);
244 sys->is_first = true;
247 /* */
248 fprintf(sys->f, "FRAME\n");
249 for (int i = 0; i < picture->i_planes; i++) {
250 const plane_t *plane = &picture->p[i];
251 for( int y = 0; y < plane->i_visible_lines; y++) {
252 const size_t written = fwrite(&plane->p_pixels[y*plane->i_pitch],
253 1, plane->i_visible_pitch, sys->f);
254 if (written != (size_t)plane->i_visible_pitch)
255 msg_Warn(vd, "only %zd of %d bytes written",
256 written, plane->i_visible_pitch);
259 fflush(sys->f);
261 /* */
262 picture_Release(picture);
265 static int Control(vout_display_t *vd, int query, va_list args)
267 VLC_UNUSED(vd);
268 switch (query) {
269 case VOUT_DISPLAY_CHANGE_FULLSCREEN: {
270 const vout_display_cfg_t *cfg = va_arg(args, const vout_display_cfg_t *);
271 if (cfg->is_fullscreen)
272 return VLC_EGENERIC;
273 return VLC_SUCCESS;
275 default:
276 return VLC_EGENERIC;
279 static void Manage (vout_display_t *vd)
281 VLC_UNUSED(vd);