From b38a4bd78e6b0c35ab7ff1deef0731b3fc2cdb10 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 2 Oct 2019 15:49:10 +0900 Subject: [PATCH 01/16] Code clean up - Remove unused assignment - Remove dead code - Correct mismatched log [Version] 0.6.3 [Profile] Common [Issue Type] Clean up Change-Id: I3815198618eca58444b6785a8851af5317d56f94 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 11 +---------- src/media_codec_sync_internal.c | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index f540901..cc14806 100755 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.2 +Version: 0.6.3 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 5d09f4b..0cc3a0a 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2664,16 +2664,12 @@ static void __mc_input_buffer_finalize_cb(GstMCBuffer *mcbuffer) return; LOGD("============>>>>> _finalize_cb : %p, %p", mcbuffer, mcbuffer->packet); - mc_gst_core_t *core = (mc_gst_core_t *)mcbuffer->core; - _mc_gst_handle_input_buffer_used(core, mcbuffer->packet); + _mc_gst_handle_input_buffer_used(mcbuffer->core, mcbuffer->packet); g_free(mcbuffer); - mcbuffer = NULL; MEDIACODEC_FLEAVE(); - - return; } static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_h packet, uint64_t size) @@ -2682,11 +2678,6 @@ static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_ mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer)); - if (mcbuffer == NULL) { - LOGE("malloc fail"); - return NULL; - } - mcbuffer->buffer = gst_buffer_new(); mcbuffer->buf_size = 0; diff --git a/src/media_codec_sync_internal.c b/src/media_codec_sync_internal.c index 5d95d6f..e17390b 100644 --- a/src/media_codec_sync_internal.c +++ b/src/media_codec_sync_internal.c @@ -677,7 +677,7 @@ int mediacodecsync_set_format(mediacodecsync_h mediacodecsync, media_format_h au } if (video_format) { - LOGD("set video format : %p", audio_format); + LOGD("set video format : %p", video_format); if (media_format_ref(video_format) != MEDIACODEC_ERROR_NONE) { LOGE("video format ref failed"); -- 2.7.4 From cb529a4c40b7cc5746448c63d60b4b82799d29e0 Mon Sep 17 00:00:00 2001 From: Hyuntae Kim Date: Tue, 22 Oct 2019 13:26:46 +0900 Subject: [PATCH 02/16] [mediacodec] disable mm-resource-manager when tv profile Change-Id: Iec9caf6101ff01c2247f2caf4bfe6289e5453bd3 --- CMakeLists.txt | 10 ++++++++-- include/media_codec_private.h | 4 ++++ packaging/capi-media-codec.spec | 12 +++++++++--- src/media_codec.c | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 packaging/capi-media-codec.spec diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 index 217ee07..b073bc8 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,11 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info mm-resource-manager gstreamer-allocators-1.0" ) -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 mm-resource-manager gstreamer-allocators-1.0" ) +SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info gstreamer-allocators-1.0" ) +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-allocators-1.0" ) +IF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) +SET(dependents "${dependents} mm-resource-manager") +ENDIF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) @@ -28,6 +31,9 @@ ENDIF("${ARCH}" STREQUAL "arm") ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") ADD_DEFINITIONS("-DTIZEN_DEBUG") +IF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) +ADD_DEFINITIONS("-DUSE_MM_RESOURCE_MANAGER") +ENDIF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=${LIB_INSTALL_DIR}") diff --git a/include/media_codec_private.h b/include/media_codec_private.h index 0057fa0..bc196ec 100644 --- a/include/media_codec_private.h +++ b/include/media_codec_private.h @@ -24,7 +24,9 @@ #include #include +#ifdef USE_MM_RESOURCE_MANAGER #include +#endif #ifdef __cplusplus extern "C" { @@ -101,7 +103,9 @@ typedef struct _mediacodec_s { int state; bool is_omx; char *m_mime; +#ifdef USE_MM_RESOURCE_MANAGER mm_resource_manager_res_h codec_resource; +#endif mediacodec_input_buffer_used_cb empty_buffer_cb; void* empty_buffer_cb_userdata; diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec old mode 100755 new mode 100644 index cc14806..311c106 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.3 +Version: 0.6.4 Release: 0 Group: Multimedia/API License: Apache-2.0 @@ -21,7 +21,9 @@ BuildRequires: pkgconfig(gstreamer-plugins-base-1.0) BuildRequires: pkgconfig(gstreamer-app-1.0) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(iniparser) +%if "%{tizen_profile_name}" != "tv" BuildRequires: pkgconfig(mm-resource-manager) +%endif #BuildRequires: pkgconfig(capi-media-camera) #BuildRequires: pkgconfig(capi-mediademuxer) #BuildRequires: pkgconfig(capi-mediamuxer) @@ -63,8 +65,12 @@ export LDFLAGS+=" -lgcov" %endif MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` -%cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} - +%cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} \ +%if "%{tizen_profile_name}" == "tv" + -DTIZEN_FEATURE_MM_RESOURCE_MANAGER=NO +%else + -DTIZEN_FEATURE_MM_RESOURCE_MANAGER=YES +%endif make %{?jobs:-j%jobs} diff --git a/src/media_codec.c b/src/media_codec.c index b76269a..88e12d8 100644 --- a/src/media_codec.c +++ b/src/media_codec.c @@ -26,9 +26,11 @@ #define MC_PREALLOCATED_HANDLE_ARRAY_SIZE 16 +#ifdef USE_MM_RESOURCE_MANAGER static mm_resource_manager_h resource_manager; static GPtrArray *mediacodec_handles; static GMutex mediacodec_handles_lock; +#endif static gboolean __mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_data); static gboolean __mediacodec_fill_buffer_cb(media_packet_h pkt, void *user_data); @@ -36,10 +38,12 @@ static gboolean __mediacodec_error_cb(mediacodec_error_e error, void *user_data) static gboolean __mediacodec_eos_cb(void *user_data); static gboolean __mediacodec_supported_codec_cb(mediacodec_codec_type_e codec_type, void *user_data); static gboolean __mediacodec_buffer_status_cb(mediacodec_status_e status, void *user_data); +#ifdef USE_MM_RESOURCE_MANAGER static void __mediacodec_init_lib() __attribute__((constructor)); static void __mediacodec_deinit_lib() __attribute__((destructor)); static int __mediacodec_resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h resource_h, void *user_data); +#endif /* * Internal Implementation @@ -131,8 +135,10 @@ int mediacodec_create(mediacodec_h *mediacodec) LOGD("mediacodec_create.."); +#ifdef USE_MM_RESOURCE_MANAGER if (resource_manager == NULL) return MEDIACODEC_ERROR_INTERNAL; +#endif handle = (mediacodec_s *)malloc(sizeof(mediacodec_s)); if (handle != NULL) { @@ -164,9 +170,11 @@ int mediacodec_create(mediacodec_h *mediacodec) mc_set_buffer_status_cb(handle->mc_handle, (mediacodec_buffer_status_cb)__mediacodec_buffer_status_cb, handle); mc_set_supported_codec_cb(handle->mc_handle, (mediacodec_supported_codec_cb)__mediacodec_supported_codec_cb, handle); +#ifdef USE_MM_RESOURCE_MANAGER g_mutex_lock(&mediacodec_handles_lock); g_ptr_array_insert(mediacodec_handles, -1, *mediacodec); g_mutex_unlock(&mediacodec_handles_lock); +#endif return MEDIACODEC_ERROR_NONE; @@ -183,9 +191,11 @@ int mediacodec_destroy(mediacodec_h mediacodec) LOGD("MEDIACODEC_ERROR_INVALID_OPERATION(0x%08x)", MEDIACODEC_ERROR_INVALID_OPERATION); return MEDIACODEC_ERROR_INVALID_OPERATION; } else { +#ifdef USE_MM_RESOURCE_MANAGER g_mutex_lock(&mediacodec_handles_lock); g_ptr_array_remove_fast(mediacodec_handles, mediacodec); g_mutex_unlock(&mediacodec_handles_lock); +#endif handle->state = MEDIACODEC_STATE_NONE; free(handle); @@ -294,11 +304,14 @@ int mediacodec_prepare(mediacodec_h mediacodec) { MEDIACODEC_INSTANCE_CHECK(mediacodec); mediacodec_s *handle = (mediacodec_s *)mediacodec; +#ifdef USE_MM_RESOURCE_MANAGER mc_handle_t *mc_handle = (mc_handle_t *) handle->mc_handle; int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; mm_resource_manager_res_h resource; +#endif MEDIACODEC_STATE_CHECK(handle, MEDIACODEC_STATE_IDLE); +#ifdef USE_MM_RESOURCE_MANAGER if (mc_handle->is_hw && mc_handle->is_video) { if (handle->codec_resource) { @@ -345,6 +358,7 @@ int mediacodec_prepare(mediacodec_h mediacodec) handle->codec_resource = resource; } +#endif int ret = mc_prepare(handle->mc_handle); @@ -360,13 +374,16 @@ int mediacodec_unprepare(mediacodec_h mediacodec) { MEDIACODEC_INSTANCE_CHECK(mediacodec); mediacodec_s *handle = (mediacodec_s *)mediacodec; +#ifdef USE_MM_RESOURCE_MANAGER int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE; +#endif int ret = mc_unprepare(handle->mc_handle); if (ret != MEDIACODEC_ERROR_NONE) { return __convert_error_code(ret, (char *)__FUNCTION__); } else { +#ifdef USE_MM_RESOURCE_MANAGER if (handle->codec_resource != NULL) { mm_resource_manager_mark_for_release(resource_manager, handle->codec_resource); @@ -384,6 +401,7 @@ int mediacodec_unprepare(mediacodec_h mediacodec) } else { LOGD("No codec resource to release. Probably resource release cb called\n"); } +#endif handle->state = MEDIACODEC_STATE_IDLE; return MEDIACODEC_ERROR_NONE; @@ -689,6 +707,7 @@ static gboolean __mediacodec_buffer_status_cb(mediacodec_status_e status, void * } +#ifdef USE_MM_RESOURCE_MANAGER static int __mediacodec_resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h resource_h, void *user_data) { @@ -734,3 +753,4 @@ static void __mediacodec_deinit_lib() mm_resource_manager_destroy(resource_manager); g_ptr_array_unref(mediacodec_handles); } +#endif -- 2.7.4 From d998035d4965be121e7a97ab278958cb7ec87a79 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 25 Oct 2019 14:04:41 +0900 Subject: [PATCH 03/16] Remove unnecessary dependency for pc file [Version] 0.6.4-1 [Profile] Common [Issue Type] Update Change-Id: I5c5b30ea0b51ed6e17aab6c84df2be4874f4966b Signed-off-by: Jeongmo Yang --- CMakeLists.txt | 4 ++-- packaging/capi-media-codec.spec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b073bc8..f2b7204 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info gstreamer-allocators-1.0" ) -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-allocators-1.0" ) +SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info gstreamer-allocators-1.0") +SET(pc_dependents "capi-base-common capi-media-tool") IF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) SET(dependents "${dependents} mm-resource-manager") ENDIF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 311c106..ab8829e 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -5,7 +5,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API Version: 0.6.4 -Release: 0 +Release: 1 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -- 2.7.4 From 385aadca8059bbe9f7ef5c28038ba32c26e4a1de Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Wed, 30 Oct 2019 11:43:49 +0900 Subject: [PATCH 04/16] Do not alloc memory in eos packet - EOS packet has dummy data [Version] 0.6.5 [Profile] Common [Issue Type] Fix bugs Change-Id: I94df9c25d03fda7fdba934d50974381532b4dca9 --- packaging/capi-media-codec.spec | 4 ++-- src/media_codec_port_gst.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index ab8829e..3fff575 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,8 +4,8 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.4 -Release: 1 +Version: 0.6.5 +Release: 0 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 0cc3a0a..5ebf95e 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2440,8 +2440,8 @@ int __mc_gst_create_eos_packet(media_format_h fmt, GstMCBuffer *mcbuffer) media_packet_h packet = NULL; MEDIACODEC_FENTER(); - if (media_packet_create_alloc(fmt, __mc_output_buffer_finalize_cb, mcbuffer, &packet)) { - LOGE("media_packet_create_alloc failed\n"); + if (media_packet_create(fmt, __mc_output_buffer_finalize_cb, mcbuffer, &packet)) { + LOGE("media_packet_create failed\n"); ret = MC_ERROR; goto ERROR; } -- 2.7.4 From 4698d3f9e0c2bbf8c649f6b5178ea676fead71f0 Mon Sep 17 00:00:00 2001 From: Hyuntae Kim Date: Fri, 25 Oct 2019 10:35:03 +0900 Subject: [PATCH 05/16] [mediacodec] code encapsulation and naming changes 1. remove duplicated header includes 2. move internal codes from header to c file 3. add parameter naming rule [Version] 0.6.6 [Profile] Common [Issue Type] Update Change-Id: Ic8865953f1d5a1da3b9ae465c6d77cc16833d3d3 --- include/media_codec_port_gst.h | 34 ++----------------------- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 55 ++++++++++++++++++++++++++++++----------- 3 files changed, 43 insertions(+), 48 deletions(-) diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index 18010d4..f3fe9a5 100644 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -19,15 +19,12 @@ #define __TIZEN_MEDIA_CODEC_PORT_GST_H__ #include -#include #include #include #include #include -#include #include -#include #include #include #include @@ -39,14 +36,6 @@ extern "C" { #define GST_INIT_STRUCTURE(param) \ memset(&(param), 0, sizeof(param)); -#define MEDIACODEC_ELEMENT_SET_STATE(x_element, x_state) \ - do { \ - LOGD("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \ - if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(x_element, x_state)) { \ - LOGE("failed to set state %s to %s\n", #x_state, GST_ELEMENT_NAME(x_element)); \ - goto STATE_CHANGE_FAILED; \ - } \ - } while (0) #define SCMN_IMGB_MAX_PLANE 4 #define TBM_API_CHANGE @@ -168,30 +157,11 @@ struct _GstMCBuffer { }; enum { fill_inbuf, fill_outbuf }; - -int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); -int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); - -int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); -int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); -int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); - -int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); -int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); -int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); -int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); - -mc_gst_core_t *mc_gst_core_new(); -void mc_gst_core_free(mc_gst_core_t *core); - -mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core); -void mc_gst_port_free(mc_gst_port_t *port); - mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle); mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle); -mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeOutUs); -mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeOutUs); +mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeout_us); +mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeout_us); mc_ret_e mc_gst_flush_buffers(mc_handle_t *mc_handle); diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 3fff575..41b392e 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.5 +Version: 0.6.6 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 5ebf95e..796cd6b 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -84,6 +84,23 @@ static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool c GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec_id, gint index); +static int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); + +static int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); +static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); + +static int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +static int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); + +static mc_gst_core_t *mc_gst_core_new(); +static void mc_gst_core_free(mc_gst_core_t *core); + +static mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core); +static void mc_gst_port_free(mc_gst_port_t *port); /* video vtable */ int(*vdec_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; int(*venc_vtable[])() = {&__mc_fill_input_buffer_with_packet, &__mc_fill_packet_with_output_buffer}; @@ -155,6 +172,14 @@ int(*adec_flac_vtable[])() = {&__mc_fill_input_buffer_with_packet, int(*adec_wma_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* WMA Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; +#define MEDIACODEC_ELEMENT_SET_STATE(x_element, x_state) \ + do { \ + LOGD("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \ + if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(x_element, x_state)) { \ + LOGE("failed to set state %s to %s\n", #x_state, GST_ELEMENT_NAME(x_element)); \ + goto STATE_CHANGE_FAILED; \ + } \ + } while (0) /* * fill_inbuf virtual functions @@ -195,7 +220,7 @@ int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h pac return ret; } -int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; void *buf_data = NULL; @@ -223,7 +248,7 @@ int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packe return ret; } -int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; uint64_t buf_size = 0; @@ -268,7 +293,7 @@ int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h return ret; } -int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) +static int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; gint i; @@ -372,12 +397,12 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h * fill_outbuf virtual functions */ -int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { return core->vtable[fill_outbuf](core, data, size, mcbuffer); } -int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int i; int stride_width; @@ -449,7 +474,7 @@ int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, in return MC_ERROR_NONE; } -int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; gchar *ext_mem = NULL; @@ -481,7 +506,7 @@ int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int siz return MC_ERROR_NONE; } -int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { gint ret = MC_ERROR_NONE; bool codec_config = FALSE; @@ -542,7 +567,7 @@ int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in return ret; } -int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) +static int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int ret = MC_ERROR_NONE; gint mem_size = 0; @@ -882,7 +907,7 @@ int _mc_output_media_packet_new(mc_gst_core_t *core, bool video, bool encoder, m /* * mc_gst_core functions */ -mc_gst_core_t *mc_gst_core_new() +static mc_gst_core_t *mc_gst_core_new() { mc_gst_core_t *core; @@ -929,7 +954,7 @@ mc_gst_core_t *mc_gst_core_new() return core; } -void mc_gst_core_free(mc_gst_core_t *core) +static void mc_gst_core_free(mc_gst_core_t *core) { MEDIACODEC_FENTER(); @@ -979,7 +1004,7 @@ void mc_gst_core_free(mc_gst_core_t *core) /* * mc_gst_port functions */ -mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) +static mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) { MEDIACODEC_FENTER(); @@ -1000,7 +1025,7 @@ mc_gst_port_t *mc_gst_port_new(mc_gst_core_t *core) return port; } -void mc_gst_port_free(mc_gst_port_t *port) +static void mc_gst_port_free(mc_gst_port_t *port) { MEDIACODEC_FENTER(); @@ -1795,7 +1820,7 @@ mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle) return ret; } -mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeOutUs) +mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint64_t timeout_us) { MEDIACODEC_FENTER(); @@ -1839,7 +1864,7 @@ mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint return ret; } -mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeOutUs) +mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeout_us) { gint ret = MC_ERROR_NONE; gint64 end_time = -1; @@ -1848,7 +1873,7 @@ mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint6 media_packet_h out_packet = NULL; MEDIACODEC_FENTER(); - end_time = g_get_monotonic_time() + timeOutUs; + end_time = g_get_monotonic_time() + timeout_us; if (!mc_handle) return MC_PARAM_ERROR; -- 2.7.4 From 269d598011f94d21724a3eedbbec05286f54ed4f Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Thu, 14 Nov 2019 12:14:26 +0900 Subject: [PATCH 06/16] Move handle of resource manager creation code - It's moved from __mediacodec_init_lib() to mediacodec_create(). It will reduce library loading time. [Version] 0.6.7 [Profile] Common [Issue Type] Optimization Change-Id: I373cf58f25b631712c04ae01e190832403a390fe Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec.c | 77 +++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 41b392e..9c4c6c9 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.6 +Version: 0.6.7 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec.c b/src/media_codec.c index 88e12d8..4149d9b 100644 --- a/src/media_codec.c +++ b/src/media_codec.c @@ -27,9 +27,9 @@ #define MC_PREALLOCATED_HANDLE_ARRAY_SIZE 16 #ifdef USE_MM_RESOURCE_MANAGER -static mm_resource_manager_h resource_manager; -static GPtrArray *mediacodec_handles; -static GMutex mediacodec_handles_lock; +static mm_resource_manager_h g_mc_resource_manager; +static GPtrArray *g_mediacodec_handles; +static GMutex g_mediacodec_lock; #endif static gboolean __mediacodec_empty_buffer_cb(media_packet_h pkt, void *user_data); @@ -136,8 +136,19 @@ int mediacodec_create(mediacodec_h *mediacodec) LOGD("mediacodec_create.."); #ifdef USE_MM_RESOURCE_MANAGER - if (resource_manager == NULL) - return MEDIACODEC_ERROR_INTERNAL; + g_mutex_lock(&g_mediacodec_lock); + + if (!g_mc_resource_manager) { + int mm_ret = mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, + __mediacodec_resource_release_cb, NULL, &g_mc_resource_manager); + if (mm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { + g_mutex_unlock(&g_mediacodec_lock); + LOGE("mm_resource_manager_create failed 0x%x", mm_ret); + return MEDIACODEC_ERROR_INTERNAL; + } + } + + g_mutex_unlock(&g_mediacodec_lock); #endif handle = (mediacodec_s *)malloc(sizeof(mediacodec_s)); @@ -171,9 +182,9 @@ int mediacodec_create(mediacodec_h *mediacodec) mc_set_supported_codec_cb(handle->mc_handle, (mediacodec_supported_codec_cb)__mediacodec_supported_codec_cb, handle); #ifdef USE_MM_RESOURCE_MANAGER - g_mutex_lock(&mediacodec_handles_lock); - g_ptr_array_insert(mediacodec_handles, -1, *mediacodec); - g_mutex_unlock(&mediacodec_handles_lock); + g_mutex_lock(&g_mediacodec_lock); + g_ptr_array_insert(g_mediacodec_handles, -1, *mediacodec); + g_mutex_unlock(&g_mediacodec_lock); #endif return MEDIACODEC_ERROR_NONE; @@ -192,9 +203,9 @@ int mediacodec_destroy(mediacodec_h mediacodec) return MEDIACODEC_ERROR_INVALID_OPERATION; } else { #ifdef USE_MM_RESOURCE_MANAGER - g_mutex_lock(&mediacodec_handles_lock); - g_ptr_array_remove_fast(mediacodec_handles, mediacodec); - g_mutex_unlock(&mediacodec_handles_lock); + g_mutex_lock(&g_mediacodec_lock); + g_ptr_array_remove_fast(g_mediacodec_handles, mediacodec); + g_mutex_unlock(&g_mediacodec_lock); #endif handle->state = MEDIACODEC_STATE_NONE; @@ -333,7 +344,7 @@ int mediacodec_prepare(mediacodec_h mediacodec) * mm_resource_manager_get_res_type_volume() can be used. * Additional info can be found in doxygen comments of mm_resource_manager.h */ - rm_ret = mm_resource_manager_mark_for_acquire(resource_manager, + rm_ret = mm_resource_manager_mark_for_acquire(g_mc_resource_manager, mc_handle->is_encoder ? MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER : MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER, @@ -349,9 +360,9 @@ int mediacodec_prepare(mediacodec_h mediacodec) return MEDIACODEC_ERROR_INTERNAL; } - rm_ret = mm_resource_manager_commit(resource_manager); + rm_ret = mm_resource_manager_commit(g_mc_resource_manager); if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - mm_resource_manager_mark_for_release(resource_manager, resource); + mm_resource_manager_mark_for_release(g_mc_resource_manager, resource); LOGE("Failed to commit resource manager : %x", rm_ret); return MEDIACODEC_ERROR_INTERNAL; } @@ -385,12 +396,12 @@ int mediacodec_unprepare(mediacodec_h mediacodec) } else { #ifdef USE_MM_RESOURCE_MANAGER if (handle->codec_resource != NULL) { - mm_resource_manager_mark_for_release(resource_manager, + mm_resource_manager_mark_for_release(g_mc_resource_manager, handle->codec_resource); handle->codec_resource = NULL; - rm_ret = mm_resource_manager_commit(resource_manager); + rm_ret = mm_resource_manager_commit(g_mc_resource_manager); if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { - mm_resource_manager_mark_for_release(resource_manager, handle->codec_resource); + mm_resource_manager_mark_for_release(g_mc_resource_manager, handle->codec_resource); switch (rm_ret) { case MM_RESOURCE_MANAGER_ERROR_LOW_PRIORITY: return MEDIACODEC_ERROR_RESOURCE_OVERLOADED; @@ -714,9 +725,9 @@ static int __mediacodec_resource_release_cb(mm_resource_manager_h rm, int i; mediacodec_s *handle; - g_mutex_lock(&mediacodec_handles_lock); - for (i = 0; i < mediacodec_handles->len; i++) { - handle = g_ptr_array_index(mediacodec_handles, i); + g_mutex_lock(&g_mediacodec_lock); + for (i = 0; i < g_mediacodec_handles->len; i++) { + handle = g_ptr_array_index(g_mediacodec_handles, i); if (handle->codec_resource == resource_h) { /* * TODO @@ -731,26 +742,32 @@ static int __mediacodec_resource_release_cb(mm_resource_manager_h rm, break; } } - g_mutex_unlock(&mediacodec_handles_lock); + g_mutex_unlock(&g_mediacodec_lock); return FALSE; } + static void __mediacodec_init_lib() { - mediacodec_handles = g_ptr_array_sized_new(MC_PREALLOCATED_HANDLE_ARRAY_SIZE); + LOGD("START"); - if (MM_RESOURCE_MANAGER_ERROR_NONE != mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA, - __mediacodec_resource_release_cb, NULL, &resource_manager)) { - LOGE("Failed to initialize resource manager"); - g_ptr_array_unref(mediacodec_handles); - } + g_mutex_init(&g_mediacodec_lock); + g_mediacodec_handles = g_ptr_array_sized_new(MC_PREALLOCATED_HANDLE_ARRAY_SIZE); + + LOGD("DONE"); } static void __mediacodec_deinit_lib() { - if (resource_manager != NULL) - mm_resource_manager_destroy(resource_manager); - g_ptr_array_unref(mediacodec_handles); + LOGD("START"); + + if (g_mc_resource_manager != NULL) + mm_resource_manager_destroy(g_mc_resource_manager); + + g_ptr_array_unref(g_mediacodec_handles); + g_mutex_clear(&g_mediacodec_lock); + + LOGD("DONE"); } #endif -- 2.7.4 From 89746d2ef1db2245ff7102eb63223082048d24c5 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 29 Nov 2019 15:34:32 +0900 Subject: [PATCH 07/16] Update feature element reference link Change-Id: I9c6ab65e7e207937cb51304e6a25bd15389e6bec Signed-off-by: Jeongmo Yang --- doc/media_codec_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/media_codec_doc.h b/doc/media_codec_doc.h index 1c41347..365e30b 100755 --- a/doc/media_codec_doc.h +++ b/doc/media_codec_doc.h @@ -43,7 +43,7 @@ * * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n * - * More details on featuring your application can be found from Feature Element. + * More details on featuring your application can be found from Feature Element. * * MEDIA CODEC API allows : * The API allows you to direct access to the media codec on device. It operates on "raw" data, so any file headers -- 2.7.4 From 449c5befbc5aa2413cf8161881b8e832290a2647 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 20 Dec 2019 15:38:09 +0900 Subject: [PATCH 08/16] [media_codec_test] Restore removed setting for encoding test - The "fmt" is used for input packet while encoding. Change-Id: Ie4bc9b0f299ce68c241d460f1409e5d5e096f5ba Signed-off-by: Jeongmo Yang --- test/media_codec_test.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/media_codec_test.c b/test/media_codec_test.c index 34a9945..dc46195 100644 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -1405,6 +1405,12 @@ void _mediacodec_prepare(App *app, gboolean frame_all) g_print("mediacodec_configure failed\n"); break; case VIDEO_ENC: + media_format_set_video_mime(fmt, app->mime); + media_format_set_video_width(fmt, app->width); + media_format_set_video_height(fmt, app->height); + media_format_set_video_avg_bps(fmt, app->target_bits); + media_format_set_video_frame_rate(fmt, app->fps); + media_format_create(&codec_format); media_format_set_video_mime(codec_format, codec_mime); media_format_set_video_width(codec_format, app->width); @@ -1428,6 +1434,11 @@ void _mediacodec_prepare(App *app, gboolean frame_all) g_print("mediacodec_configure failed\n"); break; case AUDIO_ENC: + media_format_set_audio_mime(fmt, app->mime); + media_format_set_audio_channel(fmt, app->channel); + media_format_set_audio_samplerate(fmt, app->samplerate); + media_format_set_audio_bit(fmt, app->bit); + media_format_create(&codec_format); media_format_set_audio_mime(codec_format, codec_mime); media_format_set_audio_channel(codec_format, app->channel); -- 2.7.4 From cd31bfbe503739d839d96b4650d749d3e2099ab9 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 24 Dec 2019 11:14:58 +0900 Subject: [PATCH 09/16] Fix build error due to toolchain upgrade (gcc6 -> gcc9) : -Werror=format-truncation, -Werror=stringop-overflow [Version] 0.6.8 [Profile] Common [Issue Type] Toolchain Change-Id: I4eca3d98c4aec29e9c4dc0ba0369052fee923249 Signed-off-by: Jeongmo Yang --- include/media_codec_ini.h | 3 ++- packaging/capi-media-codec.spec | 2 +- src/media_codec.c | 5 +++-- src/media_codec_ini.c | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/media_codec_ini.h b/include/media_codec_ini.h index ba0704f..ee05257 100644 --- a/include/media_codec_ini.h +++ b/include/media_codec_ini.h @@ -28,6 +28,7 @@ extern "C" { #define MEDIA_CODEC_INI_DEFAULT_PATH SYSCONFDIR"/multimedia/mmfw_media_codec.ini" #define MEDIA_CODEC_INI_MAX_STRLEN 256 +#define MEDIA_CODEC_INI_CNAME_LEN 16 #define DEFAULT_PORT "GST_PORT" #define MEDIA_CODEC_MAX_CODEC_TYPE 100 #define MEDIA_CODEC_MAX_CODEC_ROLE 4 @@ -42,7 +43,7 @@ typedef struct _codec_t codec_t; typedef struct _mc_ini_t mc_ini_t; struct _codec_list_t { - gchar cname[MEDIA_CODEC_INI_MAX_STRLEN]; + gchar cname[MEDIA_CODEC_INI_CNAME_LEN]; mediacodec_codec_type_e ctype; }; diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 9c4c6c9..2fe5507 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.7 +Version: 0.6.8 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec.c b/src/media_codec.c index 4149d9b..be2435e 100644 --- a/src/media_codec.c +++ b/src/media_codec.c @@ -349,9 +349,9 @@ int mediacodec_prepare(mediacodec_h mediacodec) MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_ENCODER : MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_DECODER, 1, &resource); - if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) - switch (rm_ret) { + if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { LOGE("Failed to acquire resource manager %x", rm_ret); + switch (rm_ret) { case MM_RESOURCE_MANAGER_ERROR_NOT_SUPPORTED: return MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE; case MM_RESOURCE_MANAGER_ERROR_NOT_ENOUGH: @@ -359,6 +359,7 @@ int mediacodec_prepare(mediacodec_h mediacodec) default: return MEDIACODEC_ERROR_INTERNAL; } + } rm_ret = mm_resource_manager_commit(g_mc_resource_manager); if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) { diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index b9d4d14..4a51222 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -88,9 +88,9 @@ do {\ if (str && \ (strlen(str) > 0) && \ (strlen(str) < MEDIA_CODEC_INI_MAX_STRLEN)) \ - strncpy(x_item, str, strlen(str) + 1); \ + strncpy(x_item, str, MEDIA_CODEC_INI_MAX_STRLEN - 1); \ else \ - strncpy(x_item, x_default, strlen(x_default) + 1); \ + strncpy(x_item, x_default, MEDIA_CODEC_INI_MAX_STRLEN - 1); \ } while (0) #define MEDIA_CODEC_INI_GET_STRING_FROM_LIST(x_dict, x_list, x_ini, x_default) \ -- 2.7.4 From de207327c0167b05405278982dc310ef4016fe46 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 8 Jan 2020 17:04:32 +0900 Subject: [PATCH 10/16] Update type of variable for iniparser upgrade [Version] 0.6.9 [Profile] Common [Issue Type] Update Change-Id: Iba874068da2659836ba6177a0d5ae6ffa7d72fa8 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_ini.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 2fe5507..d270547 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.8 +Version: 0.6.9 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index 4a51222..ce51083 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -83,7 +83,7 @@ static void _mc_ini_check_ini_status(void); /* macro */ #define MEDIA_CODEC_INI_GET_STRING(x_dict, x_item, x_ini, x_default) \ do {\ - gchar* str = iniparser_getstring(x_dict, x_ini, x_default); \ + const char *str = iniparser_getstring(x_dict, x_ini, x_default); \ \ if (str && \ (strlen(str) > 0) && \ @@ -116,7 +116,7 @@ do {\ #define MEDIA_CODEC_INI_GET_COLOR(x_dict, x_item, x_ini, x_default) \ do {\ - gchar* str = iniparser_getstring(x_dict, x_ini, x_default); \ + const char *str = iniparser_getstring(x_dict, x_ini, x_default); \ \ if (str && \ (strlen(str) > 0) && \ -- 2.7.4 From 1ec6aa17de1000414707c638d55b8dbbc1b0663b Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 11 Feb 2020 20:58:59 +0900 Subject: [PATCH 11/16] Fix coverity issue - Incorrect deallocator used [Version] 0.6.10 [Profile] Common [Issue Type] Coverity Change-Id: Id5232644e2a7be9db57a3daf0e23d3f17b1e1468 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index d270547..ebb1f6f 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.9 +Version: 0.6.10 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 796cd6b..bd2cf50 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -2393,7 +2393,7 @@ GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet * will not be invoked */ gst_buffer_unref(mcbuffer->buffer); - free(mcbuffer); + g_free(mcbuffer); return NULL; } -- 2.7.4 From aad000b056e0bf2899d2b54e15d7c0f72752849e Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 23 Mar 2020 15:55:58 +0900 Subject: [PATCH 12/16] [ACR-1537] Add new codec type for OPUS [Version] 0.6.11 [Profile] Common [Issue Type] ACR Change-Id: Ie8c6c9018314fbaad8d9fb40de6a7111da7b037e Signed-off-by: Jeongmo Yang --- include/media_codec.h | 1 + packaging/capi-media-codec.spec | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/media_codec.h b/include/media_codec.h index fd6da1e..a69da19 100644 --- a/include/media_codec.h +++ b/include/media_codec.h @@ -79,6 +79,7 @@ typedef enum { MEDIACODEC_WMAV2 = 0x10A1, /**< WMA version 2 (Since @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif)*/ MEDIACODEC_WMAPRO = 0x10A2, /**< WMA Professional (Since @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif)*/ MEDIACODEC_WMALSL = 0x10A3, /**< WMA Lossless (Since @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif)*/ + MEDIACODEC_OPUS = 0x10D0, /**< OPUS (Since 6.0)*/ MEDIACODEC_H261 = 0x2010, /**< H.261*/ MEDIACODEC_H263 = 0x2020, /**< H.263*/ diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index ebb1f6f..548d4c6 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.10 +Version: 0.6.11 Release: 0 Group: Multimedia/API License: Apache-2.0 -- 2.7.4 From b5e55dfce714159160554e31c7a867ee3b3fc0fe Mon Sep 17 00:00:00 2001 From: Hyuntae Kim Date: Tue, 14 Apr 2020 13:53:29 +0900 Subject: [PATCH 13/16] enable opus encoder Change-Id: I140b4a6df22aed2af7ab65d64a2f58e8e9b7d9d9 --- CMakeLists.txt | 2 +- include/media_codec_port.h | 1 + packaging/capi-media-codec.spec | 5 +- src/media_codec_ini.c | 4 ++ src/media_codec_port.c | 11 +++- src/media_codec_port_gst.c | 114 ++++++++++++++++++++++++++++++---------- test/media_codec_test.c | 62 +++++++++++++++++----- 7 files changed, 154 insertions(+), 45 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2b7204..d39a089 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info gstreamer-allocators-1.0") +SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-pbutils-1.0 gstreamer-tag-1.0 capi-system-info gstreamer-allocators-1.0") SET(pc_dependents "capi-base-common capi-media-tool") IF(TIZEN_FEATURE_MM_RESOURCE_MANAGER) SET(dependents "${dependents} mm-resource-manager") diff --git a/include/media_codec_port.h b/include/media_codec_port.h index 986bdd3..b34afa9 100644 --- a/include/media_codec_port.h +++ b/include/media_codec_port.h @@ -104,6 +104,7 @@ typedef enum { WMAV2, WMAPRO, WMALSL, + OPUS, H261, H263, H264, diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 548d4c6..3da38ba 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.11 +Version: 0.6.12 Release: 0 Group: Multimedia/API License: Apache-2.0 @@ -19,6 +19,8 @@ BuildRequires: pkgconfig(libtbm) BuildRequires: pkgconfig(gstreamer-1.0) BuildRequires: pkgconfig(gstreamer-plugins-base-1.0) BuildRequires: pkgconfig(gstreamer-app-1.0) +BuildRequires: pkgconfig(gstreamer-pbutils-1.0) +BuildRequires: pkgconfig(gstreamer-tag-1.0) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(iniparser) %if "%{tizen_profile_name}" != "tv" @@ -28,6 +30,7 @@ BuildRequires: pkgconfig(mm-resource-manager) #BuildRequires: pkgconfig(capi-mediademuxer) #BuildRequires: pkgconfig(capi-mediamuxer) + %description A Media Codec library in Tizen Native API diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index ce51083..35bc0b0 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -71,6 +71,7 @@ static codec_list_t general_codec_list[] = { {"wmav1", MEDIACODEC_WMAV1}, {"wmav2", MEDIACODEC_WMAV2}, {"wmapro", MEDIACODEC_WMAPRO}, + {"opus", MEDIACODEC_OPUS}, }; /* internal functions, macros here */ @@ -287,6 +288,9 @@ media_format_mimetype_e _mc_convert_media_format_str_to_int(char *sformat) } else if (!strcmp(sformat, "WMAPRO")) { iformat = MEDIA_FORMAT_WMAPRO; goto endf; + } else if (!strcmp(sformat, "OPUS")) { + iformat = MEDIA_FORMAT_OPUS; + goto endf; } endf: diff --git a/src/media_codec_port.c b/src/media_codec_port.c index d78a1d4..70b5cc3 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -399,7 +399,7 @@ int mc_prepare(MMHandleType mediacodec) break; case MEDIACODEC_PORT_TYPE_GST: - mc_gst_prepare(mc_handle); + ret = mc_gst_prepare(mc_handle); break; default: @@ -1047,6 +1047,8 @@ codec_type_e codec_type_to_simple_enumeration(mediacodec_codec_type_e media_code return VP9; case MEDIACODEC_VC1: return VC1; + case MEDIACODEC_OPUS: + return OPUS; default: return NONE; } @@ -1111,6 +1113,8 @@ mediacodec_codec_type_e simple_to_codec_type_enumeration(codec_type_e codec_id) return MEDIACODEC_VP9; case VC1: return MEDIACODEC_VC1; + case OPUS: + return MEDIACODEC_OPUS; default: return NONE; } @@ -1178,6 +1182,11 @@ gboolean _check_support_audio_info(mediacodec_codec_type_e codec_id, int sampler s_bit_depth = 32; /* NOTE: avdec_flac surpports S32LE as format */ break; } + case MEDIACODEC_OPUS: + { + s_bit_depth = 16; /* NOTE: opusenc/ opusdec support S16LE as format according to opus specification*/ + break; + } default: break; } diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index bd2cf50..5f2078f 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include /* * Internal Implementation @@ -37,7 +39,7 @@ static media_packet_h _mc_get_input_buffer(mc_gst_core_t *core); static gboolean __mc_gst_init_gstreamer(); static int _mc_output_media_packet_new(mc_gst_core_t *core, bool video, bool encoder, media_format_mimetype_e out_mime); -static mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, gchar *factory_name); +static mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name); static mc_ret_e _mc_gst_destroy_pipeline(mc_gst_core_t *core); static void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer data); static int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void *user_data); @@ -172,6 +174,9 @@ int(*adec_flac_vtable[])() = {&__mc_fill_input_buffer_with_packet, int(*adec_wma_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* WMA Decoder Vtable */ &__mc_fill_packet_with_output_buffer}; +int(*aenc_opus_vtable[])() = {&__mc_fill_input_buffer_with_packet, /* Opus Encoder Vtable */ + &__mc_fill_aenc_packet_with_output_buffer}; + #define MEDIACODEC_ELEMENT_SET_STATE(x_element, x_state) \ do { \ LOGD("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \ @@ -238,12 +243,13 @@ static int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_ return MC_ERROR; } - if (buf_data != NULL) { - gst_buffer_append_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data, buf_size, 0, - buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); - LOGD("packet data apended"); - } + if (buf_data == NULL) + return MC_ERROR; + + gst_buffer_append_memory(mcbuffer->buffer, + gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data, buf_size, 0, + buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); + LOGD("packet data apended"); return ret; } @@ -616,6 +622,9 @@ static int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *d s = gst_caps_get_structure(peercaps, 0); codec_data = gst_structure_get_value(s, "codec_data"); + if (codec_data == NULL && gst_structure_has_field(s, "streamheader")) + codec_data = gst_structure_get_value(s, "streamheader"); + core->codec_data = GST_BUFFER(g_value_dup_boxed(codec_data)); gst_caps_unref(peercaps); } @@ -817,6 +826,31 @@ int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint __mc_gst_caps_set_buffer_array(core->caps, "streamheader", header1, header2, NULL); gst_buffer_unref(header1); gst_buffer_unref(header2); + } else if (core->codec_id == MEDIACODEC_OPUS) { + const GstTagList *tags; + GstTagList *empty_tags = NULL; + GstBuffer *header, *comments; + guint8 *decoding_channel_mapping = NULL; + mc_gst_port_def_t *port_def = &core->ports[in_port_index]->port_def; + + header = gst_codec_utils_opus_create_header(port_def->info.audio.samplerate, + port_def->info.audio.channel, + 0, /* channel mapping family */ + 1, /* stream count */ + 0, /* coupled count */ + decoding_channel_mapping, + 0, /* FIXME: look ahead configured value */ + 0); + tags = gst_tag_setter_get_tag_list(GST_TAG_SETTER(core->codec)); + if (!tags) + tags = empty_tags = gst_tag_list_new_empty(); + comments = gst_tag_list_to_vorbiscomment_buffer(tags, (const guint8 *) "OpusTags", + 8, "Encoded with GStreamer opusenc"); + core->caps = gst_codec_utils_opus_create_caps_from_header(header, comments); + if (empty_tags) + gst_tag_list_unref(empty_tags); + gst_buffer_unref(header); + gst_buffer_unref(comments); } else { LOGE("Not support case of Stream header Caps"); } @@ -1143,6 +1177,7 @@ static int _mc_set_codec_data(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool c break; case MEDIACODEC_VORBIS: case MEDIACODEC_FLAC: + case MEDIACODEC_OPUS: if (codec_config) { ret = __mc_set_caps_streamheader(core, mcbuffer, VORBIS_CODECDATA_SIZE); if (ret != MC_ERROR_NONE) @@ -1449,6 +1484,16 @@ GstCaps *_mc_gst_aud_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec NULL); } break; + case MEDIACODEC_OPUS: + if (core->encoder) { + gst_caps_set_simple(caps, + "format", G_TYPE_STRING, _mc_bit_to_string(port_def->info.audio.bit_depth), + "layout", G_TYPE_STRING, "interleaved", NULL); + } else { + LOGD("[MC_NOT_SUPPORTED] opus decoder is not supported yet!!!"); + return NULL; + } + break; default: break; } @@ -1502,7 +1547,7 @@ GstCaps *_mc_gst_vid_caps_new(mc_gst_core_t *core, mediacodec_codec_type_e codec LOGE("format : %s", port_def->info.video.format); } else { gst_caps_set_simple(caps, - "parsed", G_TYPE_BOOLEAN, TRUE, /* FIXME different from sw */ + "parsed", G_TYPE_BOOLEAN, TRUE, /* FIXME different from sw */ "alignment", G_TYPE_STRING, "au", "stream-format", G_TYPE_STRING, "byte-stream", "framerate", GST_TYPE_FRACTION, 30, 1, @@ -1524,11 +1569,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo switch (id) { case MEDIACODEC_AAC: - if (encoder) { + if (encoder) core->vtable = aenc_aac_vtable; - } else { + else core->vtable = adec_aac_vtable; - } break; case MEDIACODEC_AAC_HE: case MEDIACODEC_AAC_HE_PS: @@ -1549,11 +1593,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo break; case MEDIACODEC_AMR_NB: LOGD("amrnb vtable"); - if (encoder) { + if (encoder) core->vtable = aenc_amrnb_vtable; - } else { + else core->vtable = adec_amrnb_vtable; - } break; case MEDIACODEC_AMR_WB: LOGD("amrwb vtable - Only support decoder"); @@ -1566,12 +1609,10 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo break; case MEDIACODEC_VORBIS: LOGD("vorbis vtable"); - if (encoder) { - LOGD("[MC_NOT_SUPPORTED] vorbis encoder is not supported yet!!!"); + if (encoder) return MC_NOT_SUPPORTED; - } else { + else core->vtable = adec_vorbis_vtable; - } break; case MEDIACODEC_FLAC: LOGD("flac vtable"); @@ -1582,6 +1623,13 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo core->vtable = adec_flac_vtable; } break; + case MEDIACODEC_OPUS: + LOGD("opus vtable"); + if (encoder) + core->vtable = aenc_opus_vtable; + else + core->vtable = adec_vtable; + break; case MEDIACODEC_WMAV1: case MEDIACODEC_WMAV2: case MEDIACODEC_WMAPRO: @@ -1599,31 +1647,28 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo if (encoder) { core->vtable = is_hw ? venc_h263_hw_vtable : venc_h263_sw_vtable; } else { - if (is_hw) { + if (is_hw) core->vtable = vdec_h263_hw_vtable; - } else { + else core->vtable = vdec_h263_sw_vtable; - } } break; case MEDIACODEC_MPEG4: LOGD("mpeg4 vtable"); - if (encoder) { + if (encoder) core->vtable = is_hw ? venc_mpeg4_hw_vtable : venc_mpeg4_sw_vtable; - } else { + else core->vtable = is_hw ? vdec_mpeg4_hw_vtable : vdec_mpeg4_sw_vtable; - } break; case MEDIACODEC_H264: LOGD("h264 vtable"); if (encoder) { core->vtable = is_hw ? venc_h264_hw_vtable : venc_vtable; } else { - if (is_hw) { + if (is_hw) core->vtable = vdec_h264_hw_vtable; - } else { + else core->vtable = vdec_h264_sw_vtable; - } } break; default: @@ -2017,7 +2062,7 @@ ERROR: return FALSE; } -mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, gchar *factory_name) +mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, const gchar *factory_name) { GstBus *bus = NULL; @@ -2703,6 +2748,11 @@ static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_ mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(GstMCBuffer)); + if (mcbuffer == NULL) { + LOGE("malloc fail"); + return NULL; + } + mcbuffer->buffer = gst_buffer_new(); mcbuffer->buf_size = 0; @@ -3355,8 +3405,14 @@ int _mc_get_mime(mc_gst_core_t *core) case MEDIACODEC_AMR_WB: mime = MEDIA_FORMAT_AMR_WB; break; + case MEDIACODEC_OPUS: + if (core->encoder) + mime = MEDIA_FORMAT_OPUS; + else + mime = MEDIA_FORMAT_PCM_S16LE; + break; default: - LOGE("NOT SUPPORTED!!!!"); + LOGE("NOT SUPPORTED!!!! 0x%x ", core->codec_id); break; } return mime; diff --git a/test/media_codec_test.c b/test/media_codec_test.c index dc46195..bab3988 100644 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -47,6 +47,7 @@ #define ADTS_HEADER_SIZE 7 #define AMRNB_PCM_INPUT_SIZE 320 #define AMRWB_PCM_INPUT_SIZE 640 +#define OPUS_PCM_INPUT_SIZE 4096 #define CHECK_BIT(x, y) (((x) >> (y)) & 0x01) #define GET_IS_ENCODER(x) CHECK_BIT(x, 0) @@ -568,6 +569,22 @@ void amrenc_extractor(App *app, guint8 **data, int *size, gboolean *have_frame, app->offset += *size; } +void opusenc_extractor(App *app, guint8 **data, int *size, gboolean *have_frame, gboolean *codec_data) +{ + gint read_size = OPUS_PCM_INPUT_SIZE; + gint offset = app->length - app->offset; + + *have_frame = TRUE; + *data = app->data + app->offset; + + if (read_size >= offset) + *size = offset; + else + *size = read_size; + + app->offset += *size; +} + /** * Extract Input data for AAC decoder * (case of (LC profile) ADTS format) @@ -816,6 +833,18 @@ int _configure(App *app, int codecid, int flag, gboolean *hardware, media_forma mime = MEDIA_FORMAT_AMR_WB; } break; + case MEDIACODEC_OPUS: + if (encoder) { + extractor = opusenc_extractor; + mime = MEDIA_FORMAT_OPUS; /* FIXME need to check according to verdor */ + *codec_mime = MEDIA_FORMAT_OPUS; + app->is_amr_nb = FALSE; + } else { + mime = MEDIA_FORMAT_OPUS; + *codec_mime = MEDIA_FORMAT_OPUS; + } + break; + default: LOGE("NOT SUPPORTED!!!!"); break; @@ -1438,6 +1467,7 @@ void _mediacodec_prepare(App *app, gboolean frame_all) media_format_set_audio_channel(fmt, app->channel); media_format_set_audio_samplerate(fmt, app->samplerate); media_format_set_audio_bit(fmt, app->bit); + media_format_set_audio_avg_bps(fmt, app->bitrate); media_format_create(&codec_format); media_format_set_audio_mime(codec_format, codec_mime); @@ -2003,17 +2033,18 @@ void displaymenu(void) g_print(" WMAV2 = 13\n"); g_print(" WMAPRO = 14\n"); g_print(" WMALSL = 15\n"); + g_print(" OPUS = 16\n"); g_print(" -------------------\n"); - g_print(" H261 = 16\n"); - g_print(" H263 = 17\n"); - g_print(" H264 = 18\n"); - g_print(" MJPEG = 19\n"); - g_print(" MPEG1 = 20\n"); - g_print(" MPEG2 = 21\n"); - g_print(" MPEG4 = 22\n"); - g_print(" HEVC = 23\n"); - g_print(" VP8 = 24\n"); - g_print(" VP9 = 25\n"); + g_print(" H261 = 17\n"); + g_print(" H263 = 18\n"); + g_print(" H264 = 19\n"); + g_print(" MJPEG = 20\n"); + g_print(" MPEG1 = 21\n"); + g_print(" MPEG2 = 22\n"); + g_print(" MPEG4 = 23\n"); + g_print(" HEVC = 24\n"); + g_print(" VP8 = 25\n"); + g_print(" VP9 = 26\n"); g_print(" -------------------\n"); g_print("*** Flags : Select Combination Number (e.g. DEOCDER + TYPE_SW = 10)\n"); g_print(" CODEC : ENCODER = 1 DECODER = 2\n"); @@ -2063,9 +2094,12 @@ void interpret(char *cmd) break; case CURRENT_STATUS_SET_CODEC: { - gint ids[] = { 0x1010, 0x1020, 0x1030, 0x1040, 0x1041, 0x1050, 0x1060, 0x1061, 0x1062, - 0x1070, 0x1080, 0x1090, 0x10A0, 0x10A1, 0x10A2, 0x10A3, 0x2010, 0x2020, - 0x2030, 0x2040, 0x2050, 0x2060, 0x2070, 0x2080, 0x2090, 0x20A0, 0x20B0 }; + gint ids[] = { 0x1010, 0x1020, 0x1030, 0x1040, 0x1041, + 0x1050, 0x1060, 0x1061, 0x1062, 0x1070, + 0x1080, 0x1090, 0x10A0, 0x10A1, 0x10A2, + 0x10A3, 0x10D0, 0x2010, 0x2020, 0x2030, + 0x2040, 0x2050, 0x2060, 0x2070, 0x2080, + 0x2090, 0x20A0, 0x20B0 }; if (cnt == 0) { gint n_sizes = G_N_ELEMENTS(ids); @@ -2488,6 +2522,8 @@ const char* codec_type_to_string(mediacodec_codec_type_e media_codec_id) return "VP9"; case MEDIACODEC_VC1: return "VC1"; + case MEDIACODEC_OPUS: + return "OPUS"; default: return "NONE"; } -- 2.7.4 From 92088a0611074f7eb117e928174a9758e3f317b0 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 14 Aug 2020 19:15:24 +0900 Subject: [PATCH 14/16] Update header file for documentation [Version] 0.6.13 [Issue Type] Update Change-Id: I473cd7ce33c2e2e114f954f7d0b6ab5d82007883 Signed-off-by: Jeongmo Yang --- include/media_codec.h | 12 ++++++------ packaging/capi-media-codec.spec | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/media_codec.h b/include/media_codec.h index a69da19..4d92933 100644 --- a/include/media_codec.h +++ b/include/media_codec.h @@ -458,7 +458,7 @@ int mediacodec_flush_buffers(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) * @pre mediacodec_set_input_buffer_used_cb() should be called before mediacodec_preare(). * @post mediacodec_input_buffer_used_cb() will be invoked. - * @see mediacodec_set_input_buffer_used_cb() + * @see mediacodec_input_buffer_used_cb() * @see mediacodec_unset_input_buffer_used_cb() */ int mediacodec_set_input_buffer_used_cb(mediacodec_h mediacodec, mediacodec_input_buffer_used_cb callback, void* user_data); @@ -487,7 +487,7 @@ int mediacodec_unset_input_buffer_used_cb(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) * @pre mediacodec_set_output_buffer_available_cb() should be called before mediacodec_preare(). * @post mediacodec_output_buffer_available_cb() will be invoked. - * @see mediacodec_set_output_buffer_available_cb() + * @see mediacodec_output_buffer_available_cb() * @see mediacodec_unset_output_buffer_available_cb() */ int mediacodec_set_output_buffer_available_cb(mediacodec_h mediacodec, mediacodec_output_buffer_available_cb callback, void* user_data); @@ -516,7 +516,7 @@ int mediacodec_unset_output_buffer_available_cb(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) * @pre mediacodec_set_error_cb() should be called before mediacodec_preare(). * @post mediacodec_error_cb() will be invoked. - * @see mediacodec_set_error_cb() + * @see mediacodec_error_cb() * @see mediacodec_unset_error_cb() */ int mediacodec_set_error_cb(mediacodec_h mediacodec, mediacodec_error_cb callback, void* user_data); @@ -545,7 +545,7 @@ int mediacodec_unset_error_cb(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) * @pre mediacodec_set_eos_cb() should be called before mediacodec_preare(). * @post mediacodec_eos_cb() will be invoked. - * @see mediacodec_set_eos_cb() + * @see mediacodec_eos_cb() * @see mediacodec_unset_eos_cb() */ int mediacodec_set_eos_cb(mediacodec_h mediacodec, mediacodec_eos_cb callback, void* user_data); @@ -574,7 +574,7 @@ int mediacodec_unset_eos_cb(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) * @pre mediacodec_set_buffer_status_cb() should be called before mediacodec_preare(). * @post mediacodec_buffer_status_cb() will be invoked. - * @see mediacodec_set_buffer_status_cb() + * @see mediacodec_buffer_status_cb() * @see mediacodec_unset_buffer_status_cb() */ int mediacodec_set_buffer_status_cb(mediacodec_h mediacodec, mediacodec_buffer_status_cb callback, void* user_data); @@ -600,7 +600,7 @@ int mediacodec_unset_buffer_status_cb(mediacodec_h mediacodec); * @retval #MEDIACODEC_ERROR_NONE Successful * @retval #MEDIACODEC_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) - * @see mediacodec_foreach_supported_codec() + * @see mediacodec_supported_codec_cb() */ int mediacodec_foreach_supported_codec(mediacodec_h mediacodec, mediacodec_supported_codec_cb callback, void *user_data); diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 3da38ba..26d656d 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.12 +Version: 0.6.13 Release: 0 Group: Multimedia/API License: Apache-2.0 -- 2.7.4 From f84171f0b28ff514358eb1c863f382d4f1aba016 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 21 Aug 2020 07:48:53 +0900 Subject: [PATCH 15/16] Update header file for documentation (#2) [Version] 0.6.14 [Issue Type] Documentation Change-Id: I2b77e1925e383c851fc73da888f5b471fa10dc53 Signed-off-by: Jeongmo Yang --- include/media_codec.h | 3 ++- packaging/capi-media-codec.spec | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/media_codec.h b/include/media_codec.h index 4d92933..1f75fe8 100644 --- a/include/media_codec.h +++ b/include/media_codec.h @@ -558,7 +558,7 @@ int mediacodec_set_eos_cb(mediacodec_h mediacodec, mediacodec_eos_cb callback, v * @retval #MEDIACODEC_ERROR_NONE Successful * @retval #MEDIACODEC_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) - * @see mediacodec_set_event_handler_cb() + * @see mediacodec_set_eos_cb() */ int mediacodec_unset_eos_cb(mediacodec_h mediacodec); @@ -587,6 +587,7 @@ int mediacodec_set_buffer_status_cb(mediacodec_h mediacodec, mediacodec_buffer_s * @retval #MEDIACODEC_ERROR_NONE Successful * @retval #MEDIACODEC_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIACODEC_ERROR_NOT_SUPPORTED_ON_DEVICE Not supported on device (Since 4.0) + * @see mediacodec_set_buffer_status_cb() */ int mediacodec_unset_buffer_status_cb(mediacodec_h mediacodec); diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 26d656d..eaa5b25 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.13 +Version: 0.6.14 Release: 0 Group: Multimedia/API License: Apache-2.0 -- 2.7.4 From d88ce334c0e06f49cab3fa7ecd77550838699bf1 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 8 Mar 2021 11:00:37 +0900 Subject: [PATCH 16/16] Fix Svace issue - DEREF_OF_NULL.RET.PROC.STAT [Version] 0.6.15 [Issue Type] Svace Change-Id: I718775e3e3ecfe8e26a8d9cca48c2cab5c80d4e2 Signed-off-by: Jeongmo Yang --- packaging/capi-media-codec.spec | 2 +- test/media_codec_test.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index eaa5b25..6f132cd 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.6.14 +Version: 0.6.15 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/test/media_codec_test.c b/test/media_codec_test.c index bab3988..b02cd3e 100644 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -2440,6 +2441,10 @@ void output_dump(App *app, media_packet_h pkt) g_snprintf(filename, MAX_STRING_LEN, "/tmp/dec_output_dump_%d.out", app->type); fp = fopen(filename, "ab"); + if (!fp) { + g_print("open[%s] failed[errno:%d]\n", filename, errno); + return; + } media_packet_get_buffer_data_ptr(pkt, &temp); media_packet_get_buffer_size(pkt, &buf_size); -- 2.7.4