From b1811be214bae6b84603c84d20571dd18a1395cb Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Wed, 20 Sep 2017 10:41:10 +0900 Subject: [PATCH 01/16] fix double free - remove g_list first, unexpected remove_message_all function within callback free list item first. so that, FREE after callback cause double free. Signed-off-by: SeokHoon Lee Change-Id: I28790e0d64daa3ecf3de79208d742ec6234041e7 --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_gstdispatch.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 26fb19d..6807f2a 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.16 +Version: 0.0.17 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_gstdispatch.c b/src/mm_streamrecorder_gstdispatch.c index 9ff61cd..8a0cf6a 100644 --- a/src/mm_streamrecorder_gstdispatch.c +++ b/src/mm_streamrecorder_gstdispatch.c @@ -302,6 +302,12 @@ gboolean _mmstreamrecorder_msg_callback(void *data) goto MSG_CALLBACK_DONE; } + _MMSTREAMRECORDER_LOCK((MMHandleType) hstreamrecorder); + if (hstreamrecorder->msg_data) + hstreamrecorder->msg_data = g_list_remove(hstreamrecorder->msg_data, item); + + _MMSTREAMRECORDER_UNLOCK((MMHandleType) hstreamrecorder); + /* _mmstreamrec_dbg_log("msg id:%x, msg_cb:%p, msg_data:%p, item:%p", item->id, hstreamrecorder->msg_cb, hstreamrecorder->msg_data, item); */ _MMSTREAMRECORDER_LOCK_MESSAGE_CALLBACK(hstreamrecorder); @@ -310,12 +316,6 @@ gboolean _mmstreamrecorder_msg_callback(void *data) _MMSTREAMRECORDER_UNLOCK_MESSAGE_CALLBACK(hstreamrecorder); - _MMSTREAMRECORDER_LOCK((MMHandleType) hstreamrecorder); - if (hstreamrecorder->msg_data) - hstreamrecorder->msg_data = g_list_remove(hstreamrecorder->msg_data, item); - - _MMSTREAMRECORDER_UNLOCK((MMHandleType) hstreamrecorder); - MSG_CALLBACK_DONE: /* release allocated memory */ if (item->id == MM_MESSAGE_STREAMRECORDER_VIDEO_CAPTURED || -- 2.7.4 From 7a33e3d60322cc4e662bda8fd7628755b9a7af1c Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Thu, 28 Sep 2017 10:24:42 +0900 Subject: [PATCH 02/16] Delete unused function - delete unused funcion(_mmstreamrecorder_find_fourcc and others) - delete err_attr_name in testsuite, it doesnt need to check. - add err_name check in mm_streamrecorder_recorder Signed-off-by: SeokHoon Lee Change-Id: I77c6babacf1702f7ed7402681a80c1a68fffa15c --- packaging/libmm-streamrecorder.spec | 2 +- src/include/mm_streamrecorder_fileinfo.h | 2 - src/mm_streamrecorder_fileinfo.c | 160 ------------------------------- src/mm_streamrecorder_recorder.c | 33 ++++--- test/mm_streamrecorder_testsuite.c | 7 +- 5 files changed, 25 insertions(+), 179 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 6807f2a..3c1ded6 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.17 +Version: 0.0.18 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/include/mm_streamrecorder_fileinfo.h b/src/include/mm_streamrecorder_fileinfo.h index dfc96a5..7e04c43 100644 --- a/src/include/mm_streamrecorder_fileinfo.h +++ b/src/include/mm_streamrecorder_fileinfo.h @@ -104,7 +104,6 @@ enum MMStreamReorderTagVideoOrientation { tag_fourcc is Four-character-code (FOURCC) */ // READER -gboolean _mmstreamrecorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewind); gboolean _mmstreamrecorder_update_size(FILE *f, gint64 prev_pos, gint64 curr_pos); guint64 _mmstreamrecorder_get_container_size(const guchar *size); @@ -118,7 +117,6 @@ gboolean _mmstreamrecorder_write_udta(FILE *f, _MMStreamRecorderLocationInfo inf // AUDIO FOURCC gboolean _mmstreamrecorder_write_udta_m4a(FILE *f); -gboolean _mmstreamrecorder_audio_add_metadata_info_m4a(MMHandleType handle); #ifdef __cplusplus } diff --git a/src/mm_streamrecorder_fileinfo.c b/src/mm_streamrecorder_fileinfo.c index 61d9968..5b8d780 100644 --- a/src/mm_streamrecorder_fileinfo.c +++ b/src/mm_streamrecorder_fileinfo.c @@ -51,57 +51,6 @@ | GLOBAL FUNCTION DEFINITIONS: | ---------------------------------------------------------------------------*/ -gboolean _mmstreamrecorder_find_fourcc(FILE *f, guint32 tag_fourcc, gboolean do_rewind) -{ - guchar buf[8]; - - if (do_rewind) - rewind(f); - - while (fread(&buf, sizeof(guchar), 8, f) > 0) { - unsigned long long buf_size = 0; - unsigned int buf_fourcc = MMSTREAMRECORDER_FOURCC(buf[4], buf[5], buf[6], buf[7]); - - if (tag_fourcc == buf_fourcc) { - _mmstreamrec_dbg_log("find tag : %c%c%c%c", MMSTREAMRECORDER_FOURCC_ARGS(tag_fourcc)); - return TRUE; - } else if ((buf_fourcc == MMSTREAMRECORDER_FOURCC('m', 'o', 'o', 'v')) && (tag_fourcc != buf_fourcc)) { - if (_mmstreamrecorder_find_fourcc(f, tag_fourcc, FALSE)) - return TRUE; - else - continue; - } else { - _mmstreamrec_dbg_log("skip [%c%c%c%c] tag", MMSTREAMRECORDER_FOURCC_ARGS(buf_fourcc)); - - buf_size = (unsigned long long)_mmstreamrecorder_get_container_size(buf); - buf_size = buf_size - 8; /* include tag */ - - do { - if (buf_size > _MMSTREAMRECORDER_MAX_INT) { - _mmstreamrec_dbg_log("seek %d", _MMSTREAMRECORDER_MAX_INT); - if (fseek(f, _MMSTREAMRECORDER_MAX_INT, SEEK_CUR) != 0) { - _mmstreamrec_dbg_err("fseek() fail"); - return FALSE; - } - - buf_size -= _MMSTREAMRECORDER_MAX_INT; - } else { - _mmstreamrec_dbg_log("seek %d", buf_size); - if (fseek(f, buf_size, SEEK_CUR) != 0) { - _mmstreamrec_dbg_err("fseek() fail"); - return FALSE; - } - break; - } - } while (TRUE); - } - } - - _mmstreamrec_dbg_log("cannot find tag : %c%c%c%c", MMSTREAMRECORDER_FOURCC_ARGS(tag_fourcc)); - - return FALSE; -} - gboolean _mmstreamrecorder_update_composition_matrix(FILE *f, int orientation) { /* for 0 degree */ @@ -239,112 +188,3 @@ gboolean _mmstreamrecorder_write_udta(FILE *f, _MMStreamRecorderLocationInfo inf return TRUE; } - -/* START TAG HERE */ -gboolean _mmstreamrecorder_audio_add_metadata_info_m4a(MMHandleType handle) -{ - FILE *f = NULL; - guchar buf[4]; - guint64 udta_size = 0; - gint64 current_pos = 0; - gint64 moov_pos = 0; - gint64 udta_pos = 0; - char err_msg[128] = { '\0', }; - - _MMStreamRecorderFileInfo *finfo = NULL; - mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); - _MMStreamRecorderSubContext *sc = NULL; - - mmf_return_val_if_fail(hstreamrecorder, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); - sc = MMF_STREAMRECORDER_SUBCONTEXT(handle); - - mmf_return_val_if_fail(sc, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); - mmf_return_val_if_fail(sc->info_file, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); - - finfo = sc->info_file; - - f = fopen(finfo->filename, "rb+"); - if (f == NULL) { - strerror_r(errno, err_msg, 128); - _mmstreamrec_dbg_err("file open failed [%s]", err_msg); - return FALSE; - } - - /* find udta container. - if, there are udta container, write loci box after that - else, make udta container and write loci box. */ - if (_mmstreamrecorder_find_fourcc(f, MMSTREAMRECORDER_FOURCC('u', 'd', 't', 'a'), TRUE)) { - size_t nread = 0; - - _mmstreamrec_dbg_log("find udta container"); - - /* read size */ - if (fseek(f, -8L, SEEK_CUR) != 0) - goto fail; - - udta_pos = ftell(f); - if (udta_pos < 0) - goto ftell_fail; - - nread = fread(&buf, sizeof(char), sizeof(buf), f); - - _mmstreamrec_dbg_log("recorded file fread %d", nread); - - udta_size = _mmstreamrecorder_get_container_size(buf); - - /* goto end of udta and write 'smta' box */ - if (fseek(f, (udta_size - 4L), SEEK_CUR) != 0) - goto fail; - - current_pos = ftell(f); - if (current_pos < 0) - goto ftell_fail; - - if (!_mmstreamrecorder_update_size(f, udta_pos, current_pos)) - goto fail; - } else { - _mmstreamrec_dbg_log("No udta container"); - if (fseek(f, 0, SEEK_END) != 0) - goto fail; - - if (!_mmstreamrecorder_write_udta_m4a(f)) - goto fail; - } - - /* find moov container. - update moov container size. */ - if ((current_pos = ftell(f)) < 0) - goto ftell_fail; - - if (_mmstreamrecorder_find_fourcc(f, MMSTREAMRECORDER_FOURCC('m', 'o', 'o', 'v'), TRUE)) { - - _mmstreamrec_dbg_log("found moov container"); - if (fseek(f, -8L, SEEK_CUR) != 0) - goto fail; - - moov_pos = ftell(f); - if (moov_pos < 0) - goto ftell_fail; - - if (!_mmstreamrecorder_update_size(f, moov_pos, current_pos)) - goto fail; - - } else { - _mmstreamrec_dbg_err("No 'moov' container"); - goto fail; - } - - fclose(f); - return TRUE; - - fail: - fclose(f); - return FALSE; - - ftell_fail: - _mmstreamrec_dbg_err("ftell() returns negative value."); - fclose(f); - return FALSE; -} - -/* END TAG HERE */ diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index 90db571..9e3de20 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -257,18 +257,16 @@ int _mmstreamrecorder_create_recorder_pipeline(MMHandleType handle) sinkpad = NULL; } - if (!strcmp(/*gst_element_rsink_name */"filesink", "filesink")) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder); + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder); + gst_object_unref(srcpad); + srcpad = NULL; + + if (sc->audio_enable == TRUE) { + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder); gst_object_unref(srcpad); srcpad = NULL; - - if (sc->audio_enable == TRUE) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder); - gst_object_unref(srcpad); - srcpad = NULL; - } } bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst)); @@ -375,7 +373,7 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde const char *str_aar = NULL; const char *str_acs = NULL; char *err_name = NULL; - + int ret = MM_ERROR_NONE; GstCaps *caps = NULL; GstPad *pad = NULL; GList *element_list = NULL; @@ -407,7 +405,12 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde finfo = sc->info_file; /* check element availability */ - mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_AUDIO_ENCODER, &audio_enc, MMSTR_AUDIO_CHANNEL, &channel, MMSTR_VIDEO_BITRATE, &v_bitrate, MMSTR_VIDEO_ENCODER, &video_enc, MMSTR_AUDIO_BITRATE, &a_bitrate, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_FILE_FORMAT, &file_format, MMSTR_AUDIO_SAMPLERATE, &audio_samplerate, MMSTR_AUDIO_SOURCE_FORMAT, &audio_src_format, MMSTR_VIDEO_SOURCE_FORMAT, &video_src_format, MMSTR_RECORDER_MODE, &rec_mode, NULL); + ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_AUDIO_ENCODER, &audio_enc, MMSTR_AUDIO_CHANNEL, &channel, MMSTR_VIDEO_BITRATE, &v_bitrate, MMSTR_VIDEO_ENCODER, &video_enc, MMSTR_AUDIO_BITRATE, &a_bitrate, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_FILE_FORMAT, &file_format, MMSTR_AUDIO_SAMPLERATE, &audio_samplerate, MMSTR_AUDIO_SOURCE_FORMAT, &audio_src_format, MMSTR_VIDEO_SOURCE_FORMAT, &video_src_format, MMSTR_RECORDER_MODE, &rec_mode, NULL); + if (ret != MM_ERROR_NONE) { + _mmstreamrec_dbg_err("Get attrs fail. (%s:%x)", err_name, ret); + SAFE_FREE(err_name); + return err; + } _mmstreamrec_dbg_err("audio encoder - %d , video encoder : %d", audio_enc, video_enc); _mmstreamrec_dbg_err("audio channel - %d , video v_bitrate : %d", channel, v_bitrate); @@ -1351,6 +1354,12 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long /* check element availability */ ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_VIDEO_SOURCE_FORMAT, &video_src, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_SOURCE_FORMAT, &video_source_format, NULL); + if (ret != MM_ERROR_NONE) { + _mmstreamrec_dbg_err("Error in mm_streamrecorder_get_attributes (%s:%d)", err_name, ret); + SAFE_FREE(err_name); + return ret; + } + if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst) { /*_mmstreamrec_dbg_log("Buffer Push start , time stamp %ld",timestamp);*/ diff --git a/test/mm_streamrecorder_testsuite.c b/test/mm_streamrecorder_testsuite.c index 5564ff6..06f5462 100644 --- a/test/mm_streamrecorder_testsuite.c +++ b/test/mm_streamrecorder_testsuite.c @@ -984,7 +984,6 @@ static gboolean init(int type) { MMHandleType str_handle = 0; - char *err_attr_name = NULL; int video_codec = MM_VIDEO_CODEC_INVALID; int file_format = MM_FILE_FORMAT_INVALID; int v_bitrate = 0; @@ -1021,12 +1020,12 @@ static gboolean init(int type) /* audio_src_format = 2; */ rec_mode = 0; video_src_format = MM_STREAMRECORDER_INPUT_FORMAT_NV12; - mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name, + mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL, MMSTR_VIDEO_ENABLE, TRUE, MMSTR_AUDIO_ENABLE, FALSE, NULL); - mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name, + mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL, MMSTR_VIDEO_ENCODER, video_codec, /*MMSTR_AUDIO_ENCODER, audio_codec,*/ MMSTR_FILE_FORMAT, file_format, @@ -1041,7 +1040,7 @@ static gboolean init(int type) MMSTR_VIDEO_SOURCE_FORMAT, video_src_format, MMSTR_RECORDER_MODE, rec_mode, NULL); - mm_streamrecorder_set_attributes((MMHandleType)str_handle, &err_attr_name, + mm_streamrecorder_set_attributes((MMHandleType)str_handle, NULL, MMSTR_FILENAME, filename, strlen(filename), NULL); -- 2.7.4 From 6ee3cfd20240b28acf1349e38344e24380f360c1 Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Mon, 9 Apr 2018 18:21:16 +0900 Subject: [PATCH 03/16] Add free code - add g_free (type) for memory leak Signed-off-by: SeokHoon Lee Change-Id: I6a300efef88d5bf50fa0859a6cba39643d5a028f --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_recorder.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 3c1ded6..0cd8cae 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.18 +Version: 0.0.19 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index 9e3de20..75996d0 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -562,8 +562,8 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "acaps", caps); { gchar *type = gst_caps_to_string(caps); - _mmstreamrec_dbg_warn("Set srcpad caps: %s", type); + g_free(type); } gst_caps_unref(caps); caps = NULL; @@ -908,9 +908,8 @@ int _mmstreamrecorder_create_audiosrc_bin(MMHandleType handle) MMSTREAMRECORDER_G_OBJECT_SET((sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_FILT].gst), "caps", caps); { gchar *type = gst_caps_to_string(caps); - _mmstreamrec_dbg_err("_MMSTREAMRECORDER_AUDIOSRC_FILT %s", type); - + g_free(type); } gst_caps_unref(caps); caps = NULL; -- 2.7.4 From 2bb17acd28312accdfff577848e7e6bc85d48b05 Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Tue, 2 Oct 2018 16:04:43 +0900 Subject: [PATCH 04/16] Adding initial structure for unittest - It has only one testcases for skeleton of unittest - It would be enabled by gtest build with '--define "gtests 1" Signed-off-by: SeokHoon Lee Change-Id: Ic0753be99906b17a7edc4bd20a8cdb4471003112 --- Makefile.am | 3 ++ configure.ac | 20 +++++++++++++ packaging/libmm-streamrecorder.spec | 15 ++++++++-- unittest/Makefile.am | 12 ++++++++ unittest/libmm_streamrecorder_unittest.cpp | 45 ++++++++++++++++++++++++++++++ unittest/libmm_streamrecorder_unittest.h | 26 +++++++++++++++++ 6 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 unittest/Makefile.am create mode 100644 unittest/libmm_streamrecorder_unittest.cpp create mode 100644 unittest/libmm_streamrecorder_unittest.h diff --git a/Makefile.am b/Makefile.am index 3839fb0..a4ced02 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,9 @@ ACLOCAL_AMFLAGS='-I m4' SUBDIRS = src test +if IS_TESTS +SUBDIRS += unittest +endif pcfiles = mm-streamrecorder.pc pkgconfigdir = $(libdir)/pkgconfig diff --git a/configure.ac b/configure.ac index 2de17cc..b07c4c7 100644 --- a/configure.ac +++ b/configure.ac @@ -10,6 +10,7 @@ AM_PROG_AR # Checks for programs. AC_PROG_CC +AC_PROG_CXX AC_C_CONST dnl AC_FUNC_MALLOC AC_FUNC_MMAP @@ -22,6 +23,7 @@ AC_HEADER_STDC AC_HEADER_TIME AC_PROG_GCC_TRADITIONAL AC_PROG_LIBTOOL +AC_SUBST(GCC_CXXFLAGS) # Checks for libraries. PKG_CHECK_MODULES(GST, gstreamer-1.0 >= 1.2.0) @@ -56,6 +58,23 @@ PKG_CHECK_MODULES(INIPARSER, iniparser) AC_SUBST(INIPARSER_CFLAGS) AC_SUBST(INIPARSER_LIBS) +AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests], [unittest build]), + [ + case "${enableval}" in + yes) IS_TESTS=yes ;; + no) IS_TESTS=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-tests) ;; + esac + ], +[IS_TESTS=no]) +AM_CONDITIONAL([IS_TESTS], [test "x$IS_TESTS" = "xyes"]) + +AS_IF([test "x$enable_tests" = "xyes"], [ + PKG_CHECK_MODULES(GTESTS, gmock) + AC_SUBST(GTESTS_CFLAGS) + AC_SUBST(GTESTS_LIBS) +]) + # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h memory.h stdlib.h string.h sys/time.h unistd.h]) @@ -77,6 +96,7 @@ AC_CONFIG_FILES([ Makefile src/Makefile test/Makefile +unittest/Makefile mm-streamrecorder.pc ]) AC_OUTPUT diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 0cd8cae..9b15991 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.19 +Version: 0.0.20 Release: 0 Group: Multimedia/Other License: Apache-2.0 @@ -13,6 +13,9 @@ BuildRequires: pkgconfig(gstreamer-base-1.0) BuildRequires: pkgconfig(gstreamer-video-1.0) BuildRequires: pkgconfig(gstreamer-app-1.0) BuildRequires: pkgconfig(iniparser) +%if 0%{?gtests:1} +BuildRequires: pkgconfig(gmock) +%endif %description This library is for making video/audio files with gstreamer @@ -37,7 +40,12 @@ Media Stream Recorder development library export CFLAGS+=" -Wall -Wextra -Wno-array-bounds -Wno-empty-body -Wno-ignored-qualifiers -Wno-unused-parameter -Wshadow -Wwrite-strings -Wswitch-default -Wno-unused-but-set-parameter -Wno-unused-but-set-variable" export CFLAGS+=" -DSYSCONFDIR=\\\"%{_sysconfdir}\\\"" ./autogen.sh -%configure --disable-static +%configure \ +%if 0%{?gtests:1} +--enable-tests \ +%endif +--disable-static + make %{?jobs:-j%jobs} %install @@ -58,6 +66,9 @@ rm -rf %{buildroot} %defattr(-,root,root,-) %{_bindir}/* %{_libdir}/*.so.* +%if 0%{?gtests:1} +%{_bindir}/gtest-libmm-streamrecorder +%endif %files devel diff --git a/unittest/Makefile.am b/unittest/Makefile.am new file mode 100644 index 0000000..26acced --- /dev/null +++ b/unittest/Makefile.am @@ -0,0 +1,12 @@ +bin_PROGRAMS = gtest-libmm-streamrecorder + +gtest_libmm_streamrecorder_SOURCES = libmm_streamrecorder_unittest.cpp + +gtest_libmm_streamrecorder_CXXFLAGS = -I$(top_srcdir)/src/include \ + $(GTESTS_CFLAGS) + +gtest_libmm_streamrecorder_DEPENDENCIES = $(top_srcdir)/src/libmmfstreamrecorder.la + +gtest_libmm_streamrecorder_LDADD = \ + $(GTESTS_LIBS) \ + $(top_srcdir)/src/libmmfstreamrecorder.la diff --git a/unittest/libmm_streamrecorder_unittest.cpp b/unittest/libmm_streamrecorder_unittest.cpp new file mode 100644 index 0000000..eb41236 --- /dev/null +++ b/unittest/libmm_streamrecorder_unittest.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "libmm_streamrecorder_unittest.h" + +using ::testing::InitGoogleTest; +using ::testing::Test; +using ::testing::TestCase; + +class libmm_streamrecorder_Test : public ::testing::Test { + protected: + void SetUp() { + std::cout << "SetUp()" << std::endl; + } + + void TearDown() { + std::cout << "TearDown()" << std::endl; + } +}; + +TEST(libmm_streamrecorderTest, __srecorder_get_fourcc_p1) +{ + EXPECT_EQ(1, 1); +} + +int main(int argc, char **argv) +{ + InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/unittest/libmm_streamrecorder_unittest.h b/unittest/libmm_streamrecorder_unittest.h new file mode 100644 index 0000000..bdc7956 --- /dev/null +++ b/unittest/libmm_streamrecorder_unittest.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LIB_MM_STREAMRECORDER_UNITTEST_H__ +#define __LIB_MM_STREAMRECORDER_UNITTEST_H__ + +#include +#include + +#undef LOG_TAG +#define LOG_TAG "GTEST_LIBMM_STREAMRECORDER" + +#endif /*__LIB_MM_STREAMRECORDER_UNITTEST_H__*/ -- 2.7.4 From 5c08d0e6897174ef26b0ff7fcce7c422dc732cca Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Fri, 2 Nov 2018 16:16:15 +0900 Subject: [PATCH 05/16] Apply new attribute API of libmm-common - Remove dependency of mm_attrs_private.h. - Use new API set in mm_attrs.h instead of those. Change-Id: I235197cfa1d89ea656238709ac25b66ba02af19b Signed-off-by: Sangchul Lee --- src/include/mm_streamrecorder_attribute.h | 23 ++++--- src/include/mm_streamrecorder_internal.h | 1 - src/mm_streamrecorder.c | 1 - src/mm_streamrecorder_attribute.c | 102 +++++++++++++++--------------- 4 files changed, 62 insertions(+), 65 deletions(-) diff --git a/src/include/mm_streamrecorder_attribute.h b/src/include/mm_streamrecorder_attribute.h index 9879e7c..8114b00 100644 --- a/src/include/mm_streamrecorder_attribute.h +++ b/src/include/mm_streamrecorder_attribute.h @@ -27,7 +27,6 @@ ========================================================================================*/ #include #include -#include #include #include "mm_streamrecorder_internal.h" @@ -83,7 +82,7 @@ typedef enum { /*======================================================================================= | TYPE DEFINITIONS | ========================================================================================*/ -typedef bool(*mmf_streamrecorder_commit_func_t) (MMHandleType handle, int attr_idx, const mmf_value_t *value); +typedef bool(*mmf_streamrecorder_commit_func_t) (MMHandleType handle, int attr_idx, const MMAttrsValue *value); /*======================================================================================= | STRUCTURE DEFINITIONS | @@ -208,23 +207,23 @@ int _mmstreamrecorder_get_attribute_info(MMHandleType handle, const char *attr_n * @see * */ -bool _mmstreamrecorder_commit_streamrecorder_attrs(int attr_idx, const char *attr_name, const mmf_value_t *value, void *commit_param); +bool _mmstreamrecorder_commit_streamrecorder_attrs(int attr_idx, const char *attr_name, const MMAttrsValue *value, void *commit_param); -bool _mmstreamrecorder_commit_video_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_video_enable(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_video_encoder(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_video_encoder(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_enable(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_encoder(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_encoder(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_samplingrate(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_samplingrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_bitformat(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_bitformat(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_channel(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_channel(MMHandleType handle, int attr_idx, const MMAttrsValue *value); -bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value); /** * check whether supported or not @@ -235,7 +234,7 @@ bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, c */ bool _mmstreamrecorder_check_supported_attribute(MMHandleType handle, int attr_index); -bool _mmstreamrecorder_commit_video_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmstreamrecorder_commit_video_bitrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value); #ifdef __cplusplus } diff --git a/src/include/mm_streamrecorder_internal.h b/src/include/mm_streamrecorder_internal.h index a29c3cf..61cb31e 100644 --- a/src/include/mm_streamrecorder_internal.h +++ b/src/include/mm_streamrecorder_internal.h @@ -33,7 +33,6 @@ #include #include -#include #include #include "mm_streamrecorder.h" diff --git a/src/mm_streamrecorder.c b/src/mm_streamrecorder.c index ec4c9b6..d2b70b8 100644 --- a/src/mm_streamrecorder.c +++ b/src/mm_streamrecorder.c @@ -27,7 +27,6 @@ #include -#include #include "mm_streamrecorder.h" #include "mm_streamrecorder_internal.h" #include "mm_streamrecorder_attribute.h" diff --git a/src/mm_streamrecorder_attribute.c b/src/mm_streamrecorder_attribute.c index e908d0f..f64b0dd 100644 --- a/src/mm_streamrecorder_attribute.c +++ b/src/mm_streamrecorder_attribute.c @@ -44,7 +44,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_BUFFER_TYPE, /* ID */ (char *)"videobuffer-type", /* Name */ - MMF_VALUE_TYPE_INT, /* Type */ + MM_ATTRS_TYPE_INT, /* Type */ MM_ATTRS_FLAG_RW, /* Flag */ {(void *)MM_STREAMRECORDER_VIDEO_TYPE_TBM_BO}, /* Default value */ MM_ATTRS_VALID_TYPE_INT_RANGE, /* Validity type */ @@ -55,7 +55,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { /* 1 */ {MM_STR_VIDEO_FORMAT, (char *)"videosource-format", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)MM_STREAMRECORDER_INPUT_FORMAT_NV12}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -67,7 +67,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_FRAMERATE, (char *)"video-framerate", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -79,7 +79,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_ENCODER_BITRATE, (char *)"video-bitrate", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -91,7 +91,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_RESOLUTION_WIDTH, (char *)"video-resolution-width", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_ARRAY, @@ -103,7 +103,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_RESOLUTION_HEIGHT, (char *)"video-resolution-height", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_ARRAY, @@ -115,7 +115,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_FORMAT, (char *)"audio-source-format", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)MM_STREAMRECORDER_AUDIO_FORMAT_PCM_S16_LE}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -127,7 +127,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_ENCODER_BITRATE, (char *)"audio-bitrate", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)128000}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -139,7 +139,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_SAMPLERATE, (char *)"audio-samplerate", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -151,7 +151,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_ENCODER, (char *)"video-encoder", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_ARRAY, @@ -163,7 +163,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_ENCODER, (char *)"audio-encoder", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_ARRAY, @@ -175,7 +175,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_CHENNEL_COUNT, (char *)"audio-channel-count", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)2}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -187,7 +187,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_FILE_FORMAT, (char *)"file-format", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_ARRAY, @@ -199,7 +199,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_TARGET_FILE_NAME, (char *)"filename", - MMF_VALUE_TYPE_STRING, + MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, {NULL}, MM_ATTRS_VALID_TYPE_NONE, @@ -211,7 +211,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_VIDEO_ENABLE, (char *)"video-enable", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)FALSE}, MM_ATTRS_VALID_TYPE_NONE, @@ -223,7 +223,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_AUDIO_ENABLE, (char *)"audio-enable", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)FALSE}, MM_ATTRS_VALID_TYPE_NONE, @@ -235,7 +235,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_MODE, (char *)"recorder-mode", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)MM_STREAMRECORDER_MODE_MEDIABUFFER}, MM_ATTRS_VALID_TYPE_NONE, @@ -247,7 +247,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_TARGET_MAX_SIZE, (char *)"target-max-size", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -259,7 +259,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { { MM_STR_TARGET_TIME_LIMIT, (char *)"target-time-limit", - MMF_VALUE_TYPE_INT, + MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, {(void *)0}, MM_ATTRS_VALID_TYPE_INT_RANGE, @@ -362,7 +362,6 @@ static int __mmstreamrecorder_release_conf_valid_info(MMHandleType handle) #if 0 static bool __mmstreamrecorder_attrs_is_supported(MMHandleType handle, int idx) { - mmf_attrs_t *attr = (mmf_attrs_t *) handle; int flag; if (mm_attrs_get_flags(handle, idx, &flag) == MM_ERROR_NONE) { @@ -372,15 +371,15 @@ static bool __mmstreamrecorder_attrs_is_supported(MMHandleType handle, int idx) return FALSE; } - if (attr->items[idx].value_spec.type == MM_ATTRS_VALID_TYPE_INT_RANGE) { + if (mm_attrs_get_valid_type(handle, idx) == MM_ATTRS_VALID_TYPE_INT_RANGE) { int min, max; - mm_attrs_get_valid_range((MMHandleType) attr, idx, &min, &max); + mm_attrs_get_valid_range(handle, idx, &min, &max); if (max < min) return FALSE; - } else if (attr->items[idx].value_spec.type == MM_ATTRS_VALID_TYPE_INT_ARRAY) { + } else if (mm_attrs_get_valid_type(handle, idx) == MM_ATTRS_VALID_TYPE_INT_ARRAY) { int count; int *array; - mm_attrs_get_valid_array((MMHandleType) attr, idx, &count, &array); + mm_attrs_get_valid_array(handle, idx, &count, &array); if (count == 0) return FALSE; } @@ -525,19 +524,19 @@ static int __mmstreamrecorder_check_valid_pair(MMHandleType handle, char **err_a } /* attribute commiter */ -void __mmstreamrecorder_print_attrs(const char *attr_name, const mmf_value_t * value, const char *cmt_way) +void __mmstreamrecorder_print_attrs(const char *attr_name, const MMAttrsValue * value, const char *cmt_way) { switch (value->type) { - case MMF_VALUE_TYPE_INT: + case MM_ATTRS_TYPE_INT: _mmstreamrec_dbg_log("%s :(%s:%d)", cmt_way, attr_name, value->value.i_val); break; - case MMF_VALUE_TYPE_DOUBLE: + case MM_ATTRS_TYPE_DOUBLE: _mmstreamrec_dbg_log("%s :(%s:%f)", cmt_way, attr_name, value->value.d_val); break; - case MMF_VALUE_TYPE_STRING: + case MM_ATTRS_TYPE_STRING: _mmstreamrec_dbg_log("%s :(%s:%s)", cmt_way, attr_name, value->value.s_val); break; - case MMF_VALUE_TYPE_DATA: + case MM_ATTRS_TYPE_DATA: _mmstreamrec_dbg_log("%s :(%s:%p)", cmt_way, attr_name, value->value.p_val); break; default: @@ -738,17 +737,18 @@ MMHandleType _mmstreamrecorder_alloc_attribute(MMHandleType handle) { _mmstreamrec_dbg_log(""); - MMHandleType attrs = 0; - mmf_attrs_construct_info_t *attrs_const_info = NULL; + MMHandleType attrs = NULL; + MMAttrsConstructInfo *attrs_const_info = NULL; unsigned int attr_count = 0; unsigned int idx; + int ret = MM_ERROR_NONE; /* Create attribute constructor */ _mmstreamrec_dbg_log("start"); - /* alloc 'mmf_attrs_construct_info_t' */ + /* alloc 'mm_attrs_construct_info_t' */ attr_count = ARRAY_SIZE(stream_attrs_const_info); - attrs_const_info = malloc(attr_count * sizeof(mmf_attrs_construct_info_t)); + attrs_const_info = malloc(attr_count * sizeof(MMAttrsConstructInfo)); if (!attrs_const_info) { _mmstreamrec_dbg_err("Fail to alloc constructor."); @@ -772,12 +772,12 @@ MMHandleType _mmstreamrecorder_alloc_attribute(MMHandleType handle) _mmstreamrec_dbg_log("Create Streamrecorder Attributes[%p, %d]", attrs_const_info, attr_count); - attrs = mmf_attrs_new_from_data("Streamrecorder_Attributes", attrs_const_info, attr_count, _mmstreamrecorder_commit_streamrecorder_attrs, (void *)handle); + ret = mm_attrs_new(attrs_const_info, attr_count, "Streamrecorder_Attributes", _mmstreamrecorder_commit_streamrecorder_attrs, (void *)handle, &attrs); free(attrs_const_info); attrs_const_info = NULL; - if (attrs == 0) { + if (ret != MM_ERROR_NONE) { _mmstreamrec_dbg_err("Fail to alloc attribute handle"); return 0; } @@ -785,19 +785,19 @@ MMHandleType _mmstreamrecorder_alloc_attribute(MMHandleType handle) __mmstreamrecorder_set_conf_to_valid_info(handle); for (idx = 0; idx < attr_count; idx++) { - mmf_attrs_set_valid_type(attrs, idx, stream_attrs_const_info[idx].validity_type); + mm_attrs_set_valid_type(attrs, idx, stream_attrs_const_info[idx].validity_type); switch (stream_attrs_const_info[idx].validity_type) { case MM_ATTRS_VALID_TYPE_INT_ARRAY: if (stream_attrs_const_info[idx].validity_value_1.int_array && stream_attrs_const_info[idx].validity_value_2.count > 0) - mmf_attrs_set_valid_array(attrs, idx, + mm_attrs_set_valid_array(attrs, idx, (const int *)(stream_attrs_const_info[idx].validity_value_1.int_array), stream_attrs_const_info[idx].validity_value_2.count, stream_attrs_const_info[idx].default_value.value_int); break; case MM_ATTRS_VALID_TYPE_INT_RANGE: - mmf_attrs_set_valid_range(attrs, idx, + mm_attrs_set_valid_range(attrs, idx, stream_attrs_const_info[idx].validity_value_1.int_min, stream_attrs_const_info[idx].validity_value_2.int_max, stream_attrs_const_info[idx].default_value.value_int); @@ -805,13 +805,13 @@ MMHandleType _mmstreamrecorder_alloc_attribute(MMHandleType handle) case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY: if (stream_attrs_const_info[idx].validity_value_1.double_array && stream_attrs_const_info[idx].validity_value_2.count > 0) - mmf_attrs_set_valid_double_array(attrs, idx, + mm_attrs_set_valid_double_array(attrs, idx, (const double *)(stream_attrs_const_info[idx].validity_value_1.double_array), stream_attrs_const_info[idx].validity_value_2.count, stream_attrs_const_info[idx].default_value.value_double); break; case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE: - mmf_attrs_set_valid_double_range(attrs, idx, + mm_attrs_set_valid_double_range(attrs, idx, stream_attrs_const_info[idx].validity_value_1.double_min, stream_attrs_const_info[idx].validity_value_2.double_max, stream_attrs_const_info[idx].default_value.value_double); @@ -835,7 +835,7 @@ void _mmstreamrecorder_dealloc_attribute(MMHandleType attrs) _mmstreamrec_dbg_log(""); if (attrs) { - mmf_attrs_free(attrs); + mm_attrs_free(attrs); _mmstreamrec_dbg_log("released attribute"); } @@ -940,7 +940,7 @@ int _mmstreamrecorder_get_attribute_info(MMHandleType handle, const char *attr_n return ret; } -bool _mmstreamrecorder_commit_streamrecorder_attrs(int attr_idx, const char *attr_name, const mmf_value_t * value, void *commit_param) +bool _mmstreamrecorder_commit_streamrecorder_attrs(int attr_idx, const char *attr_name, const MMAttrsValue * value, void *commit_param) { bool bret = FALSE; @@ -962,7 +962,7 @@ bool _mmstreamrecorder_commit_streamrecorder_attrs(int attr_idx, const char *att return bret; } -bool _mmstreamrecorder_commit_video_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_video_enable(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; /* mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); */ @@ -988,7 +988,7 @@ bool _mmstreamrecorder_commit_video_enable(MMHandleType handle, int attr_idx, co return TRUE; } -bool _mmstreamrecorder_commit_video_encoder(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_video_encoder(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1010,7 +1010,7 @@ bool _mmstreamrecorder_commit_video_encoder(MMHandleType handle, int attr_idx, c return TRUE; } -bool _mmstreamrecorder_commit_audio_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_enable(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; /* mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); */ @@ -1035,7 +1035,7 @@ bool _mmstreamrecorder_commit_audio_enable(MMHandleType handle, int attr_idx, co return TRUE; } -bool _mmstreamrecorder_commit_audio_encoder(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_encoder(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1057,7 +1057,7 @@ bool _mmstreamrecorder_commit_audio_encoder(MMHandleType handle, int attr_idx, c return TRUE; } -bool _mmstreamrecorder_commit_audio_samplingrate(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_samplingrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1079,7 +1079,7 @@ bool _mmstreamrecorder_commit_audio_samplingrate(MMHandleType handle, int attr_i return TRUE; } -bool _mmstreamrecorder_commit_audio_bitformat(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_bitformat(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1104,7 +1104,7 @@ bool _mmstreamrecorder_commit_audio_bitformat(MMHandleType handle, int attr_idx, return TRUE; } -bool _mmstreamrecorder_commit_video_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_video_bitrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1127,7 +1127,7 @@ bool _mmstreamrecorder_commit_video_bitrate(MMHandleType handle, int attr_idx, c return TRUE; } -bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; @@ -1149,7 +1149,7 @@ bool _mmstreamrecorder_commit_audio_bitrate(MMHandleType handle, int attr_idx, c return TRUE; } -bool _mmstreamrecorder_commit_audio_channel(MMHandleType handle, int attr_idx, const mmf_value_t *value) +bool _mmstreamrecorder_commit_audio_channel(MMHandleType handle, int attr_idx, const MMAttrsValue *value) { MMHandleType attr = 0; _MMStreamRecorderSubContext *sc = NULL; -- 2.7.4 From 289110907217124cd33d42657a879a2f7eeb4221 Mon Sep 17 00:00:00 2001 From: SeokHoon LEE Date: Fri, 7 Dec 2018 15:11:14 +0900 Subject: [PATCH 06/16] fix dlog format Change-Id: I69b8f2568dbd51451e0d061baf2595084ac4fd70 Signed-off-by: SeokHoon LEE --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_attribute.c | 8 ++++---- src/mm_streamrecorder_recorder.c | 2 +- test/mm_streamrecorder_testsuite.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 9b15991..df7002e 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.20 +Version: 0.0.21 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_attribute.c b/src/mm_streamrecorder_attribute.c index f64b0dd..02e45b0 100644 --- a/src/mm_streamrecorder_attribute.c +++ b/src/mm_streamrecorder_attribute.c @@ -705,7 +705,7 @@ _mmstreamrecorder_get_available_format(MMHandleType handle, int type, int ** for arr = (int*) g_malloc0(count * sizeof(int)); if (arr == NULL) { - _mmstreamrec_dbg_err("malloc failed : %d", count * sizeof(int)); + _mmstreamrec_dbg_err("malloc failed : %zu", count * sizeof(int)); return -1; } @@ -866,7 +866,7 @@ int _mmstreamrecorder_set_attributes(MMHandleType handle, char **err_attr_name, attrs = MMF_STREAMRECORDER_ATTRS(handle); if (!attrs) { - _mmstreamrec_dbg_err("handle 0x%x, attrs is NULL, attr name [%s]", handle, attribute_name); + _mmstreamrec_dbg_err("handle %p, attrs is NULL, attr name [%s]", handle, attribute_name); return MM_ERROR_STREAMRECORDER_NOT_INITIALIZED; } @@ -875,7 +875,7 @@ int _mmstreamrecorder_set_attributes(MMHandleType handle, char **err_attr_name, ret = __mmstreamrecorder_check_valid_pair(handle, err_attr_name, attribute_name, var_args); - _mmstreamrec_dbg_err("__mmstreamrecorder_check_valid_pair handle 0x%x, attr name [%s] , ret = %d", handle, attribute_name, ret); + _mmstreamrec_dbg_err("__mmstreamrecorder_check_valid_pair handle %p, attr name [%s] , ret = %d", handle, attribute_name, ret); if (ret == MM_ERROR_NONE) { /* In 64bit environment, unexpected result is returned if var_args is used again. */ @@ -883,7 +883,7 @@ int _mmstreamrecorder_set_attributes(MMHandleType handle, char **err_attr_name, } va_end(var_args_copy); - _mmstreamrec_dbg_err("mm_attrs_set_valist handle 0x%x, attr name [%s] , ret = %d", handle, attribute_name, ret); + _mmstreamrec_dbg_err("mm_attrs_set_valist handle %p, attr name [%s] , ret = %d", handle, attribute_name, ret); return ret; } diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index 75996d0..d9eaeb0 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -67,7 +67,7 @@ int _mmstreamrecorder_create_pipeline(MMHandleType handle) _MMStreamRecorderSubContext *sc = NULL; GstElement *pipeline = NULL; - _mmstreamrec_dbg_log("handle : %x", handle); + _mmstreamrec_dbg_log("handle : %p", handle); mmf_return_val_if_fail(hstreamrecorder, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); diff --git a/test/mm_streamrecorder_testsuite.c b/test/mm_streamrecorder_testsuite.c index 06f5462..c6f570d 100644 --- a/test/mm_streamrecorder_testsuite.c +++ b/test/mm_streamrecorder_testsuite.c @@ -1169,7 +1169,7 @@ static gboolean mode_change() if (!fp) return -1; nread = fread(&buffer, sizeof(char), sizeof(buffer), fp); - time_msg_t("mm_streamrecorder_create() : nread %d, sizeof(buffer) %d", nread, sizeof(buffer)); + time_msg_t("mm_streamrecorder_create() : nread %zu, sizeof(buffer) %zu", nread, sizeof(buffer)); fclose(fp); err = mm_streamrecorder_create(&hstreamrecorder->streamrecorder); -- 2.7.4 From 5d284ab8c7320f836a522fb9db5df8a6ac5d0c43 Mon Sep 17 00:00:00 2001 From: SeokHoon Lee Date: Mon, 9 Apr 2018 18:21:16 +0900 Subject: [PATCH 07/16] Add free code - add g_free (type) for memory leak Signed-off-by: SeokHoon Lee Change-Id: I6a300efef88d5bf50fa0859a6cba39643d5a028f --- packaging/libmm-streamrecorder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index df7002e..7454e41 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.21 +Version: 0.0.22 Release: 0 Group: Multimedia/Other License: Apache-2.0 -- 2.7.4 From 0aee4a2c55166b78fcec8dcda732f33841e89158 Mon Sep 17 00:00:00 2001 From: SeokHoon LEE Date: Mon, 21 Jan 2019 10:07:30 +0900 Subject: [PATCH 08/16] Add failure log for removing corrupted ini file - Add g_remove failed log Change-Id: Id3a7f0533385e9fba0212bd83b1590af08f08d28 Signed-off-by: SeokHoon LEE --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_ini.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 7454e41..3a23d44 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.22 +Version: 0.0.23 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_ini.c b/src/mm_streamrecorder_ini.c index d3f88c1..787c0c3 100644 --- a/src/mm_streamrecorder_ini.c +++ b/src/mm_streamrecorder_ini.c @@ -323,7 +323,8 @@ void __get_element_list(mm_streamrecorder_ini_t* ini, gchar* str, int keyword static void __mm_streamrecorder_ini_check_status(void) { - struct stat ini_buff; + GStatBuf ini_buff; + char buf[255] = {0, }; _mmstreamrec_dbg_warn("enter"); @@ -332,7 +333,10 @@ void __mm_streamrecorder_ini_check_status(void) } else { if (ini_buff.st_size < 5) { _mmstreamrec_dbg_err("mmfw_streamrecorder.ini file size=%d, Corrupted! So, Removed\n", (int)ini_buff.st_size); - g_remove(MM_STREAMRECORDER_INI_DEFAULT_PATH); + if (g_remove(MM_STREAMRECORDER_INI_DEFAULT_PATH) == -1) { + strerror_r(errno, buf, sizeof(buf)); + _mmstreamrec_dbg_err("failed to delete corrupted ini [%s]", buf); + } } } -- 2.7.4 From 0e515ac8edb22e4515f5954224ebff9aa5234c92 Mon Sep 17 00:00:00 2001 From: SeokHoon LEE Date: Mon, 22 Apr 2019 14:29:23 +0900 Subject: [PATCH 09/16] Add push_vidoe_packet for i420 format - add new function to process video packet that have separate plane in I420 format Change-Id: Id1abdcf1bf2562092e02ee352779afa45b7aaf94 Signed-off-by: SeokHoon LEE --- configure.ac | 4 ++ packaging/libmm-streamrecorder.spec | 3 +- src/Makefile.am | 2 + src/include/mm_streamrecorder.h | 3 ++ src/include/mm_streamrecorder_internal.h | 2 + src/mm_streamrecorder.c | 16 ++++++++ src/mm_streamrecorder_internal.c | 70 ++++++++++++++++++++++++++++++++ test/Makefile.am | 2 + 8 files changed, 101 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index b07c4c7..f28cbea 100644 --- a/configure.ac +++ b/configure.ac @@ -42,6 +42,10 @@ PKG_CHECK_MODULES(MM_COMMON, mm-common) AC_SUBST(MM_COMMON_CFLAGS) AC_SUBST(MM_COMMON_LIBS) +PKG_CHECK_MODULES(MEDIA_TOOL, capi-media-tool) +AC_SUBST(MEDIA_TOOL_CFLAGS) +AC_SUBST(MEDIA_TOOL_LIBS) + PKG_CHECK_MODULES(DLOG, dlog) AC_SUBST(DLOG_CFLAGS) AC_SUBST(DLOG_LIBS) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 3a23d44..c78bfdb 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.23 +Version: 0.0.24 Release: 0 Group: Multimedia/Other License: Apache-2.0 @@ -8,6 +8,7 @@ Source0: %{name}-%{version}.tar.gz Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig BuildRequires: pkgconfig(mm-common) +BuildRequires: pkgconfig(capi-media-tool) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(gstreamer-base-1.0) BuildRequires: pkgconfig(gstreamer-video-1.0) diff --git a/src/Makefile.am b/src/Makefile.am index 2138fc5..a1e672c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,6 +39,7 @@ libmmfstreamrecorder_la_CFLAGS = -I$(srcdir)/include \ $(GST_INTERFACES_CFLAGS) \ $(DLOG_CFLAGS) \ $(MM_COMMON_CFLAGS) \ + $(MEDIA_TOOL_CFLAGS) \ $(GST_APP_CFLAGS) libmmfstreamrecorder_la_LIBADD = \ @@ -47,6 +48,7 @@ libmmfstreamrecorder_la_LIBADD = \ $(GST_VIDEO_LIBS) \ $(GST_INTERFACES_LIBS) \ $(MM_COMMON_LIBS) \ + $(MEDIA_TOOL_LIBS) \ $(DLOG_LIBS) \ $(VCONF_LIBS) \ $(GST_APP_LIBS) \ diff --git a/src/include/mm_streamrecorder.h b/src/include/mm_streamrecorder.h index 66902e3..b32ba7d 100644 --- a/src/include/mm_streamrecorder.h +++ b/src/include/mm_streamrecorder.h @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -442,6 +443,8 @@ int mm_streamrecorder_commit(MMHandleType streamrecorder); int mm_streamrecorder_cancel(MMHandleType streamrecorder); +int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long timestamp, void *buffer); + int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size); /** diff --git a/src/include/mm_streamrecorder_internal.h b/src/include/mm_streamrecorder_internal.h index 61cb31e..5bd3d2c 100644 --- a/src/include/mm_streamrecorder_internal.h +++ b/src/include/mm_streamrecorder_internal.h @@ -359,6 +359,8 @@ int _mmstreamrecorder_unrealize(MMHandleType hstreamrecorder); */ int _mmstreamrecorder_record(MMHandleType hstreamrecorder); +int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h packet, unsigned long timestamp, void *buffer); + int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size); /** diff --git a/src/mm_streamrecorder.c b/src/mm_streamrecorder.c index d2b70b8..b4c639b 100644 --- a/src/mm_streamrecorder.c +++ b/src/mm_streamrecorder.c @@ -160,6 +160,22 @@ int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRe return error; } +int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long timestamp, void *buffer) +{ + int error = MM_ERROR_NONE; + + mmf_return_val_if_fail((void *)streamrecorder, MM_ERROR_STREAMRECORDER_INVALID_ARGUMENT); + + _mmstreamrec_dbg_log(""); + + error = _mmstreamrecorder_push_video_packet(streamrecorder, packet, timestamp, buffer); + + _mmstreamrec_dbg_log("END"); + + return error; +} + + int mm_streamrecorder_commit(MMHandleType streamrecorder) { int error = MM_ERROR_NONE; diff --git a/src/mm_streamrecorder_internal.c b/src/mm_streamrecorder_internal.c index 5293609..127ff69 100644 --- a/src/mm_streamrecorder_internal.c +++ b/src/mm_streamrecorder_internal.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "mm_streamrecorder_internal.h" #include "mm_streamrecorder_recorder.h" @@ -388,6 +389,75 @@ int _mmstreamrecorder_record(MMHandleType handle) return ret; } +int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h media_packet, unsigned long timestamp, void *buffer) +{ + int ret = MM_ERROR_NONE; + unsigned int ind = 0; + uint32_t plane_num = 0; + mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); + GstStreamRecorderBuffer *stream_buffer = NULL; + int image_width = 0; + int image_height = 0; + unsigned char *data_buffer = NULL; + int size = 0, total_size = 0; + + if (!hstreamrecorder) { + _mmstreamrec_dbg_err("Not initialized"); + ret = MM_ERROR_STREAMRECORDER_NOT_INITIALIZED; + return ret; + } + + ret = media_packet_get_number_of_video_planes(media_packet, &plane_num); + if (plane_num <= 0 || ret != MEDIA_PACKET_ERROR_NONE) { + LOGE("invalid plane_num [%d] is returned", plane_num); + return MM_ERROR_STREAMRECORDER_INVALID_ARGUMENT; + } + + stream_buffer = (GstStreamRecorderBuffer *) malloc(sizeof(GstStreamRecorderBuffer)); + if (stream_buffer == NULL) { + _mmstreamrec_dbg_err("stream buffer allocation fail"); + return MM_ERROR_STREAMRECORDER_LOW_MEMORY; + } + + stream_buffer->str_handle = handle; + stream_buffer->buffer = gst_buffer_new(); + if (stream_buffer->buffer == NULL) { + free(stream_buffer); + stream_buffer = NULL; + _mmstreamrec_dbg_err("gst buffer allocation fail"); + return MM_ERROR_STREAMRECORDER_LOW_MEMORY; + } + stream_buffer->user_buffer = buffer; + stream_buffer->buffer->pts = timestamp; + GST_BUFFER_DURATION(stream_buffer->buffer) = GST_CLOCK_TIME_NONE; + + for (ind = 0; ind < plane_num; ++ind) { + ret = media_packet_get_video_stride_width(media_packet, ind, &image_width); + ret |= media_packet_get_video_stride_height(media_packet, ind, &image_height); + ret |= media_packet_get_video_plane_data_ptr(media_packet, ind, (void**)&data_buffer); + + if (ret != MEDIA_PACKET_ERROR_NONE) { + LOGE("media_packet_get_video_plane_data_ptr() plane[%d] failed", ind); + return MM_ERROR_STREAMRECORDER_INVALID_ARGUMENT; + } + + size = image_width * image_height; + total_size += size; + _mmstreamrec_dbg_err("Plane[%d] info : %d x %d (%p) size = %d\n", ind, image_width, image_height, data_buffer, total_size); + + if (ind == plane_num - 1) //last plane + gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, + data_buffer, size, 0, size, stream_buffer, _mmstreamrecorder_buffer_destroy)); + else + gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, + data_buffer, size, 0, size, NULL, NULL)); + } + + ret = _mmstreamrecorder_push_videostream_buffer(handle, timestamp, stream_buffer->buffer, total_size); + + return ret; +} + int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size) { int ret = MM_ERROR_NONE; diff --git a/test/Makefile.am b/test/Makefile.am index f22d5ae..344277e 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -7,6 +7,7 @@ mm_streamrecorder_testsuite_CFLAGS = -fPIE \ $(GLIB_CFLAGS)\ $(GST_CFLAGS)\ $(MM_COMMON_CFLAGS)\ + $(MEDIA_TOOL_CFLAGS) \ $(MM_SOUND_CFLAGS)\ $(MDM_CFLAGS) @@ -20,6 +21,7 @@ mm_streamrecorder_testsuite_LDADD = $(top_builddir)/src/libmmfstreamrecorder.la $(GLIB_LIBS)\ $(GST_LIBS)\ $(MM_COMMON_LIBS)\ + $(MEDIA_TOOL_LIBS) \ $(MM_SOUND_LIBS)\ $(MDM_LIBS) -- 2.7.4 From aec382cc3fb04883b0a5beb0a02a0e2932f7c63c Mon Sep 17 00:00:00 2001 From: SeokHoon LEE Date: Wed, 17 Jul 2019 13:45:34 +0900 Subject: [PATCH 10/16] Remove unnecessary map - _mmstreamrecordder_push_videostream_buffer and audiostream_buffer take onwership of buffer so, - remove unnecessary map/unmap. Change-Id: Ie2e3561d8d79f2de2f5318d1c331b56faeec216b Signed-off-by: SeokHoon LEE --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_internal.c | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index c78bfdb..8218720 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.24 +Version: 0.0.25 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_internal.c b/src/mm_streamrecorder_internal.c index 127ff69..fe6b723 100644 --- a/src/mm_streamrecorder_internal.c +++ b/src/mm_streamrecorder_internal.c @@ -463,7 +463,6 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt int ret = MM_ERROR_NONE; int format; - GstMapInfo map; mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); /* _mmstreamrec_dbg_log(""); */ @@ -496,7 +495,6 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt stream_buffer->buffer->pts = timestamp; GST_BUFFER_DURATION(stream_buffer->buffer) = GST_CLOCK_TIME_NONE; - gst_buffer_map(stream_buffer->buffer, &map, GST_MAP_READWRITE); if (streamtype == MM_STREAM_TYPE_VIDEO) { if (format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || format == MM_STREAMRECORDER_INPUT_FORMAT_NV21) { @@ -517,15 +515,13 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt buffer, size, 0, size, stream_buffer, _mmstreamrecorder_buffer_destroy)); ret = _mmstreamrecorder_push_audiostream_buffer(handle, timestamp, stream_buffer->buffer, size); } else { - gst_buffer_unmap(stream_buffer->buffer, &map); gst_object_unref(stream_buffer->buffer); free(stream_buffer); stream_buffer = NULL; return MM_ERROR_STREAMRECORDER_INVALID_CONDITION; } - gst_buffer_unmap(stream_buffer->buffer, &map); - return ret; + return ret; } int _mmstreamrecorder_pause(MMHandleType handle) -- 2.7.4 From 91785ae80b12885fe45ce36664bf8ee0ef51b36e Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Tue, 20 Aug 2019 16:36:08 +0900 Subject: [PATCH 11/16] Change stream buffer data pointer location. Data pointer of 'MediaPacket' is assigned to 'data[0]' member variable but 'gst_buffer_append_memory' api try to get pointer from 'handle.paddr[0]'. So i change it to 'data[0]'. Change-Id: Ice515241ffa0e03ff580744242b6417401dfd38f Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_internal.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 8218720..49a0505 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.25 +Version: 0.0.26 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_internal.c b/src/mm_streamrecorder_internal.c index fe6b723..1846328 100644 --- a/src/mm_streamrecorder_internal.c +++ b/src/mm_streamrecorder_internal.c @@ -501,7 +501,7 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt MMVideoBuffer *video_buf = (MMVideoBuffer *)buffer; /* Buffer at 0th position */ gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, - video_buf->handle.paddr[0], size, 0, size, video_buf->handle.paddr[0], NULL)); + video_buf->data[0], size, 0, size, video_buf->data[0], NULL)); /* Buffer at 1st position */ gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, video_buf, sizeof(MMVideoBuffer), 0, sizeof(MMVideoBuffer), stream_buffer, _mmstreamrecorder_buffer_destroy)); -- 2.7.4 From c6808084637299a90ecb85a38e9a3b8b4db67bec Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Mon, 25 Nov 2019 16:03:36 +0900 Subject: [PATCH 12/16] Adds changes for mode of stream recoder It related with patch of mediastreamrecorder. (https://review.tizen.org/gerrit/#/c/platform/core/api/mediastreamrecorder/+/218535) *Changes Recorder Mode. :MM_STREAMRECORDER_MODE_MEDIABUFFER->MM_STREAMRECORDER_MODE_STREAM_BUFFER :MM_STREAMRECORDER_MODE_SCREENRECORD->MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK *Changes Video source formats. Removed :UYVY, YUYV changed :BGRA8888->BGRA *changes timestamp type unsinged long to unsigned long long :mm_streamrecorder_push_stream_buffer :mm_streamrecorder_push_video_packet *Divides gst_set_videosrcpad_caps. : gst_set_videosrcpad_caps_sw : gst_set_videosrcpad_caps_hw *Adds Enums for MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK :_MMSTREAMRECORDER_ELELMENT enum structure. Refers patch for Other minor changes. Change-Id: Iee498d750b0bf1c56a7117aa08656a7a2395afb4 Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/include/mm_streamrecorder.h | 16 +- src/include/mm_streamrecorder_gstcommon.h | 3 +- src/include/mm_streamrecorder_ini.h | 4 + src/include/mm_streamrecorder_internal.h | 28 +- src/include/mm_streamrecorder_recorder.h | 4 +- src/mm_streamrecorder.c | 4 +- src/mm_streamrecorder_attribute.c | 2 +- src/mm_streamrecorder_gstcommon.c | 38 ++- src/mm_streamrecorder_ini.c | 6 + src/mm_streamrecorder_internal.c | 6 +- src/mm_streamrecorder_recorder.c | 497 +++++++++++++++++++++--------- 12 files changed, 437 insertions(+), 173 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 49a0505..f679aff 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.26 +Version: 0.0.28 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/include/mm_streamrecorder.h b/src/include/mm_streamrecorder.h index b32ba7d..6043828 100644 --- a/src/include/mm_streamrecorder.h +++ b/src/include/mm_streamrecorder.h @@ -130,13 +130,13 @@ typedef enum { */ typedef enum { - MM_STREAMRECORDER_MODE_MEDIABUFFER = 0, /**< Recording with mediabuffer */ - MM_STREAMRECORDER_MODE_SCREENRECORD, /**< Recording with screenrecord */ + MM_STREAMRECORDER_MODE_STREAM_BUFFER = 0, /**< Recording with mediabuffer */ + MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK /**< Recording with device's own screen(display) and audio */ } MMStreamRecorderModeType; typedef enum { MM_STREAMRECORDER_VIDEO_TYPE_TBM_BO, /**< TBM BO type */ - MM_STREAMRECORDER_VIDEO_TYPE_NORMAL_BUFFER, /**< Normal Raw data buffer */ + MM_STREAMRECORDER_VIDEO_TYPE_NORMAL_BUFFER /**< Normal Raw data buffer */ } MMStreamRecorderVideoBufType; typedef enum { @@ -144,9 +144,7 @@ typedef enum { MM_STREAMRECORDER_INPUT_FORMAT_NV12, /**< NV12 pixel format */ MM_STREAMRECORDER_INPUT_FORMAT_NV21, /**< NV21 pixel format */ MM_STREAMRECORDER_INPUT_FORMAT_I420, /**< I420 pixel format */ - MM_STREAMRECORDER_INPUT_FORMAT_UYVY, /**< UYVY pixel format */ - MM_STREAMRECORDER_INPUT_FORMAT_YUYV, /**< YUYV pixel format */ - MM_STREAMRECORDER_INPUT_FORMAT_BGRA8888, /**< BGRA8888 pixel format */ + MM_STREAMRECORDER_INPUT_FORMAT_BGRA, /**< BGRA pixel format */ MM_STREAMRECORDER_INPUT_FORMAT_NUM /**< Number of the pixel format */ } MMStreamRecorderVideoSourceFormat; @@ -176,7 +174,7 @@ typedef enum { * An enumeration for attribute validation type. */ typedef enum { - MM_STR_REC_ATTRS_VALID_TYPE_INVALID = -1, /**< Invalid validation type */ + MM_STR_REC_ATTRS_VALID_TYPE_INVALID = -1, /**< Invalid validation type */ MM_STR_REC_ATTRS_VALID_TYPE_NONE, /**< Do not check validity */ MM_STR_REC_ATTRS_VALID_TYPE_INT_ARRAY, /**< validity checking type of integer array */ MM_STR_REC_ATTRS_VALID_TYPE_INT_RANGE, /**< validity checking type of integer range */ @@ -443,9 +441,9 @@ int mm_streamrecorder_commit(MMHandleType streamrecorder); int mm_streamrecorder_cancel(MMHandleType streamrecorder); -int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long timestamp, void *buffer); +int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long long timestamp, void *buffer); -int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size); +int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRecorderStreamType streamtype, unsigned long long timestamp, void *buffer, int size); /** * mm_streamrecorder_commit:\n diff --git a/src/include/mm_streamrecorder_gstcommon.h b/src/include/mm_streamrecorder_gstcommon.h index 4da1a79..1689f66 100644 --- a/src/include/mm_streamrecorder_gstcommon.h +++ b/src/include/mm_streamrecorder_gstcommon.h @@ -246,7 +246,8 @@ gboolean _mmstreamrecorder_link_elements(GList *element_list); * */ int _mmstreamrecorder_gst_set_state(MMHandleType handle, GstElement *pipeline, GstState target_state); -GstCaps *gst_set_videosrcpad_caps(gint srcfmt, gint width, gint height, gint rate, gint scale); +GstCaps *gst_set_videosrcpad_caps_sw(gint srcfmt, gint width, gint height, gint rate, gint scale); +GstCaps *gst_set_videosrcpad_caps_hw(gchar* srcfmt, gint width, gint height, gint rate, gint scale); GstCaps *gst_set_audiosrcpad_caps(gint samplerate, gint channel, gint depth, gint width, gint datatype); #ifdef __cplusplus diff --git a/src/include/mm_streamrecorder_ini.h b/src/include/mm_streamrecorder_ini.h index e9b39f5..74df497 100644 --- a/src/include/mm_streamrecorder_ini.h +++ b/src/include/mm_streamrecorder_ini.h @@ -53,6 +53,8 @@ typedef struct __mm_streamrecorder_ini { guint convert_output_buffer_num; guint reset_pause_time; guint screen_record; + gboolean hw_encoder_supported; + gchar video_codec_element_hw[STREAMRECORDER_INI_MAX_STRLEN]; /*encodebin */ guint encsink_bin_profile; @@ -98,6 +100,8 @@ typedef struct __mm_streamrecorder_ini { #define DEFAULT_CONVERT_OUTPUT_BUFFER_NUM 6 #define DEFAULT_RESET_PAUSE_TIME 0 #define DEFAULT_SCREEN_RECORD 1 +#define DEFAULT_HW_ENCODER_SUPPORTED 0 +#define DEFAULT_VIDEO_CODEC_ELEMENT_HW "" /*encodebin*/ #define DEFAULT_ENCSINK_BIN_PROFILE 0 diff --git a/src/include/mm_streamrecorder_internal.h b/src/include/mm_streamrecorder_internal.h index 5bd3d2c..c529dfb 100644 --- a/src/include/mm_streamrecorder_internal.h +++ b/src/include/mm_streamrecorder_internal.h @@ -136,6 +136,9 @@ typedef enum { _MMSTREAMRECORDER_AUDIOSRC_BIN, _MMSTREAMRECORDER_AUDIOSRC_SRC, /* appsrc */ _MMSTREAMRECORDER_AUDIOSRC_FILT, + _MMSTREAMRECORDER_AUDIOSRC_CONV, + _MMSTREAMRECORDER_AUDIOSRC_ENC, + _MMSTREAMRECORDER_AUDIOSRC_QUE, /* Pipeline element of Encodebin */ _MMSTREAMRECORDER_ENCSINK_BIN, @@ -163,6 +166,27 @@ typedef enum { _MMSTREAMRECORDER_ENCODE_PIPELINE_ELEMENT_NUM, } _MMSTREAMRECORDER_ENCODE_PIPELINE_ELELMENT; +typedef enum { + /* Pipeline element of Audio input */ + _MMSTREAMRECORDER_AUDIO_SRC = 0x01, + _MMSTREAMRECORDER_AUDIO_CONV, + _MMSTREAMRECORDER_AUDIO_ENC, + _MMSTREAMRECORDER_AUDIO_QUE, + + /* Pipeline element of Video input */ + _MMSTREAMRECORDER_VIDEO_SRC, + _MMSTREAMRECORDER_VIDEO_CAPS, + _MMSTREAMRECORDER_VIDEO_CONV, + _MMSTREAMRECORDER_VIDEO_ENC, + _MMSTREAMRECORDER_VIDEO_QUE, + + /* Pipeline element of Common */ + _MMSTREAMRECORDER_MUX, + _MMSTREAMRECORDER_SINK, + + _MMSTREAMRECORDER_ELELMENT_NUM, +} _MMSTREAMRECORDER_ELELMENT; + /** * Command type for streamrecorder. */ @@ -359,9 +383,9 @@ int _mmstreamrecorder_unrealize(MMHandleType hstreamrecorder); */ int _mmstreamrecorder_record(MMHandleType hstreamrecorder); -int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h packet, unsigned long timestamp, void *buffer); +int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h packet, unsigned long long timestamp, void *buffer); -int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size); +int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long long timestamp, void *buffer, int size); /** * This function is to pause video and audio recording diff --git a/src/include/mm_streamrecorder_recorder.h b/src/include/mm_streamrecorder_recorder.h index 8b8c4ce..edd4773 100644 --- a/src/include/mm_streamrecorder_recorder.h +++ b/src/include/mm_streamrecorder_recorder.h @@ -140,8 +140,8 @@ int _mmstreamrecorder_destroy_recorder_pipeline(MMHandleType handle); // COMMAND int _mmstreamrecorder_video_command(MMHandleType handle, int command); -int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long timestamp, GstBuffer *buffer, int size); -int _mmstreamrecorder_push_audiostream_buffer(MMHandleType handle, unsigned long timestamp, GstBuffer *buffer, int size); +int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long long timestamp, GstBuffer *buffer, int size); +int _mmstreamrecorder_push_audiostream_buffer(MMHandleType handle, unsigned long long timestamp, GstBuffer *buffer, int size); #ifdef __cplusplus } diff --git a/src/mm_streamrecorder.c b/src/mm_streamrecorder.c index b4c639b..1002c12 100644 --- a/src/mm_streamrecorder.c +++ b/src/mm_streamrecorder.c @@ -145,7 +145,7 @@ int mm_streamrecorder_record(MMHandleType streamrecorder) return error; } -int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size) +int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRecorderStreamType streamtype, unsigned long long timestamp, void *buffer, int size) { int error = MM_ERROR_NONE; @@ -160,7 +160,7 @@ int mm_streamrecorder_push_stream_buffer(MMHandleType streamrecorder, MMStreamRe return error; } -int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long timestamp, void *buffer) +int mm_streamrecorder_push_video_packet(MMHandleType streamrecorder, media_packet_h packet, unsigned long long timestamp, void *buffer) { int error = MM_ERROR_NONE; diff --git a/src/mm_streamrecorder_attribute.c b/src/mm_streamrecorder_attribute.c index 02e45b0..4555485 100644 --- a/src/mm_streamrecorder_attribute.c +++ b/src/mm_streamrecorder_attribute.c @@ -237,7 +237,7 @@ mm_streamrecorder_attr_construct_info stream_attrs_const_info[] = { (char *)"recorder-mode", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, - {(void *)MM_STREAMRECORDER_MODE_MEDIABUFFER}, + {(void *)MM_STREAMRECORDER_MODE_STREAM_BUFFER}, MM_ATTRS_VALID_TYPE_NONE, {0}, {_MMSTREAMRECORDER_MAX_INT}, diff --git a/src/mm_streamrecorder_gstcommon.c b/src/mm_streamrecorder_gstcommon.c index 1a437fa..64d4d5e 100644 --- a/src/mm_streamrecorder_gstcommon.c +++ b/src/mm_streamrecorder_gstcommon.c @@ -323,22 +323,28 @@ int _mmstreamrecorder_gst_set_state(MMHandleType handle, GstElement *pipeline, G return MM_ERROR_STREAMRECORDER_RESPONSE_TIMEOUT; } -GstCaps *gst_set_videosrcpad_caps(gint srcfmt, gint width, gint height, gint rate, gint scale) +GstCaps *gst_set_videosrcpad_caps_sw(gint srcfmt, gint width, gint height, gint rate, gint scale) { GstCaps *caps = NULL; - if (srcfmt == MM_STREAMRECORDER_INPUT_FORMAT_NV12) + switch (srcfmt) { + case MM_STREAMRECORDER_INPUT_FORMAT_NV12 : caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "NV12", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); - else if (srcfmt == MM_STREAMRECORDER_INPUT_FORMAT_I420) + break; + case MM_STREAMRECORDER_INPUT_FORMAT_I420 : caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "I420", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); - else - caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGRA8888", "bpp", G_TYPE_INT, 32, "depth", G_TYPE_INT, 24, "endianness", G_TYPE_INT, 4321, "red_mask", G_TYPE_INT, 65280, "green_mask", G_TYPE_INT, 16711680, "blue_mask", G_TYPE_INT, -16777216, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); + break; + case MM_STREAMRECORDER_INPUT_FORMAT_BGRA : + caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGRA", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); + break; + default : + caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "BGRA", "bpp", G_TYPE_INT, 32, "depth", G_TYPE_INT, 24, "endianness", G_TYPE_INT, 4321, "red_mask", G_TYPE_INT, 65280, "green_mask", G_TYPE_INT, 16711680, "blue_mask", G_TYPE_INT, -16777216, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); + break; + } - if (!caps) { + if (!caps) _mmstreamrec_dbg_err("failed to alloc caps"); - return NULL; - } /* gchar *type = gst_caps_to_string(caps); */ @@ -349,6 +355,22 @@ GstCaps *gst_set_videosrcpad_caps(gint srcfmt, gint width, gint height, gint rat return caps; } +GstCaps *gst_set_videosrcpad_caps_hw(gchar* elem, gint width, gint height, gint rate, gint scale) +{ + + GstCaps *caps = NULL; + _mmstreamrec_dbg_err("Hardware Codec Element [%s]", elem); + + + if (!g_strcmp0(elem, "sprd")) + caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "SN12", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); + + if (!caps) + _mmstreamrec_dbg_err("failed to alloc caps"); + + return caps; +} + GstCaps *gst_set_audiosrcpad_caps(gint samplerate, gint channel, gint depth, gint width, gint datatype) { diff --git a/src/mm_streamrecorder_ini.c b/src/mm_streamrecorder_ini.c index 787c0c3..9f6cce3 100644 --- a/src/mm_streamrecorder_ini.c +++ b/src/mm_streamrecorder_ini.c @@ -96,6 +96,8 @@ int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini) ini->convert_output_buffer_num = iniparser_getint(dict, "general:convert output buffer num", DEFAULT_CONVERT_OUTPUT_BUFFER_NUM); ini->reset_pause_time = iniparser_getint(dict, "general:reset pause time", DEFAULT_RESET_PAUSE_TIME); ini->screen_record = iniparser_getint(dict, "general:screen record", DEFAULT_SCREEN_RECORD); + ini->hw_encoder_supported = iniparser_getboolean(dict, "general:hw encoder supported", DEFAULT_HW_ENCODER_SUPPORTED); + MM_STREAMRECORDER_INI_GET_STRING(dict, ini->video_codec_element_hw, (const char *)"general:video codec element hw", (char *)DEFAULT_VIDEO_SOURCE); /*encodebin */ ini->encsink_bin_profile = iniparser_getint(dict, "encodebin:encsink bin profile", DEFAULT_ENCSINK_BIN_PROFILE); @@ -140,6 +142,8 @@ int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini) ini->convert_output_buffer_num = DEFAULT_CONVERT_OUTPUT_BUFFER_NUM; ini->reset_pause_time = DEFAULT_RESET_PAUSE_TIME; ini->screen_record = DEFAULT_SCREEN_RECORD; + ini->hw_encoder_supported = DEFAULT_HW_ENCODER_SUPPORTED; + strncpy(ini->video_codec_element_hw, DEFAULT_VIDEO_CODEC_ELEMENT_HW, STREAMRECORDER_INI_MAX_STRLEN - 1); /*encodebin */ ini->encsink_bin_profile = DEFAULT_ENCSINK_BIN_PROFILE; @@ -190,6 +194,8 @@ int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini) _mmstreamrec_dbg_log("convert_output_buffer_num : %d", ini->convert_output_buffer_num); _mmstreamrec_dbg_log("reset_pause_time : %d", ini->reset_pause_time); _mmstreamrec_dbg_log("screen_record : %d", ini->screen_record); + _mmstreamrec_dbg_log("hw_encoder_supported : %d", ini->hw_encoder_supported); + _mmstreamrec_dbg_log("video_codec_element_hw : %s", ini->video_codec_element_hw); /*encodebin */ _mmstreamrec_dbg_log("encode bin profile : %d", ini->encsink_bin_profile); diff --git a/src/mm_streamrecorder_internal.c b/src/mm_streamrecorder_internal.c index 1846328..b446eed 100644 --- a/src/mm_streamrecorder_internal.c +++ b/src/mm_streamrecorder_internal.c @@ -389,7 +389,7 @@ int _mmstreamrecorder_record(MMHandleType handle) return ret; } -int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h media_packet, unsigned long timestamp, void *buffer) +int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h media_packet, unsigned long long timestamp, void *buffer) { int ret = MM_ERROR_NONE; unsigned int ind = 0; @@ -458,7 +458,7 @@ int _mmstreamrecorder_push_video_packet(MMHandleType handle, media_packet_h medi return ret; } -int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long timestamp, void *buffer, int size) +int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderStreamType streamtype, unsigned long long timestamp, void *buffer, int size) { int ret = MM_ERROR_NONE; @@ -506,7 +506,7 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, video_buf, sizeof(MMVideoBuffer), 0, sizeof(MMVideoBuffer), stream_buffer, _mmstreamrecorder_buffer_destroy)); } else { - gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, + gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buffer, size, 0, size, stream_buffer, _mmstreamrecorder_buffer_destroy)); } ret = _mmstreamrecorder_push_videostream_buffer(handle, timestamp, stream_buffer->buffer, size); diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index d9eaeb0..eb72cdb 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -158,15 +158,23 @@ int _mmstreamrecorder_create_recorder_pipeline(MMHandleType handle) { int i = 0; int err = MM_ERROR_NONE; - int audio_enable = FALSE; + int rec_mode = 0; + int width = 0; + int height = 0; + int video_src_format = 0; + int frame_rate = 0; + int filename_size = 0; + gboolean audio_enable = FALSE; GstBus *bus = NULL; GstPad *srcpad = NULL; GstPad *sinkpad = NULL; - + GstCaps *caps = NULL; + GList *element_list = NULL; + GstStructure* pulse_property = NULL; unsigned int video_codec = MM_VIDEO_CODEC_INVALID; unsigned int file_format = MM_FILE_FORMAT_INVALID; char *err_name = NULL; - + char *filename = NULL; mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); _MMStreamRecorderSubContext *sc = NULL; @@ -177,96 +185,278 @@ int _mmstreamrecorder_create_recorder_pipeline(MMHandleType handle) _mmstreamrec_dbg_warn("start"); - err = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_VIDEO_ENCODER, &video_codec, MMSTR_FILE_FORMAT, &file_format, NULL); + err = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_VIDEO_ENCODER, &video_codec, MMSTR_FILE_FORMAT, &file_format, MMSTR_RECORDER_MODE, &rec_mode, NULL); if (err != MM_ERROR_NONE) { _mmstreamrec_dbg_warn("Get attrs fail. (%s:%x)", err_name, err); SAFE_FREE(err_name); return err; } - err = _mmstreamrecorder_check_videocodec_fileformat_compatibility(video_codec, file_format); - if (err != MM_ERROR_NONE) - return err; + if (rec_mode == MM_STREAMRECORDER_MODE_STREAM_BUFFER) { + _mmstreamrec_dbg_log("Recording Mode [%d]", MM_STREAMRECORDER_MODE_STREAM_BUFFER); + err = _mmstreamrecorder_check_videocodec_fileformat_compatibility(video_codec, file_format); + if (err != MM_ERROR_NONE) + return err; - /* Main pipeline */ - _MMSTREAMRECORDER_PIPELINE_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_ENCODE_MAIN_PIPE, "recorder_pipeline", err); + /* Main pipeline */ + _MMSTREAMRECORDER_PIPELINE_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_ENCODE_MAIN_PIPE, "recorder_pipeline", err); - /* get audio disable */ - mm_streamrecorder_get_attributes(handle, NULL, MMSTR_AUDIO_ENABLE, &audio_enable, NULL); - sc->audio_enable = audio_enable; + /* get audio disable */ + mm_streamrecorder_get_attributes(handle, NULL, MMSTR_AUDIO_ENABLE, &audio_enable, NULL); + sc->audio_enable = audio_enable; - _mmstreamrec_dbg_log("AUDIO DISABLE : %d", sc->audio_enable); + _mmstreamrec_dbg_log("AUDIO DISABLE : %d", sc->audio_enable); - if (sc->audio_enable == TRUE) { - /* create audiosrc bin */ - err = _mmstreamrecorder_create_audiosrc_bin((MMHandleType) hstreamrecorder); + if (sc->audio_enable == TRUE) { + /* create audiosrc bin */ + err = _mmstreamrecorder_create_audiosrc_bin((MMHandleType) hstreamrecorder); + if (err != MM_ERROR_NONE) + return err; + } + + err = _mmstreamrecorder_create_encodesink_bin((MMHandleType) hstreamrecorder, MM_STREAMRECORDER_ENCBIN_PROFILE_VIDEO); if (err != MM_ERROR_NONE) return err; - } - - err = _mmstreamrecorder_create_encodesink_bin((MMHandleType) hstreamrecorder, MM_STREAMRECORDER_ENCBIN_PROFILE_VIDEO); - if (err != MM_ERROR_NONE) - return err; - - if (sc->audio_enable == TRUE) - gst_bin_add(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_BIN].gst); - /* add element and encodesink bin to encode main pipeline */ - gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, NULL); + if (sc->audio_enable == TRUE) + gst_bin_add(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_BIN].gst); - /* Link each element : appsrc - capsfilter - encodesink bin */ - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "src"); - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, "sink"); - _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); + /* add element and encodesink bin to encode main pipeline */ + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, NULL); - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, "src"); - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, "video_sink0"); - _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); + /* Link each element : appsrc - capsfilter - encodesink bin */ + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "src"); + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, "sink"); + _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); - if (sc->audio_enable == TRUE) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_BIN].gst, "src"); - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, "audio_sink0"); + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, "src"); + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, "video_sink0"); _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); - } - if (sc->audio_enable == TRUE) { - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "sink"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(sinkpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audioque_dataprobe, hstreamrecorder); - gst_object_unref(sinkpad); - sinkpad = NULL; + if (sc->audio_enable == TRUE) { + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_BIN].gst, "src"); + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_BIN].gst, "audio_sink0"); + _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error); + } - if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC_QUE].gst) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC_QUE].gst, "src"); + if (sc->audio_enable == TRUE) { + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "sink"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(sinkpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audioque_dataprobe, hstreamrecorder); + gst_object_unref(sinkpad); + sinkpad = NULL; + + if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC_QUE].gst) { + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC_QUE].gst, "src"); + MMSTREAMRECORDER_ADD_EVENT_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_eventprobe_monitor, hstreamrecorder); + gst_object_unref(srcpad); + srcpad = NULL; + } + } + + if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC_QUE].gst) { + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC_QUE].gst, "src"); MMSTREAMRECORDER_ADD_EVENT_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_eventprobe_monitor, hstreamrecorder); gst_object_unref(srcpad); srcpad = NULL; } - } - if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC_QUE].gst) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC_QUE].gst, "src"); - MMSTREAMRECORDER_ADD_EVENT_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_eventprobe_monitor, hstreamrecorder); + if (sc->audio_enable == FALSE) { + sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "sink"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(sinkpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_audio_disable, hstreamrecorder); + gst_object_unref(sinkpad); + sinkpad = NULL; + } + + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder); gst_object_unref(srcpad); srcpad = NULL; - } - if (sc->audio_enable == FALSE) { - sinkpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "sink"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(sinkpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_audio_disable, hstreamrecorder); - gst_object_unref(sinkpad); - sinkpad = NULL; - } + if (sc->audio_enable == TRUE) { + srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); + MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder); + gst_object_unref(srcpad); + srcpad = NULL; + } + } else if (rec_mode == MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK) { + _mmstreamrec_dbg_log("Recording Mode [%d]", MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK); + err = mm_streamrecorder_get_attributes(handle, NULL, MMSTR_VIDEO_RESOLUTION_WIDTH, &width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &height, MMSTR_AUDIO_ENABLE, &audio_enable, MMSTR_VIDEO_SOURCE_FORMAT, &video_src_format, MMSTR_VIDEO_FRAMERATE, &frame_rate, MMSTR_FILENAME, &filename, &filename_size, NULL); + _mmstreamrec_dbg_log("width [%d], height [%d], audio enable[%d], format [%d], framerate [%d] filename [%s]", width, height, audio_enable, video_src_format, frame_rate, filename); - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_video_dataprobe_record, hstreamrecorder); - gst_object_unref(srcpad); - srcpad = NULL; + _MMSTREAMRECORDER_PIPELINE_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_ENCODE_MAIN_PIPE, "recorder_pipeline", err); - if (sc->audio_enable == TRUE) { - srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); - MMSTREAMRECORDER_ADD_BUFFER_PROBE(srcpad, _MMSTREAMRECORDER_HANDLER_VIDEOREC, __mmstreamrecorder_audio_dataprobe_check, hstreamrecorder); - gst_object_unref(srcpad); - srcpad = NULL; + if (!hstreamrecorder->ini.hw_encoder_supported) { + _mmstreamrec_dbg_log("Screen is recorded with SW encoder."); + if (audio_enable) { + _mmstreamrec_dbg_log("Audio is enabled!"); + + /* Audio pipeline */ + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_SRC, "pulsesrc", "audio_source", element_list, err); + + pulse_property = gst_structure_new_from_string("props,media.role=loopback-mirroring"); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "stream-properties", pulse_property); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "do-timestamp", true); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "provide-clock", false); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_CONV, "audioconvert", "audio_converter", element_list, err); + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_ENC, "avenc_aac", "audio_encoder", element_list, err); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst, "compliance", -2); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_QUE, "queue", "audio_queue", element_list, err); + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_CONV].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst, NULL); + } + + /* Video pipeline */ + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_SRC, "waylandsrc", "video_source", element_list, err); + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_CAPS, "capsfilter", "video_capsfilter", element_list, err); + + caps = gst_set_videosrcpad_caps_sw(MM_STREAMRECORDER_INPUT_FORMAT_BGRA, width, height, frame_rate, 1); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst, "caps", caps); + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_CONV, "videoconvert", "video_conveter", element_list, err); + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_ENC, "avenc_mpeg4", "video_encoder", element_list, err); + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_QUE, "queue", "video_queue", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_MUX, "avmux_mp4", "av_muxer", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_SINK, "filesink", "av_sink", element_list, err); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_SINK].gst, "location", filename); + + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_VIDEO_SRC].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_CONV].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_ENC].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst, NULL); + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_MUX].gst, + sc->encode_element[_MMSTREAMRECORDER_SINK].gst, NULL); + if (audio_enable) { + if (!_MM_GST_ELEMENT_LINK_MANY(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_CONV].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst), NULL)) { + _mmstreamrec_dbg_log("AUDIO PIPELINE LINK MANY FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN AUDIO QUE AND MUX FAILED"); + } + } + + if (!_MM_GST_ELEMENT_LINK_MANY(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_SRC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_CONV].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_ENC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst), NULL)) { + _mmstreamrec_dbg_log("VIDEO PIPELINE LINK MANY FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN VIDEO QUE AND MUX FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_SINK].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN MUX AND SINK FAILED"); + } + } else { + _mmstreamrec_dbg_log("Screen is recorded with HW encoder."); + if (audio_enable) { + _mmstreamrec_dbg_log("Audio is enabled!"); + + /* Audio pipeline */ + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_SRC, "pulsesrc", "audio_source", element_list, err); + + pulse_property = gst_structure_new_from_string("props,media.role=loopback-mirroring"); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "stream-properties", pulse_property); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "do-timestamp", true); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, "provide-clock", false); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_CONV, "audioconvert", "audio_converter", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_ENC, "avenc_aac", "audio_encoder", element_list, err); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst, "compliance", -2); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_AUDIO_QUE, "queue", "audio_queue", element_list, err); + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_CONV].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst, + sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_SRC].gst, NULL); + } + /* Video pipeline */ + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_SRC, "waylandsrc", "video_source", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_CAPS, "capsfilter", "video_capsfilter", element_list, err); + + caps = gst_set_videosrcpad_caps_hw(hstreamrecorder->ini.video_codec_element_hw, width, height, frame_rate, 1); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst, "caps", caps); + + if (!g_strcmp0(hstreamrecorder->ini.video_codec_element_hw, "sprd")){ + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_ENC, "sprdenc_h264", "video_encoder", element_list, err); + } else { + _mmstreamrec_dbg_warn("no matched hw codec element found."); + goto pipeline_creation_error; + } + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_VIDEO_QUE, "queue", "video_queue", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_MUX, "avmux_mp4", "av_muxer", element_list, err); + + _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_SINK, "filesink", "av_sink", element_list, err); + MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_SINK].gst, "location", filename); + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_VIDEO_SRC].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_ENC].gst, + sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst, NULL); + + gst_bin_add_many(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), + sc->encode_element[_MMSTREAMRECORDER_MUX].gst, + sc->encode_element[_MMSTREAMRECORDER_SINK].gst, NULL); + if (audio_enable) { + if (!_MM_GST_ELEMENT_LINK_MANY(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_SRC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_CONV].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_ENC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst), NULL)) { + _mmstreamrec_dbg_log("AUDIO PIPELINE LINK MANY FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_AUDIO_QUE].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN AUDIO QUE AND MUX FAILED"); + } + } + + if (!_MM_GST_ELEMENT_LINK_MANY(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_SRC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_CAPS].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_ENC].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst), NULL)) { + _mmstreamrec_dbg_log("VIDEO PIPELINE LINK MANY FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_VIDEO_QUE].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN VIDEO QUE AND MUX FAILED"); + } + + if (!_MM_GST_ELEMENT_LINK(GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_MUX].gst), + GST_ELEMENT(sc->encode_element[_MMSTREAMRECORDER_SINK].gst))) { + _mmstreamrec_dbg_log("LINK BETWEEN MUX AND SINK FAILED"); + } + } } bus = gst_pipeline_get_bus(GST_PIPELINE(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst)); @@ -276,7 +466,6 @@ int _mmstreamrecorder_create_recorder_pipeline(MMHandleType handle) gst_object_unref(bus); bus = NULL; - return MM_ERROR_NONE; pipeline_creation_error: @@ -434,14 +623,14 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_ENCSINK_SRC, hstreamrecorder->ini.name_of_encsink_src, "encodesink_src", element_list, err); _MMSTREAMRECORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMSTREAMRECORDER_ENCSINK_FILT, "capsfilter", "encodesink_filter", element_list, err); - caps = gst_set_videosrcpad_caps(video_src_format, video_width, video_height, video_fps, 1); + caps = gst_set_videosrcpad_caps_sw(video_src_format, video_width, video_height, video_fps, 1); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "caps", caps); if (caps) { gst_caps_unref(caps); caps = NULL; } - caps = gst_set_videosrcpad_caps(video_src_format, video_width, video_height, video_fps, 1); + caps = gst_set_videosrcpad_caps_sw(video_src_format, video_width, video_height, video_fps, 1); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_FILT].gst, "caps", caps); if (caps) { gst_caps_unref(caps); @@ -454,7 +643,7 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde g_list_free(element_list); element_list = NULL; } - if (rec_mode == MM_STREAMRECORDER_MODE_MEDIABUFFER) { + if (rec_mode == MM_STREAMRECORDER_MODE_STREAM_BUFFER) { /* set appsrc as live source */ MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "is-live", hstreamrecorder->ini.encsink_src_islive); } @@ -480,7 +669,7 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde /* TODO : check the last value ( set ) */ MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "profile", hstreamrecorder->ini.encsink_bin_profile); - if (rec_mode == MM_STREAMRECORDER_MODE_MEDIABUFFER) + if (rec_mode == MM_STREAMRECORDER_MODE_STREAM_BUFFER) MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "auto-audio-convert", hstreamrecorder->ini.encsink_bin_auto_audio_convert); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "auto-audio-resample", hstreamrecorder->ini.encsink_bin_auto_audio_resample); @@ -514,7 +703,7 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde if (video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV12) video_src_format = MM_STREAMRECORDER_INPUT_FORMAT_I420; - caps = gst_set_videosrcpad_caps(video_src_format, video_width, video_height, video_fps, 1); + caps = gst_set_videosrcpad_caps_sw(video_src_format, video_width, video_height, video_fps, 1); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "vcaps", caps); if (video_src_format != MM_STREAMRECORDER_INPUT_FORMAT_NV12) MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VCONV].gst, "dst-buffer-num", hstreamrecorder->ini.convert_output_buffer_num); @@ -767,7 +956,7 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde return MM_ERROR_NONE; - pipeline_creation_error: +pipeline_creation_error: _MMSTREAMRECORDER_ELEMENT_REMOVE(sc->encode_element, _MMSTREAMRECORDER_ENCSINK_ENCBIN); _MMSTREAMRECORDER_ELEMENT_REMOVE(sc->encode_element, _MMSTREAMRECORDER_ENCSINK_SRC); _MMSTREAMRECORDER_ELEMENT_REMOVE(sc->encode_element, _MMSTREAMRECORDER_ENCSINK_FILT); @@ -902,7 +1091,7 @@ int _mmstreamrecorder_create_audiosrc_bin(MMHandleType handle) } if (caps) { - if (rec_mode == MM_STREAMRECORDER_MODE_MEDIABUFFER) + if (rec_mode == MM_STREAMRECORDER_MODE_STREAM_BUFFER) MMSTREAMRECORDER_G_OBJECT_SET((sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst), "caps", caps); MMSTREAMRECORDER_G_OBJECT_SET((sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_FILT].gst), "caps", caps); @@ -919,7 +1108,7 @@ int _mmstreamrecorder_create_audiosrc_bin(MMHandleType handle) goto pipeline_creation_error; } - if (rec_mode == MM_STREAMRECORDER_MODE_SCREENRECORD) { + if (rec_mode == MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK) { #if 1 /* mic mode */ MMSTREAMRECORDER_G_OBJECT_SET((sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst), "do-timestamp", TRUE); #else /* speaker mode with alsasrc */ @@ -1019,6 +1208,9 @@ int _mmstreamrecorder_video_command(MMHandleType handle, int command) GstElement *pipeline = NULL; GstPad *pad = NULL; guint count = 0; + gboolean audio_enable = FALSE; + int rec_mode = 0; + char *err_name = NULL; mmf_return_val_if_fail(hstreamrecorder, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); @@ -1031,6 +1223,14 @@ int _mmstreamrecorder_video_command(MMHandleType handle, int command) mmf_return_val_if_fail(sc->info_file, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); + ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_RECORDER_MODE, &rec_mode, MMSTR_AUDIO_ENABLE, &audio_enable, NULL); + + if (ret != MM_ERROR_NONE) { + _mmstreamrec_dbg_err("Get attrs fail. (%s:%x)", err_name, ret); + SAFE_FREE(err_name); + return ret; + } + info = sc->info_video; if (sc->audio_enable == TRUE) info_audio = sc->info_audio; @@ -1059,7 +1259,7 @@ int _mmstreamrecorder_video_command(MMHandleType handle, int command) sc->ferror_count = 0; sc->error_occurs = FALSE; sc->bget_eos = FALSE; - + ret = _mmstreamrecorder_gst_set_state(handle, sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst, GST_STATE_PAUSED); ret = _mmstreamrecorder_gst_set_state(handle, sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst, GST_STATE_PLAYING); if (ret != MM_ERROR_NONE) { /* Remove recorder pipeline and recording file which size maybe zero */ @@ -1150,88 +1350,96 @@ int _mmstreamrecorder_video_command(MMHandleType handle, int command) case _MM_STREAMRECORDER_CMD_COMMIT: /* video recording command */ { - - if (info->b_commiting) { - _mmstreamrec_dbg_err("now on commiting previous file!!(command : %d)", command); - return MM_ERROR_STREAMRECORDER_CMD_IS_RUNNING; - } else { - _mmstreamrec_dbg_log("_MM_STREAMRECORDER_CMD_COMMIT : start"); - info->b_commiting = TRUE; - } - - for (count = 0; count <= hstreamrecorder->ini.retrial_count; count++) { - if (sc->audio_enable == FALSE) { - /* check only video frame */ - if (info->video_frame_count >= hstreamrecorder->ini.minimum_frame) { - break; - } else if (count == hstreamrecorder->ini.retrial_count) { - _mmstreamrec_dbg_err("Commit fail, frame count is %" G_GUINT64_FORMAT "", info->video_frame_count); - info->b_commiting = FALSE; - return MM_ERROR_STREAMRECORDER_INVALID_CONDITION; - } else { - _mmstreamrec_dbg_warn("Waiting for enough video frame, retrial [%d], frame %" G_GUINT64_FORMAT "", count, info->video_frame_count); + if(rec_mode == MM_STREAMRECORDER_MODE_DEVICE_LOOPBACK) { + if (sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst != NULL) {\ + if (audio_enable) { + ret = gst_element_send_event(gst_bin_get_by_name(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), "audio_source"), gst_event_new_eos()); } + ret = gst_element_send_event(gst_bin_get_by_name(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), "video_source"), gst_event_new_eos()); + } + } else { - usleep(hstreamrecorder->ini.video_frame_wait_time); + if (info->b_commiting) { + _mmstreamrec_dbg_err("now on commiting previous file!!(command : %d)", command); + return MM_ERROR_STREAMRECORDER_CMD_IS_RUNNING; } else { - /* check both of video and audio frame */ - if (info->video_frame_count >= hstreamrecorder->ini.minimum_frame && info_audio->audio_frame_count) { - break; - } else if (count == hstreamrecorder->ini.retrial_count) { - _mmstreamrec_dbg_err("Commit fail, VIDEO[%" G_GUINT64_FORMAT "], AUDIO [%" G_GUINT64_FORMAT "]", info->video_frame_count, info_audio->audio_frame_count); + _mmstreamrec_dbg_log("_MM_STREAMRECORDER_CMD_COMMIT : start"); + info->b_commiting = TRUE; + } - info->b_commiting = FALSE; - return MM_ERROR_STREAMRECORDER_INVALID_CONDITION; + for (count = 0; count <= hstreamrecorder->ini.retrial_count; count++) { + if (sc->audio_enable == FALSE) { + /* check only video frame */ + if (info->video_frame_count >= hstreamrecorder->ini.minimum_frame) { + break; + } else if (count == hstreamrecorder->ini.retrial_count) { + _mmstreamrec_dbg_err("Commit fail, frame count is %" G_GUINT64_FORMAT "", info->video_frame_count); + info->b_commiting = FALSE; + return MM_ERROR_STREAMRECORDER_INVALID_CONDITION; + } else { + _mmstreamrec_dbg_warn("Waiting for enough video frame, retrial [%d], frame %" G_GUINT64_FORMAT "", count, info->video_frame_count); + } + + usleep(hstreamrecorder->ini.video_frame_wait_time); } else { - _mmstreamrec_dbg_warn("Waiting for enough frames, retrial [%d], VIDEO[%" G_GUINT64_FORMAT "], AUDIO [%" G_GUINT64_FORMAT "]", count, info->video_frame_count, info_audio->audio_frame_count); + /* check both of video and audio frame */ + if (info->video_frame_count >= hstreamrecorder->ini.minimum_frame && info_audio->audio_frame_count) { + break; + } else if (count == hstreamrecorder->ini.retrial_count) { + _mmstreamrec_dbg_err("Commit fail, VIDEO[%" G_GUINT64_FORMAT "], AUDIO [%" G_GUINT64_FORMAT "]", info->video_frame_count, info_audio->audio_frame_count); + + info->b_commiting = FALSE; + return MM_ERROR_STREAMRECORDER_INVALID_CONDITION; + } else { + _mmstreamrec_dbg_warn("Waiting for enough frames, retrial [%d], VIDEO[%" G_GUINT64_FORMAT "], AUDIO [%" G_GUINT64_FORMAT "]", count, info->video_frame_count, info_audio->audio_frame_count); + } + + usleep(hstreamrecorder->ini.video_frame_wait_time); } - - usleep(hstreamrecorder->ini.video_frame_wait_time); } - } - if (sc->error_occurs) { - GstPad *video = NULL; - GstPad *audio = NULL; + if (sc->error_occurs) { + GstPad *video = NULL; + GstPad *audio = NULL; - _mmstreamrec_dbg_err("Committing Error case"); + _mmstreamrec_dbg_err("Committing Error case"); #if 0 - video = gst_element_get_static_pad(sc->element[_MMSTREAMRECORDER_VIDEOSINK_SINK].gst, "sink"); - ret = gst_pad_send_event(video, gst_event_new_eos()); - _mmstreamrec_dbg_err("Sending EOS video sink : %d", ret); - gst_object_unref(video); + video = gst_element_get_static_pad(sc->element[_MMSTREAMRECORDER_VIDEOSINK_SINK].gst, "sink"); + ret = gst_pad_send_event(video, gst_event_new_eos()); + _mmstreamrec_dbg_err("Sending EOS video sink : %d", ret); + gst_object_unref(video); #endif - video = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); - gst_pad_push_event(video, gst_event_new_flush_start()); - gst_pad_push_event(video, gst_event_new_flush_stop(TRUE)); - ret = gst_pad_push_event(video, gst_event_new_eos()); - _mmstreamrec_dbg_err("Sending EOS video encoder src pad : %d", ret); - gst_object_unref(video); - - if (sc->audio_enable == TRUE) { - audio = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); - gst_pad_push_event(audio, gst_event_new_flush_start()); - gst_pad_push_event(audio, gst_event_new_flush_stop(TRUE)); - ret = gst_element_send_event(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, gst_event_new_eos()); - _mmstreamrec_dbg_err("Sending EOS audio encoder src pad : %d", ret); - gst_object_unref(audio); - } - } else { - if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst != NULL) { + video = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VENC].gst, "src"); + gst_pad_push_event(video, gst_event_new_flush_start()); + gst_pad_push_event(video, gst_event_new_flush_stop(TRUE)); + ret = gst_pad_push_event(video, gst_event_new_eos()); + _mmstreamrec_dbg_err("Sending EOS video encoder src pad : %d", ret); + gst_object_unref(video); + + if (sc->audio_enable == TRUE) { + audio = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_AENC].gst, "src"); + gst_pad_push_event(audio, gst_event_new_flush_start()); + gst_pad_push_event(audio, gst_event_new_flush_stop(TRUE)); + ret = gst_element_send_event(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, gst_event_new_eos()); + _mmstreamrec_dbg_err("Sending EOS audio encoder src pad : %d", ret); + gst_object_unref(audio); + } + } else { + if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst != NULL) { ret = gst_element_send_event(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, gst_event_new_eos()); _mmstreamrec_dbg_warn("send eos to appsrc result : %d", ret); - } + } - if (sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst != NULL) { - pad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, "src"); - ret = gst_element_send_event(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, gst_event_new_eos()); - gst_object_unref(pad); - pad = NULL; + if (sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst != NULL) { + pad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, "src"); + ret = gst_element_send_event(sc->encode_element[_MMSTREAMRECORDER_AUDIOSRC_SRC].gst, gst_event_new_eos()); + gst_object_unref(pad); + pad = NULL; - _mmstreamrec_dbg_warn("send eos to audiosrc result : %d", ret); + _mmstreamrec_dbg_warn("send eos to audiosrc result : %d", ret); + } } } - /* Wait EOS */ _mmstreamrec_dbg_log("Start to wait EOS"); ret = _mmstreamrecorder_get_eos_message(handle); @@ -1324,7 +1532,7 @@ int _mmstreamrecorder_video_handle_eos(MMHandleType handle) return TRUE; } -int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long timestamp, GstBuffer *buffer, int size) +int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long long timestamp, GstBuffer *buffer, int size) { mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); _MMStreamRecorderSubContext *sc = NULL; @@ -1344,11 +1552,11 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long mmf_return_val_if_fail(sc, MM_ERROR_STREAMRECORDER_NOT_INITIALIZED); if (buffer == NULL || size == 0) { - _mmstreamrec_dbg_err("video : Buffer is %p , size %d, time stamp is %ld", buffer, size, timestamp); + _mmstreamrec_dbg_err("video : Buffer is %p , size %d, time stamp is %lld", buffer, size, timestamp); return MM_ERROR_STREAMRECORDER_RESOURCE_CREATION; } - _mmstreamrec_dbg_log("video : Buffer is %p , size %d, time stamp is %ld", buffer, size, timestamp); + _mmstreamrec_dbg_log("video : Buffer is %p , size %d, time stamp is %lld", buffer, size, timestamp); /* check element availability */ ret = mm_streamrecorder_get_attributes(handle, &err_name, MMSTR_VIDEO_FRAMERATE, &video_fps, MMSTR_VIDEO_SOURCE_FORMAT, &video_src, MMSTR_VIDEO_RESOLUTION_WIDTH, &video_width, MMSTR_VIDEO_RESOLUTION_HEIGHT, &video_height, MMSTR_VIDEO_SOURCE_FORMAT, &video_source_format, NULL); @@ -1364,7 +1572,7 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long /*_mmstreamrec_dbg_log("Buffer Push start , time stamp %ld",timestamp);*/ /* srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "src"); */ /* srccaps = gst_pad_get_current_caps(srcpad); */ - srccaps = gst_set_videosrcpad_caps(video_src, video_width, video_height, video_fps, 1); + srccaps = gst_set_videosrcpad_caps_sw(video_src, video_width, video_height, video_fps, 1); if (srccaps) { gst_app_src_set_caps((GstAppSrc *) sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, srccaps); gst_caps_unref(srccaps); @@ -1373,6 +1581,7 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long /*_mmstreamrec_dbg_err("newbuf streamrecorder(%p) ",newbuf);*/ ret = gst_app_src_push_buffer((GstAppSrc *) sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, buffer); + if (ret) { _mmstreamrec_dbg_err("video gst_app_src_push_buffer %d", ret); ret = MM_ERROR_STREAMRECORDER_VIDEOBUFFER_PUSH; @@ -1384,7 +1593,7 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long return ret; } -int _mmstreamrecorder_push_audiostream_buffer(MMHandleType handle, unsigned long timestamp, GstBuffer *buffer, int size) +int _mmstreamrecorder_push_audiostream_buffer(MMHandleType handle, unsigned long long timestamp, GstBuffer *buffer, int size) { mmf_streamrecorder_t *hstreamrecorder = MMF_STREAMRECORDER(handle); _MMStreamRecorderSubContext *sc = NULL; -- 2.7.4 From bdd86e69fbe697ed6023f6e18ddb1eb347bc38c8 Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Wed, 8 Jan 2020 16:36:45 +0900 Subject: [PATCH 13/16] Fix build error due to toolchain upgrade (gcc6->gcc9) Change-Id: Ib1caeea8b393775c6ffe38e608ae17e8b71ab429 Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_gstcommon.c | 1 + test/mm_streamrecorder_testsuite.c | 11 ++++------- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index f679aff..187f587 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.28 +Version: 0.0.29 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_gstcommon.c b/src/mm_streamrecorder_gstcommon.c index 64d4d5e..2ab6911 100644 --- a/src/mm_streamrecorder_gstcommon.c +++ b/src/mm_streamrecorder_gstcommon.c @@ -293,6 +293,7 @@ int _mmstreamrecorder_gst_set_state(MMHandleType handle, GstElement *pipeline, G switch (getChangeReturn) { case GST_STATE_CHANGE_NO_PREROLL: _mmstreamrec_dbg_log("status=GST_STATE_CHANGE_NO_PREROLL."); + /* fall through */ case GST_STATE_CHANGE_SUCCESS: /* if we reached the final target state, exit */ if (pipeline_state == target_state) { diff --git a/test/mm_streamrecorder_testsuite.c b/test/mm_streamrecorder_testsuite.c index c6f570d..ee4ac19 100644 --- a/test/mm_streamrecorder_testsuite.c +++ b/test/mm_streamrecorder_testsuite.c @@ -314,7 +314,7 @@ const char *visible_mode[] = { ---------------------------------------------------------------------------*/ static void print_menu(); void get_me_out(); -static gboolean cmd_input(GIOChannel *channel); +static gboolean cmd_input(GIOChannel *channel, GIOCondition cond, gpointer data); static gboolean init(int type); static gboolean mode_change(); int streamrecordertest_set_attr_int(const char* attr_subcategory, int value); @@ -930,7 +930,9 @@ static void setting_menu(gchar buf) * @remark * @see */ -static gboolean cmd_input(GIOChannel *channel) +static gboolean cmd_input(GIOChannel *channel, + GIOCondition cond, + gpointer data) { gchar *buf = NULL; gsize read_size; @@ -1081,10 +1083,7 @@ static gboolean mode_change() { int err = MM_ERROR_NONE; int state = STREAMRECORDER_NONE; - int device_count = 0; - int facing_direction = 0; char media_type = '\0'; - char *evassink_name = NULL; bool check = FALSE; state = streamrecorder_get_state(); @@ -1182,8 +1181,6 @@ static gboolean mode_change() } - debug_msg_t("evassink name[%s], device count[%d], facing direction[%d]", evassink_name, device_count, facing_direction); - if (!init(hstreamrecorder->mode)) { err_msg_t("testsuite init() failed."); return -1; -- 2.7.4 From b74066efa7c66366c7e1b1999192d009c058275b Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Tue, 25 Feb 2020 18:21:32 +0900 Subject: [PATCH 14/16] Adds NV21 format support Change-Id: Icc1bebcd58f873c276a28d5da62187d3c14bd5f1 Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_gstcommon.c | 3 +++ src/mm_streamrecorder_recorder.c | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 187f587..33d1200 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.29 +Version: 0.0.30 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_gstcommon.c b/src/mm_streamrecorder_gstcommon.c index 2ab6911..2543298 100644 --- a/src/mm_streamrecorder_gstcommon.c +++ b/src/mm_streamrecorder_gstcommon.c @@ -333,6 +333,9 @@ GstCaps *gst_set_videosrcpad_caps_sw(gint srcfmt, gint width, gint height, gint case MM_STREAMRECORDER_INPUT_FORMAT_NV12 : caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "NV12", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); break; + case MM_STREAMRECORDER_INPUT_FORMAT_NV21 : + caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "NV21", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); + break; case MM_STREAMRECORDER_INPUT_FORMAT_I420 : caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "I420", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); break; diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index eb72cdb..efa126c 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -700,11 +700,12 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "auto-colorspace", hstreamrecorder->ini.encsink_bin_auto_colorspace); - if (video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV12) + if (video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV21 ) video_src_format = MM_STREAMRECORDER_INPUT_FORMAT_I420; caps = gst_set_videosrcpad_caps_sw(video_src_format, video_width, video_height, video_fps, 1); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "vcaps", caps); + if (video_src_format != MM_STREAMRECORDER_INPUT_FORMAT_NV12) MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VCONV].gst, "dst-buffer-num", hstreamrecorder->ini.convert_output_buffer_num); -- 2.7.4 From 6016752352bda75fbca1566db28534debf98811f Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Fri, 13 Mar 2020 14:57:16 +0900 Subject: [PATCH 15/16] Change mediapacket usage Change-Id: I226b832ed7cd9fd08a52d8a1c6eef6ad6ca3ff89 Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/mm_streamrecorder_gstcommon.c | 8 ++++---- src/mm_streamrecorder_internal.c | 6 ++++-- src/mm_streamrecorder_recorder.c | 9 ++++----- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 33d1200..3c6bfc5 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.30 +Version: 0.0.31 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/mm_streamrecorder_gstcommon.c b/src/mm_streamrecorder_gstcommon.c index 2543298..548d844 100644 --- a/src/mm_streamrecorder_gstcommon.c +++ b/src/mm_streamrecorder_gstcommon.c @@ -328,7 +328,7 @@ GstCaps *gst_set_videosrcpad_caps_sw(gint srcfmt, gint width, gint height, gint { GstCaps *caps = NULL; - + gchar *type = NULL; switch (srcfmt) { case MM_STREAMRECORDER_INPUT_FORMAT_NV12 : caps = gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "NV12", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, rate, scale, NULL); @@ -350,11 +350,11 @@ GstCaps *gst_set_videosrcpad_caps_sw(gint srcfmt, gint width, gint height, gint if (!caps) _mmstreamrec_dbg_err("failed to alloc caps"); - /* gchar *type = gst_caps_to_string(caps); */ + type = gst_caps_to_string(caps); - /* _mmstreamrec_dbg_warn("Set srcpad caps: %s",type); */ + _mmstreamrec_dbg_warn("Set srcfmt %d caps: %s",srcfmt, type); - /* g_free(type); */ + g_free(type); return caps; } diff --git a/src/mm_streamrecorder_internal.c b/src/mm_streamrecorder_internal.c index b446eed..863755a 100644 --- a/src/mm_streamrecorder_internal.c +++ b/src/mm_streamrecorder_internal.c @@ -496,15 +496,17 @@ int _mmstreamrecorder_push_stream_buffer(MMHandleType handle, MMStreamRecorderSt GST_BUFFER_DURATION(stream_buffer->buffer) = GST_CLOCK_TIME_NONE; if (streamtype == MM_STREAM_TYPE_VIDEO) { - if (format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || format == MM_STREAMRECORDER_INPUT_FORMAT_NV21) { + if (format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || + format == MM_STREAMRECORDER_INPUT_FORMAT_NV21) { MMVideoBuffer *video_buf = (MMVideoBuffer *)buffer; + /* Buffer at 0th position */ gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, video_buf->data[0], size, 0, size, video_buf->data[0], NULL)); /* Buffer at 1st position */ gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, - video_buf, sizeof(MMVideoBuffer), 0, sizeof(MMVideoBuffer), stream_buffer, _mmstreamrecorder_buffer_destroy)); + video_buf->data[1], size / 2, 0, size / 2, stream_buffer, _mmstreamrecorder_buffer_destroy)); } else { gst_buffer_append_memory(stream_buffer->buffer, gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buffer, size, 0, size, stream_buffer, _mmstreamrecorder_buffer_destroy)); diff --git a/src/mm_streamrecorder_recorder.c b/src/mm_streamrecorder_recorder.c index efa126c..9f8b35c 100644 --- a/src/mm_streamrecorder_recorder.c +++ b/src/mm_streamrecorder_recorder.c @@ -700,13 +700,15 @@ int _mmstreamrecorder_create_encodesink_bin(MMHandleType handle, MMStreamRecorde MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "auto-colorspace", hstreamrecorder->ini.encsink_bin_auto_colorspace); - if (video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV21 ) + if (video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV12 || + video_src_format == MM_STREAMRECORDER_INPUT_FORMAT_NV21) video_src_format = MM_STREAMRECORDER_INPUT_FORMAT_I420; caps = gst_set_videosrcpad_caps_sw(video_src_format, video_width, video_height, video_fps, 1); MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_ENCBIN].gst, "vcaps", caps); - if (video_src_format != MM_STREAMRECORDER_INPUT_FORMAT_NV12) + if (video_src_format != MM_STREAMRECORDER_INPUT_FORMAT_NV12 || + video_src_format != MM_STREAMRECORDER_INPUT_FORMAT_NV21) MMSTREAMRECORDER_G_OBJECT_SET(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_VCONV].gst, "dst-buffer-num", hstreamrecorder->ini.convert_output_buffer_num); /* state tuning */ @@ -1570,9 +1572,6 @@ int _mmstreamrecorder_push_videostream_buffer(MMHandleType handle, unsigned long if (sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst) { - /*_mmstreamrec_dbg_log("Buffer Push start , time stamp %ld",timestamp);*/ - /* srcpad = gst_element_get_static_pad(sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, "src"); */ - /* srccaps = gst_pad_get_current_caps(srcpad); */ srccaps = gst_set_videosrcpad_caps_sw(video_src, video_width, video_height, video_fps, 1); if (srccaps) { gst_app_src_set_caps((GstAppSrc *) sc->encode_element[_MMSTREAMRECORDER_ENCSINK_SRC].gst, srccaps); -- 2.7.4 From 556eca35359fce1efcc315981a795bc953e3f00f Mon Sep 17 00:00:00 2001 From: Hyunsoo Park Date: Fri, 15 May 2020 14:30:25 +0900 Subject: [PATCH 16/16] Adds dot generation codes In case of 'generate dot' ini value is 'yes', stream recorder would generate dot file. Change-Id: I89bc3b1a4db3b349cbfc91621b65fb59ab973f57 Signed-off-by: Hyunsoo Park --- packaging/libmm-streamrecorder.spec | 2 +- src/include/mm_streamrecorder_ini.h | 5 +++++ src/mm_streamrecorder_gstdispatch.c | 7 +++++++ src/mm_streamrecorder_ini.c | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packaging/libmm-streamrecorder.spec b/packaging/libmm-streamrecorder.spec index 3c6bfc5..8badfa4 100644 --- a/packaging/libmm-streamrecorder.spec +++ b/packaging/libmm-streamrecorder.spec @@ -1,6 +1,6 @@ Name: libmm-streamrecorder Summary: Media Stream Recorder library -Version: 0.0.31 +Version: 0.0.32 Release: 0 Group: Multimedia/Other License: Apache-2.0 diff --git a/src/include/mm_streamrecorder_ini.h b/src/include/mm_streamrecorder_ini.h index 74df497..eeb2919 100644 --- a/src/include/mm_streamrecorder_ini.h +++ b/src/include/mm_streamrecorder_ini.h @@ -90,6 +90,8 @@ typedef struct __mm_streamrecorder_ini { gchar supported_video_encoders[STREAMRECORDER_ATTRIBUTE_NUM_MAX][STREAMRECORDER_INI_MAX_STRLEN]; gchar supported_file_formats[STREAMRECORDER_ATTRIBUTE_NUM_MAX][STREAMRECORDER_INI_MAX_STRLEN]; + /* debug */ + gboolean generate_dot; } mm_streamrecorder_ini_t; /*Default sink ini values*/ @@ -137,6 +139,9 @@ typedef struct __mm_streamrecorder_ini { #define DEFAULT_SUPPORTED_VIDEO_ENCODERS "" #define DEFAULT_SUPPORTED_FILE_FORMATS "" +/*debug*/ +#define DEFAULT_GENERATE_DOT FALSE + int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t * ini); int _mm_streamrecorder_ini_unload(mm_streamrecorder_ini_t * ini); diff --git a/src/mm_streamrecorder_gstdispatch.c b/src/mm_streamrecorder_gstdispatch.c index 8a0cf6a..042d793 100644 --- a/src/mm_streamrecorder_gstdispatch.c +++ b/src/mm_streamrecorder_gstdispatch.c @@ -812,6 +812,13 @@ gboolean _mmstreamrecorder_pipeline_cb_message(GstBus *bus, GstMessage *message, vnewstate = (GValue *) gst_structure_get_value(gst_message_get_structure(message), "new-state"); newstate = (GstState) vnewstate->data[0].v_int; _mmstreamrec_dbg_log("GST_MESSAGE_STATE_CHANGED[%s]", gst_element_state_get_name(newstate)); + if (newstate == 4) { + if (hstreamrecorder->ini.generate_dot) { + _mmstreamrec_dbg_log("GST_MESSAGE_STATE_PLAYING! DOT would be generated."); + g_setenv("GST_DEBUG_DUMP_DOT_DIR", "/tmp/", FALSE); + GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(sc->encode_element[_MMSTREAMRECORDER_ENCODE_MAIN_PIPE].gst), GST_DEBUG_GRAPH_SHOW_ALL, "streamrecorder_pipeline"); + } + } } } } diff --git a/src/mm_streamrecorder_ini.c b/src/mm_streamrecorder_ini.c index 9f6cce3..4eac503 100644 --- a/src/mm_streamrecorder_ini.c +++ b/src/mm_streamrecorder_ini.c @@ -133,6 +133,9 @@ int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini) __get_element_list(ini, iniparser_getstring(dict, "attribute:supported video encoders", (char*)DEFAULT_SUPPORTED_VIDEO_ENCODERS), KEYWORD_VIDEO_ENCODERS); __get_element_list(ini, iniparser_getstring(dict, "attribute:supported file formats", (char*)DEFAULT_SUPPORTED_FILE_FORMATS), KEYWORD_FILE_FORMATS); + /* debug */ + ini->generate_dot = iniparser_getboolean(dict, "debug:generate dot", DEFAULT_GENERATE_DOT); + } else { /* if dict is not available just fill the structure with default value */ _mmstreamrec_dbg_err("failed to load ini. using hardcoded default\n"); /* general */ @@ -178,6 +181,9 @@ int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini) __get_element_list(ini, (char *)DEFAULT_SUPPORTED_AUDIO_ENCODERS, KEYWORD_AUDIO_ENCODERS); __get_element_list(ini, (char *)DEFAULT_SUPPORTED_VIDEO_ENCODERS, KEYWORD_VIDEO_ENCODERS); __get_element_list(ini, (char *)DEFAULT_SUPPORTED_FILE_FORMATS, KEYWORD_FILE_FORMATS); + + /* debug */ + ini->generate_dot = DEFAULT_GENERATE_DOT; } /* free dict as we got our own structure */ -- 2.7.4