1
2from PyObjCTools.TestSupport import *
3from Quartz import *
4
5class TestCVPixelBuffer (TestCase):
6    def testConstants(self):
7        self.assertEqual(kCVPixelFormatType_1Monochrome, 0x00000001)
8        self.assertEqual(kCVPixelFormatType_2Indexed, 0x00000002)
9        self.assertEqual(kCVPixelFormatType_4Indexed, 0x00000004)
10        self.assertEqual(kCVPixelFormatType_8Indexed, 0x00000008)
11        self.assertEqual(kCVPixelFormatType_1IndexedGray_WhiteIsZero, 0x00000021)
12        self.assertEqual(kCVPixelFormatType_2IndexedGray_WhiteIsZero, 0x00000022)
13        self.assertEqual(kCVPixelFormatType_4IndexedGray_WhiteIsZero, 0x00000024)
14        self.assertEqual(kCVPixelFormatType_8IndexedGray_WhiteIsZero, 0x00000028)
15        self.assertEqual(kCVPixelFormatType_16BE555, 0x00000010)
16        self.assertEqual(kCVPixelFormatType_16LE555, fourcc(b'L555'))
17        self.assertEqual(kCVPixelFormatType_16LE5551, fourcc(b'5551'))
18        self.assertEqual(kCVPixelFormatType_16BE565, fourcc(b'B565'))
19        self.assertEqual(kCVPixelFormatType_16LE565, fourcc(b'L565'))
20        self.assertEqual(kCVPixelFormatType_24RGB, 0x00000018)
21        self.assertEqual(kCVPixelFormatType_24BGR, fourcc(b'24BG'))
22        self.assertEqual(kCVPixelFormatType_32ARGB, 0x00000020)
23        self.assertEqual(kCVPixelFormatType_32BGRA, fourcc(b'BGRA'))
24        self.assertEqual(kCVPixelFormatType_32ABGR, fourcc(b'ABGR'))
25        self.assertEqual(kCVPixelFormatType_32RGBA, fourcc(b'RGBA'))
26        self.assertEqual(kCVPixelFormatType_64ARGB, fourcc(b'b64a'))
27        self.assertEqual(kCVPixelFormatType_48RGB, fourcc(b'b48r'))
28        self.assertEqual(kCVPixelFormatType_32AlphaGray, fourcc(b'b32a'))
29        self.assertEqual(kCVPixelFormatType_16Gray, fourcc(b'b16g'))
30        self.assertEqual(kCVPixelFormatType_422YpCbCr8, fourcc(b'2vuy'))
31        self.assertEqual(kCVPixelFormatType_4444YpCbCrA8, fourcc(b'v408'))
32        self.assertEqual(kCVPixelFormatType_4444YpCbCrA8R, fourcc(b'r408'))
33        self.assertEqual(kCVPixelFormatType_444YpCbCr8, fourcc(b'v308'))
34        self.assertEqual(kCVPixelFormatType_422YpCbCr16, fourcc(b'v216'))
35        self.assertEqual(kCVPixelFormatType_422YpCbCr10, fourcc(b'v210'))
36        self.assertEqual(kCVPixelFormatType_444YpCbCr10, fourcc(b'v410'))
37        self.assertEqual(kCVPixelFormatType_420YpCbCr8Planar, fourcc(b'y420'))
38
39        self.assertIsInstance(kCVPixelBufferPixelFormatTypeKey, unicode)
40        self.assertIsInstance(kCVPixelBufferMemoryAllocatorKey, unicode)
41        self.assertIsInstance(kCVPixelBufferWidthKey, unicode)
42        self.assertIsInstance(kCVPixelBufferHeightKey, unicode)
43        self.assertIsInstance(kCVPixelBufferExtendedPixelsLeftKey, unicode)
44        self.assertIsInstance(kCVPixelBufferExtendedPixelsTopKey, unicode)
45        self.assertIsInstance(kCVPixelBufferExtendedPixelsRightKey, unicode)
46        self.assertIsInstance(kCVPixelBufferExtendedPixelsBottomKey, unicode)
47        self.assertIsInstance(kCVPixelBufferBytesPerRowAlignmentKey, unicode)
48        self.assertIsInstance(kCVPixelBufferCGBitmapContextCompatibilityKey, unicode)
49        self.assertIsInstance(kCVPixelBufferCGImageCompatibilityKey, unicode)
50        self.assertIsInstance(kCVPixelBufferOpenGLCompatibilityKey, unicode)
51
52    def testTypes(self):
53        self.assertIsCFType(CVPixelBufferRef)
54
55    def testStructures(self):
56        v = CVPlanarComponentInfo()
57        self.assertIsInstance(v.offset, (int, long))
58        self.assertIsInstance(v.rowBytes, (int, long))
59
60        v = CVPlanarPixelBufferInfo_YCbCrPlanar()
61        self.assertIsInstance(v.componentInfoY, CVPlanarComponentInfo)
62        self.assertIsInstance(v.componentInfoCb, CVPlanarComponentInfo)
63        self.assertIsInstance(v.componentInfoCr, CVPlanarComponentInfo)
64
65    def testFunctions(self):
66        self.assertIsInstance(CVPixelBufferGetTypeID(), (int, long))
67
68
69        buf = self.makeBuffer()
70        self.assertIsInstance(buf, CVPixelBufferRef)
71
72
73        v = CVPixelBufferRetain(buf)
74        self.assertTrue(v is buf)
75        CVPixelBufferRelease(v)
76
77        self.assertArgIsOut(CVPixelBufferCreateResolvedAttributesDictionary, 2)
78        rv, v = CVPixelBufferCreateResolvedAttributesDictionary(None, [], None)
79        self.assertEqual(rv, 0)
80        self.assertIsInstance(v, CFDictionaryRef)
81
82
83
84        v = CVPixelBufferGetWidth(buf)
85        self.assertIsInstance(v, (int, long))
86
87        v = CVPixelBufferGetHeight(buf)
88        self.assertIsInstance(v, (int, long))
89
90        v = CVPixelBufferGetPixelFormatType(buf)
91        self.assertIsInstance(v, (int, long))
92
93        rv = CVPixelBufferLockBaseAddress(buf, 0)
94        self.assertEqual(rv, 0)
95
96        self.assertResultHasType(CVPixelBufferGetBaseAddress, b'^v')
97        self.assertResultIsVariableSize(CVPixelBufferGetBaseAddress)
98        v = CVPixelBufferGetBaseAddress(buf)
99        self.assertIsInstance(v, objc.varlist)
100        self.assertIsInstance(v[0], str)
101
102        self.assertResultHasType(CVPixelBufferGetBaseAddressOfPlane, b'^v')
103        self.assertResultIsVariableSize(CVPixelBufferGetBaseAddressOfPlane)
104        v = CVPixelBufferGetBaseAddressOfPlane(buf, 0)
105        if v is not objc.NULL:
106            self.assertIsInstance(v, objc.varlist)
107            self.assertIsInstance(v[0], str)
108
109        rv = CVPixelBufferUnlockBaseAddress(buf, 0)
110        self.assertEqual(rv, 0)
111
112        v = CVPixelBufferGetBytesPerRow(buf)
113        self.assertIsInstance(v, (int, long))
114
115        v = CVPixelBufferGetDataSize(buf)
116        self.assertIsInstance(v, (int, long))
117
118        v = CVPixelBufferGetPlaneCount(buf)
119        self.assertIsInstance(v, (int, long))
120
121        v = CVPixelBufferGetWidthOfPlane(buf, 0)
122        self.assertIsInstance(v, (int, long))
123
124        v = CVPixelBufferGetHeightOfPlane(buf, 0)
125        self.assertIsInstance(v, (int, long))
126
127        v = CVPixelBufferGetBytesPerRowOfPlane(buf, 0)
128        self.assertIsInstance(v, (int, long))
129
130        self.assertArgIsOut(CVPixelBufferGetExtendedPixels, 1)
131        self.assertArgIsOut(CVPixelBufferGetExtendedPixels, 2)
132        self.assertArgIsOut(CVPixelBufferGetExtendedPixels, 3)
133        self.assertArgIsOut(CVPixelBufferGetExtendedPixels, 4)
134        v = CVPixelBufferGetExtendedPixels(buf, None, None, None, None)
135        self.assertEqual(len(v), 4)
136        for i in range(4):
137            self.assertIsInstance(v[i], (int, long))
138
139        rv = CVPixelBufferFillExtendedPixels(buf)
140        self.assertIsInstance(rv, (int, long))
141
142
143
144    def testManual(self):
145        self.fail("CVPixelBufferCreate requires manual wrapper")
146        self.fail("CVPixelBufferCreateWithBytes requires manual wrapper")
147        self.fail("CVPixelBufferCreateWithPlanarBytes requires manual wrapper")
148
149
150
151
152    def makeBuffer(self):
153        # Helper function for creating a buffer, needed until we write the
154        # manual wrappers for creating a buffer without a pool
155        rv, pool = CVPixelBufferPoolCreate(None, {
156                kCVPixelBufferPoolMinimumBufferCountKey: 1,
157                kCVPixelBufferPoolMaximumBufferAgeKey: 300,
158            }, {
159                kCVPixelBufferWidthKey: 100,
160                kCVPixelBufferHeightKey: 100,
161                kCVPixelBufferPixelFormatTypeKey: kCVPixelFormatType_32ARGB,
162            }, None)
163        self.assertEqual(rv, 0)
164        self.assertIsInstance(pool, CVPixelBufferPoolRef)
165
166        rv, image = CVPixelBufferPoolCreatePixelBuffer(None, pool, None)
167        self.assertEqual(rv, 0)
168        return image
169
170    @min_os_level('10.6')
171    def testConstants10_6(self):
172        self.assertEqual(kCVPixelBufferLock_ReadOnly, 1)
173
174        self.assertIsInstance(kCVPixelBufferPlaneAlignmentKey, unicode)
175        self.assertIsInstance(kCVPixelBufferIOSurfacePropertiesKey, unicode)
176        self.assertIsInstance(kCVPixelBufferIOSurfaceOpenGLTextureCompatibilityKey, unicode)
177        self.assertIsInstance(kCVPixelBufferIOSurfaceOpenGLFBOCompatibilityKey, unicode)
178        self.assertIsInstance(kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey, unicode)
179
180    @min_os_level('10.6')
181    def testFunctions10_6(self):
182        self.assertResultHasType(CVPixelBufferGetIOSurface, b'^{__IOSurfaceRef=}')
183        self.assertArgHasType(CVPixelBufferGetIOSurface, 0, b'^{__CVPixelBuffer=}')
184        self.assertArgHasType(CVPixelBufferCreateWithIOSurface, 1, b'^{__IOSurfaceRef=}')
185        self.assertArgIsOut(CVPixelBufferCreateWithIOSurface, 3)
186
187
188
189if __name__ == "__main__":
190    main()
191