Mercurial > mplayer.hg
annotate libvo/vo_cvidix.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | 7681eab10aea |
children | 0f1b5b68af32 |
rev | line source |
---|---|
10979 | 1 /* |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
2 * VIDIX-accelerated overlay on (black) background |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
3 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
4 * should work on any OS |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
5 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
6 * copyright (C) 2003 Sascha Sommer |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
7 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
8 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
9 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
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:
27768
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
13 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
14 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
18 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
19 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
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:
27768
diff
changeset
|
21 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
27768
diff
changeset
|
23 */ |
10979 | 24 |
25 #include <stdio.h> | |
26 #include <stdlib.h> | |
27 #include <string.h> | |
28 #include <math.h> | |
29 #include <errno.h> | |
30 | |
31 #include "config.h" | |
32 #include "video_out.h" | |
33 #include "video_out_internal.h" | |
11232 | 34 #include "aspect.h" |
35 #include "geometry.h" | |
10979 | 36 |
37 #include "mp_msg.h" | |
38 | |
39 #include "vosub_vidix.h" | |
27079 | 40 #include "vidix/vidix.h" |
10979 | 41 |
42 | |
25216 | 43 static const vo_info_t info = { |
12783 | 44 "console VIDIX", |
11017 | 45 "cvidix", |
10979 | 46 "Sascha Sommer", |
47 "" | |
48 }; | |
49 | |
11017 | 50 LIBVO_EXTERN(cvidix) |
10979 | 51 |
52 #define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */ | |
53 | |
54 /* VIDIX related */ | |
55 static char *vidix_name; | |
11232 | 56 static uint32_t swidth,sheight,sformat; |
13360 | 57 /// center video only when screenw & height are set |
58 static uint32_t center=0; | |
10979 | 59 static vidix_grkey_t gr_key; |
11232 | 60 |
61 | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16388
diff
changeset
|
62 static uint32_t setup_vidix(void){ |
11232 | 63 int x=vo_dx,y=vo_dy; |
64 aspect(&vo_dwidth,&vo_dheight,vo_fs ? A_ZOOM : A_NOZOOM); | |
13360 | 65 if(vo_fs || center){ |
11232 | 66 if(vo_dwidth <= vo_screenwidth)x = (vo_screenwidth - vo_dwidth)/2; |
67 else x=0; | |
68 if(vo_dheight <= vo_screenheight)y = (vo_screenheight - vo_dheight)/2; | |
69 else y=0; | |
70 } | |
71 if(vo_config_count)vidix_stop(); | |
72 if(vidix_init(swidth, sheight, x, y, vo_dwidth, vo_dheight, sformat, 32, vo_screenwidth,vo_screenheight)){ | |
73 mp_msg(MSGT_VO, MSGL_FATAL, "Can't setup VIDIX driver: %s\n", strerror(errno)); | |
74 return 1; | |
75 } | |
10979 | 76 vidix_start(); |
77 if(vidix_grkey_support()){ | |
78 vidix_grkey_get(&gr_key); | |
79 gr_key.key_op = KEYS_PUT; | |
11232 | 80 if (!vo_fs && !(vo_colorkey & 0xff000000)){ |
81 gr_key.ckey.op = CKEY_TRUE; | |
82 gr_key.ckey.red = (vo_colorkey & 0x00FF0000) >> 16; | |
83 gr_key.ckey.green = (vo_colorkey & 0x0000FF00) >> 8; | |
84 gr_key.ckey.blue = vo_colorkey & 0x000000FF; | |
11158
85f4534d1edb
Colorkeying can be disabled. Fbdev, svga and vesa vidix colorkeying support
alex
parents:
11019
diff
changeset
|
85 } |
11232 | 86 else gr_key.ckey.op = CKEY_FALSE; |
10979 | 87 vidix_grkey_set(&gr_key); |
11232 | 88 } |
10979 | 89 return 0; |
90 } | |
91 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
92 static int config(uint32_t width, uint32_t height, uint32_t d_width,uint32_t d_height, uint32_t flags, char *title, uint32_t format){ |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14041
diff
changeset
|
93 vo_fs = flags & VOFLAG_FULLSCREEN; |
13360 | 94 if(!vo_config_count){ |
14041
928b03a98062
10l initial patch by Oded Shimon <ods15 at ods15.dyndns.org>
faust3
parents:
13787
diff
changeset
|
95 if(vo_screenwidth && vo_screenheight){ |
928b03a98062
10l initial patch by Oded Shimon <ods15 at ods15.dyndns.org>
faust3
parents:
13787
diff
changeset
|
96 if(!vo_geometry)center=1; |
928b03a98062
10l initial patch by Oded Shimon <ods15 at ods15.dyndns.org>
faust3
parents:
13787
diff
changeset
|
97 } |
13360 | 98 } |
27768
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
99 if(!vo_screenwidth){ |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
100 mp_msg(MSGT_VO, MSGL_WARN, "vo_cvidix: Screen width not set (see -screenw), assuming 640 pixels.\n"); |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
101 vo_screenwidth = 640; |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
102 } |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
103 if(!vo_screenheight){ |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
104 mp_msg(MSGT_VO, MSGL_WARN, "vo_cvidix: Screen height not set (see -screenh), assuming 480 pixels.\n"); |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
105 vo_screenheight = 480; |
ffd1bd7043e6
Improve error message when screen width and height are not set.
diego
parents:
27079
diff
changeset
|
106 } |
11232 | 107 swidth = width; |
108 sheight = height; | |
109 sformat = format; | |
110 vo_dwidth=d_width; | |
111 vo_dheight=d_height; | |
112 aspect_save_orig(width,height); | |
113 aspect_save_prescale(d_width,d_height); | |
114 aspect_save_screenres(vo_screenwidth,vo_screenheight); | |
115 if(!vo_geometry){ | |
116 vo_dx=0; | |
117 vo_dy=0; | |
118 } | |
119 else geometry(&vo_dx, &vo_dy, &vo_dwidth, &vo_dheight,vo_screenwidth,vo_screenheight); | |
120 return setup_vidix(); | |
121 } | |
122 | |
10979 | 123 static void check_events(void){ |
124 } | |
125 | |
126 /* draw_osd, flip_page, draw_slice, draw_frame should be | |
127 overwritten with vidix functions (vosub_vidix.c) */ | |
128 static void draw_osd(void){ | |
11019 | 129 mp_msg(MSGT_VO, MSGL_FATAL, "vo_cvidix: error: didn't use vidix draw_osd!\n"); |
10979 | 130 return; |
131 } | |
132 | |
133 static void flip_page(void){ | |
11019 | 134 mp_msg(MSGT_VO, MSGL_FATAL, "vo_cvidix: error: didn't use vidix flip_page!\n"); |
10979 | 135 return; |
136 } | |
137 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
138 static int draw_slice(uint8_t *src[], int stride[],int w, int h, int x, int y){ |
10979 | 139 UNUSED(src); |
140 UNUSED(stride); | |
141 UNUSED(w); | |
142 UNUSED(h); | |
143 UNUSED(x); | |
144 UNUSED(y); | |
11019 | 145 mp_msg(MSGT_VO, MSGL_FATAL, "vo_cvidix: error: didn't use vidix draw_slice!\n"); |
10979 | 146 return -1; |
147 } | |
148 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
149 static int draw_frame(uint8_t *src[]){ |
10979 | 150 UNUSED(src); |
11019 | 151 mp_msg(MSGT_VO, MSGL_FATAL, "vo_cvidix: error: didn't use vidix draw_frame!\n"); |
10979 | 152 return -1; |
153 } | |
154 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
155 static int query_format(uint32_t format){ |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25216
diff
changeset
|
156 return vidix_query_fourcc(format); |
10979 | 157 } |
158 | |
159 static void uninit(void){ | |
160 if(!vo_config_count) return; | |
161 vidix_term(); | |
162 if(vidix_name){ | |
163 free(vidix_name); | |
164 vidix_name = NULL; | |
165 } | |
166 } | |
167 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
168 static int preinit(const char *arg){ |
10979 | 169 if(arg)vidix_name = strdup(arg); |
170 else { | |
11462 | 171 mp_msg(MSGT_VO, MSGL_INFO, "vo_cvidix: No vidix driver name provided, probing available ones (-v option for details)!\n"); |
10979 | 172 vidix_name = NULL; |
173 } | |
11019 | 174 if(vidix_preinit(vidix_name, &video_out_cvidix))return 1; |
10979 | 175 return 0; |
176 } | |
177 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15212
diff
changeset
|
178 static int control(uint32_t request, void *data, ...){ |
10979 | 179 switch (request) { |
180 case VOCTRL_QUERY_FORMAT: | |
181 return query_format(*((uint32_t*)data)); | |
11232 | 182 case VOCTRL_FULLSCREEN: |
183 if(vo_fs)vo_fs=0; | |
184 else vo_fs=1; | |
185 setup_vidix(); | |
186 return VO_TRUE; | |
16388 | 187 case VOCTRL_SET_EQUALIZER: |
188 { | |
189 va_list ap; | |
190 int value; | |
191 va_start(ap, data); | |
192 value = va_arg(ap, int); | |
193 va_end(ap); | |
20110 | 194 return vidix_control(request, data, value); |
16388 | 195 } |
196 case VOCTRL_GET_EQUALIZER: | |
197 { | |
198 va_list ap; | |
199 int *value; | |
200 va_start(ap, data); | |
201 value = va_arg(ap, int *); | |
202 va_end(ap); | |
203 return vidix_control(request, data, value); | |
204 } | |
11232 | 205 } |
10979 | 206 return vidix_control(request, data); |
207 } |