Mercurial > mplayer.hg
annotate libvo/vo_corevideo.m @ 36182:8587ae275646
Rename HAVE_CMOV to HAVE_I686 for FFmpeg.
Keep the cmov name in configure since it is less
confusing, since cmov is what we test for and
also since for example VIA C3 sometimes is considered
i686 that does not implement the optional CMOV
instruction.
author | reimar |
---|---|
date | Fri, 17 May 2013 15:59:38 +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 |