Fix Svace issue
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_videorec.c
index 64b0c99..687da30 100644 (file)
@@ -23,7 +23,6 @@
 |  INCLUDE FILES                                                                                                                                               |
 =======================================================================================*/
 #include <gst/allocators/gsttizenmemory.h>
-#include <gst/video/cameracontrol.h>
 #include <gst/app/gstappsrc.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_videorec.h"
@@ -92,20 +91,20 @@ gboolean _mmcamcorder_video_push_buffer(void *handle, GstSample *sample)
                int ret = 0;
                GstClock *clock = NULL;
 
-               MMCAM_LOG_VERBOSE("GST_BUFFER_FLAG_DELTA_UNIT is set : %d",
-                       GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT));
+               MMCAM_LOG_VERBOSE("buffer[%p] - delta flag[%d]",
+                       buffer, GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT));
 
                current_ts = GST_BUFFER_PTS(buffer);
 
                if (info_video->is_first_frame) {
                        /* check first I frame for H.264 stream */
                        if (_mmcamcorder_is_encoded_preview_pixel_format(info_image->preview_format)) {
-                               if (GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT)) {
-                                       MMCAM_LOG_WARNING("NOT key frame.. skip this buffer");
+                               if (!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_HEADER)) {
+                                       MMCAM_LOG_WARNING("No header in buffer");
                                        return TRUE;
-                               } else {
-                                       MMCAM_LOG_WARNING("first key frame");
                                }
+
+                               MMCAM_LOG_WARNING("Got buffer with header");
                        }
 
                        /* set base timestamp */
@@ -119,7 +118,7 @@ gboolean _mmcamcorder_video_push_buffer(void *handle, GstSample *sample)
                                }
                        } else {
                                /* for image capture with encodebin and v4l2src */
-                               if (sc->bencbin_capture && info_image->capturing) {
+                               if (hcamcorder->capture_mode == MM_CAMCORDER_CAPTURE_MODE_ENCODEBIN && info_image->capturing) {
                                        g_mutex_lock(&hcamcorder->task_thread_lock);
                                        MMCAM_LOG_INFO("send signal for sound play");
                                        hcamcorder->task_thread_state = _MMCAMCORDER_TASK_THREAD_STATE_SOUND_SOLO_PLAY_START;
@@ -140,16 +139,11 @@ gboolean _mmcamcorder_video_push_buffer(void *handle, GstSample *sample)
 
                GST_BUFFER_DTS(buffer) = GST_BUFFER_PTS(buffer) = current_ts - info_video->base_video_ts;
 
-               MMCAM_LOG_DEBUG("buffer %p, timestamp %"GST_TIME_FORMAT,
+               MMCAM_LOG_DEBUG("buffer[%p] - timestamp[%"GST_TIME_FORMAT"]",
                        buffer, GST_TIME_ARGS(GST_BUFFER_PTS(buffer)));
 
-               if (info_video->record_dual_stream) {
-                       /* It will NOT INCREASE reference count of buffer */
-                       ret = gst_app_src_push_buffer((GstAppSrc *)element[_MMCAMCORDER_ENCSINK_SRC].gst, buffer);
-               } else {
-                       /* It will INCREASE reference count of buffer */
-                       g_signal_emit_by_name(element[_MMCAMCORDER_ENCSINK_SRC].gst, "push-buffer", buffer, &ret);
-               }
+               /* It will INCREASE reference count of buffer */
+               g_signal_emit_by_name(element[_MMCAMCORDER_ENCSINK_SRC].gst, "push-buffer", buffer, &ret);
 
                MMCAM_LOG_VERBOSE("push buffer result : 0x%x", ret);
 
@@ -241,8 +235,10 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
        MMCAM_LOG_INFO("MMCAM_AUDIO_DISABLE %d, is_modified_rate %d, ved_cb %p",
                sc->audio_disable, sc->is_modified_rate, hcamcorder->vedecision_cb);
 
-       if (sc->is_modified_rate || hcamcorder->vedecision_cb)
+       if (sc->is_modified_rate || hcamcorder->vedecision_cb) {
+               MMCAM_LOG_INFO("audio disabled[prev:%d]", sc->audio_disable);
                sc->audio_disable = TRUE;
+       }
 
        if (sc->audio_disable == FALSE) {
                /* create audiosrc bin */
@@ -264,34 +260,34 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
        if (sc->info_video->use_videoscale) {
                gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst),
                        sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst,
-                       sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst,
+                       sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst,
                        sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE].gst,
-                       sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst,
+                       sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_CAPS].gst,
                        sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst,
                        NULL);
        } else {
                gst_bin_add_many(GST_BIN(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst),
                        sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst,
-                       sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst,
+                       sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst,
                        sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst,
                        NULL);
        }
 
        /* Link each element : appsrc - capsfilter - encodesink bin */
        srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_SRC].gst, "src");
