Set error code for timeout error
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_gstcommon.c
index 7692784..99d93c0 100644 (file)
@@ -25,7 +25,6 @@
 #include <gst/audio/audio-format.h>
 #include <gst/video/videooverlay.h>
 #include <gst/video/cameracontrol.h>
-#include <gst/wayland/wayland.h>
 
 #include <sys/time.h>
 #include <unistd.h>
@@ -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);
@@ -1285,10 +1297,10 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
 {
        int err = MM_ERROR_NONE;
        int size = 0;
-       int retx = 0;
-       int rety = 0;
-       int retwidth = 0;
-       int retheight = 0;
+       int rect_x = 0;
+       int rect_y = 0;
+       int rect_width = 0;
+       int rect_height = 0;
        int visible = 0;
        int rotation = MM_DISPLAY_ROTATION_NONE;
        int flip = MM_FLIP_NONE;
@@ -1324,10 +1336,10 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
 
        /* Get video display information */
        err = mm_camcorder_get_attributes(handle, &err_name,
-               MMCAM_DISPLAY_RECT_X, &retx,
-               MMCAM_DISPLAY_RECT_Y, &rety,
-               MMCAM_DISPLAY_RECT_WIDTH, &retwidth,
-               MMCAM_DISPLAY_RECT_HEIGHT, &retheight,
+               MMCAM_DISPLAY_RECT_X, &rect_x,
+               MMCAM_DISPLAY_RECT_Y, &rect_y,
+               MMCAM_DISPLAY_RECT_WIDTH, &rect_width,
+               MMCAM_DISPLAY_RECT_HEIGHT, &rect_height,
                MMCAM_DISPLAY_ROTATION, &rotation,
                MMCAM_DISPLAY_FLIP, &flip,
                MMCAM_DISPLAY_VISIBLE, &visible,
@@ -1428,12 +1440,17 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
                MMCAMCORDER_G_OBJECT_SET(vsink, "zoom", zoom_level);
 
                if (display_geometry_method == MM_DISPLAY_METHOD_CUSTOM_ROI) {
-                       g_object_set(vsink,
-                               "dst-roi-x", retx,
-                               "dst-roi-y", rety,
-                               "dst-roi-w", retwidth,
-                               "dst-roi-h", retheight,
-                               NULL);
+                       if (!strcmp(videosink_name, "waylandsink")) {
+                           gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(vsink),
+                                       rect_x, rect_y, rect_width, rect_height);
+                       } else {
+                               g_object_set(vsink,
+                                       "dst-roi-x", rect_x,
+                                       "dst-roi-y", rect_y,
+                                       "dst-roi-w", rect_width,
+                                       "dst-roi-h", rect_height,
+                                       NULL);
+                       }
                }
        }
 
@@ -1528,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);
@@ -1827,7 +1844,7 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_push_buffer_to_record(Gst
        /* push buffer in appsrc to encode */
        if (!sc->info_video) {
                _mmcam_dbg_warn("sc->info_video is NULL!!");
-               return FALSE;
+               return GST_PAD_PROBE_DROP;
        }
 
        if (sc->info_video->push_encoding_buffer == PUSH_ENCODING_BUFFER_RUN &&
@@ -1922,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;
 }
@@ -1970,6 +2103,9 @@ int _mmcamcorder_get_eos_message(MMHandleType handle)
                        _mmcam_dbg_log("EOS signal received");
                } else {
                        _mmcam_dbg_err("EOS wait time out");
+
+                       if (hcamcorder->error_code == MM_ERROR_NONE)
+                               hcamcorder->error_code = MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
                }
        } else {
                _mmcam_dbg_log("already got EOS");
@@ -2038,7 +2174,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;
                        }
@@ -2131,11 +2267,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;
@@ -2170,11 +2306,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;
@@ -2270,11 +2406,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);
@@ -2727,7 +2860,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) {