* limitations under the License.
*/
-#include <media_face.h>
+
#include <media_info_private.h>
+#define MAX_SIZE 16
+
static int __media_face_check_media_id(const char *media_id)
{
int ret = MEDIA_CONTENT_ERROR_NONE;
media_content_retvm_if(!STRING_VALID(media_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media_id");
- query_str = sqlite3_mprintf(SELECT_MEDIA_COUNT_FROM_MEDIA_BY_ID, media_id);
- ret = _content_query_prepare(&stmt, query_str, NULL, NULL);
+ /* Get image count */
+ query_str = sqlite3_mprintf(SELECT_IMAGE_COUNT_FROM_MEDIA_BY_ID, media_id);
+ ret = _content_get_result(query_str, &stmt);
SQLITE3_SAFE_FREE(query_str);
media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
- while (sqlite3_step(stmt) == SQLITE_ROW)
+ if (sqlite3_step(stmt) == SQLITE_ROW)
item_count = (int)sqlite3_column_int(stmt, 0);
SQLITE3_FINALIZE(stmt);
return MEDIA_CONTENT_ERROR_NONE;
}
+int media_face_destroy(media_face_h face)
+{
+ media_face_s *_face = (media_face_s*)face;
+
+ media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
+
+ SAFE_FREE(_face->media_id);
+ SAFE_FREE(_face->face_tag);
+ SAFE_FREE(_face);
+
+ return MEDIA_CONTENT_ERROR_NONE;
+}
+
int media_face_clone(media_face_h *dst, media_face_h src)
{
media_face_s *_src = (media_face_s*)src;
media_face_s *_dst = (media_face_s *)calloc(1, sizeof(media_face_s));
media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
- if (STRING_VALID(_src->face_id)) {
- _dst->face_id = strdup(_src->face_id);
- if (_dst->face_id == NULL) {
- media_face_destroy((media_face_h)_dst);
- media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
- return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
- }
- }
-
if (STRING_VALID(_src->media_id)) {
_dst->media_id = strdup(_src->media_id);
if (_dst->media_id == NULL) {
}
}
+ _dst->face_id = _src->face_id;
_dst->face_rect_x = _src->face_rect_x;
_dst->face_rect_y = _src->face_rect_y;
_dst->face_rect_w = _src->face_rect_w;
return MEDIA_CONTENT_ERROR_NONE;
}
-int media_face_destroy(media_face_h face)
+static void __media_face_convert_itoa(int face_id, char **face_strid)
{
- media_face_s *_face = (media_face_s*)face;
+ char buf[MAX_SIZE] = {0, };
- media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
-
- SAFE_FREE(_face->face_id);
- SAFE_FREE(_face->media_id);
- SAFE_FREE(_face->face_tag);
- SAFE_FREE(_face);
-
- return MEDIA_CONTENT_ERROR_NONE;
+ snprintf(buf, MAX_SIZE, "%d", face_id);
+ *face_strid = strndup(buf, strlen(buf));
}
int media_face_get_face_id(media_face_h face, char **face_id)
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
- if (STRING_VALID(_face->face_id)) {
- *face_id = strdup(_face->face_id);
+ if (_face->face_id > 0) {
+ __media_face_convert_itoa(_face->face_id, face_id);
media_content_retvm_if(*face_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "Out of memory");
} else {
*face_id = NULL;
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
ret = __media_face_check_media_id(media_id);
- media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Not exist media_id");
+ media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "media_id does not exist or is not an image");
media_face_s* _face = calloc(1, sizeof(media_face_s));
media_content_retvm_if(_face == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "Out of memory");
{
int ret = MEDIA_CONTENT_ERROR_NONE;
char *query_str = NULL;
- char *face_uuid = NULL;
+ sqlite3_stmt *stmt = NULL;
media_face_s* _face = (media_face_s*)face;
media_content_retvm_if(_face->face_rect_w == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_w");
media_content_retvm_if(_face->face_rect_h == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_h");
- ret = media_svc_generate_uuid(&face_uuid);
- media_content_retvm_if(ret != MS_MEDIA_ERR_NONE, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Fail to generate face_id");
-
- SAFE_FREE(_face->face_id);
- _face->face_id = strdup(face_uuid);
- SAFE_FREE(face_uuid);
-
- query_str = sqlite3_mprintf(INSERT_FACE_TO_FACE, _face->face_id, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation, _face->face_tag);
+ query_str = sqlite3_mprintf(INSERT_FACE_TO_FACE, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation, _face->face_tag);
ret = _content_query_sql(query_str);
SQLITE3_SAFE_FREE(query_str);
+ query_str = sqlite3_mprintf(SELECT_FACE_ID, _face->media_id, _face->face_rect_x, _face->face_rect_y, _face->face_rect_w, _face->face_rect_h, _face->orientation);
+ ret = _content_get_result(query_str, &stmt);
+ SQLITE3_SAFE_FREE(query_str);
+ media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+ if (sqlite3_step(stmt) == SQLITE_ROW)
+ _face->face_id = (int)sqlite3_column_int(stmt, 0);
+
+ SQLITE3_FINALIZE(stmt);
+
+
return ret;
}
media_face_s* _face = (media_face_s*)face;
media_content_retvm_if(face == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
- media_content_retvm_if(_face->face_id == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid face_id");
+ media_content_retvm_if(_face->face_id == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid face_id");
media_content_retvm_if(_face->media_id == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_id");
media_content_retvm_if(_face->face_rect_w == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_w");
media_content_retvm_if(_face->face_rect_h == 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid rect_h");
return ret;
}
+static int __media_face_safe_atoi(const char *buffer, int *si)
+{
+ char *end = NULL;
+ errno = 0;
+ media_content_retvm_if(buffer == NULL || si == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid parameter");
+
+ const long sl = strtol(buffer, &end, 10);
+
+ media_content_retvm_if(end == buffer, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "not a decimal number");
+ media_content_retvm_if('\0' != *end, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "extra characters at end of input: %s", end);
+ media_content_retvm_if((LONG_MIN == sl || LONG_MAX == sl) && (ERANGE == errno), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "out of range of type long");
+ media_content_retvm_if(sl > INT_MAX, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "greater than INT_MAX");
+ media_content_retvm_if(sl < INT_MIN, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "less than INT_MIN");
+
+ *si = (int)sl;
+
+ return MEDIA_CONTENT_ERROR_NONE;
+}
+
int media_face_delete_from_db(const char *face_id)
{
int ret = MEDIA_CONTENT_ERROR_NONE;
char *query_str = NULL;
-
+ int query_face_id = 0;
media_content_retvm_if(!STRING_VALID(face_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid face_id");
- query_str = sqlite3_mprintf(DELETE_FACE_FROM_FACE, face_id);
+ ret = __media_face_safe_atoi(face_id, &query_face_id);
+ media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid face_id");
+
+ /*Update modified_time to 0.. It will restore the deleted face when media_info_start_face_detection() is called */
+ query_str = sqlite3_mprintf(UPDATE_MEDIA_INFO_IN_FACE_SCAN_LIST, query_face_id);
+ ret = _content_query_sql(query_str);
+ SQLITE3_SAFE_FREE(query_str);
+ media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+ query_str = sqlite3_mprintf(DELETE_FACE_FROM_FACE, query_face_id);
ret = _content_query_sql(query_str);
SQLITE3_SAFE_FREE(query_str);
return ret;
}
+
+int media_face_get_face_count_from_db(filter_h filter, int *face_count)
+{
+ int ret = MEDIA_CONTENT_ERROR_NONE;
+
+ if (face_count == NULL) {
+ media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+ return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = _media_db_get_group_count(filter, MEDIA_GROUP_FACE, face_count);
+
+ return ret;
+}
+
+int media_face_foreach_face_from_db(filter_h filter, media_face_cb callback, void *user_data)
+{
+ int ret = MEDIA_CONTENT_ERROR_NONE;
+
+ media_content_retvm_if(callback == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid paramter");
+
+ ret = _media_db_get_face(NULL, filter, callback, user_data);
+
+ return ret;
+}