annotate src/camera_mac.m @ 3194:9fcb7abf3185 default tip

Remove some gcc 4.7.2 compiler warnings
author Lenard Lindstrom <len-l@telus.net>
date Tue, 23 Apr 2013 19:53:36 -0700
parents 1c265998cf59
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1975
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
1 //
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
2 // camera_mac.m
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
3 //
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
4 // Created by Werner Laurensse on 2009-05-28.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
5 // Copyright (c) 2009 . All rights reserved.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
6 //
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
7
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
8 #import "camera.h"
2143
99afc91b219a apply camera module patch for Python 3; thanks Christoph Gohlke
Lenard Lindstrom <len-l@telus.net>
parents: 1989
diff changeset
9 #import "pgcompat.h"
1975
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
10
3073
1c265998cf59 Disable camera_mac if OS X is above version 10.6.
Rene Dudfield <renesd@gmail.com>
parents: 2143
diff changeset
11 #if defined(PYGAME_MAC_CAMERA_OLD)
1c265998cf59 Disable camera_mac if OS X is above version 10.6.
Rene Dudfield <renesd@gmail.com>
parents: 2143
diff changeset
12
1989
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
13
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
14
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
15 /* Flips the image array horizontally and/or vertically by reverse copying
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
16 * a 'depth' number of bytes to flipped_image.*/
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
17 /* todo speed up... */
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
18 void flip_image(const void* image,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
19 void* flipped_image,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
20 int width, int height,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
21 short depth,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
22 int hflip, int vflip)
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
23 {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
24
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
25 if (!hflip && vflip) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
26 int i, j;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
27 int width_size = width*depth;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
28 const void* tmp_image = image;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
29
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
30 for(i=0; i<=height-1; i++) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
31 for(j=0; j<=width; j++) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
32 memcpy(flipped_image+width_size-j*depth-3,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
33 tmp_image+j*depth,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
34 depth);
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
35 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
36 tmp_image += width_size;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
37 flipped_image += width_size;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
38 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
39 } else if (hflip && !vflip) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
40 int i;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
41 int width_size = width*depth;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
42 void* tmp_image = flipped_image+width_size*height;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
43
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
44 for(i=0; i<height; i++) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
45 tmp_image -= width_size;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
46 memcpy(tmp_image, image+i*width_size, width_size);
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
47 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
48 } else if (hflip && vflip) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
49 int i, j;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
50 int width_size = width*depth;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
51 void* tmp_image = flipped_image + width_size*height;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
52
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
53 for(i=0; i<=height-1; i++) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
54 for(j=0; j<=width; j++) {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
55 memcpy(tmp_image-j*depth-3,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
56 image+j*depth,
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
57 depth);
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
58 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
59 tmp_image -= width_size;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
60 image += width_size;
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
61 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
62 } else {
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
63 memcpy(flipped_image, image, height*width*depth);
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
64 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
65 }
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
66
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
67
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
68
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
69
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
70
1975
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
71 /*
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
72 * return: an array of the available cameras ids.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
73 * num_cameras: number of cameras in array.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
74 */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
75 char** mac_list_cameras(int* num_cameras) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
76 char** cameras;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
77 char* camera;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
78
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
79 // The ComponentDescription allows you to search for Components that can be used to capture
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
80 // images, and thus can be used as camera.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
81 ComponentDescription cameraDescription;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
82 memset(&cameraDescription, 0, sizeof(ComponentDescription));
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
83 cameraDescription.componentType = SeqGrabComponentType;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
84
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
85 // Count the number of cameras on the system, and allocate an array for the cameras
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
86 *num_cameras = (int) CountComponents(&cameraDescription);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
87 cameras = (char **) malloc(sizeof(char*) * *num_cameras);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
88
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
89 // Try to find a camera, and add the camera's 'number' as a string to the array of cameras
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
90 Component cameraComponent = FindNextComponent(0, &cameraDescription);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
91 short num = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
92 while(cameraComponent != NULL) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
93 camera = malloc(sizeof(char) * 50); //TODO: find a better way to do this...
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
94 sprintf(camera, "%d", cameraComponent);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
95 cameras[num] = camera;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
96 cameraComponent = FindNextComponent(cameraComponent, &cameraDescription);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
97 num++;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
98 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
99 return cameras;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
100 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
101
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
102 /* Open a Camera component. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
103 int mac_open_device (PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
104 OSErr theErr;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
105
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
106 // Initialize movie toolbox
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
107 theErr = EnterMovies();
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
108 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
109 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
110 "Cannot initializes the Movie Toolbox");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
111 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
112 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
113
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
114 // Open camera component
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
115 SeqGrabComponent component = OpenComponent((Component) atoi(self->device_name));
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
116 if (component == NULL) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
117 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
118 "Cannot open '%s'", self->device_name);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
119 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
120 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
121 self->component = component;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
122
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
123 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
124 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
125
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
126 /* Make the Camera object ready for capturing images. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
127 int mac_init_device(PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
128 OSErr theErr;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
129
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
130 if (self->color_out == YUV_OUT) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
131 self->pixelformat = kYUVSPixelFormat;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
132 self->depth = 2;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
133 } else {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
134 self->pixelformat = k24RGBPixelFormat;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
135 self->depth = 3;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
136 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
137
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
138 int rowlength = self->boundsRect.right * self->depth;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
139
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
140 theErr = SGInitialize(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
141 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
142 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
143 "Cannot initialize sequence grabber component");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
144 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
145 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
146
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
147
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
148 theErr = SGSetDataRef(self->component, 0, 0, seqGrabDontMakeMovie);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
149 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
150 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
151 "Cannot set the sequence grabber destination data reference for a record operation");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
152 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
153 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
154
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
155 theErr = SGNewChannel(self->component, VideoMediaType, &self->channel);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
156 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
157 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
158 "Cannot creates a sequence grabber channel and assigns a channel component to the channel");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
159 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
160 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
161
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
162 //theErr = SGSettingsDialog (self->component, self->channel, 0, NULL, 0, NULL, 0);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
163
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
164 theErr = SGSetChannelBounds(self->channel, &self->boundsRect);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
165 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
166 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
167 "Cannot specifie a channel's display boundary rectangle");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
168 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
169 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
170
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
171 /*
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
172 theErr = SGSetFrameRate (vc, fps);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
173 if(theErr != noErr){
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
174 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
175 "Cannot set the frame rate of the sequence grabber");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
176 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
177 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
178 */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
179
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
180 theErr = SGSetChannelUsage(self->channel, seqGrabPreview);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
181 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
182 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
183 "Cannot specifie how a channel is to be used by the sequence grabber componen");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
184 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
185 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
186
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
187 theErr = SGSetChannelPlayFlags(self->channel, channelPlayAllData);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
188 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
189 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
190 "Cannot adjust the speed and quality with which the sequence grabber displays data from a channel");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
191 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
192 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
193
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
194 self->pixels.length = self->boundsRect.right * self->boundsRect.bottom * self->depth;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
195 self->pixels.start = (unsigned char*) malloc(self->pixels.length);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
196
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
197 theErr = QTNewGWorldFromPtr(&self->gworld,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
198 self->pixelformat,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
199 &self->boundsRect,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
200 NULL,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
201 NULL,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
202 0,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
203 self->pixels.start,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
204 rowlength);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
205
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
206 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
207 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
208 "Cannot wrap a graphics world and pixel map structure around an existing block of memory containing an image, "
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
209 "failed to run QTNewGWorldFromPtr");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
210 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
211 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
212 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
213 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
214 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
215
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
216 if (self->gworld == NULL) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
217 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
218 "Cannot wrap a graphics world and pixel map structure around an existing block of memory containing an image, "
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
219 "gworld is NULL");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
220 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
221 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
222 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
223 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
224 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
225
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
226 theErr = SGSetGWorld(self->component, (CGrafPtr)self->gworld, NULL);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
227 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
228 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
229 "Cannot establishe the graphics port and device for a sequence grabber component");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
230 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
231 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
232 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
233 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
234 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
235
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
236 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
237 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
238
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
239 /* Start Capturing */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
240 int mac_start_capturing(PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
241 OSErr theErr;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
242
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
243 theErr = SGPrepare(self->component, true, false);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
244 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
245 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
246 "Cannot istruct a sequence grabber to get ready to begin a preview or record operation");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
247 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
248 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
249 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
250 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
251 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
252
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
253 theErr = SGStartPreview(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
254 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
255 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
256 "Cannot instruct the sequence grabber to begin processing data from its channels");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
257 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
258 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
259 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
260 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
261 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
262
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
263 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
264 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
265
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
266 /* Close the camera component, and stop the image capturing if necessary. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
267 int mac_close_device (PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
268 ComponentResult theErr;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
269
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
270 // Stop recording
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
271 if (self->component)
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
272 SGStop(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
273
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
274 // Close sequence grabber component
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
275 if (self->component) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
276 theErr = CloseComponent(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
277 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
278 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
279 "Cannot close sequence grabber component");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
280 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
281 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
282 self->component = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
283 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
284
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
285 // Dispose of GWorld
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
286 if (self->gworld) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
287 DisposeGWorld(self->gworld);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
288 self->gworld = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
289 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
290 // Dispose of pixels buffer
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
291 free(self->pixels.start);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
292 self->pixels.start = NULL;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
293 self->pixels.length = 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
294 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
295 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
296
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
297 /* Stop capturing. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
298 int mac_stop_capturing (PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
299 OSErr theErr = SGStop(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
300 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
301 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
302 "Could not stop the sequence grabber with previewing");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
303 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
304 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
305 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
306 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
307
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
308 /* Read a frame, and put the raw data into a python string. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
309 PyObject *mac_read_raw(PyCameraObject *self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
310 if (self->gworld == NULL) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
311 PyErr_Format(PyExc_SystemError,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
312 "Cannot set convert gworld to surface because gworls is 0");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
313 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
314 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
315
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
316 if (mac_camera_idle(self) == 0) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
317 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
318 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
319
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
320 PyObject *raw;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
321 PixMapHandle pixmap_handle = GetGWorldPixMap(self->gworld);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
322 LockPixels(pixmap_handle);
2143
99afc91b219a apply camera module patch for Python 3; thanks Christoph Gohlke
Lenard Lindstrom <len-l@telus.net>
parents: 1989
diff changeset
323 raw = Bytes_FromStringAndSize(self->pixels.start, self->pixels.length);
1975
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
324 UnlockPixels(pixmap_handle);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
325 return raw;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
326 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
327
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
328 /* Read a frame from the camera and copy it to a surface. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
329 int mac_read_frame(PyCameraObject* self, SDL_Surface* surf) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
330 if (mac_camera_idle(self) != 0) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
331 return mac_process_image(self, self->pixels.start, self->pixels.length, surf);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
332 } else {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
333 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
334 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
335 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
336
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
337 // TODO sometimes it is posible to directly grab the image in the desired pixel format,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
338 // but this format needs to be known at the beginning of the initiation of the camera.
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
339 int mac_process_image(PyCameraObject* self, const void *image, unsigned int buffer_size, SDL_Surface* surf) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
340 if (!surf)
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
341 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
342
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
343 void* new_pixels;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
344 if (self->hflip || self->vflip) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
345 new_pixels = malloc(self->pixels.length);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
346 flip_image(self->pixels.start,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
347 new_pixels,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
348 self->boundsRect.right,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
349 self->boundsRect.bottom,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
350 self->depth,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
351 self->hflip,
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
352 self->vflip);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
353 } else {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
354 new_pixels = image;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
355 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
356
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
357 SDL_LockSurface(surf);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
358
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
359 switch (self->pixelformat) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
360 case k24RGBPixelFormat:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
361 if (buffer_size >= self->size * 3) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
362 switch (self->color_out) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
363 case RGB_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
364 rgb24_to_rgb(new_pixels, surf->pixels, self->size, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
365 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
366 case HSV_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
367 rgb_to_hsv(new_pixels, surf->pixels, self->size, V4L2_PIX_FMT_RGB24, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
368 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
369 case YUV_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
370 rgb_to_yuv(new_pixels, surf->pixels, self->size, V4L2_PIX_FMT_RGB24, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
371 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
372 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
373 } else {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
374 SDL_UnlockSurface(surf);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
375 free(new_pixels);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
376 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
377 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
378 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
379
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
380 case kYUVSPixelFormat:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
381 if (buffer_size >= self->size * 2) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
382 switch (self->color_out) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
383 case YUV_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
384 yuyv_to_yuv(new_pixels, surf->pixels, self->size, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
385 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
386 case RGB_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
387 yuyv_to_rgb(new_pixels, surf->pixels, self->size, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
388 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
389 case HSV_OUT:
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
390 yuyv_to_rgb(new_pixels, surf->pixels, self->size, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
391 rgb_to_hsv(surf->pixels, surf->pixels, self->size, V4L2_PIX_FMT_YUYV, surf->format);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
392 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
393 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
394 } else {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
395 SDL_UnlockSurface(surf);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
396 free(new_pixels);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
397 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
398 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
399 break;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
400 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
401 SDL_UnlockSurface(surf);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
402 if (self->hflip || self->vflip)
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
403 free(new_pixels);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
404
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
405 return 1;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
406 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
407
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
408 /* Put the camera in idle mode. */
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
409 int mac_camera_idle(PyCameraObject* self) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
410 OSErr theErr = SGIdle(self->component);
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
411 if (theErr != noErr) {
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
412 PyErr_Format(PyExc_SystemError, "SGIdle failed");
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
413 return 0;
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
414 }
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
415
4acd76af09ad commit mac camera
ab3
parents:
diff changeset
416 return 1;
1989
b8611a14022c moved flip_image into camera_mac since it is only used there and fails to build x platform.
Rene Dudfield <renesd@gmail.com>
parents: 1975
diff changeset
417 }
3073
1c265998cf59 Disable camera_mac if OS X is above version 10.6.
Rene Dudfield <renesd@gmail.com>
parents: 2143
diff changeset
418
1c265998cf59 Disable camera_mac if OS X is above version 10.6.
Rene Dudfield <renesd@gmail.com>
parents: 2143
diff changeset
419
1c265998cf59 Disable camera_mac if OS X is above version 10.6.
Rene Dudfield <renesd@gmail.com>
parents: 2143
diff changeset
420 #endif