X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_gstcommon.c;h=824350b34717b1e7291e3eb0dc0ef94680a1cede;hb=b807cc4f6b49f13fda0d2457ea3e7454728c8028;hp=317bb6b1020b6ec2d00ed31ae2f9ccd5c0b54dc2;hpb=233e1c443293461ff31edea55bbf2ef6bd31bf0e;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 317bb6b..824350b 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -478,8 +477,10 @@ int _mmcamcorder_create_audiosrc_bin(MMHandleType handle) const char *audiosrc_name = NULL; char *cat_name = NULL; char *stream_type = NULL; - char stream_type_len = 0; + int stream_type_len = 0; int stream_index = 0; + int buffer_interval = 0; + int blocksize = 0; GstCaps *caps = NULL; GstPad *pad = NULL; @@ -562,6 +563,17 @@ int _mmcamcorder_create_audiosrc_bin(MMHandleType handle) /* set audiosrc properties in ini configuration */ _mmcamcorder_conf_set_value_element_property(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, AudiosrcElement); + /* set block size */ + _mmcamcorder_conf_get_value_int((MMHandleType)hcamcorder, hcamcorder->conf_main, + CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT, + "AudioBufferInterval", + &buffer_interval); + + if (_mmcamcorder_get_audiosrc_blocksize(rate, format, channel, buffer_interval, &blocksize)) { + _mmcam_dbg_log("set audiosrc block size %d", blocksize); + MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, "blocksize", blocksize); + } + _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_AUDIOSRC_FILT, "capsfilter", "audiosrc_capsfilter", element_list, err); _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_AUDIOSRC_QUE, "queue", "audiosrc_queue", element_list, err); @@ -1533,7 +1545,7 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_preview(GstPad *pad, GstP GstMapInfo mapinfo; mmf_return_val_if_fail(buffer, GST_PAD_PROBE_DROP); - mmf_return_val_if_fail(gst_buffer_n_memory(buffer) , GST_PAD_PROBE_DROP); + mmf_return_val_if_fail(gst_buffer_n_memory(buffer), GST_PAD_PROBE_DROP); mmf_return_val_if_fail(hcamcorder, GST_PAD_PROBE_DROP); sc = MMF_CAMCORDER_SUBCONTEXT(u_data); @@ -1927,27 +1939,143 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_push_buffer_to_record(Gst } +GstPadProbeReturn __mmcamcorder_muxed_dataprobe(GstPad *pad, GstPadProbeInfo *info, gpointer u_data) +{ + MMCamcorderMuxedStreamDataType stream; + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data); + _MMCamcorderSubContext *sc = NULL; + GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER(info); + GstMapInfo mapinfo; + + mmf_return_val_if_fail(buffer, GST_PAD_PROBE_OK); + mmf_return_val_if_fail(gst_buffer_n_memory(buffer), GST_PAD_PROBE_OK); + mmf_return_val_if_fail(hcamcorder, GST_PAD_PROBE_OK); + + sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); + mmf_return_val_if_fail(sc, GST_PAD_PROBE_OK); + + if (!gst_buffer_map(buffer, &mapinfo, GST_MAP_READ)) { + _mmcam_dbg_warn("map failed : buffer %p", buffer); + return GST_PAD_PROBE_OK; + } + + /* call application callback */ + _MMCAMCORDER_LOCK_MSTREAM_CALLBACK(hcamcorder); + + if (hcamcorder->mstream_cb) { + stream.data = (void *)mapinfo.data; + stream.length = mapinfo.size; + stream.offset = sc->muxed_stream_offset; + hcamcorder->mstream_cb(&stream, hcamcorder->mstream_cb_param); + } + + _MMCAMCORDER_UNLOCK_MSTREAM_CALLBACK(hcamcorder); + + /* calculate current offset */ + sc->muxed_stream_offset += mapinfo.size; + + gst_buffer_unmap(buffer, &mapinfo); + + return GST_PAD_PROBE_OK; +} + + +GstPadProbeReturn __mmcamcorder_eventprobe_monitor(GstPad *pad, GstPadProbeInfo *info, gpointer u_data) +{ + GstEvent *event = GST_PAD_PROBE_INFO_EVENT(info); + mmf_camcorder_t *hcamcorder = NULL; + _MMCamcorderSubContext *sc = NULL; + GstObject *parent = NULL; + + switch (GST_EVENT_TYPE(event)) { + case GST_EVENT_UNKNOWN: + /* upstream events */ + case GST_EVENT_QOS: + case GST_EVENT_SEEK: + case GST_EVENT_NAVIGATION: + case GST_EVENT_LATENCY: + /* downstream serialized events */ + case GST_EVENT_TAG: + case GST_EVENT_BUFFERSIZE: + _mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event)); + break; + case GST_EVENT_SEGMENT: + _mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event)); + + hcamcorder = MMF_CAMCORDER(u_data); + if (!hcamcorder) { + _mmcam_dbg_warn("NULL handle"); + break; + } + + sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder); + if (!sc) { + _mmcam_dbg_warn("NULL sub context"); + break; + } + + if (!sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst) { + _mmcam_dbg_warn("no encoder sink"); + break; + } + + parent = gst_pad_get_parent(pad); + if (!parent) { + _mmcam_dbg_warn("get parent failed"); + break; + } + + if (parent == (GstObject *)sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst) { + const GstSegment *segment; + gst_event_parse_segment(event, &segment); + if (segment->format == GST_FORMAT_BYTES) { + _mmcam_dbg_log("change current offset %llu -> %llu", + sc->muxed_stream_offset, segment->start); + + sc->muxed_stream_offset = (unsigned long long)segment->start; + } + } + + gst_object_unref(parent); + parent = NULL; + break; + case GST_EVENT_EOS: + _mmcam_dbg_warn("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event)); + break; + /* bidirectional events */ + case GST_EVENT_FLUSH_START: + case GST_EVENT_FLUSH_STOP: + _mmcam_dbg_err("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event)); + break; + default: + _mmcam_dbg_log("[%s:%s] gots %s", GST_DEBUG_PAD_NAME(pad), GST_EVENT_TYPE_NAME(event)); + break; + } + + return GST_PAD_PROBE_OK; +} + + int __mmcamcorder_get_amrnb_bitrate_mode(int bitrate) { int result = MM_CAMCORDER_MR475; - if (bitrate < 5150) { + if (bitrate < 5150) result = MM_CAMCORDER_MR475; /*AMR475*/ - } else if (bitrate < 5900) { + else if (bitrate < 5900) result = MM_CAMCORDER_MR515; /*AMR515*/ - } else if (bitrate < 6700) { + else if (bitrate < 6700) result = MM_CAMCORDER_MR59; /*AMR59*/ - } else if (bitrate < 7400) { + else if (bitrate < 7400) result = MM_CAMCORDER_MR67; /*AMR67*/ - } else if (bitrate < 7950) { + else if (bitrate < 7950) result = MM_CAMCORDER_MR74; /*AMR74*/ - } else if (bitrate < 10200) { + else if (bitrate < 10200) result = MM_CAMCORDER_MR795; /*AMR795*/ - } else if (bitrate < 12200) { + else if (bitrate < 12200) result = MM_CAMCORDER_MR102; /*AMR102*/ - } else { + else result = MM_CAMCORDER_MR122; /*AMR122*/ - } return result; } @@ -2043,7 +2171,7 @@ int _mmcamcorder_check_codec_fileformat_compatibility(const char *codec_type, in } else if (!strcmp(codec_type, MMCAM_VIDEO_ENCODER)) { if (codec > MM_VIDEO_CODEC_INVALID && codec < MM_VIDEO_CODEC_NUM && file_format > MM_FILE_FORMAT_INVALID && file_format < MM_FILE_FORMAT_NUM) { - if (videocodec_fileformat_compatibility_table[ codec][file_format] == 0) { + if (videocodec_fileformat_compatibility_table[codec][file_format] == 0) { _mmcam_dbg_err("Video codec[%d] and file format[%d] compatibility FAILED.", codec, file_format); return MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE; } @@ -2136,11 +2264,11 @@ bool _mmcamcorder_set_display_rotation(MMHandleType handle, int display_rotate, !strcmp(videosink_name, "directvideosink")) { MMCAMCORDER_G_OBJECT_SET(sc->element[videosink_index].gst, "rotate", display_rotate); _mmcam_dbg_log("Set display-rotate [%d] done.", display_rotate); - return TRUE; } else { - _mmcam_dbg_warn("videosink[%s] does not support DISPLAY_ROTATION.", videosink_name); - return FALSE; + _mmcam_dbg_warn("[%s] does not support DISPLAY_ROTATION, but no error", videosink_name); } + + return TRUE; } else { _mmcam_dbg_err("Videosink element is null"); return FALSE; @@ -2175,11 +2303,11 @@ bool _mmcamcorder_set_display_flip(MMHandleType handle, int display_flip, int vi !strcmp(videosink_name, "directvideosink")) { MMCAMCORDER_G_OBJECT_SET(sc->element[videosink_index].gst, "flip", display_flip); _mmcam_dbg_log("Set display flip [%d] done.", display_flip); - return TRUE; } else { - _mmcam_dbg_warn("videosink[%s] does not support DISPLAY_FLIP", videosink_name); - return FALSE; + _mmcam_dbg_warn("[%s] does not support DISPLAY_FLIP, but no error", videosink_name); } + + return TRUE; } else { _mmcam_dbg_err("Videosink element is null"); return FALSE; @@ -2275,11 +2403,8 @@ bool _mmcamcorder_set_videosrc_caps(MMHandleType handle, unsigned int fourcc, in motion_rate, capture_width, capture_height, fps_auto, sc->info_video->video_width, sc->info_video->video_height); - if (motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) { - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps); - } else { - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", 0); - } + MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, + "high-speed-fps", (motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE ? fps : 0)); MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-width", capture_width); MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-height", capture_height); @@ -2732,7 +2857,7 @@ bool _mmcamcorder_set_sound_stream_info(GstElement *element, char *stream_type, "props,media.role=%s, media.parent_id=%d", stream_type, stream_index); - _mmcam_dbg_log("stream type %s, index %d -> [%s]", stream_type, stream_index, stream_props); + _mmcam_dbg_warn("stream type %s, index %d -> [%s]", stream_type, stream_index, stream_props); props = gst_structure_from_string(stream_props, NULL); if (!props) {