auto import from //depot/cupcake/@135843
[android/platform/external/neven.git] / FaceRecEm / common / src / b_FDSDK / FaceFinder.c
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /* ---- includes ----------------------------------------------------------- */
18
19 #include "FaceFinder_Internal.h"
20
21 /* ---- related objects  --------------------------------------------------- */
22
23 /* ---- typedefs ----------------------------------------------------------- */
24
25 /* ---- constants ---------------------------------------------------------- */
26
27 /* ------------------------------------------------------------------------- */
28
29 /* ========================================================================= */
30 /*                                                                           */
31 /* ---- functions ---------------------------------------------------------- */
32 /*                                                                           */
33 /* ========================================================================= */
34
35 /* ------------------------------------------------------------------------- */
36
37 void btk_FaceFinder_init( struct bbs_Context* cpA, struct btk_FaceFinder* ptrA )
38 {
39         ptrA->hsdkE = NULL;
40         ptrA->hidE = btk_HID_FF;
41
42         bpi_FaceFinderRef_init( cpA, &ptrA->ffE );
43
44         ptrA->facesE = 0;
45         ptrA->faceIndexE = 0;
46 }
47
48 /* ------------------------------------------------------------------------- */
49
50 void btk_FaceFinder_exit( struct bbs_Context* cpA, struct btk_FaceFinder* ptrA )
51 {
52         ptrA->hsdkE = NULL;
53         ptrA->hidE = btk_HID_FF;
54
55         bpi_FaceFinderRef_exit( cpA, &ptrA->ffE );
56
57         ptrA->facesE = 0;
58         ptrA->faceIndexE = 0;
59 }
60
61 /* ------------------------------------------------------------------------- */
62
63 btk_FaceFinderCreateParam btk_FaceFinder_defaultParam()
64 {
65         btk_FaceFinderCreateParam paramL;
66         paramL.reserved = 0;
67         paramL.pModuleParam = NULL;
68         paramL.moduleParamSize = 0;
69         paramL.maxDetectableFaces = 0;
70         return paramL;
71 }
72
73 /* ------------------------------------------------------------------------- */
74
75 btk_Status btk_FaceFinder_create( btk_HSDK hsdkA,     /* sdk handle */
76                                                                   const btk_FaceFinderCreateParam* pCreateParamA,
77                                                                   btk_HFaceFinder* hpFaceFinderA )
78 {
79         const char* fNameL = "btk_FaceFinder_create";
80
81         btk_HFaceFinder hFaceFinderL = NULL;
82
83         if( hpFaceFinderA == NULL )                                     return btk_STATUS_INVALID_HANDLE;
84         if( *hpFaceFinderA != NULL )                            return btk_STATUS_INVALID_HANDLE;
85         if( hsdkA == NULL )                                                     return btk_STATUS_INVALID_HANDLE;
86         if( hsdkA->hidE != btk_HID_SDK )                        return btk_STATUS_INVALID_HANDLE;
87         if( pCreateParamA == NULL )                                     return btk_STATUS_INVALID_HANDLE;
88         if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
89
90         hFaceFinderL = ( btk_HFaceFinder )bbs_MemSeg_alloc( &hsdkA->contextE, hsdkA->contextE.memTblE.espArrE[ 0 ], bbs_SIZEOF16( struct btk_FaceFinder ) );
91         if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_ERROR;
92
93         btk_FaceFinder_init( &hsdkA->contextE, hFaceFinderL );
94         if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_ERROR;
95
96         hFaceFinderL->hsdkE = hsdkA;
97
98         if( btk_SDK_paramConsistencyTest( hsdkA, pCreateParamA->pModuleParam, pCreateParamA->moduleParamSize, fNameL ) == btk_STATUS_ERROR ) return btk_STATUS_ERROR;
99
100         if( hsdkA->maxImageWidthE * hsdkA->maxImageHeightE == 0 )
101         {
102                 bbs_Context_pushError( &hsdkA->contextE, 
103                                            bbs_Error_create( bbs_ERR_ERROR, 0, NULL, "%s:\nSDK parameter maxImageWidth or maxImageWidth is 0!\n"
104                                                                                                      "Since SDK version 1.3.0 the maximum image size must be specified when creating the SDK handle.\n"
105                                                                                                                                                  "Set the values in *pCreateParamA when you call function btk_SDK_create.", fNameL ) );
106                 return btk_STATUS_ERROR;
107         }
108
109         bpi_FaceFinderRef_memRead( &hsdkA->contextE,
110                                                            &hFaceFinderL->ffE,
111                                                            hsdkA->maxImageWidthE,
112                                                            hsdkA->maxImageHeightE,
113                                                            pCreateParamA->pModuleParam,
114                                                            &hsdkA->contextE.memTblE );
115
116         if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_ERROR;
117
118         *hpFaceFinderA = hFaceFinderL;
119         hsdkA->refCtrE++;
120
121         return btk_STATUS_OK;
122 }
123
124 /* ------------------------------------------------------------------------- */
125
126 btk_Status btk_FaceFinder_close( btk_HFaceFinder hFaceFinderA )
127 {
128         btk_HSDK hsdkL = NULL;
129         if( hFaceFinderA == NULL )                              return btk_STATUS_INVALID_HANDLE;
130         if( hFaceFinderA->hidE != btk_HID_FF )  return btk_STATUS_INVALID_HANDLE;
131         if( hFaceFinderA->hsdkE == NULL )               return btk_STATUS_INVALID_HANDLE;
132         hsdkL = hFaceFinderA->hsdkE;
133         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
134
135         hsdkL->refCtrE--;
136
137         btk_FaceFinder_exit( &hsdkL->contextE, hFaceFinderA );
138         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
139
140         bbs_MemSeg_free( &hsdkL->contextE, hsdkL->contextE.memTblE.espArrE[ 0 ], hFaceFinderA );
141         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
142
143         return btk_STATUS_OK;
144 }
145
146 /* ------------------------------------------------------------------------- */
147
148 btk_Status btk_FaceFinder_setRange( btk_HFaceFinder hFaceFinderA,
149                                                                     u32 minDistA,
150                                                                         u32 maxDistA )
151 {
152         btk_HSDK hsdkL = NULL;
153         if( hFaceFinderA == NULL )                              return btk_STATUS_INVALID_HANDLE;
154         if( hFaceFinderA->hidE != btk_HID_FF )  return btk_STATUS_INVALID_HANDLE;
155         hsdkL = hFaceFinderA->hsdkE;
156         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
157
158         bpi_FaceFinderRef_setRange( &hsdkL->contextE, &hFaceFinderA->ffE, minDistA, maxDistA );
159         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
160
161         return btk_STATUS_OK;
162 }
163
164 /* ------------------------------------------------------------------------- */
165
166 btk_Status btk_FaceFinder_putDCR( btk_HFaceFinder hFaceFinderA,
167                                                                   btk_HDCR hdcrA )
168 {
169         const char* fNameL = "btk_FaceFinder_putDCR";
170
171         btk_HSDK hsdkL = NULL;
172         if( hFaceFinderA == NULL )                              return btk_STATUS_INVALID_HANDLE;
173         if( hFaceFinderA->hidE != btk_HID_FF )  return btk_STATUS_INVALID_HANDLE;
174         if( hdcrA == NULL )                     return btk_STATUS_INVALID_HANDLE;
175         hsdkL = hFaceFinderA->hsdkE;
176         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
177
178         if( hdcrA->dcrE.imageDataPtrE == NULL )
179         {
180                 bbs_Context_pushError( &hsdkL->contextE,
181                                            bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
182                                                                "%s:\nNo image was assigned to data carrier", fNameL ) );
183         }
184
185         hFaceFinderA->facesE = bpi_FaceFinderRef_putDcr( &hsdkL->contextE,
186                                                                                                      &hFaceFinderA->ffE,
187                                                                                                          &hdcrA->dcrE );
188
189         hFaceFinderA->faceIndexE = 0;
190         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
191
192         return btk_STATUS_OK;
193 }
194
195 /* ------------------------------------------------------------------------- */
196
197 u32 btk_FaceFinder_faces( btk_HFaceFinder hFaceFinderA )
198 {
199         if( hFaceFinderA == NULL )                              return 0;
200         if( hFaceFinderA->hidE != btk_HID_FF )  return 0;
201         return hFaceFinderA->facesE - hFaceFinderA->faceIndexE;
202 }
203
204 /* ------------------------------------------------------------------------- */
205
206 btk_Status btk_FaceFinder_getDCR( btk_HFaceFinder hFaceFinderA,
207                                                                   btk_HDCR hdcrA )
208 {
209         btk_HSDK hsdkL = NULL;
210         if( hFaceFinderA == NULL )                              return btk_STATUS_INVALID_HANDLE;
211         if( hFaceFinderA->hidE != btk_HID_FF )  return btk_STATUS_INVALID_HANDLE;
212         if( hdcrA == NULL )                     return btk_STATUS_INVALID_HANDLE;
213         hsdkL = hFaceFinderA->hsdkE;
214         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
215
216         if( hFaceFinderA->faceIndexE < hFaceFinderA->facesE )
217         {
218                 bpi_FaceFinderRef_getDcr( &hsdkL->contextE,
219                                                                   &hFaceFinderA->ffE,
220                                                                    hFaceFinderA->faceIndexE,
221                                                                   &hdcrA->dcrE );
222
223                 if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
224
225                 hdcrA->dcrE.approvedE = TRUE;
226                 hFaceFinderA->faceIndexE++;
227         }
228         else
229         {
230                 bpi_FaceFinderRef_getDcr( &hsdkL->contextE,
231                                                                   &hFaceFinderA->ffE,
232                                                                   0,
233                                                                   &hdcrA->dcrE );
234                 hdcrA->dcrE.approvedE = FALSE;
235         }
236
237         return btk_STATUS_OK;
238 }
239
240 /* ------------------------------------------------------------------------- */
241
242 btk_Status btk_FaceFinder_process( btk_HFaceFinder hFaceFinderA,
243                                                                    btk_HDCR hdcrA )
244 {
245         const char* fNameL = "btk_FaceFinder_process";
246         int32 confL;
247
248         btk_HSDK hsdkL = NULL;
249         if( hFaceFinderA == NULL )                              return btk_STATUS_INVALID_HANDLE;
250         if( hFaceFinderA->hidE != btk_HID_FF )  return btk_STATUS_INVALID_HANDLE;
251         if( hdcrA == NULL )                                             return btk_STATUS_INVALID_HANDLE;
252         hsdkL = hFaceFinderA->hsdkE;
253         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
254
255         if( hdcrA->dcrE.imageDataPtrE == NULL )
256         {
257                 bbs_Context_pushError( &hsdkL->contextE,
258                                            bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
259                                                                "%s:\nNo image was assigned to data carrier", fNameL ) );
260         }
261
262         confL = bpi_FaceFinderRef_process( &hsdkL->contextE,
263                                                                            &hFaceFinderA->ffE,
264                                                                            &hdcrA->dcrE );
265
266         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
267
268         hdcrA->dcrE.confidenceE = confL;
269         hdcrA->dcrE.approvedE = confL > ( ( int32 )1 << 23 );
270
271         hFaceFinderA->faceIndexE = 0;
272         hFaceFinderA->facesE = 0;
273
274         bts_IdCluster2D_copy( &hsdkL->contextE,
275                                   &hdcrA->dcrE.sdkClusterE,
276                                                   &hdcrA->dcrE.mainClusterE );
277
278         if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
279
280         return btk_STATUS_OK;
281 }
282
283 /* ------------------------------------------------------------------------- */
284
285 /* ========================================================================= */