Mercurial > mplayer.hg
annotate libvo/vo_corevideo.m @ 35890:3be8afb83629
Switch back to glClearDepth.
glClearDepthf seems to be missing a least on Windows.
author | reimar |
---|---|
date | Sat, 16 Mar 2013 19:19:40 +0000 |
parents | 4683218a0324 |
children | 598767b14852 |
rev | line source |
---|---|
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
1 /* |
29210 | 2 * CoreVideo video output driver |
28836 | 3 * Copyright (c) 2005 Nicolas Plourde <nicolasplourde@gmail.com> |
4 * | |
28446
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
5 * This file is part of MPlayer. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
6 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
10 * (at your option) any later version. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
11 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
15 * GNU General Public License for more details. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
16 * |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
20 */ |
7681eab10aea
Add standard license headers, unify header formatting.
diego
parents:
28306
diff
changeset
|
21 |
29210 | 22 #import "vo_corevideo.h" |
16385 | 23 #include <sys/types.h> |
24 #include <sys/ipc.h> | |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
25 #include <sys/mman.h> |
28077 | 26 #include <unistd.h> |
27988 | 27 #include <CoreServices/CoreServices.h> |
28 //special workaround for Apple bug #6267445 | |
29 //(OSServices Power API disabled in OSServices.h for 64bit systems) | |
30 #ifndef __POWER__ | |
31 #include <CoreServices/../Frameworks/OSServices.framework/Headers/Power.h> | |
32 #endif | |
15289 | 33 |
34 //MPLAYER | |
35 #include "config.h" | |
36 #include "fastmemcpy.h" | |
37 #include "video_out.h" | |
38 #include "video_out_internal.h" | |
39 #include "aspect.h" | |
40 #include "mp_msg.h" | |
41 #include "m_option.h" | |
28075
ca9badc94740
#include appropriate headers instead of locally declaring function prototypes.
diego
parents:
28051
diff
changeset
|
42 #include "mp_fifo.h" |
32471 | 43 #include "sub/sub.h" |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
44 #include "subopt-helper.h" |
15289 | 45 |
46 #include "input/input.h" | |
47 #include "input/mouse.h" | |
48 | |
49 #include "osdep/keycodes.h" | |
29533
9c8f8e375823
Reuse the osx_common convert_key function to convert OSX keycodes to MPlayer
reimar
parents:
29272
diff
changeset
|
50 #include "osx_common.h" |
15289 | 51 |
52 //Cocoa | |
35065 | 53 static NSDistantObject *mplayerosxProxy; |
54 static id <MPlayerOSXVOProto> mplayerosxProto; | |
55 static MPlayerOpenGLView *mpGLView; | |
56 static NSAutoreleasePool *autoreleasepool; | |
57 static OSType pixelFormat; | |
15289 | 58 |
16385 | 59 //shared memory |
35065 | 60 static BOOL shared_buffer = false; |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
61 #define DEFAULT_BUFFER_NAME "mplayerosx" |
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
62 static char *buffer_name; |
16385 | 63 |
15728 | 64 //Screen |
35065 | 65 static int screen_id = -1; |
15289 | 66 |
67 //image | |
35065 | 68 static unsigned char *image_data; |
25180 | 69 // For double buffering |
70 static uint8_t image_page = 0; | |
71 static unsigned char *image_datas[2]; | |
72 | |
15289 | 73 static uint32_t image_width; |
74 static uint32_t image_height; | |
75 static uint32_t image_bytes; | |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
76 static uint32_t image_stride; |
15289 | 77 static uint32_t image_format; |
78 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
79 static vo_info_t info = |
15289 | 80 { |
28837 | 81 "Mac OS X Core Video", |
29210 | 82 "corevideo", |
15289 | 83 "Nicolas Plourde <nicolas.plourde@gmail.com>", |
84 "" | |
85 }; | |
86 | |
29210 | 87 LIBVO_EXTERN(corevideo) |
15289 | 88 |
89 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride) | |
90 { | |
34876
c5f89bf5b952
corevideo: Reduce code duplication in OSD rendering code.
reimar
parents:
34875
diff
changeset
|
91 unsigned char *dst = image_data + image_bytes * (y0 * image_width + x0); |
35128 | 92 vo_draw_alpha_func draw = vo_get_draw_alpha(image_format); |
93 if (!draw) return; | |
94 draw(w,h,src,srca,stride,dst,image_stride); | |
15289 | 95 } |
96 | |
29573
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
97 static void free_file_specific(void) |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
98 { |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
99 if(shared_buffer) |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
100 { |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
101 [mplayerosxProto stop]; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
102 mplayerosxProto = nil; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
103 [mplayerosxProxy release]; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
104 mplayerosxProxy = nil; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
105 |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
106 if (munmap(image_data, image_height*image_stride) == -1) |
29573
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
107 mp_msg(MSGT_VO, MSGL_FATAL, "[vo_corevideo] uninit: munmap failed. Error: %s\n", strerror(errno)); |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
108 |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
109 if (shm_unlink(buffer_name) == -1) |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
110 mp_msg(MSGT_VO, MSGL_FATAL, "[vo_corevideo] uninit: shm_unlink failed. Error: %s\n", strerror(errno)); |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
111 } else { |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
112 free(image_datas[0]); |
34875
444a6a469743
Remove unnecessary if, free can be called unconditionally.
reimar
parents:
34825
diff
changeset
|
113 free(image_datas[1]); |
29573
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
114 image_datas[0] = NULL; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
115 image_datas[1] = NULL; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
116 image_data = NULL; |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
117 } |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
118 } |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
119 |
35150
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
120 static void update_screen_info_shared_buffer(void) |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
121 { |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
122 NSRect rc = [[NSScreen mainScreen] frame]; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
123 vo_screenwidth = rc.size.width; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
124 vo_screenheight = rc.size.height; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
125 xinerama_x = rc.origin.x; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
126 xinerama_y = rc.origin.y; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
127 aspect_save_screenres(vo_screenwidth, vo_screenheight); |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
128 } |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
129 |
29564
4ae3d2d7946e
Use MPlayer's standard aspect handling functions in corevideo
reimar
parents:
29533
diff
changeset
|
130 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) |
4ae3d2d7946e
Use MPlayer's standard aspect handling functions in corevideo
reimar
parents:
29533
diff
changeset
|
131 { |
29573
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
132 free_file_specific(); |
16385 | 133 |
15289 | 134 //misc mplayer setup |
135 image_width = width; | |
136 image_height = height; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
137 switch (image_format) |
15289 | 138 { |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
139 case IMGFMT_RGB24: |
34825 | 140 image_bytes = 3; |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
141 break; |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
142 case IMGFMT_ARGB: |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
143 case IMGFMT_BGRA: |
34825 | 144 image_bytes = 4; |
15289 | 145 break; |
16385 | 146 case IMGFMT_YUY2: |
35019 | 147 case IMGFMT_UYVY: |
34825 | 148 image_bytes = 2; |
15289 | 149 break; |
150 } | |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
151 // should be aligned, but that would break the shared buffer |
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
152 image_stride = image_width * image_bytes; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
153 |
16385 | 154 if(!shared_buffer) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
155 { |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
156 image_data = malloc(image_height*image_stride); |
25180 | 157 image_datas[0] = image_data; |
158 if (vo_doublebuffering) | |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
159 image_datas[1] = malloc(image_height*image_stride); |
25180 | 160 image_page = 0; |
25120
9b4ca4dc1294
Fix a memory leak when working in shared_buffer mode.
ulion
parents:
25114
diff
changeset
|
161 |
16385 | 162 //config OpenGL View |
35080
a10c7a7a9232
Move some code around to make splitting into vo-specific and generic code easier.
reimar
parents:
35079
diff
changeset
|
163 [mpGLView config:d_width:d_height:flags]; |
16385 | 164 [mpGLView reshape]; |
35146 | 165 [[mpGLView window] setTitle:[NSString stringWithUTF8String:vo_wintitle ? vo_wintitle : title]]; |
16385 | 166 } |
167 else | |
168 { | |
29567
349de9bdfcce
Make shm_fd a local variable and close it when we need it no longer, thus
reimar
parents:
29566
diff
changeset
|
169 int shm_fd; |
29210 | 170 mp_msg(MSGT_VO, MSGL_INFO, "[vo_corevideo] writing output to a shared buffer " |
29170
9d40283d9a5d
Unify error message output and update error messages.
diego
parents:
29137
diff
changeset
|
171 "named \"%s\"\n",buffer_name); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
172 |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
173 // create shared memory |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
174 shm_fd = shm_open(buffer_name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
175 if (shm_fd == -1) |
16385 | 176 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
177 mp_msg(MSGT_VO, MSGL_FATAL, |
29210 | 178 "[vo_corevideo] failed to open shared memory. Error: %s\n", strerror(errno)); |
16385 | 179 return 1; |
180 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
181 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
182 |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
183 if (ftruncate(shm_fd, image_height*image_stride) == -1) |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
184 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
185 mp_msg(MSGT_VO, MSGL_FATAL, |
29210 | 186 "[vo_corevideo] failed to size shared memory, possibly already in use. Error: %s\n", strerror(errno)); |
29567
349de9bdfcce
Make shm_fd a local variable and close it when we need it no longer, thus
reimar
parents:
29566
diff
changeset
|
187 close(shm_fd); |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
188 shm_unlink(buffer_name); |
16385 | 189 return 1; |
190 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
191 |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
192 image_data = mmap(NULL, image_height*image_stride, |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
193 PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); |
29567
349de9bdfcce
Make shm_fd a local variable and close it when we need it no longer, thus
reimar
parents:
29566
diff
changeset
|
194 close(shm_fd); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
195 |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
196 if (image_data == MAP_FAILED) |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
197 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
198 mp_msg(MSGT_VO, MSGL_FATAL, |
29210 | 199 "[vo_corevideo] failed to map shared memory. Error: %s\n", strerror(errno)); |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
200 shm_unlink(buffer_name); |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
201 return 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
202 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
203 |
28837 | 204 //connect to mplayerosx |
35146 | 205 mplayerosxProxy=[NSConnection rootProxyForConnectionWithRegisteredName:[NSString stringWithUTF8String:buffer_name] host:nil]; |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
206 if ([mplayerosxProxy conformsToProtocol:@protocol(MPlayerOSXVOProto)]) { |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
207 [mplayerosxProxy setProtocolForProxy:@protocol(MPlayerOSXVOProto)]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
208 mplayerosxProto = (id <MPlayerOSXVOProto>)mplayerosxProxy; |
29564
4ae3d2d7946e
Use MPlayer's standard aspect handling functions in corevideo
reimar
parents:
29533
diff
changeset
|
209 [mplayerosxProto startWithWidth: image_width withHeight: image_height withBytes: image_bytes withAspect:d_width*100/d_height]; |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
210 } |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
211 else { |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
212 [mplayerosxProxy release]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
213 mplayerosxProxy = nil; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
214 mplayerosxProto = nil; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
215 } |
16385 | 216 } |
15289 | 217 return 0; |
218 } | |
219 | |
220 static void check_events(void) | |
221 { | |
29272
c95bad660986
When used with shared_buffer, there's no need for a NSApp object, which causes MPlayer to be marked as unresponsive.
adrian
parents:
29271
diff
changeset
|
222 if (mpGLView) |
c95bad660986
When used with shared_buffer, there's no need for a NSApp object, which causes MPlayer to be marked as unresponsive.
adrian
parents:
29271
diff
changeset
|
223 [mpGLView check_events]; |
15289 | 224 } |
225 | |
226 static void draw_osd(void) | |
227 { | |
228 vo_draw_text(image_width, image_height, draw_alpha); | |
229 } | |
230 | |
231 static void flip_page(void) | |
232 { | |
29271
82b6fbc72099
When used with shared_buffer, autorelease in each flip_page so objects don't accumulate until exit.
adrian
parents:
29263
diff
changeset
|
233 if(shared_buffer) { |
82b6fbc72099
When used with shared_buffer, autorelease in each flip_page so objects don't accumulate until exit.
adrian
parents:
29263
diff
changeset
|
234 NSAutoreleasePool *pool = [NSAutoreleasePool new]; |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
235 [mplayerosxProto render]; |
29271
82b6fbc72099
When used with shared_buffer, autorelease in each flip_page so objects don't accumulate until exit.
adrian
parents:
29263
diff
changeset
|
236 [pool release]; |
82b6fbc72099
When used with shared_buffer, autorelease in each flip_page so objects don't accumulate until exit.
adrian
parents:
29263
diff
changeset
|
237 } else { |
25114
bed4188998ca
Move the setCurrentTexture call into flip_page(), fix osd flicker problem.
ulion
parents:
25078
diff
changeset
|
238 [mpGLView setCurrentTexture]; |
16385 | 239 [mpGLView render]; |
25180 | 240 if (vo_doublebuffering) { |
241 image_page = 1 - image_page; | |
242 image_data = image_datas[image_page]; | |
243 } | |
25114
bed4188998ca
Move the setCurrentTexture call into flip_page(), fix osd flicker problem.
ulion
parents:
25078
diff
changeset
|
244 } |
15289 | 245 } |
246 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
247 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
15289 | 248 { |
249 return 0; | |
250 } | |
251 | |
252 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
253 static int draw_frame(uint8_t *src[]) |
15289 | 254 { |
30972
886527159cae
Implement VOCTRL_DRAW_IMAGE instead of the deprecated draw_frame, avoiding
reimar
parents:
30922
diff
changeset
|
255 return 0; |
886527159cae
Implement VOCTRL_DRAW_IMAGE instead of the deprecated draw_frame, avoiding
reimar
parents:
30922
diff
changeset
|
256 } |
15289 | 257 |
30972
886527159cae
Implement VOCTRL_DRAW_IMAGE instead of the deprecated draw_frame, avoiding
reimar
parents:
30922
diff
changeset
|
258 static uint32_t draw_image(mp_image_t *mpi) |
886527159cae
Implement VOCTRL_DRAW_IMAGE instead of the deprecated draw_frame, avoiding
reimar
parents:
30922
diff
changeset
|
259 { |
35057 | 260 if (!(mpi->flags & MP_IMGFLAG_DIRECT)) |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
261 memcpy_pic(image_data, mpi->planes[0], image_width*image_bytes, image_height, image_stride, mpi->stride[0]); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
262 |
15289 | 263 return 0; |
264 } | |
265 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
266 static int query_format(uint32_t format) |
15289 | 267 { |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
268 const int supportflags = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN; |
15289 | 269 image_format = format; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
270 |
15289 | 271 switch(format) |
272 { | |
273 case IMGFMT_YUY2: | |
274 pixelFormat = kYUVSPixelFormat; | |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
275 return supportflags; |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
276 |
35019 | 277 case IMGFMT_UYVY: |
278 pixelFormat = k2vuyPixelFormat; | |
279 return supportflags; | |
280 | |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
281 case IMGFMT_RGB24: |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
282 pixelFormat = k24RGBPixelFormat; |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
283 return supportflags; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
284 |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
285 case IMGFMT_ARGB: |
15289 | 286 pixelFormat = k32ARGBPixelFormat; |
30974
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
287 return supportflags; |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
288 |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
289 case IMGFMT_BGRA: |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
290 pixelFormat = k32BGRAPixelFormat; |
bd964ca1f6fa
Fix RGB support for corevideo: corevideo can only support
reimar
parents:
30973
diff
changeset
|
291 return supportflags; |
15289 | 292 } |
293 return 0; | |
294 } | |
295 | |
35057 | 296 static int get_image(mp_image_t *mpi) |
297 { | |
298 if (!(mpi->flags & (MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_ACCEPT_WIDTH)) || | |
299 (mpi->type != MP_IMGTYPE_TEMP && mpi->type != MP_IMGTYPE_STATIC)) | |
300 return VO_FALSE; | |
301 | |
302 // mpi should not be planar format here | |
303 mpi->planes[0] = image_data; | |
304 mpi->stride[0] = image_stride; | |
305 mpi->flags |= MP_IMGFLAG_DIRECT; | |
306 mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK; | |
307 return VO_TRUE; | |
308 } | |
309 | |
15289 | 310 static void uninit(void) |
311 { | |
21551 | 312 SetSystemUIMode( kUIModeNormal, 0); |
313 CGDisplayShowCursor(kCGDirectMainDisplay); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
314 |
29573
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
315 free_file_specific(); |
2b14be337eaf
Fix some of the major memleaks of vo_corevideo with -fixed-vo
reimar
parents:
29567
diff
changeset
|
316 |
21551 | 317 if(mpGLView) |
318 { | |
25136 | 319 NSAutoreleasePool *finalPool; |
24742
0bef706332b5
Fix deallocate bug which sometimes causes a crash when reinitializing.
nplourde
parents:
24698
diff
changeset
|
320 mpGLView = nil; |
21551 | 321 [autoreleasepool release]; |
25136 | 322 finalPool = [[NSAutoreleasePool alloc] init]; |
25078
3efbdaab822f
Let NSApp handle events when uninit to fix the delay dealloc bug of mpGLView.
ulion
parents:
24965
diff
changeset
|
323 [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; |
3efbdaab822f
Let NSApp handle events when uninit to fix the delay dealloc bug of mpGLView.
ulion
parents:
24965
diff
changeset
|
324 [finalPool release]; |
21551 | 325 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
326 |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32471
diff
changeset
|
327 free(buffer_name); |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
328 buffer_name = NULL; |
15289 | 329 } |
330 | |
29603 | 331 static const opt_t subopts[] = { |
28306 | 332 {"device_id", OPT_ARG_INT, &screen_id, NULL}, |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
333 {"shared_buffer", OPT_ARG_BOOL, &shared_buffer, NULL}, |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
334 {"buffer_name", OPT_ARG_MSTRZ,&buffer_name, NULL}, |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
335 {NULL} |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
336 }; |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
337 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
338 static int preinit(const char *arg) |
15289 | 339 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
340 |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
341 // set defaults |
28306 | 342 screen_id = -1; |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
343 shared_buffer = false; |
28204 | 344 buffer_name = NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
345 |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
346 if (subopt_parse(arg, subopts) != 0) { |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
347 mp_msg(MSGT_VO, MSGL_FATAL, |
29210 | 348 "\n-vo corevideo command line help:\n" |
349 "Example: mplayer -vo corevideo:device_id=1:shared_buffer:buffer_name=mybuff\n" | |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
350 "\nOptions:\n" |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
351 " device_id=<0-...>\n" |
35074
3fb18ad99003
Deprecate corevideo device_id in favour of -xineramascreen.
reimar
parents:
35073
diff
changeset
|
352 " DEPRECATED, use -xineramascreen instead.\n" |
28837 | 353 " Set screen device ID for fullscreen.\n" |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
354 " shared_buffer\n" |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
355 " Write output to a shared memory buffer instead of displaying it.\n" |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
356 " buffer_name=<name>\n" |
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
357 " Name of the shared buffer created with shm_open() as well as\n" |
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
358 " the name of the NSConnection MPlayer will try to open.\n" |
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
359 " Setting buffer_name implicitly enables shared_buffer.\n" |
28130
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
360 "\n" ); |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
361 return -1; |
b5898cb411da
Replace vo_macosx's custom options parsing with a subopt_parse()-based one
gpoirier
parents:
28077
diff
changeset
|
362 } |
15728 | 363 |
15289 | 364 autoreleasepool = [[NSAutoreleasePool alloc] init]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
365 |
35074
3fb18ad99003
Deprecate corevideo device_id in favour of -xineramascreen.
reimar
parents:
35073
diff
changeset
|
366 if (screen_id != -1) |
3fb18ad99003
Deprecate corevideo device_id in favour of -xineramascreen.
reimar
parents:
35073
diff
changeset
|
367 xinerama_screen = screen_id; |
3fb18ad99003
Deprecate corevideo device_id in favour of -xineramascreen.
reimar
parents:
35073
diff
changeset
|
368 |
28204 | 369 if (!buffer_name) |
370 buffer_name = strdup(DEFAULT_BUFFER_NAME); | |
371 else | |
28180
781ef511a767
Add an option to vo_macosx to set a custom buffer_name.
gpoirier
parents:
28130
diff
changeset
|
372 shared_buffer = true; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
373 |
16385 | 374 if(!shared_buffer) |
16144 | 375 { |
16385 | 376 if(!mpGLView) |
377 { | |
378 mpGLView = [[MPlayerOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) pixelFormat:[MPlayerOpenGLView defaultPixelFormat]]; | |
379 [mpGLView autorelease]; | |
380 } | |
381 [mpGLView display]; | |
382 [mpGLView preinit]; | |
16144 | 383 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
384 |
15289 | 385 return 0; |
386 } | |
387 | |
33330
ad12e6080ed1
Fix compilation for OSX due to r33392 - control() vaarg removal.
iive
parents:
32537
diff
changeset
|
388 static int control(uint32_t request, void *data) |
15289 | 389 { |
390 switch (request) | |
391 { | |
30972
886527159cae
Implement VOCTRL_DRAW_IMAGE instead of the deprecated draw_frame, avoiding
reimar
parents:
30922
diff
changeset
|
392 case VOCTRL_DRAW_IMAGE: return draw_image(data); |
34825 | 393 case VOCTRL_PAUSE: |
394 case VOCTRL_RESUME: | |
395 return VO_TRUE; | |
31737 | 396 case VOCTRL_QUERY_FORMAT: return query_format(*(uint32_t*)data); |
35057 | 397 case VOCTRL_GET_IMAGE: return get_image(data); |
31737 | 398 case VOCTRL_ONTOP: vo_ontop = !vo_ontop; if(!shared_buffer){ [mpGLView ontop]; } else { [mplayerosxProto ontop]; } return VO_TRUE; |
399 case VOCTRL_ROOTWIN: vo_rootwin = !vo_rootwin; [mpGLView rootwin]; return VO_TRUE; | |
400 case VOCTRL_FULLSCREEN: vo_fs = !vo_fs; if(!shared_buffer){ [mpGLView fullscreen: NO]; } else { [mplayerosxProto toggleFullscreen]; } return VO_TRUE; | |
15289 | 401 case VOCTRL_GET_PANSCAN: return VO_TRUE; |
35069 | 402 case VOCTRL_SET_PANSCAN: panscan_calc(); return VO_TRUE; |
35150
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
403 case VOCTRL_UPDATE_SCREENINFO: |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
404 if (shared_buffer) |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
405 update_screen_info_shared_buffer(); |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
406 else |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
407 [mpGLView update_screen_info]; |
4683218a0324
vo corevideo: VOCTRL_UPDATE_SCREENINFO: Fix shared_buffer case
al
parents:
35146
diff
changeset
|
408 return VO_TRUE; |
15289 | 409 } |
410 return VO_NOTIMPL; | |
411 } | |
412 | |
413 ////////////////////////////////////////////////////////////////////////// | |
414 // NSOpenGLView Subclass | |
415 ////////////////////////////////////////////////////////////////////////// | |
15611 | 416 @implementation MPlayerOpenGLView |
24076 | 417 - (void) preinit |
15289 | 418 { |
29566
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
419 CVReturn error; |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
420 |
35086
8848682f4035
Split out an objective-C common OS X layer, to be reused by -vo gl.
reimar
parents:
35085
diff
changeset
|
421 [super preinit]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
422 |
35086
8848682f4035
Split out an objective-C common OS X layer, to be reused by -vo gl.
reimar
parents:
35085
diff
changeset
|
423 error = CVOpenGLTextureCacheCreate(NULL, 0, [[self openGLContext] CGLContextObj], [[self pixelFormat] CGLPixelFormatObj], 0, &textureCache); |
29566
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
424 if(error != kCVReturnSuccess) |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
425 mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture Cache(%d)\n", error); |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
426 } |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
427 |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
428 - (void) releaseVideoSpecific |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
429 { |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
430 CVPixelBufferRelease(frameBuffers[0]); |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
431 frameBuffers[0] = NULL; |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
432 CVPixelBufferRelease(frameBuffers[1]); |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
433 frameBuffers[1] = NULL; |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
434 CVOpenGLTextureRelease(texture); |
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
435 texture = NULL; |
15726 | 436 } |
437 | |
29574
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
438 - (void) dealloc |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
439 { |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
440 [self releaseVideoSpecific]; |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
441 CVOpenGLTextureCacheRelease(textureCache); |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
442 textureCache = NULL; |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
443 [super dealloc]; |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
444 } |
0aa36133f638
Add a dealloc function to corevideo to reduce the memleaks from
reimar
parents:
29573
diff
changeset
|
445 |
35080
a10c7a7a9232
Move some code around to make splitting into vo-specific and generic code easier.
reimar
parents:
35079
diff
changeset
|
446 - (void) config:(uint32_t)width:(uint32_t)height:(uint32_t)flags |
15726 | 447 { |
15289 | 448 CVReturn error = kCVReturnSuccess; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
449 |
35086
8848682f4035
Split out an objective-C common OS X layer, to be reused by -vo gl.
reimar
parents:
35085
diff
changeset
|
450 [super config:width:height:flags]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
451 |
29566
b128ce47771d
Reduce vo_corevideo memleaks by initializing static context etc. only once
reimar
parents:
29564
diff
changeset
|
452 [self releaseVideoSpecific]; |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
453 error = CVPixelBufferCreateWithBytes(NULL, image_width, image_height, pixelFormat, image_datas[0], image_stride, NULL, NULL, NULL, &frameBuffers[0]); |
15289 | 454 if(error != kCVReturnSuccess) |
29210 | 455 mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create Pixel Buffer(%d)\n", error); |
25180 | 456 if (vo_doublebuffering) { |
34878
3e6cfa2053bf
Add a separate stride variable to make it easier to optimize later (e.g. align stride).
reimar
parents:
34876
diff
changeset
|
457 error = CVPixelBufferCreateWithBytes(NULL, image_width, image_height, pixelFormat, image_datas[1], image_stride, NULL, NULL, NULL, &frameBuffers[1]); |
25180 | 458 if(error != kCVReturnSuccess) |
29210 | 459 mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create Pixel Double Buffer(%d)\n", error); |
25180 | 460 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
461 |
25180 | 462 error = CVOpenGLTextureCacheCreateTextureFromImage(NULL, textureCache, frameBuffers[image_page], 0, &texture); |
15289 | 463 if(error != kCVReturnSuccess) |
29210 | 464 mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture(%d)\n", error); |
15570 | 465 } |
466 | |
467 /* | |
15289 | 468 Setup OpenGL |
469 */ | |
470 - (void)prepareOpenGL | |
471 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
472 glEnable(GL_BLEND); |
15289 | 473 glDisable(GL_DEPTH_TEST); |
474 glDepthMask(GL_FALSE); | |
475 glDisable(GL_CULL_FACE); | |
476 [self reshape]; | |
477 } | |
478 | |
479 /* | |
480 reshape OpenGL viewport | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
481 */ |
15289 | 482 - (void)reshape |
483 { | |
31739
923b5da53f65
Declare variables with proper types to avoid dangerous pointer casts.
reimar
parents:
31738
diff
changeset
|
484 int d_width, d_height; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
485 |
35091 | 486 [super reshape]; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
487 |
35090 | 488 glViewport(0, 0, vo_dwidth, vo_dheight); |
15289 | 489 glMatrixMode(GL_PROJECTION); |
490 glLoadIdentity(); | |
35090 | 491 glOrtho(0, vo_dwidth, vo_dheight, 0, -1.0, 1.0); |
15289 | 492 glMatrixMode(GL_MODELVIEW); |
493 glLoadIdentity(); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
494 |
35090 | 495 d_width = vo_dwidth; |
496 d_height = vo_dheight; | |
15729 | 497 //set texture frame |
35127
dd8ebdd08791
Use aspect_scaling() function also for vo_corevideo.
reimar
parents:
35091
diff
changeset
|
498 if(aspect_scaling()) |
15289 | 499 { |
31739
923b5da53f65
Declare variables with proper types to avoid dangerous pointer casts.
reimar
parents:
31738
diff
changeset
|
500 aspect(&d_width, &d_height, A_WINZOOM); |
15289 | 501 } |
35090 | 502 textureFrame = NSMakeRect((vo_dwidth - d_width) / 2, (vo_dheight - d_height) / 2, d_width, d_height); |
15289 | 503 } |
504 | |
505 /* | |
506 Render frame | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
507 */ |
15289 | 508 - (void) render |
509 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
510 glClear(GL_COLOR_BUFFER_BIT); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
511 |
15289 | 512 glEnable(CVOpenGLTextureGetTarget(texture)); |
513 glBindTexture(CVOpenGLTextureGetTarget(texture), CVOpenGLTextureGetName(texture)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
514 |
15289 | 515 glColor3f(1,1,1); |
516 glBegin(GL_QUADS); | |
15729 | 517 glTexCoord2f(upperLeft[0], upperLeft[1]); glVertex2i( textureFrame.origin.x-(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); |
25424 | 518 glTexCoord2f(lowerLeft[0], lowerLeft[1]); glVertex2i(textureFrame.origin.x-(vo_panscan_x >> 1), NSMaxY(textureFrame)+(vo_panscan_y >> 1)); |
519 glTexCoord2f(lowerRight[0], lowerRight[1]); glVertex2i(NSMaxX(textureFrame)+(vo_panscan_x >> 1), NSMaxY(textureFrame)+(vo_panscan_y >> 1)); | |
520 glTexCoord2f(upperRight[0], upperRight[1]); glVertex2i(NSMaxX(textureFrame)+(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); | |
15289 | 521 glEnd(); |
15339 | 522 glDisable(CVOpenGLTextureGetTarget(texture)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
523 |
15339 | 524 //render resize box |
35082
6d8be70115a8
Remove local variables that (except for very brief moments before
reimar
parents:
35081
diff
changeset
|
525 if(!vo_fs) |
15339 | 526 { |
527 NSRect frame = [self frame]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
528 |
15339 | 529 glBegin(GL_LINES); |
530 glColor4f(0.2, 0.2, 0.2, 0.5); | |
531 glVertex2i(frame.size.width-1, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-1); | |
532 glVertex2i(frame.size.width-1, frame.size.height-5); glVertex2i(frame.size.width-5, frame.size.height-1); | |
533 glVertex2i(frame.size.width-1, frame.size.height-9); glVertex2i(frame.size.width-9, frame.size.height-1); | |
534 | |
535 glColor4f(0.4, 0.4, 0.4, 0.5); | |
536 glVertex2i(frame.size.width-1, frame.size.height-2); glVertex2i(frame.size.width-2, frame.size.height-1); | |
537 glVertex2i(frame.size.width-1, frame.size.height-6); glVertex2i(frame.size.width-6, frame.size.height-1); | |
538 glVertex2i(frame.size.width-1, frame.size.height-10); glVertex2i(frame.size.width-10, frame.size.height-1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
539 |
15339 | 540 glColor4f(0.6, 0.6, 0.6, 0.5); |
541 glVertex2i(frame.size.width-1, frame.size.height-3); glVertex2i(frame.size.width-3, frame.size.height-1); | |
542 glVertex2i(frame.size.width-1, frame.size.height-7); glVertex2i(frame.size.width-7, frame.size.height-1); | |
543 glVertex2i(frame.size.width-1, frame.size.height-11); glVertex2i(frame.size.width-11, frame.size.height-1); | |
544 glEnd(); | |
545 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
546 |
15289 | 547 glFlush(); |
548 } | |
549 | |
550 /* | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
551 Create OpenGL texture from current frame & set texco |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
552 */ |
15289 | 553 - (void) setCurrentTexture |
554 { | |
555 CVReturn error = kCVReturnSuccess; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
556 |
29137
0f6fc0df2c23
fix a memory leak leading to ~80 bytes being leaked at each call to flip_page.
gpoirier
parents:
28837
diff
changeset
|
557 CVOpenGLTextureRelease(texture); |
25180 | 558 error = CVOpenGLTextureCacheCreateTextureFromImage(NULL, textureCache, frameBuffers[image_page], 0, &texture); |
15289 | 559 if(error != kCVReturnSuccess) |
29210 | 560 mp_msg(MSGT_VO, MSGL_ERR,"[vo_corevideo] Failed to create OpenGL texture(%d)\n", error); |
15289 | 561 |
562 CVOpenGLTextureGetCleanTexCoords(texture, lowerLeft, lowerRight, upperRight, upperLeft); | |
563 } | |
564 | |
565 /* | |
566 redraw win rect | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29210
diff
changeset
|
567 */ |
15289 | 568 - (void) drawRect: (NSRect *) bounds |
569 { | |
570 [self render]; | |
571 } | |
15325 | 572 @end |