/*---------------------------------------------------------------------------------------
| GLOBAL VARIABLE DEFINITIONS for internal |
---------------------------------------------------------------------------------------*/
-#define MM_CAMCORDER_START_CHANGE_STATE _MMCamcorderStartHelperFunc((void *)hcamcorder)
-#define MM_CAMCORDER_STOP_CHANGE_STATE _MMCamcorderStopHelperFunc((void *)hcamcorder)
+
/*---------------------------------------------------------------------------------------
| LOCAL VARIABLE DEFINITIONS for internal |
---------------------------------------------------------------------------------------*/
#define RESET_PAUSE_TIME 0
-#define _MMCAMCORDER_AUDIO_MINIMUM_SPACE (100*1024)
-#define _MMCAMCORDER_AUDIO_MARGIN_SPACE (1*1024)
+#define _MMCAMCORDER_AUDIO_MINIMUM_SPACE ((100*1024) + (5*1024))
#define _MMCAMCORDER_RETRIAL_COUNT 10
#define _MMCAMCORDER_FRAME_WAIT_TIME 200000 /* micro second */
#define _MMCAMCORDER_FREE_SPACE_CHECK_INTERVAL 10
_MMCamcorderSubContext *sc = NULL;
type_element *aenc_elem = NULL;
type_element *mux_elem = NULL;
+ type_element *sink_elem = NULL;
mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
sc = MMF_CAMCORDER_SUBCONTEXT(handle);
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_AENC, aenc_name, NULL, element_list, err);
- if (file_name)
- sink_name = "filesink";
- else
- sink_name = "fakesink";
+ _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
+ CONFIGURE_CATEGORY_MAIN_RECORD,
+ "RecordsinkElement",
+ &sink_elem);
+ _mmcamcorder_conf_get_value_element_name(sink_elem, &sink_name);
_mmcam_dbg_log("encode sink : %s", sink_name);
_MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_SINK, sink_name, NULL, element_list, err);
+ _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, sink_elem);
+
/* add elements to encode pipeline */
if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), element_list)) {
_mmcam_dbg_err("add encode elements error.");
srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "src");
MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_AUDIOREC,
__mmcamcorder_audio_dataprobe_record, hcamcorder);
+
+ /* for replay gain tag */
+ MMCAMCORDER_ADD_EVENT_PROBE(srcpad, _MMCAMCORDER_HANDLER_AUDIOREC,
+ __mmcamcorder_eventprobe_monitor, hcamcorder);
+
gst_object_unref(srcpad);
srcpad = NULL;
}
-/**
- * This function operates each command on audio mode.
- *
- * @param c [in] Handle of camcorder context.
- * @param command [in] command type received from Multimedia Framework.
- *
- * @return This function returns MM_ERROR_NONE on success, or the other values
- * on error.
- * @remark
- * @see _mmcamcorder_set_functions()
- *
- */
- /* ADDED BY SISO */
-
-
-void* _MMCamcorderStartHelperFunc(void *handle)
-{
- mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
- _mmcamcorder_set_state((MMHandleType)hcamcorder, hcamcorder->target_state);
-
- return NULL;
-}
-
-void* _MMCamcorderStopHelperFunc(void *handle)
-{
- mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
- _mmcamcorder_set_state((MMHandleType)hcamcorder, hcamcorder->target_state);
-
- return NULL;
-}
-
-
int
_mmcamcorder_audio_command(MMHandleType handle, int command)
{
goto _ERR_CAMCORDER_AUDIO_COMMAND;
}
+ SAFE_G_FREE(info->filename);
+
if (temp_filename) {
info->filename = g_strdup(temp_filename);
if (!info->filename) {
- _mmcam_dbg_err("STRDUP was failed");
+ _mmcam_dbg_err("STRDUP was failed for [%s]", temp_filename);
goto _ERR_CAMCORDER_AUDIO_COMMAND;
}
- _mmcam_dbg_log("Record start : set file name using attribute - %s\n ", info->filename);
+ _mmcam_dbg_log("Record start : file name [%s]", info->filename);
MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", info->filename);
+ } else {
+ _mmcam_dbg_log("Recorded data will be written in [%s]", _MMCamcorder_FILENAME_NULL);
+ MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", _MMCamcorder_FILENAME_NULL);
}
sc->ferror_send = FALSE;
/* MSDOS_SUPER_MAGIC : 0x4d44 */
if (file_system_type == MSDOS_SUPER_MAGIC &&
(info->max_size == 0 || info->max_size > FAT32_FILE_SYSTEM_MAX_SIZE)) {
- _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %"G_GUINT64_FORMAT,
+ _mmcam_dbg_warn("FAT32 and too large max[%"G_GUINT64_FORMAT"], set max as %lu",
info->max_size, FAT32_FILE_SYSTEM_MAX_SIZE);
info->max_size = FAT32_FILE_SYSTEM_MAX_SIZE;
} else {
err = -1;
}
- if ((err == -1) || free_space <= (_MMCAMCORDER_AUDIO_MINIMUM_SPACE+(5*1024))) {
+ if (temp_filename &&
+ (err == -1 || free_space <= _MMCAMCORDER_AUDIO_MINIMUM_SPACE)) {
_mmcam_dbg_err("OUT of STORAGE [err:%d or free space [%" G_GUINT64_FORMAT "] is smaller than [%d]",
- err, free_space, (_MMCAMCORDER_AUDIO_MINIMUM_SPACE+(5*1024)));
+ err, free_space, _MMCAMCORDER_AUDIO_MINIMUM_SPACE);
return MM_ERROR_OUT_OF_STORAGE;
}
}
if (info->filesize > 0) {
break;
} else if (count == _MMCAMCORDER_RETRIAL_COUNT) {
- _mmcam_dbg_err("Pause fail, wait 200 ms, but file size is %lld",
+ _mmcam_dbg_err("Pause fail, wait 200 ms, but file size is %"G_GUINT64_FORMAT,
info->filesize);
return MM_ERROR_CAMCORDER_INVALID_CONDITION;
} else {
- _mmcam_dbg_warn("Wait for enough audio frame, retry count[%d], file size is %lld",
+ _mmcam_dbg_warn("Wait for enough audio frame, retry count[%d], file size is %"G_GUINT64_FORMAT,
count, info->filesize);
}
usleep(_MMCAMCORDER_FRAME_WAIT_TIME);
if (ret != MM_ERROR_NONE)
goto _ERR_CAMCORDER_AUDIO_COMMAND;
- if (info->bMuxing) {
+ if (info->bMuxing)
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
- } else {
+ else
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", FALSE);
- }
- _mmcamcorder_gst_set_state(handle, sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, GST_STATE_NULL);
+ _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_NULL);
sc->pipeline_time = 0;
sc->pause_time = 0;
case _MMCamcorder_CMD_COMMIT:
{
int count = 0;
-
+ guint64 free_space = 0;
_mmcam_dbg_log("_MMCamcorder_CMD_COMMIT");
if (info->b_commiting) {
if (info->filesize > 0) {
break;
} else if (count == _MMCAMCORDER_RETRIAL_COUNT) {
- _mmcam_dbg_err("Commit fail, waited 200 ms, but file size is %lld", info->filesize);
+ _mmcam_dbg_err("Commit fail, waited 200 ms, but file size is %"G_GUINT64_FORMAT, info->filesize);
info->b_commiting = FALSE;
return MM_ERROR_CAMCORDER_INVALID_CONDITION;
} else {
- _mmcam_dbg_warn("Waiting for enough audio frame, re-count[%d], file size is %lld",
+ _mmcam_dbg_warn("Waiting for enough audio frame, re-count[%d], file size is %"G_GUINT64_FORMAT,
count, info->filesize);
}
usleep(_MMCAMCORDER_FRAME_WAIT_TIME);
}
+ _mmcamcorder_get_freespace(hcamcorder->storage_info.type, &free_space);
+ if (free_space < _MMCAMCORDER_AUDIO_MINIMUM_SPACE) {
+ _mmcam_dbg_warn("_MMCamcorder_CMD_COMMIT out of storage [%" G_GUINT64_FORMAT "]", free_space);
+ ret = MM_ERROR_OUT_OF_STORAGE;
+ goto _ERR_CAMCORDER_AUDIO_COMMAND;
+ }
+
if (audioSrc) {
if (gst_element_send_event(audioSrc, gst_event_new_eos()) == FALSE) {
_mmcam_dbg_err("send EOS failed");
_mmcamcorder_send_message(handle, &msg);
- if (info->bMuxing) {
+ if (info->bMuxing)
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
- } else {
+ else
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", FALSE);
- }
_mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_NULL);
_mmcam_dbg_warn("Free Space : [%" G_GUINT64_FORMAT "], file size : [%" G_GUINT64_FORMAT "]",
free_space, audioinfo->filesize);
- if (audioinfo->bMuxing) {
+ if (audioinfo->bMuxing)
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
- } else {
+ else
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
- }
sc->isMaxsizePausing = TRUE;
msg.id = MM_MESSAGE_CAMCORDER_NO_FREE_SPACE;
audioinfo->max_size, audioinfo->filesize, trailer_size);
/* just same as pause status. After blocking two queue, this function will not call again. */
- if (audioinfo->bMuxing) {
+ if (audioinfo->bMuxing)
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
- } else {
+ else
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
- }
msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
msg.param.recording_status.remained_time = 0;
_mmcamcorder_send_message((MMHandleType)hcamcorder, &msg);
- _mmcam_dbg_warn("Last filesize sent by message : %d", audioinfo->filesize + trailer_size);
+ _mmcam_dbg_warn("Last filesize sent by message : %"G_GUINT64_FORMAT, audioinfo->filesize + trailer_size);
sc->isMaxsizePausing = TRUE;
msg.id = MM_MESSAGE_CAMCORDER_MAX_SIZE;
_mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \
rec_pipe_time, audioinfo->max_time);
- if (audioinfo->bMuxing) {
+ if (audioinfo->bMuxing)
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
- } else {
+ else
MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
- }
sc->isMaxtimePausing = TRUE;
msg.id = MM_MESSAGE_CAMCORDER_TIME_LIMIT;
nread = fread(&buf, sizeof(char), sizeof(buf), f);
- _mmcam_dbg_log("recorded file fread %d", nread);
+ _mmcam_dbg_log("recorded file fread %zu", nread);
udta_size = _mmcamcorder_get_container_size(buf);