-       sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "sink");
+       sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst, "sink");
        _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
 
-       srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_FILT].gst, "src");
+       srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_CAPS].gst, "src");
        if (sc->info_video->use_videoscale) {
                sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE].gst, "sink");
                _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
 
                srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE].gst, "src");
-               sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst, "sink");
+               sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_CAPS].gst, "sink");
                _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
 
-               srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_FILT].gst, "src");
+               srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_VSCALE_CAPS].gst, "src");
        }
        sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_BIN].gst, "video_sink0");
        _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
@@ -324,21 +320,18 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
                MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                        __mmcamcorder_audioque_dataprobe, hcamcorder);
                gst_object_unref(sinkpad);
-               sinkpad = NULL;
 
                /* for voice mute */
                srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, "src");
                MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                        __mmcamcorder_audio_dataprobe_audio_mute, hcamcorder);
                gst_object_unref(srcpad);
-               srcpad = NULL;
 
                if (sc->encode_element[_MMCAMCORDER_ENCSINK_AENC_QUE].gst) {
                        srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC_QUE].gst, "src");
                        MMCAMCORDER_ADD_EVENT_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                                __mmcamcorder_eventprobe_monitor, hcamcorder);
                        gst_object_unref(srcpad);
-                       srcpad = NULL;
                }
        }
 
@@ -347,7 +340,6 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
                MMCAMCORDER_ADD_EVENT_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                        __mmcamcorder_eventprobe_monitor, hcamcorder);
                gst_object_unref(srcpad);
-               srcpad = NULL;
        }
 
        if (sc->audio_disable) {
@@ -355,7 +347,6 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
                MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                        __mmcamcorder_video_dataprobe_audio_disable, hcamcorder);
                gst_object_unref(sinkpad);
-               sinkpad = NULL;
        }
 
        if (!strcmp(gst_element_rsink_name, "filesink")) {
@@ -363,13 +354,13 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
                MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                        __mmcamcorder_video_dataprobe_encoded, hcamcorder);
                gst_object_unref(srcpad);
-               srcpad = NULL;
 
-               srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "src");
-               MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
-                       __mmcamcorder_audio_dataprobe_check, hcamcorder);
-               gst_object_unref(srcpad);
-               srcpad = NULL;
+               if (sc->audio_disable == FALSE) {
+                       srcpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst, "src");
+                       MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
+                               __mmcamcorder_audio_dataprobe_check, hcamcorder);
+                       gst_object_unref(srcpad);
+               }
        }
 
        sinkpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "sink");
@@ -378,7 +369,6 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
        MMCAMCORDER_ADD_EVENT_PROBE(sinkpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                __mmcamcorder_eventprobe_monitor, hcamcorder);
        gst_object_unref(sinkpad);
-       sinkpad = NULL;
 
        bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst));
 
@@ -386,7 +376,6 @@ int _mmcamcorder_create_recorder_pipeline(MMHandleType handle)
        gst_bus_set_sync_handler(bus, _mmcamcorder_encode_pipeline_bus_sync_callback, (gpointer)hcamcorder, NULL);
 
        gst_object_unref(bus);
-       bus = NULL;
 
        return MM_ERROR_NONE;
 
@@ -429,7 +418,7 @@ int _mmcamcorder_remove_audio_pipeline(MMHandleType handle)
                        This is a typical problem of unref. Even though I unref bin here, it takes much time to finalize each elements.
                        So I clean handles first, make them unref later. Audio recording, however, isn't needed this process.
                        It's because the pipeline of audio recording destroys at the same time,
