X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_audiorec.c;h=ca5dd3026852641dee9b19229eb26d0260b5f977;hb=HEAD;hp=70eb27ad82a4d2561632968895c7baada0963366;hpb=233e1c443293461ff31edea55bbf2ef6bd31bf0e;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_audiorec.c b/src/mm_camcorder_audiorec.c index 70eb27a..9c14bcc 100644 --- a/src/mm_camcorder_audiorec.c +++ b/src/mm_camcorder_audiorec.c @@ -30,16 +30,14 @@ /*--------------------------------------------------------------------------------------- | 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_RETRIAL_COUNT 10 -#define _MMCAMCORDER_FRAME_WAIT_TIME 200000 /* micro second */ +#define _MMCAMCORDER_AUDIO_MINIMUM_SPACE ((100*1024) + (5*1024)) +#define _MMCAMCORDER_RETRIAL_COUNT 15 +#define _MMCAMCORDER_FRAME_WAIT_TIME 200000 /* us */ #define _MMCAMCORDER_FREE_SPACE_CHECK_INTERVAL 10 /*--------------------------------------------------------------------------------------- @@ -62,10 +60,12 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle); static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) { int err = MM_ERROR_NONE; - int ret = MM_ERROR_NONE; + int file_name_len = 0; + char *file_name = NULL; const char *aenc_name = NULL; const char *mux_name = NULL; + const char *sink_name = NULL; GstBus *bus = NULL; GstPad *srcpad = NULL; @@ -77,6 +77,7 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) _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); @@ -87,17 +88,17 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) info = (_MMCamcorderAudioInfo *)sc->info_audio; - _mmcam_dbg_log(""); + MMCAM_LOG_INFO(""); mux_elem = _mmcamcorder_get_type_element(handle, MM_CAM_FILE_FORMAT); err = _mmcamcorder_conf_get_value_element_name(mux_elem, &mux_name); if (!mux_name || !strcmp(mux_name, "wavenc")) { /* IF MUX in not chosen then record in raw file */ - _mmcam_dbg_log("Record without muxing."); + MMCAM_LOG_INFO("Record without muxing."); info->bMuxing = FALSE; } else { - _mmcam_dbg_log("Record with mux."); + MMCAM_LOG_INFO("Record with mux."); info->bMuxing = TRUE; } @@ -113,22 +114,43 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder, MM_CAMCORDER_ENCBIN_PROFILE_AUDIO); if (err != MM_ERROR_NONE) return err; + + /* Add and link elements */ + gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, + sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, + NULL); + + srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, "src"); + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, "audio_sink0"); + _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); } else { + err = mm_camcorder_get_attributes(handle, NULL, + MMCAM_TARGET_FILENAME, &file_name, &file_name_len, + NULL); + if (err != MM_ERROR_NONE) { + MMCAM_LOG_ERROR("failed to get filename [0x%x]", err); + err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; + goto pipeline_creation_error; + } + /* without muxing. can't use encodebin. */ aenc_elem = _mmcamcorder_get_type_element(handle, MM_CAM_AUDIO_ENCODER); if (!aenc_elem) { - _mmcam_dbg_err("Fail to get type element"); + MMCAM_LOG_ERROR("Fail to get type element"); err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; goto pipeline_creation_error; } err = _mmcamcorder_conf_get_value_element_name(aenc_elem, &aenc_name); if ((!err) || (!aenc_name)) { - _mmcam_dbg_err("Fail to get element name"); + MMCAM_LOG_ERROR("Fail to get element name"); err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; goto pipeline_creation_error; } + element_list = g_list_append(element_list, &sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN]); + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_AQUE, "queue", NULL, element_list, err); if (strcmp(aenc_name, "wavenc") != 0) @@ -136,58 +158,30 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_AENC, aenc_name, NULL, element_list, err); - _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_SINK, "filesink", NULL, element_list, err); - } + _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); - /* Add and link elements */ - if (info->bMuxing) { - /* IF MUX is indicated create MUX */ - gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), - sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, - NULL); + MMCAM_LOG_INFO("encode sink : %s", sink_name); - srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, "src"); - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, "audio_sink0"); - _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); - } else { - /* IF MUX in not chosen then record in raw amr file */ - if (!strcmp(aenc_name, "wavenc")) { - gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), - sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, - NULL); + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_SINK, sink_name, NULL, element_list, err); - ret = _MM_GST_ELEMENT_LINK_MANY(sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, - NULL); - if (!ret) { - err = MM_ERROR_CAMCORDER_GST_LINK; - goto pipeline_creation_error; - } - } else { - gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), - sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_CONV].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, - NULL); + _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, sink_elem); - ret = _MM_GST_ELEMENT_LINK_MANY(sc->encode_element[_MMCAMCORDER_AUDIOSRC_BIN].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AQUE].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_CONV].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, - sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, - NULL); - if (!ret) { - err = MM_ERROR_CAMCORDER_GST_LINK; - goto pipeline_creation_error; - } + /* add elements to encode pipeline */ + if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst), element_list)) { + MMCAM_LOG_ERROR("add encode elements error."); + err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; + goto pipeline_creation_error; + } + + /* link elements */ + if (!_mmcamcorder_link_elements(element_list)) { + MMCAM_LOG_ERROR("encode element link error."); + err = MM_ERROR_CAMCORDER_GST_LINK; + goto pipeline_creation_error; } } @@ -201,13 +195,23 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle) 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; - bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst)); + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "sink"); + MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_AUDIOREC, + __mmcamcorder_muxed_dataprobe, hcamcorder); + MMCAMCORDER_ADD_EVENT_PROBE(sinkpad, _MMCAMCORDER_HANDLER_AUDIOREC, + __mmcamcorder_eventprobe_monitor, hcamcorder); + gst_object_unref(sinkpad); + sinkpad = NULL; - /* register message callback */ - hcamcorder->pipeline_cb_event_id = gst_bus_add_watch(bus, (GstBusFunc)_mmcamcorder_pipeline_cb_message, hcamcorder); + bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst)); /* set sync callback */ gst_bus_set_sync_handler(bus, _mmcamcorder_encode_pipeline_bus_sync_callback, hcamcorder, NULL); @@ -278,10 +282,10 @@ _mmcamcorder_destroy_audio_pipeline(MMHandleType handle) info = sc->info_audio; - _mmcam_dbg_log("start"); + MMCAM_LOG_INFO("start"); if (sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst) { - _mmcam_dbg_warn("release audio pipeline"); + MMCAM_LOG_WARNING("release audio pipeline"); _mmcamcorder_gst_set_state(handle, sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst, GST_STATE_NULL); @@ -306,51 +310,17 @@ _mmcamcorder_destroy_audio_pipeline(MMHandleType handle) gst_object_unref(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst); } - _mmcam_dbg_log("done"); + MMCAM_LOG_INFO("done"); return; } -/** - * 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) { int cmd = command; int ret = MM_ERROR_NONE; - int err = 0; - guint64 free_space = 0; char *err_attr_name = NULL; GstElement *pipeline = NULL; @@ -369,7 +339,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst; info = sc->info_audio; - _mmcam_dbg_log(""); + MMCAM_LOG_INFO(""); pipeline = sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst; audioSrc = sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst; @@ -377,11 +347,10 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) case _MMCamcorder_CMD_RECORD: /* check status for resume case */ if (_mmcamcorder_get_state((MMHandleType)hcamcorder) != MM_CAMCORDER_STATE_PAUSED) { + gboolean storage_validity = FALSE; guint imax_size = 0; guint imax_time = 0; - char *temp_filename = NULL; - char *dir_name = NULL; - int file_system_type = 0; + char *target_filename = NULL; int filename_length = 0; int root_directory_length = 0; @@ -394,34 +363,42 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) MMCAM_TARGET_MAX_SIZE, &imax_size, MMCAM_TARGET_TIME_LIMIT, &imax_time, MMCAM_FILE_FORMAT, &(info->fileformat), - MMCAM_TARGET_FILENAME, &temp_filename, &filename_length, + MMCAM_TARGET_FILENAME, &target_filename, &filename_length, MMCAM_ROOT_DIRECTORY, &hcamcorder->root_directory, &root_directory_length, NULL); if (ret != MM_ERROR_NONE) { - _mmcam_dbg_warn("failed to get attribute. (%s:%x)", err_attr_name, ret); + MMCAM_LOG_WARNING("failed to get attribute. (%s:%x)", err_attr_name, ret); SAFE_FREE(err_attr_name); goto _ERR_CAMCORDER_AUDIO_COMMAND; } - if (temp_filename == NULL) { - _mmcam_dbg_err("filename is not set"); + if (!target_filename && !hcamcorder->mstream_cb) { + MMCAM_LOG_ERROR("filename is not set and muxed stream cb is NULL"); ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT; goto _ERR_CAMCORDER_AUDIO_COMMAND; } - info->filename = g_strdup(temp_filename); - if (!info->filename) { - _mmcam_dbg_err("STRDUP was failed"); - goto _ERR_CAMCORDER_AUDIO_COMMAND; - } + SAFE_G_FREE(info->filename); - _mmcam_dbg_log("Record start : set file name using attribute - %s\n ", info->filename); + if (target_filename) { + info->filename = g_strdup(target_filename); + if (!info->filename) { + MMCAM_LOG_ERROR("STRDUP was failed for [%s]", target_filename); + goto _ERR_CAMCORDER_AUDIO_COMMAND; + } - MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", info->filename); + MMCAM_LOG_INFO("Record start : file name [%s]", info->filename); + + MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", info->filename); + } else { + MMCAM_LOG_INFO("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; sc->ferror_count = 0; sc->bget_eos = FALSE; + sc->muxed_stream_offset = 0; info->filesize = 0; /* set max size */ @@ -436,48 +413,14 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) else info->max_time = ((guint64)imax_time) * 1000; /* to millisecond */ - /* TODO : check free space before recording start */ - dir_name = g_path_get_dirname(info->filename); - if (dir_name) { - err = _mmcamcorder_get_storage_info(dir_name, hcamcorder->root_directory, &hcamcorder->storage_info); - if (err != 0) { - _mmcam_dbg_err("get storage info failed"); - g_free(dir_name); - dir_name = NULL; - return MM_ERROR_OUT_OF_STORAGE; - } - - err = _mmcamcorder_get_freespace(hcamcorder->storage_info.type, &free_space); - - _mmcam_dbg_warn("current space - %s [%" G_GUINT64_FORMAT "]", dir_name, free_space); - - if (_mmcamcorder_get_file_system_type(dir_name, &file_system_type) == 0) { - /* 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, - info->max_size, FAT32_FILE_SYSTEM_MAX_SIZE); - info->max_size = FAT32_FILE_SYSTEM_MAX_SIZE; - } else { - _mmcam_dbg_warn("file system 0x%x, max size %"G_GUINT64_FORMAT, - file_system_type, info->max_size); - } - } else { - _mmcam_dbg_warn("_mmcamcorder_get_file_system_type failed"); - } - - g_free(dir_name); - dir_name = NULL; - } else { - _mmcam_dbg_err("failed to get directory name"); - err = -1; + ret = _mmcamcorder_get_storage_validity(handle, info->filename, + _MMCAMCORDER_AUDIO_MINIMUM_SPACE, &storage_validity); + if (ret != MM_ERROR_NONE || !storage_validity) { + MMCAM_LOG_ERROR("storage validation failed[0x%x]:%d", ret, storage_validity); + return ret; } - if ((err == -1) || free_space <= (_MMCAMCORDER_AUDIO_MINIMUM_SPACE+(5*1024))) { - _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))); - return MM_ERROR_OUT_OF_STORAGE; - } + _mmcamcorder_adjust_recording_max_size(info->filename, &info->max_size); } ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING); @@ -491,8 +434,8 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) GstClock *pipe_clock = NULL; int count = 0; - if (info->b_commiting) { - _mmcam_dbg_warn("now on commiting previous file!!(cmd : %d)", cmd); + if (info->b_committing) { + MMCAM_LOG_WARNING("now on commiting previous file!!(cmd : %d)", cmd); return MM_ERROR_CAMCORDER_CMD_IS_RUNNING; } @@ -500,11 +443,11 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) 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_LOG_ERROR("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_LOG_WARNING("Wait for enough audio frame, retry count[%d], file size is %"G_GUINT64_FORMAT, count, info->filesize); } usleep(_MMCAMCORDER_FRAME_WAIT_TIME); @@ -521,8 +464,8 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) } case _MMCamcorder_CMD_CANCEL: - if (info->b_commiting) { - _mmcam_dbg_warn("now on commiting previous file!!(cmd : %d)", cmd); + if (info->b_committing) { + MMCAM_LOG_WARNING("now on commiting previous file!!(cmd : %d)", cmd); return MM_ERROR_CAMCORDER_CMD_IS_RUNNING; } @@ -530,13 +473,18 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) 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); + + /* Reconstruct audio encoding pipeline, + because some muxer(ex:avmux_amr) should be created newly for next recording after cancel. + Otherwise, it returns error when start next recording. */ + _mmcamcorder_destroy_audio_pipeline(handle); + ret = _mmcamcorder_create_audio_pipeline(handle); sc->pipeline_time = 0; sc->pause_time = 0; @@ -544,7 +492,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) sc->isMaxtimePausing = FALSE; if (info->filename) { - _mmcam_dbg_log("file delete(%s)", info->filename); + MMCAM_LOG_INFO("file delete(%s)", info->filename); unlink(info->filename); SAFE_G_FREE(info->filename); } @@ -553,60 +501,67 @@ _mmcamcorder_audio_command(MMHandleType handle, int command) case _MMCamcorder_CMD_COMMIT: { int count = 0; + guint64 free_space = 0; + MMCAM_LOG_INFO("_MMCamcorder_CMD_COMMIT"); - _mmcam_dbg_log("_MMCamcorder_CMD_COMMIT"); - - if (info->b_commiting) { - _mmcam_dbg_warn("now on commiting previous file!!(cmd : %d)", cmd); + if (info->b_committing) { + MMCAM_LOG_WARNING("now on commiting previous file!!(cmd : %d)", cmd); return MM_ERROR_CAMCORDER_CMD_IS_RUNNING; } else { - _mmcam_dbg_log("_MMCamcorder_CMD_COMMIT : start"); - info->b_commiting = TRUE; + MMCAM_LOG_INFO("_MMCamcorder_CMD_COMMIT : start"); + info->b_committing = TRUE; } for (count = 0 ; count <= _MMCAMCORDER_RETRIAL_COUNT ; count++) { 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); - info->b_commiting = FALSE; + MMCAM_LOG_ERROR("Commit fail, waited 200 ms, but file size is %"G_GUINT64_FORMAT, info->filesize); + info->b_committing = FALSE; return MM_ERROR_CAMCORDER_INVALID_CONDITION; } else { - _mmcam_dbg_warn("Waiting for enough audio frame, re-count[%d], file size is %lld", + MMCAM_LOG_WARNING("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_LOG_WARNING("_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"); - info->b_commiting = FALSE; + MMCAM_LOG_ERROR("send EOS failed"); + info->b_committing = FALSE; ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_CAMCORDER_AUDIO_COMMAND; } - _mmcam_dbg_log("send EOS done"); + MMCAM_LOG_INFO("send EOS done"); /* for pause -> commit case */ if (_mmcamcorder_get_state((MMHandleType)hcamcorder) == MM_CAMCORDER_STATE_PAUSED) { ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING); if (ret != MM_ERROR_NONE) { - info->b_commiting = FALSE; + info->b_committing = FALSE; goto _ERR_CAMCORDER_AUDIO_COMMAND; } } } else { - _mmcam_dbg_err("No audio stream source"); - info->b_commiting = FALSE; + MMCAM_LOG_ERROR("No audio stream source"); + info->b_committing = FALSE; ret = MM_ERROR_CAMCORDER_INTERNAL; goto _ERR_CAMCORDER_AUDIO_COMMAND; } /* wait until finishing EOS */ - _mmcam_dbg_log("Start to wait EOS"); + MMCAM_LOG_INFO("Start to wait EOS"); if ((ret = _mmcamcorder_get_eos_message(handle)) != MM_ERROR_NONE) { - info->b_commiting = FALSE; + info->b_committing = FALSE; goto _ERR_CAMCORDER_AUDIO_COMMAND; } break; @@ -646,7 +601,7 @@ int _mmcamcorder_audio_handle_eos(MMHandleType handle) mmf_return_val_if_fail(sc, FALSE); mmf_return_val_if_fail(sc->info_audio, FALSE); - _mmcam_dbg_err(""); + MMCAM_LOG_ERROR(""); info = sc->info_audio; @@ -654,15 +609,11 @@ int _mmcamcorder_audio_handle_eos(MMHandleType handle) err = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY); if (err != MM_ERROR_NONE) - _mmcam_dbg_warn("Failed:_MMCamcorder_CMD_COMMIT:GST_STATE_READY. err[%x]", err); + MMCAM_LOG_WARNING("Failed:_MMCamcorder_CMD_COMMIT:GST_STATE_READY. err[%x]", err); /* Send recording report message to application */ msg.id = MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED; - report = (MMCamRecordingReport*) g_malloc(sizeof(MMCamRecordingReport)); - if (!report) { - _mmcam_dbg_err("Recording report fail(%s). Out of memory.", info->filename); - return FALSE; - } + report = (MMCamRecordingReport *)g_malloc(sizeof(MMCamRecordingReport)); /* START TAG HERE */ /* MM_AUDIO_CODEC_AAC + MM_FILE_FORMAT_MP4 */ @@ -675,11 +626,10 @@ int _mmcamcorder_audio_handle_eos(MMHandleType handle) _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); @@ -690,9 +640,9 @@ int _mmcamcorder_audio_handle_eos(MMHandleType handle) SAFE_G_FREE(info->filename); - _mmcam_dbg_err("_MMCamcorder_CMD_COMMIT : end"); + MMCAM_LOG_ERROR("_MMCamcorder_CMD_COMMIT : end"); - info->b_commiting = FALSE; + info->b_committing = FALSE; return TRUE; } @@ -743,7 +693,7 @@ __mmcamcorder_get_decibel(unsigned char* raw, int size, MMCamcorderAudioFormat f } /* - _mmcam_dbg_log("size[%d],depthByte[%d],count[%d],rms[%f],db[%f]", + MMCAM_LOG_INFO("size[%d],depthByte[%d],count[%d],rms[%f],db[%f]", size, depthByte, count, rms, db); */ @@ -755,6 +705,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_voicerecorder(GstPad *pad { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data); double volume = 0.0; + int current_state = MM_CAMCORDER_STATE_NONE; int format = 0; int channel = 0; float curdcb = 0.0; @@ -766,6 +717,12 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_voicerecorder(GstPad *pad mmf_return_val_if_fail(hcamcorder, GST_PAD_PROBE_OK); + current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder); + if (current_state < MM_CAMCORDER_STATE_PREPARE) { + MMCAM_LOG_WARNING("Not ready for stream callback"); + return GST_PAD_PROBE_OK; + } + memset(&mapinfo, 0x0, sizeof(GstMapInfo)); /* Set volume to audio input */ @@ -776,12 +733,15 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_voicerecorder(GstPad *pad NULL); if (err < 0) { - _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, err); + MMCAM_LOG_WARNING("Get attrs fail. (%s:%x)", err_name, err); SAFE_FREE(err_name); - return err; + return GST_PAD_PROBE_OK; } - gst_buffer_map(buffer, &mapinfo, GST_MAP_READWRITE); + if (!gst_buffer_map(buffer, &mapinfo, GST_MAP_READWRITE)) { + MMCAM_LOG_WARNING("map failed : buffer[%p]", buffer); + return GST_PAD_PROBE_OK; + } if (volume == 0) memset(mapinfo.data, 0, mapinfo.size); @@ -793,37 +753,29 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_voicerecorder(GstPad *pad msg.param.rec_volume_dB = curdcb; _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); - /* CALL audio stream callback */ - if ((hcamcorder->astream_cb) && buffer && mapinfo.data && mapinfo.size > 0) { - MMCamcorderAudioStreamDataType stream; + _MMCAMCORDER_LOCK_ASTREAM_CALLBACK(hcamcorder); - if (_mmcamcorder_get_state((MMHandleType)hcamcorder) < MM_CAMCORDER_STATE_PREPARE) { - _mmcam_dbg_warn("Not ready for stream callback"); - gst_buffer_unmap(buffer, &mapinfo); - return GST_PAD_PROBE_OK; - } + MMCAM_LOG_DEBUG("audio stream cb[%p][%"GST_TIME_FORMAT"] - fmt[%d], ch[%d], size[%"G_GSIZE_FORMAT"], dB[%f]", + hcamcorder->astream_cb, GST_TIME_ARGS(GST_BUFFER_PTS(buffer)), format, channel, mapinfo.size, curdcb); - /* - _mmcam_dbg_log("Call audio steramCb, data[%p], format[%d], channel[%d], length[%d], volume_dB[%f]", - GST_BUFFER_DATA(buffer), format, channel, GST_BUFFER_SIZE(buffer), curdcb); - */ + /* CALL audio stream callback */ + if (hcamcorder->astream_cb) { + MMCamcorderAudioStreamDataType stream; stream.data = (void *)mapinfo.data; stream.format = format; stream.channel = channel; - stream.length = mapinfo.size; - stream.timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/1000000); /* nano -> msecond */ + stream.length = (unsigned int)mapinfo.size; + stream.timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); stream.volume_dB = curdcb; - _MMCAMCORDER_LOCK_ASTREAM_CALLBACK(hcamcorder); - - if (hcamcorder->astream_cb) - hcamcorder->astream_cb(&stream, hcamcorder->astream_cb_param); - - _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(hcamcorder); + hcamcorder->astream_cb(&stream, hcamcorder->astream_cb_param); } + _MMCAMCORDER_UNLOCK_ASTREAM_CALLBACK(hcamcorder); + gst_buffer_unmap(buffer, &mapinfo); + return GST_PAD_PROBE_OK; } @@ -852,7 +804,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa audioinfo = sc->info_audio; if (sc->isMaxtimePausing || sc->isMaxsizePausing) { - _mmcam_dbg_warn("isMaxtimePausing[%d],isMaxsizePausing[%d]", + MMCAM_LOG_WARNING("isMaxtimePausing[%d],isMaxsizePausing[%d]", sc->isMaxtimePausing, sc->isMaxsizePausing); return GST_PAD_PROBE_DROP; } @@ -870,7 +822,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa } if (sc->ferror_send) { - _mmcam_dbg_warn("file write error, drop frames"); + MMCAM_LOG_WARNING("file write error, drop frames"); return GST_PAD_PROBE_DROP; } @@ -881,7 +833,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa audioinfo->fileformat == MM_FILE_FORMAT_AAC) ? TRUE : FALSE; if (get_trailer_size) { MMCAMCORDER_G_OBJECT_GET(sc->encode_element[_MMCAMCORDER_ENCSINK_MUX].gst, "expected-trailer-size", &trailer_size); - /*_mmcam_dbg_log("trailer_size %d", trailer_size);*/ + MMCAM_LOG_VERBOSE("trailer_size %"G_GUINT64_FORMAT, trailer_size); } else { trailer_size = 0; /* no trailer */ } @@ -895,7 +847,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa /* check free space */ free_space_ret = _mmcamcorder_get_freespace(hcamcorder->storage_info.type, &free_space); if (free_space_ret != 0) { - _mmcam_dbg_err("Error occured. [%d]", free_space_ret); + MMCAM_LOG_ERROR("Error occurred. [%d]", free_space_ret); if (sc->ferror_count == 2 && sc->ferror_send == FALSE) { sc->ferror_send = TRUE; @@ -914,16 +866,16 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa /* check storage state */ storage_get_state(hcamcorder->storage_info.id, &storage_state); - _mmcam_dbg_warn("storage state %d", storage_state); + MMCAM_LOG_WARNING("storage state %d", storage_state); if (storage_state == STORAGE_STATE_REMOVED || storage_state == STORAGE_STATE_UNMOUNTABLE) { - _mmcam_dbg_err("storage was removed!"); + MMCAM_LOG_ERROR("storage was removed!"); _MMCAMCORDER_LOCK(hcamcorder); if (sc->ferror_send == FALSE) { - _mmcam_dbg_err("OUT_OF_STORAGE error"); + MMCAM_LOG_ERROR("OUT_OF_STORAGE error"); sc->ferror_send = TRUE; @@ -935,7 +887,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); } else { _MMCAMCORDER_UNLOCK(hcamcorder); - _mmcam_dbg_warn("error was already sent"); + MMCAM_LOG_WARNING("error was already sent"); } return GST_PAD_PROBE_DROP; @@ -943,15 +895,14 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa } if (free_space < (guint64)(_MMCAMCORDER_AUDIO_MINIMUM_SPACE + buffer_size + trailer_size)) { - _mmcam_dbg_warn("No more space for recording!!!"); - _mmcam_dbg_warn("Free Space : [%" G_GUINT64_FORMAT "], file size : [%" G_GUINT64_FORMAT "]", + MMCAM_LOG_WARNING("No more space for recording!!!"); + MMCAM_LOG_WARNING("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; @@ -962,7 +913,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa } if (!GST_CLOCK_TIME_IS_VALID(GST_BUFFER_PTS(buffer))) { - _mmcam_dbg_err("Buffer timestamp is invalid, check it"); + MMCAM_LOG_ERROR("Buffer timestamp is invalid, check it"); return GST_PAD_PROBE_DROP; } @@ -978,21 +929,18 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa remained_time = (unsigned long long)((long double)rec_pipe_time * (max_size/current_size)) - rec_pipe_time; } - /*_mmcam_dbg_log("remained time : %u", remained_time);*/ - /* check max size of recorded file */ if (audioinfo->max_size > 0 && audioinfo->max_size < audioinfo->filesize + buffer_size + trailer_size + _MMCAMCORDER_MMS_MARGIN_SPACE) { - _mmcam_dbg_warn("Max size!!! Recording is paused."); - _mmcam_dbg_warn("Max [%" G_GUINT64_FORMAT "], file [%" G_GUINT64_FORMAT "], trailer : [%" G_GUINT64_FORMAT "]", \ + MMCAM_LOG_WARNING("Max size!!! Recording is paused."); + MMCAM_LOG_WARNING("Max [%" G_GUINT64_FORMAT "], file [%" G_GUINT64_FORMAT "], trailer : [%" G_GUINT64_FORMAT "]", \ 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; @@ -1000,7 +948,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa 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_LOG_WARNING("Last filesize sent by message : %"G_GUINT64_FORMAT, audioinfo->filesize + trailer_size); sc->isMaxsizePausing = TRUE; msg.id = MM_MESSAGE_CAMCORDER_MAX_SIZE; @@ -1012,14 +960,13 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa /* check recording time limit and send recording status message */ if (audioinfo->max_time > 0 && rec_pipe_time > audioinfo->max_time) { - _mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \ - rec_pipe_time, audioinfo->max_time); + MMCAM_LOG_WARNING("Current time : [%"GST_TIME_FORMAT"], Maximum time : [%"GST_TIME_FORMAT"]", + GST_TIME_ARGS(GST_BUFFER_PTS(buffer)), GST_TIME_ARGS(audioinfo->max_time * GST_MSECOND)); - 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; @@ -1030,13 +977,17 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstPa } /* send message for recording time and recorded file size */ - if (audioinfo->b_commiting == FALSE) { + if (audioinfo->b_committing == FALSE) { audioinfo->filesize += buffer_size; msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS; msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time; msg.param.recording_status.filesize = (unsigned long long)((audioinfo->filesize + trailer_size) >> 10); msg.param.recording_status.remained_time = remained_time; + + MMCAM_LOG_DEBUG("audio rec[%"GST_TIME_FORMAT"], size[%"G_GUINT64_FORMAT"(trailer:%"G_GUINT64_FORMAT")]", + GST_TIME_ARGS(GST_BUFFER_PTS(buffer)), audioinfo->filesize + trailer_size, trailer_size); + _mmcamcorder_send_message((MMHandleType)hcamcorder, &msg); return GST_PAD_PROBE_OK; @@ -1097,7 +1048,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) f = fopen64(info->filename, "rb+"); if (f == NULL) { strerror_r(errno, err_msg, 128); - _mmcam_dbg_err("file open failed [%s]", err_msg); + MMCAM_LOG_ERROR("file open failed [%s]", err_msg); return FALSE; } @@ -1107,7 +1058,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) if (_mmcamcorder_find_fourcc(f, MMCAM_FOURCC('u', 'd', 't', 'a'), TRUE)) { size_t nread = 0; - _mmcam_dbg_log("find udta container"); + MMCAM_LOG_INFO("find udta container"); /* read size */ if (fseek(f, -8L, SEEK_CUR) != 0) @@ -1119,7 +1070,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) nread = fread(&buf, sizeof(char), sizeof(buf), f); - _mmcam_dbg_log("recorded file fread %d", nread); + MMCAM_LOG_INFO("recorded file fread %zu", nread); udta_size = _mmcamcorder_get_container_size(buf); @@ -1142,7 +1093,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) if (!_mmcamcorder_update_size(f, udta_pos, current_pos)) goto fail; } else { - _mmcam_dbg_log("No udta container"); + MMCAM_LOG_INFO("No udta container"); if (fseek(f, 0, SEEK_END) != 0) goto fail; @@ -1157,7 +1108,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) if (_mmcamcorder_find_fourcc(f, MMCAM_FOURCC('m', 'o', 'o', 'v'), TRUE)) { - _mmcam_dbg_log("found moov container"); + MMCAM_LOG_INFO("found moov container"); if (fseek(f, -8L, SEEK_CUR) != 0) goto fail; @@ -1169,7 +1120,7 @@ static gboolean __mmcamcorder_audio_add_metadata_info_m4a(MMHandleType handle) goto fail; } else { - _mmcam_dbg_err("No 'moov' container"); + MMCAM_LOG_ERROR("No 'moov' container"); goto fail; } @@ -1182,7 +1133,7 @@ fail: return FALSE; ftell_fail: - _mmcam_dbg_err("ftell() returns negative value."); + MMCAM_LOG_ERROR("ftell() returns negative value."); fclose(f); return FALSE; }