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