-                       and '_mmcamcorder_element_release_noti' will perfom removing handle.
+                       and '_mmcamcorder_element_release_noti' will perform removing handle.
                */
                _mmcamcorder_remove_element_handle(handle, (void *)sc->encode_element, _MMCAMCORDER_AUDIOSRC_BIN, _MMCAMCORDER_AUDIOSRC_VOL);
 
@@ -463,14 +452,12 @@ int _mmcamcorder_remove_encode_pipeline(MMHandleType handle)
                if (reqpad) {
                        gst_element_release_request_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, reqpad);
                        gst_object_unref(reqpad);
-                       reqpad = NULL;
                }
 
                reqpad = gst_element_get_static_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "video");
                if (reqpad) {
                        gst_element_release_request_pad(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, reqpad);
                        gst_object_unref(reqpad);
-                       reqpad = NULL;
                }
 
                /* release encode main pipeline */
@@ -482,7 +469,7 @@ int _mmcamcorder_remove_encode_pipeline(MMHandleType handle)
                        This is a typical problem of unref. Even though I unref bin here, it takes much time to finalize each elements.
                        So I clean handles first, make them unref later. Audio recording, however, isn't needed this process.
                        It's because the pipeline of audio recording destroys at the same time,
-                       and '_mmcamcorder_element_release_noti' will perfom removing handle.
+                       and '_mmcamcorder_element_release_noti' will perform removing handle.
                */
                /* _mmcamcorder_remove_element_handle(handle, (void *)sc->encode_element,
                        _MMCAMCORDER_ENCODE_MAIN_PIPE, _MMCAMCORDER_ENCSINK_SINK); */
@@ -566,10 +553,8 @@ int _mmcamcorder_remove_recorder_pipeline(MMHandleType handle)
                while ((gst_msg = gst_bus_pop(bus)) != NULL) {
                        _mmcamcorder_pipeline_cb_message(bus, gst_msg, (gpointer)hcamcorder);
                        gst_message_unref(gst_msg);
-                       gst_msg = NULL;
                }
                gst_object_unref(bus);
-               bus = NULL;
        }
 
        MMCAM_LOG_INFO("done");
@@ -804,7 +789,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                                "PassFirstVideoFrame",
                                &(sc->pass_first_vframe));
 
-                       MMCAM_LOG_INFO("Drop video frame count[%d], Pass fisrt video frame count[%d]",
+                       MMCAM_LOG_INFO("Drop video frame count[%d], Pass first video frame count[%d]",
                                sc->drop_vframe, sc->pass_first_vframe);
 
                        info->record_drop_count = (guint)motion_rate;
@@ -1477,7 +1462,12 @@ static GstPadProbeReturn __mmcamcorder_video_dataprobe_encoded(GstPad *pad, GstP
                return GST_PAD_PROBE_DROP;
        }
 
-       gst_buffer_map(buffer, &mapinfo, GST_MAP_READ);
+       if (!gst_buffer_map(buffer, &mapinfo, GST_MAP_READ)) {
+               MMCAM_LOG_WARNING("map failed : buffer[%p]", buffer);
+               return GST_PAD_PROBE_OK;
+       }
+
+
        buffer_size = mapinfo.size;
        gst_buffer_unmap(buffer, &mapinfo);
 
@@ -1806,12 +1796,15 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_audio_mute(GstPad *pad, G
        if (err != MM_ERROR_NONE) {
                MMCAM_LOG_WARNING("Get attrs fail. (%s:%x)", err_name, err);
                SAFE_FREE(err_name);
-               return err;
+               return GST_PAD_PROBE_OK;
        }
 
        memset(&mapinfo, 0x0, sizeof(GstMapInfo));
 
-       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;
+       }
 
        /* Set audio stream NULL */
        if (volume == 0.0)
@@ -1821,7 +1814,7 @@ static GstPadProbeReturn __mmcamcorder_audio_dataprobe_audio_mute(GstPad *pad, G
                GST_TIME_ARGS(GST_BUFFER_PTS(buffer)), hcamcorder->astream_cb, format, channel, mapinfo.size);
 
        /* CALL audio stream callback */
-       if (hcamcorder->astream_cb && buffer && mapinfo.data && mapinfo.size > 0) {
+       if (hcamcorder->astream_cb) {
                MMCamcorderAudioStreamDataType stream;
 
                if (_mmcamcorder_get_state((MMHandleType)hcamcorder) < MM_CAMCORDER_STATE_PREPARE) {