| 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"
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 */
}
} 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;
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);
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 */
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);
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;
}
}
MMCAMCORDER_ADD_EVENT_PROBE(srcpad, _MMCAMCORDER_HANDLER_VIDEOREC,
__mmcamcorder_eventprobe_monitor, hcamcorder);
gst_object_unref(srcpad);
- srcpad = NULL;
}
if (sc->audio_disable) {
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")) {
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");
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));
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;
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);
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 */
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); */
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");
"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;
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);
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)
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) {