const char* mm_camcorder_resource_str[MM_CAMCORDER_RESOURCE_MAX] = {
"camera",
- "video_overlay"
+ "video_overlay",
+ "video_encoder"
};
#define MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(x_camcorder_resource_manager) \
int i = 0;
const mrp_res_resource_set_t *rset;
mrp_res_resource_t *resource;
- mmf_camcorder_t* camcorder = NULL;
+ mmf_camcorder_t *hcamcorder = NULL;
+ MMCamcorderResourceManager *resource_manager = (MMCamcorderResourceManager *)user_data;
- if (err != MRP_RES_ERROR_NONE) {
- _mmcam_dbg_err(" - error message received from Murphy, err(0x%x)", err);
- return;
- }
+ mmf_return_if_fail(context);
+ mmf_return_if_fail(resource_manager);
- camcorder = (mmf_camcorder_t*)user_data;
+ hcamcorder = (mmf_camcorder_t *)resource_manager->hcamcorder;
- mmf_return_if_fail((MMHandleType)camcorder);
+ mmf_return_if_fail(hcamcorder);
- _mmcam_dbg_log("enter");
+ _mmcam_dbg_warn("enter - state %d", context->state);
- _MMCAMCORDER_LOCK_RESOURCE(camcorder);
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
switch (context->state) {
case MRP_RES_CONNECTED:
- _mmcam_dbg_log(" - connected to Murphy");
+ _mmcam_dbg_warn(" - connected to Murphy");
if ((rset = mrp_res_list_resources(context)) != NULL) {
mrp_res_string_array_t *resource_names;
resource_names = mrp_res_list_resource_names(rset);
if (!resource_names) {
_mmcam_dbg_err(" - no resources available");
- _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
return;
}
for (i = 0; i < resource_names->num_strings; i++) {
resource = mrp_res_get_resource_by_name(rset, resource_names->strings[i]);
if (resource)
- _mmcam_dbg_log(" - available resource: %s", resource->name);
+ _mmcam_dbg_warn(" - available resource: %s", resource->name);
}
mrp_res_free_string_array(resource_names);
}
- camcorder->resource_manager.is_connected = TRUE;
- _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
+ resource_manager->is_connected = TRUE;
+ _MMCAMCORDER_RESOURCE_SIGNAL(hcamcorder);
break;
case MRP_RES_DISCONNECTED:
- _mmcam_dbg_log(" - disconnected from Murphy");
- if (camcorder->resource_manager.rset) {
- mrp_res_delete_resource_set(camcorder->resource_manager.rset);
- camcorder->resource_manager.rset = NULL;
+ _mmcam_dbg_err(" - disconnected from Murphy : stop camcorder");
+
+ if (resource_manager->rset) {
+ mrp_res_delete_resource_set(resource_manager->rset);
+ resource_manager->rset = NULL;
}
- if (camcorder->resource_manager.context) {
- mrp_res_destroy(camcorder->resource_manager.context);
- camcorder->resource_manager.context = NULL;
- camcorder->resource_manager.is_connected = FALSE;
+
+ if (resource_manager->context) {
+ mrp_res_destroy(resource_manager->context);
+ resource_manager->context = NULL;
+ resource_manager->is_connected = FALSE;
}
+
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
+ _MMCAMCORDER_LOCK_ASM(hcamcorder);
+
+ /* Stop the camera */
+ __mmcamcorder_force_stop(hcamcorder, _MMCAMCORDER_STATE_CHANGE_BY_RM);
+
+ _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
+
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
break;
}
- _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
- _mmcam_dbg_log("leave");
+ _mmcam_dbg_warn("leave");
return;
}
static void __mmcamcorder_resource_set_state_callback(mrp_res_context_t *cx, const mrp_res_resource_set_t *rs, void *user_data)
{
int i = 0;
- mmf_camcorder_t *camcorder = (mmf_camcorder_t *)user_data;
- mrp_res_resource_t *res;
+ mmf_camcorder_t *hcamcorder = NULL;
+ MMCamcorderResourceManager *resource_manager = (MMCamcorderResourceManager *)user_data;
+ mrp_res_resource_t *res = NULL;
+
+ mmf_return_if_fail(resource_manager && resource_manager->hcamcorder);
+
+ hcamcorder = (mmf_camcorder_t *)resource_manager->hcamcorder;
- mmf_return_if_fail((MMHandleType)camcorder);
+ _mmcam_dbg_warn("start");
- _MMCAMCORDER_LOCK_RESOURCE(camcorder);
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
- if (!mrp_res_equal_resource_set(rs, camcorder->resource_manager.rset)) {
- _mmcam_dbg_warn("- resource set(%p) is not same as this camcorder handle's(%p)", rs, camcorder->resource_manager.rset);
- _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+ if (!mrp_res_equal_resource_set(rs, resource_manager->rset)) {
+ _mmcam_dbg_warn("- resource set(%p) is not same as this handle's(%p)", rs, resource_manager->rset);
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
return;
}
- _mmcam_dbg_log(" - resource set state of camcorder(%p) is changed to [%s]",
- camcorder, __mmcamcorder_resource_state_to_str(rs->state));
+ _mmcam_dbg_log(" - resource set state is changed to [%s]", __mmcamcorder_resource_state_to_str(rs->state));
for (i = 0; i < MM_CAMCORDER_RESOURCE_MAX; i++) {
res = mrp_res_get_resource_by_name(rs, mm_camcorder_resource_str[i]);
if (res == NULL) {
_mmcam_dbg_warn(" -- %s not present in resource set", mm_camcorder_resource_str[i]);
} else {
- _mmcam_dbg_log(" -- resource name [%s] -> [%s]",
+ _mmcam_dbg_warn(" -- resource name [%s] -> [%s]",
res->name, __mmcamcorder_resource_state_to_str(res->state));
if (res->state == MRP_RES_RESOURCE_ACQUIRED) {
- camcorder->resource_manager.acquire_remain--;
+ resource_manager->acquire_remain--;
- if (camcorder->resource_manager.acquire_remain <= 0) {
- _mmcam_dbg_log("send signal - resource acquire done");
- _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
+ if (resource_manager->acquire_remain <= 0) {
+ _mmcam_dbg_warn("send signal - resource acquire done");
+ _MMCAMCORDER_RESOURCE_SIGNAL(hcamcorder);
} else {
_mmcam_dbg_warn("remained acquire count %d",
- camcorder->resource_manager.acquire_remain);
+ resource_manager->acquire_remain);
}
} else if (res->state == MRP_RES_RESOURCE_LOST) {
- camcorder->resource_manager.acquire_remain++;
+ resource_manager->acquire_remain++;
- if (camcorder->resource_manager.acquire_remain >= camcorder->resource_manager.acquire_count) {
- _mmcam_dbg_log("resource release done");
+ if (resource_manager->acquire_remain >= resource_manager->acquire_count) {
+ _mmcam_dbg_warn("resource release done");
- if (camcorder->state > MM_CAMCORDER_STATE_NULL) {
- _mmcam_dbg_log("send resource signal");
- _MMCAMCORDER_RESOURCE_SIGNAL(camcorder);
+ if (hcamcorder->state > MM_CAMCORDER_STATE_NULL) {
+ _mmcam_dbg_warn("send resource signal");
+ _MMCAMCORDER_RESOURCE_SIGNAL(hcamcorder);
} else {
- _mmcam_dbg_log("skip resource signal - state %d", camcorder->state);
+ _mmcam_dbg_warn("skip resource signal - state %d", hcamcorder->state);
}
} else {
_mmcam_dbg_warn("acquired %d, lost %d",
- camcorder->resource_manager.acquire_count,
- camcorder->resource_manager.acquire_remain);
+ resource_manager->acquire_count, resource_manager->acquire_remain);
}
}
}
}
- mrp_res_delete_resource_set(camcorder->resource_manager.rset);
- camcorder->resource_manager.rset = mrp_res_copy_resource_set(rs);
+ mrp_res_delete_resource_set(resource_manager->rset);
+ resource_manager->rset = mrp_res_copy_resource_set(rs);
- _MMCAMCORDER_UNLOCK_RESOURCE(camcorder);
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
+ _mmcam_dbg_warn("done");
return;
}
{
int i = 0;
int current_state = MM_CAMCORDER_STATE_NONE;
- mmf_camcorder_t* camcorder = (mmf_camcorder_t*)user_data;
- mrp_res_resource_t *res;
+ mmf_camcorder_t *hcamcorder = NULL;
+ MMCamcorderResourceManager *resource_manager = (MMCamcorderResourceManager *)user_data;
+ mrp_res_resource_t *res = NULL;
+
+ mmf_return_if_fail(resource_manager && resource_manager->hcamcorder);
- mmf_return_if_fail((MMHandleType)camcorder);
+ hcamcorder = (mmf_camcorder_t *)resource_manager->hcamcorder;
- current_state = _mmcamcorder_get_state((MMHandleType)camcorder);
+ current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
if (current_state <= MM_CAMCORDER_STATE_NONE ||
current_state >= MM_CAMCORDER_STATE_NUM) {
- _mmcam_dbg_err("Abnormal state. Or null handle. (%p, %d)", camcorder, current_state);
+ _mmcam_dbg_err("Abnormal state %d", current_state);
return;
}
- /* set value to inform a status is changed by resource manaer */
- camcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_RM;
+ _mmcam_dbg_warn("enter");
- _MMCAMCORDER_LOCK_ASM(camcorder);
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
- if (!mrp_res_equal_resource_set(rs, camcorder->resource_manager.rset)) {
- _MMCAMCORDER_UNLOCK_ASM(camcorder);
- _mmcam_dbg_warn("- resource set(%p) is not same as this camcorder handle's(%p)", rs, camcorder->resource_manager.rset);
+ if (!mrp_res_equal_resource_set(rs, resource_manager->rset)) {
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+ _mmcam_dbg_warn("- resource set(%p) is not same as this handle's(%p)", rs, resource_manager->rset);
return;
}
- _mmcam_dbg_log(" - resource set state of camcorder(%p) is changed to [%s]",
- camcorder, __mmcamcorder_resource_state_to_str(rs->state));
+ /* set flag for resource release callback */
+ resource_manager->is_release_cb_calling = TRUE;
+
+ _mmcam_dbg_log(" - resource set state is changed to [%s]", __mmcamcorder_resource_state_to_str(rs->state));
for (i = 0; i < MM_CAMCORDER_RESOURCE_MAX; i++) {
res = mrp_res_get_resource_by_name(rs, mm_camcorder_resource_str[i]);
if (res == NULL) {
_mmcam_dbg_warn(" -- %s not present in resource set", mm_camcorder_resource_str[i]);
} else {
- _mmcam_dbg_log(" -- resource name [%s] -> [%s]", res->name, __mmcamcorder_resource_state_to_str(res->state));
+ _mmcam_dbg_warn(" -- resource name [%s] -> [%s]", res->name, __mmcamcorder_resource_state_to_str(res->state));
}
}
- /* Stop the camera */
- __mmcamcorder_force_stop(camcorder);
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
+ _MMCAMCORDER_LOCK_ASM(hcamcorder);
+
+ if (resource_manager->id == MM_CAMCORDER_RESOURCE_ID_MAIN) {
+ /* Stop camera */
+ __mmcamcorder_force_stop(hcamcorder, _MMCAMCORDER_STATE_CHANGE_BY_RM);
+ } else {
+ /* Stop video recording */
+ if (_mmcamcorder_commit((MMHandleType)hcamcorder) != MM_ERROR_NONE) {
+ _mmcam_dbg_err("commit failed, cancel it");
+ _mmcamcorder_cancel((MMHandleType)hcamcorder);
+ }
+ }
+
+ _MMCAMCORDER_UNLOCK_ASM(hcamcorder);
+
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+
+ /* restore flag for resource release callback */
+ resource_manager->is_release_cb_calling = FALSE;
- /* restore value */
- camcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
- _MMCAMCORDER_UNLOCK_ASM(camcorder);
+ _mmcam_dbg_warn("leave");
return;
}
}
resource_manager->rset = mrp_res_create_resource_set(resource_manager->context,
- MRP_APP_CLASS_FOR_CAMCORDER, __mmcamcorder_resource_set_state_callback, (void*)resource_manager->user_data);
+ MRP_APP_CLASS_FOR_CAMCORDER, __mmcamcorder_resource_set_state_callback, (void *)resource_manager);
if (resource_manager->rset == NULL) {
_mmcam_dbg_err(" - could not create resource set");
bool mrp_ret = FALSE;
if (resource_manager->rset) {
- mrp_ret = mrp_res_set_release_callback(resource_manager->rset, __mmcamcorder_resource_release_cb, resource_manager->user_data);
+ mrp_ret = mrp_res_set_release_callback(resource_manager->rset, __mmcamcorder_resource_release_cb, (void *)resource_manager);
if (!mrp_ret) {
_mmcam_dbg_err(" - could not set release callback");
ret = MM_ERROR_RESOURCE_INTERNAL;
return ret;
}
-static gpointer __mmcamcorder_launch_glib_murphy_loop(void *user_data)
+int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager)
{
- MMCamcorderResourceManager *resource_manager= (MMCamcorderResourceManager *)user_data;
+ GMainContext *mrp_ctx = NULL;
+ GMainLoop *mrp_loop = NULL;
- _mmcam_dbg_log("Run mrp_loop");
+ MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
- g_main_loop_run(resource_manager->mrp_loop);
+ _mmcam_dbg_warn("start");
- _mmcam_dbg_log("Murphy glib loop exit");
+ mrp_ctx = g_main_context_new();
+ if (!mrp_ctx) {
+ _mmcam_dbg_err("failed to get create glib context for mrp");
+ return MM_ERROR_RESOURCE_INTERNAL;
+ }
- return NULL;
-}
+ mrp_loop = g_main_loop_new(mrp_ctx, TRUE);
-int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data)
-{
- MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
-
- GMainContext *mrp_ctx = g_main_context_new();
- resource_manager->mrp_loop = g_main_loop_new(mrp_ctx, TRUE);
- resource_manager->mloop = mrp_mainloop_glib_get(resource_manager->mrp_loop);
- resource_manager->starter = g_thread_new(NULL, (GThreadFunc)__mmcamcorder_launch_glib_murphy_loop, resource_manager);
g_main_context_unref(mrp_ctx);
+ mrp_ctx = NULL;
+
+ if (!mrp_loop) {
+ _mmcam_dbg_err("failed to get create glib loop for mrp");
+ return MM_ERROR_RESOURCE_INTERNAL;
+ }
+
+ resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop);
+
+ g_main_loop_unref(mrp_loop);
+ mrp_loop = NULL;
+
if (!resource_manager->mloop) {
_mmcam_dbg_err("failed to get mainloop for mrp");
return MM_ERROR_RESOURCE_INTERNAL;
}
- resource_manager->context = mrp_res_create(resource_manager->mloop, __mmcamcorder_resource_state_callback, user_data);
+ _mmcam_dbg_warn("mloop %p", resource_manager->mloop);
+
+ resource_manager->context = mrp_res_create(resource_manager->mloop, __mmcamcorder_resource_state_callback, (void *)resource_manager);
if (!resource_manager->context) {
_mmcam_dbg_err("could not get context for mrp");
+
mrp_mainloop_destroy(resource_manager->mloop);
resource_manager->mloop = NULL;
+
return MM_ERROR_RESOURCE_INTERNAL;
}
- resource_manager->user_data = user_data;
-
_mmcam_dbg_log("done");
return MM_ERROR_NONE;
}
+
+int _mmcamcorder_resource_wait_for_connection(MMCamcorderResourceManager *resource_manager)
+{
+ int ret = MM_ERROR_NONE;
+ void *hcamcorder = NULL;
+
+ mmf_return_val_if_fail(resource_manager && resource_manager->hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+ hcamcorder = resource_manager->hcamcorder;
+
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+
+ if (resource_manager->is_connected == FALSE) {
+ gint64 end_time = 0;
+
+ /* wait for resource manager connected */
+ _mmcam_dbg_warn("not connected. wait for signal...");
+
+ end_time = g_get_monotonic_time() + (__MMCAMCORDER_RESOURCE_WAIT_TIME * G_TIME_SPAN_SECOND);
+
+ if (_MMCAMCORDER_RESOURCE_WAIT_UNTIL(hcamcorder, end_time)) {
+ _mmcam_dbg_warn("signal received");
+ ret = MM_ERROR_NONE;
+ } else {
+ _mmcam_dbg_err("connection timeout");
+ ret = MM_ERROR_RESOURCE_INTERNAL;
+ }
+ } else {
+ _mmcam_dbg_warn("already connected [%d]", resource_manager->id);
+ }
+
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
+ return ret;
+}
+
+
+int _mmcamcorder_resource_check_connection(MMCamcorderResourceManager *resource_manager)
+{
+ int ret = MM_ERROR_NONE;
+
+ mmf_return_val_if_fail(resource_manager, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+ if (resource_manager->is_connected == FALSE) {
+ _mmcam_dbg_warn("resource manager[%d] disconnected before, try to reconnect", resource_manager->id);
+
+ /* release remained resource */
+ _mmcamcorder_resource_manager_deinit(resource_manager);
+
+ /* init resource manager and wait for connection */
+ ret = _mmcamcorder_resource_manager_init(resource_manager);
+ if (ret != MM_ERROR_NONE) {
+ _mmcam_dbg_err("failed to initialize resource manager[%d]", resource_manager->id);
+ return ret;
+ }
+
+ ret = _mmcamcorder_resource_wait_for_connection(resource_manager);
+ if (ret != MM_ERROR_NONE) {
+ _mmcam_dbg_err("failed to connect resource manager[%d]", resource_manager->id);
+ return ret;
+ }
+ }
+
+ _mmcam_dbg_warn("done[%d]", resource_manager->id);
+
+ return ret;
+}
+
+
int _mmcamcorder_resource_manager_prepare(MMCamcorderResourceManager *resource_manager, MMCamcorderResourceType resource_type)
{
MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
{
MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
+ _mmcam_dbg_warn("rset %p, context %p, mloop %p",
+ resource_manager->rset, resource_manager->context, resource_manager->mloop);
+
if (resource_manager->rset) {
if (resource_manager->rset->state == MRP_RES_RESOURCE_ACQUIRED) {
_mmcam_dbg_warn("resource is still acquired. release...");
if (mrp_res_release_resource_set(resource_manager->rset))
_mmcam_dbg_err("- could not release resource");
}
- _mmcam_dbg_log("delete resource set");
+
+ _mmcam_dbg_warn("delete resource set");
+
mrp_res_delete_resource_set(resource_manager->rset);
resource_manager->rset = NULL;
}
if (resource_manager->context) {
- _mmcam_dbg_log("destroy resource context");
+ _mmcam_dbg_warn("destroy resource context");
+
mrp_res_destroy(resource_manager->context);
resource_manager->context = NULL;
}
- if (resource_manager->mrp_loop) {
- g_main_loop_quit(resource_manager->mrp_loop);
- g_main_loop_unref(resource_manager->mrp_loop);
- resource_manager->mrp_loop = NULL;
- }
-
- if (resource_manager->starter) {
- g_thread_join(resource_manager->starter);
- g_thread_unref(resource_manager->starter);
- resource_manager->starter = NULL;
- }
-
if (resource_manager->mloop) {
- _mmcam_dbg_log("destroy resource mainloop");
+ _mmcam_dbg_warn("destroy resource mainloop");
+
+ mrp_mainloop_quit(resource_manager->mloop, 0);
mrp_mainloop_destroy(resource_manager->mloop);
resource_manager->mloop = NULL;
}
+ _mmcam_dbg_warn("done");
+
return MM_ERROR_NONE;
}