1 /*---------------------------------------------------------------------------*
2
3 Copyright 2010-2012 Nintendo. All rights reserved.
4
5 These coded instructions, statements, and computer programs contain
6 proprietary information of Nintendo of America Inc. and/or Nintendo
7 Company Ltd., and are protected by Federal copyright law. They may
8 not be disclosed to third parties or copied or duplicated in any form,
9 in whole or in part, without the prior written consent of Nintendo.
10
11 *---------------------------------------------------------------------------*/
12 ////============================================================================
13 /// DEMODRCCamera.c
14 ///
15 /// This is DRC Camera system code for the DEMO library.
16 ///
17 ////============================================================================
18
19 #include <cafe/demo.h>
20 #include <cafe/gx2.h>
21 #include <cafe/camera/camera.h>
22
23 // Camera related members
24 CAMSurface DEMODRCCameraSurface[2];
25 GX2Texture DEMODRCCameraYTexture;
26 GX2Texture DEMODRCCameraUVTexture;
27
28 CAMSetupInfo DEMODRCCameraSetupInfo;
29 CAMHandle DEMOCameraHandle;
30
31 #define DEMO_CAM_MAX_ALLOC_ATTEMPTS (10)
32
DEMODRCCameraMemAlloc(int size,int alignment)33 void* DEMODRCCameraMemAlloc(int size, int alignment)
34 {
35 void *pMemTemp[DEMO_CAM_MAX_ALLOC_ATTEMPTS] = {0};
36 void *pMem = NULL;
37 s32 err;
38 u32 i;
39
40 if (size == 0) return 0;
41
42 for (i=0; i<DEMO_CAM_MAX_ALLOC_ATTEMPTS; i++)
43 {
44 pMem = DEMOAllocEx(size, alignment);
45
46 if (!pMem)
47 {
48 OSReport("DEMODRCCameraAlloc: Memory Allocation failed\n");
49 break;
50 }
51
52 err = CAMCheckMemSegmentation((void *)pMem, size);
53 if (err!=CAMERA_ERROR_NONE)
54 {
55 if (err != CAMERA_ERROR_SEGMENT_VIOLATION)
56 {
57 OSReport("DEMODRCCameraAlloc: unknown error\n");
58 break; //logically we should never get here
59 }
60 else
61 {
62 pMemTemp[i] = pMem;
63 }
64 }
65 else //CAMCheckMemSegmentation succeeded
66 {
67 break;
68 }
69 }
70
71 for(i=0; i < DEMO_CAM_MAX_ALLOC_ATTEMPTS; i++)
72 {
73 if(pMemTemp[i])
74 {
75 MEMFreeToDefaultHeap(pMemTemp[i]);
76 pMemTemp[i] = 0;
77 }
78 }
79
80 return pMem;
81 }
82
83
DEMODRCCameraInit(DRC_CAMERA_FPS fps)84 void DEMODRCCameraInit(DRC_CAMERA_FPS fps)
85 {
86 s32 total_size;
87 s32 err;
88 s32 *pErr = &err;
89 const u32 BUFFER_ALIGNMENT = 256;
90
91 // Set up another linear L8 texture
92 GX2InitTexture(&DEMODRCCameraYTexture,
93 CAMERA_STREAM_WIDTH, // width
94 CAMERA_STREAM_HEIGHT, // height
95 1, // depth
96 1, // num mips
97 GX2_SURFACE_FORMAT_TC_R8_UNORM,
98 GX2_SURFACE_DIM_2D);
99 DEMODRCCameraYTexture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED;
100 // Recalculate, reinit due to tileMode change
101 GX2CalcSurfaceSizeAndAlignment(&DEMODRCCameraYTexture.surface);
102 GX2InitTextureRegs(&DEMODRCCameraYTexture);
103
104 // Set up another linear UV8 texture
105 GX2InitTexture(&DEMODRCCameraUVTexture,
106 CAMERA_STREAM_WIDTH/2, // width
107 CAMERA_STREAM_HEIGHT/2, // height
108 1, // depth
109 1, // num mips
110 GX2_SURFACE_FORMAT_TC_R8_G8_UNORM,
111 GX2_SURFACE_DIM_2D);
112 DEMODRCCameraUVTexture.surface.tileMode = GX2_TILE_MODE_LINEAR_ALIGNED;
113 // Recalculate, reinit due to tileMode change
114 GX2CalcSurfaceSizeAndAlignment(&DEMODRCCameraUVTexture.surface);
115 GX2InitTextureRegs(&DEMODRCCameraUVTexture);
116
117 DEMODRCCameraSurface[0].imagePtr =
118 DEMODRCCameraMemAlloc(CAMERA_YUV_BUFFER_SIZE,
119 CAMERA_YUV_BUFFER_ALIGNMENT);
120 ASSERT(NULL != DEMODRCCameraSurface[0].imagePtr && "Unable to allocate memory");
121 DEMODRCCameraSurface[0].imageSize = CAMERA_YUV_BUFFER_SIZE;
122 DEMODRCCameraSurface[0].alignment = CAMERA_YUV_BUFFER_ALIGNMENT;
123
124 DEMODRCCameraSurface[1].imagePtr =
125 DEMODRCCameraMemAlloc(CAMERA_YUV_BUFFER_SIZE,
126 CAMERA_YUV_BUFFER_ALIGNMENT);
127 ASSERT(NULL != DEMODRCCameraSurface[1].imagePtr && "Unable to allocate memory");
128 DEMODRCCameraSurface[1].imageSize = CAMERA_YUV_BUFFER_SIZE;
129 DEMODRCCameraSurface[1].alignment = CAMERA_YUV_BUFFER_ALIGNMENT;
130
131 DEMODRCCameraSetupInfo.StreamInfo.type = CAMERA_STREAM_VIDEO;
132 DEMODRCCameraSetupInfo.StreamInfo.width = CAMERA_STREAM_WIDTH;
133 DEMODRCCameraSetupInfo.StreamInfo.height = CAMERA_STREAM_HEIGHT;
134
135 DEMODRCCameraSetupInfo.mode.display = DRC_CAMERA_DOWNSTREAM;
136 DEMODRCCameraSetupInfo.mode.fps = fps;
137
138 total_size = CAMGetMemReq(&DEMODRCCameraSetupInfo.StreamInfo);
139
140 DEMODRCCameraSetupInfo.WorkMem.pMem =
141 DEMODRCCameraMemAlloc(total_size, BUFFER_ALIGNMENT);
142 DEMODRCCameraSetupInfo.WorkMem.size = total_size;
143 ASSERT(NULL != DEMODRCCameraSetupInfo.WorkMem.pMem);
144
145 DEMODRCCameraSetupInfo.ThreadAffinity = CAM_THREAD_ATTR_AFFINITY_CORE1; //Core 1
146
147 DEMOCameraHandle = CAMInit(CAMERA_INSTANCE_0, &DEMODRCCameraSetupInfo, pErr);
148 if (DEMOCameraHandle < 0)
149 {
150 OSReport("Error: CAMInit returned %d\n", err);
151 ASSERT(!"CAMInit returned bad handle");
152 }
153 }
154
DEMODRCCameraShutdown()155 void DEMODRCCameraShutdown()
156 {
157 CAMExit(DEMOCameraHandle);
158 DEMOFree(DEMODRCCameraSurface[0].imagePtr);
159 DEMOFree(DEMODRCCameraSurface[1].imagePtr);
160 DEMOFree(DEMODRCCameraSetupInfo.WorkMem.pMem);
161 }
162
DEMODRCCameraOpen()163 void DEMODRCCameraOpen()
164 {
165 s32 err;
166
167 err = CAMOpen(DEMOCameraHandle);
168 if(err != CAMERA_ERROR_NONE)
169 {
170 if(err != CAMERA_ERROR_DEVICE_IN_USE)
171 OSReport("Error: CAMOpen returned %d\n", err);
172 }
173 }
174
DEMODRCCameraClose()175 void DEMODRCCameraClose()
176 {
177 s32 err;
178 err = CAMClose(DEMOCameraHandle);
179 if(err != CAMERA_ERROR_NONE)
180 {
181 if(err != CAMERA_ERROR_UNIINITIALIZED)
182 OSReport("CAMClose returned %d\n", err);
183 }
184 }
185
186