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