X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git;a=blobdiff_plain;f=src%2Fmm_camcorder_internal.c;h=cb9a8f7c50c4631a776201c2f83aa857dfdb7e2b;hp=0ffdb412893bfcd0952999ba31adc89fb73dde7c;hb=d7eada0c4476da4dc8df793c748fe743202d4ba9;hpb=3af0d65cae4a435597cec0137464ccb6569d13c6 diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index 0ffdb41..cb9a8f7 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -71,6 +71,9 @@ static void __mmcamcorder_deinit_configure(mmf_camcorder_t *hcamcorder); static gboolean __mmcamcorder_init_gstreamer(camera_conf *conf); static void __mmcamcorder_get_system_info(mmf_camcorder_t *hcamcorder); +static GstBusSyncReply __mmcamcorder_handle_gst_sync_error(mmf_camcorder_t *hcamcorder, GstMessage *message); +static GstBusSyncReply __mmcamcorder_gst_handle_sync_audio_error(mmf_camcorder_t *hcamcorder, gint err_code); +static GstBusSyncReply __mmcamcorder_gst_handle_sync_others_error(mmf_camcorder_t *hcamcorder, gint err_code); static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *message, GError *error); static gint __mmcamcorder_gst_handle_stream_error(MMHandleType handle, int code, GstMessage *message); static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int code, GstMessage *message); @@ -2983,160 +2986,196 @@ DROP_MESSAGE: } -GstBusSyncReply _mmcamcorder_encode_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data) +static GstBusSyncReply __mmcamcorder_gst_handle_sync_audio_error(mmf_camcorder_t *hcamcorder, gint err_code) { - GstElement *element = NULL; - GError *err = NULL; - gchar *debug_info = NULL; + _MMCamcorderMsgItem msg; - mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data); + if (!hcamcorder) { + _mmcam_dbg_err("NULL handle"); + return GST_BUS_PASS; + } + + switch (err_code) { + case GST_RESOURCE_ERROR_OPEN_READ_WRITE: + case GST_RESOURCE_ERROR_OPEN_WRITE: + _mmcam_dbg_err("audio device [open failed]"); + + /* post error to application */ + hcamcorder->error_occurs = TRUE; + hcamcorder->error_code = MM_ERROR_COMMON_INVALID_PERMISSION; + + msg.id = MM_MESSAGE_CAMCORDER_ERROR; + msg.param.code = hcamcorder->error_code; + + _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); + + _mmcam_dbg_err("error : sc->error_occurs %d", hcamcorder->error_occurs); + + return GST_BUS_DROP; + default: + break; + } + + return GST_BUS_PASS; +} + + +static GstBusSyncReply __mmcamcorder_gst_handle_sync_others_error(mmf_camcorder_t *hcamcorder, gint err_code) +{ + gboolean b_commiting = FALSE; + storage_state_e storage_state = STORAGE_STATE_UNMOUNTABLE; + _MMCamcorderMsgItem msg; _MMCamcorderSubContext *sc = NULL; - mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS); - mmf_return_val_if_fail(message, GST_BUS_PASS); + if (!hcamcorder) { + _mmcam_dbg_err("NULL handle"); + return GST_BUS_PASS; + } sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); mmf_return_val_if_fail(sc, GST_BUS_PASS); - if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_EOS) { - _mmcam_dbg_log("got EOS from pipeline"); + if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { + mmf_return_val_if_fail(sc->info_video, GST_BUS_PASS); + b_commiting = sc->info_video->b_commiting; + } else { + mmf_return_val_if_fail(sc->info_audio, GST_BUS_PASS); + b_commiting = sc->info_audio->b_commiting; + } - _MMCAMCORDER_LOCK(hcamcorder); + _MMCAMCORDER_LOCK(hcamcorder); - sc->bget_eos = TRUE; - _MMCAMCORDER_SIGNAL(hcamcorder); + switch (err_code) { + case GST_RESOURCE_ERROR_WRITE: + storage_get_state(hcamcorder->storage_info.id, &storage_state); + if (storage_state == STORAGE_STATE_REMOVED || + storage_state == STORAGE_STATE_UNMOUNTABLE) { + _mmcam_dbg_err("storage was removed! [storage state %d]", storage_state); + hcamcorder->error_code = MM_ERROR_OUT_OF_STORAGE; + } else { + _mmcam_dbg_err("File write error, storage state %d", storage_state); + hcamcorder->error_code = MM_ERROR_FILE_WRITE; + } + + if (sc->ferror_send == FALSE) { + sc->ferror_send = TRUE; + } else { + _mmcam_dbg_err("error was already sent"); + _MMCAMCORDER_UNLOCK(hcamcorder); + return GST_BUS_DROP; + } + break; + case GST_RESOURCE_ERROR_NO_SPACE_LEFT: + _mmcam_dbg_err("No left space"); + hcamcorder->error_code = MM_MESSAGE_CAMCORDER_NO_FREE_SPACE; + break; + case GST_RESOURCE_ERROR_OPEN_WRITE: + _mmcam_dbg_err("Out of storage"); + hcamcorder->error_code = MM_ERROR_OUT_OF_STORAGE; + break; + case GST_RESOURCE_ERROR_SEEK: + _mmcam_dbg_err("File read(seek)"); + hcamcorder->error_code = MM_ERROR_FILE_READ; + break; + default: + _mmcam_dbg_err("Resource error(%d)", err_code); + hcamcorder->error_code = MM_ERROR_CAMCORDER_GST_RESOURCE; + break; + } + if (b_commiting) { + _MMCAMCORDER_SIGNAL(hcamcorder); + _MMCAMCORDER_UNLOCK(hcamcorder); + } else { _MMCAMCORDER_UNLOCK(hcamcorder); - goto DROP_MESSAGE; - } else if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) { - _MMCamcorderMsgItem msg; + msg.id = MM_MESSAGE_CAMCORDER_ERROR; + msg.param.code = hcamcorder->error_code; - /* parse error message */ - gst_message_parse_error(message, &err, &debug_info); + _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); + } - if (debug_info) { - _mmcam_dbg_err("GST ERROR : %s", debug_info); - g_free(debug_info); - debug_info = NULL; - } + return GST_BUS_DROP; +} - if (!err) { - _mmcam_dbg_warn("failed to parse error message"); - return GST_BUS_PASS; - } - /* set videosrc element to compare */ - element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst); +static GstBusSyncReply __mmcamcorder_handle_gst_sync_error(mmf_camcorder_t *hcamcorder, GstMessage *message) +{ + GError *err = NULL; + gchar *debug_info = NULL; + GstBusSyncReply ret = GST_BUS_PASS; + _MMCamcorderSubContext *sc = NULL; - /* check domain[RESOURCE] and element[AUDIOSRC] */ - if (err->domain == GST_RESOURCE_ERROR && - GST_ELEMENT_CAST(message->src) == element) { - switch (err->code) { - case GST_RESOURCE_ERROR_OPEN_READ_WRITE: - case GST_RESOURCE_ERROR_OPEN_WRITE: - _mmcam_dbg_err("audio device [open failed]"); + if (!message || !hcamcorder) { + _mmcam_dbg_err("NULL message(%p) or handle(%p)", message, hcamcorder); + return GST_BUS_PASS; + } - /* post error to application */ - hcamcorder->error_occurs = TRUE; - hcamcorder->error_code = MM_ERROR_COMMON_INVALID_PERMISSION; + sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); + mmf_return_val_if_fail(sc, GST_BUS_PASS); - msg.id = MM_MESSAGE_CAMCORDER_ERROR; - msg.param.code = hcamcorder->error_code; + /* parse error message */ + gst_message_parse_error(message, &err, &debug_info); - _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); + if (debug_info) { + _mmcam_dbg_err("GST ERROR : %s", debug_info); + g_free(debug_info); + debug_info = NULL; + } - _mmcam_dbg_err(" error : sc->error_occurs %d", hcamcorder->error_occurs); + if (!err) { + _mmcam_dbg_warn("failed to parse error message"); + return GST_BUS_PASS; + } - goto DROP_MESSAGE; - default: - break; - } - } else { - gboolean b_commiting = FALSE; - storage_state_e storage_state = STORAGE_STATE_UNMOUNTABLE; + /* check domain[RESOURCE] and element[AUDIOSRC] */ + if (err->domain == GST_RESOURCE_ERROR && + GST_ELEMENT_CAST(message->src) == GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst)) + ret = __mmcamcorder_gst_handle_sync_audio_error(hcamcorder, err->code); + else + ret = __mmcamcorder_gst_handle_sync_others_error(hcamcorder, err->code); - if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) { - mmf_return_val_if_fail(sc->info_video, GST_BUS_PASS); - b_commiting = sc->info_video->b_commiting; - } else { - mmf_return_val_if_fail(sc->info_audio, GST_BUS_PASS); - b_commiting = sc->info_audio->b_commiting; - } + g_error_free(err); - _MMCAMCORDER_LOCK(hcamcorder); + return ret; +} - switch (err->code) { - case GST_RESOURCE_ERROR_WRITE: - storage_get_state(hcamcorder->storage_info.id, &storage_state); - if (storage_state == STORAGE_STATE_REMOVED || - storage_state == STORAGE_STATE_UNMOUNTABLE) { - _mmcam_dbg_err("storage was removed! [storage state %d]", storage_state); - hcamcorder->error_code = MM_ERROR_OUT_OF_STORAGE; - } else { - _mmcam_dbg_err("File write error, storage state %d", storage_state); - hcamcorder->error_code = MM_ERROR_FILE_WRITE; - } - if (sc->ferror_send == FALSE) { - sc->ferror_send = TRUE; - } else { - _mmcam_dbg_err("error was already sent"); - _MMCAMCORDER_UNLOCK(hcamcorder); - goto DROP_MESSAGE; - } - break; - case GST_RESOURCE_ERROR_NO_SPACE_LEFT: - _mmcam_dbg_err("No left space"); - hcamcorder->error_code = MM_MESSAGE_CAMCORDER_NO_FREE_SPACE; - break; - case GST_RESOURCE_ERROR_OPEN_WRITE: - _mmcam_dbg_err("Out of storage"); - hcamcorder->error_code = MM_ERROR_OUT_OF_STORAGE; - break; - case GST_RESOURCE_ERROR_SEEK: - _mmcam_dbg_err("File read(seek)"); - hcamcorder->error_code = MM_ERROR_FILE_READ; - break; - default: - _mmcam_dbg_err("Resource error(%d)", err->code); - hcamcorder->error_code = MM_ERROR_CAMCORDER_GST_RESOURCE; - break; - } +GstBusSyncReply _mmcamcorder_encode_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data) +{ + GstBusSyncReply ret = GST_BUS_PASS; + GstElement *element = NULL; - if (b_commiting) { - _MMCAMCORDER_SIGNAL(hcamcorder); - _MMCAMCORDER_UNLOCK(hcamcorder); - } else { - _MMCAMCORDER_UNLOCK(hcamcorder); + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data); + _MMCamcorderSubContext *sc = NULL; - msg.id = MM_MESSAGE_CAMCORDER_ERROR; - msg.param.code = hcamcorder->error_code; + mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS); + mmf_return_val_if_fail(message, GST_BUS_PASS); - _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); - } + sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); + mmf_return_val_if_fail(sc, GST_BUS_PASS); - goto DROP_MESSAGE; - } - } + if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_EOS) { + _mmcam_dbg_log("got EOS from pipeline"); - if (err) { - g_error_free(err); - err = NULL; - } + _MMCAMCORDER_LOCK(hcamcorder); - return GST_BUS_PASS; + sc->bget_eos = TRUE; + _MMCAMCORDER_SIGNAL(hcamcorder); -DROP_MESSAGE: - if (err) { - g_error_free(err); - err = NULL; + _MMCAMCORDER_UNLOCK(hcamcorder); + + ret = GST_BUS_DROP; + } else if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) { + ret = __mmcamcorder_handle_gst_sync_error(hcamcorder, message); } - gst_message_unref(message); - message = NULL; + if (ret == GST_BUS_DROP) { + gst_message_unref(message); + message = NULL; + } - return GST_BUS_DROP; + return ret; }