#define DPM_ALLOWED 1
#define DPM_DISALLOWED 0
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+#define __MMCAMCORDER_RESOURCE_WAIT_TIME 5
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
+
/*---------------------------------------------------------------------------------------
| LOCAL FUNCTION PROTOTYPES: |
g_mutex_init(&(hcamcorder->mtsafe).vcapture_cb_lock);
g_mutex_init(&(hcamcorder->mtsafe).vstream_cb_lock);
g_mutex_init(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+ g_cond_init(&(hcamcorder->mtsafe).resource_cond);
+ g_mutex_init(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
g_mutex_init(&hcamcorder->restart_preview_lock);
g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+ g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
+ g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
g_mutex_clear(&hcamcorder->snd_info.open_mutex);
g_cond_clear(&hcamcorder->snd_info.open_cond);
g_mutex_clear(&(hcamcorder->mtsafe).vcapture_cb_lock);
g_mutex_clear(&(hcamcorder->mtsafe).vstream_cb_lock);
g_mutex_clear(&(hcamcorder->mtsafe).astream_cb_lock);
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+ g_cond_clear(&(hcamcorder->mtsafe).resource_cond);
+ g_mutex_clear(&(hcamcorder->mtsafe).resource_lock);
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
g_mutex_clear(&hcamcorder->snd_info.open_mutex);
g_cond_clear(&hcamcorder->snd_info.open_cond);
if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO_CAPTURE) {
int dpm_camera_state = DPM_ALLOWED;
+#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+ gint64 end_time = 0;
+#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
/* check camera policy from DPM */
if (hcamcorder->dpm_policy) {
_mmcam_dbg_warn("NULL dpm_policy");
}
#ifdef _MMCAMCORDER_MURPHY_SUPPORT
+ hcamcorder->resource_manager.acquire_count = 0;
+
/* prepare resource manager for camera */
ret = _mmcamcorder_resource_manager_prepare(&hcamcorder->resource_manager, MM_CAMCORDER_RESOURCE_TYPE_CAMERA);
if (ret != MM_ERROR_NONE) {
}
/* acquire resources */
+ _MMCAMCORDER_LOCK_RESOURCE(hcamcorder);
+
if (hcamcorder->resource_manager.rset && _mmcamcorder_resource_manager_acquire(&hcamcorder->resource_manager)) {
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+
_mmcam_dbg_err("could not acquire resources");
+
_mmcamcorder_resource_manager_unprepare(&hcamcorder->resource_manager);
goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
}
+
+ if (hcamcorder->resource_manager.acquire_count > 0) {
+ _mmcam_dbg_warn("wait for resource state change");
+
+ /* wait for resource state change */
+ 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");
+ } else {
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
+ _mmcam_dbg_err("timeout");
+ ret = MM_ERROR_RESOURCE_INTERNAL;
+ goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
+ }
+ } else {
+ _mmcam_dbg_log("already all acquired");
+ }
+
+ _MMCAMCORDER_UNLOCK_RESOURCE(hcamcorder);
#endif /* _MMCAMCORDER_MURPHY_SUPPORT */
}
goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
}
+ /* initialize error code */
+ hcamcorder->error_code = MM_ERROR_NONE;
+
ret = hcamcorder->command((MMHandleType)hcamcorder, _MMCamcorder_CMD_COMMIT);
if (ret != MM_ERROR_NONE) {
goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
break;
case GST_MESSAGE_EOS:
{
- _mmcam_dbg_log ("Got EOS from element \"%s\".",
- GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message))));
-
- sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
- mmf_return_val_if_fail(sc, TRUE);
-
- if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
- mmf_return_val_if_fail(sc->info_video, TRUE);
- if (sc->info_video->b_commiting) {
- _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
- }
- } else {
- mmf_return_val_if_fail(sc->info_audio, TRUE);
- if (sc->info_audio->b_commiting) {
- _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
- }
- }
-
- sc->bget_eos = TRUE;
-
+ _mmcam_dbg_err("Got EOS from element \"%s\"... but should not be reached here!",
+ GST_STR_NULL(GST_ELEMENT_NAME(GST_MESSAGE_SRC(message))));
break;
}
case GST_MESSAGE_ERROR:
int capture_done = FALSE;
if (gst_structure_get_int(gst_message_get_structure(message), "capture-done", &capture_done)) {
- sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
- if (sc && sc->info_image) {
+ if (sc->info_image) {
/* play capture sound */
_mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE01, FALSE);
}
}
return GST_BUS_PASS;
+
DROP_MESSAGE:
gst_message_unref(message);
message = NULL;
}
-GstBusSyncReply _mmcamcorder_audio_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
+GstBusSyncReply _mmcamcorder_encode_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
{
GstElement *element = NULL;
GError *err = NULL;
sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
mmf_return_val_if_fail(sc, GST_BUS_PASS);
- if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
+ if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_EOS) {
+ _mmcam_dbg_log("got EOS from pipeline");
+
+ _MMCAMCORDER_LOCK(hcamcorder);
+
+ sc->bget_eos = TRUE;
+ _MMCAMCORDER_SIGNAL(hcamcorder);
+
+ _MMCAMCORDER_UNLOCK(hcamcorder);
+
+ goto DROP_MESSAGE;
+ } else if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
+ _MMCamcorderMsgItem msg;
+
/* parse error message */
gst_message_parse_error(message, &err, &debug_info);
/* set videosrc element to compare */
element = GST_ELEMENT_CAST(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst);
- /* check domain[RESOURCE] and element[VIDEOSRC] */
+ /* check domain[RESOURCE] and element[AUDIOSRC] */
if (err->domain == GST_RESOURCE_ERROR &&
GST_ELEMENT_CAST(message->src) == element) {
- _MMCamcorderMsgItem msg;
-
switch (err->code) {
case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
case GST_RESOURCE_ERROR_OPEN_WRITE:
_mmcam_dbg_err(" error : sc->error_occurs %d", hcamcorder->error_occurs);
- g_error_free(err);
- gst_message_unref(message);
- message = NULL;
+ goto DROP_MESSAGE;
+ default:
+ break;
+ }
+ } else {
+ gboolean b_commiting = FALSE;
- return GST_BUS_DROP;
+ 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);
+
+ switch (err->code) {
+ case GST_RESOURCE_ERROR_WRITE:
+ _mmcam_dbg_err("File write error");
+ hcamcorder->error_code = MM_ERROR_FILE_WRITE;
+ 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);
+
+ msg.id = MM_MESSAGE_CAMCORDER_ERROR;
+ msg.param.code = hcamcorder->error_code;
+
+ _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
+ }
}
+ goto DROP_MESSAGE;
+ }
+
+ if (err) {
g_error_free(err);
+ err = NULL;
}
return GST_BUS_PASS;
+
+DROP_MESSAGE:
+ if (err) {
+ g_error_free(err);
+ err = NULL;
+ }
+
+ gst_message_unref(message);
+ message = NULL;
+
+ return GST_BUS_DROP;
}