{
MEDIACODEC_INSTANCE_CHECK(mediacodec);
mediacodec_s *handle = (mediacodec_s *)mediacodec;
+ int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
int ret = mc_unprepare(handle->mc_handle);
mm_resource_manager_mark_for_release(resource_manager,
handle->codec_resource);
handle->codec_resource = NULL;
- mm_resource_manager_commit(resource_manager);
+ rm_ret = mm_resource_manager_commit(resource_manager);
+ if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+ mm_resource_manager_mark_for_release(resource_manager, resource);
+ switch (rm_ret) {
+ case MM_RESOURCE_MANAGER_ERROR_LOW_PRIORITY:
+ return MEDIACODEC_ERROR_RESOURCE_OVERLOADED;
+ default:
+ return MEDIACODEC_ERROR_INTERNAL;
+ }
+ }
} else {
LOGD("No codec resource to release. Probably resource release cb called\n");
}
static void __mediacodec_init_lib()
{
mediacodec_handles = g_ptr_array_sized_new(MC_PREALLOCATED_HANDLE_ARRAY_SIZE);
- mm_resource_manager_create(MM_RESOURCE_MANAGER_APP_CLASS_MEDIA,
- __mediacodec_resource_release_cb, NULL, &resource_manager);
+
+ 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);
+ }
}
static void __mediacodec_deinit_lib()
{
gint i;
gint num_bos;
+ gint err;
+ int ret = MEDIA_PACKET_ERROR_NONE;
tbm_surface_h surface = NULL;
tbm_surface_info_s surface_info;
tbm_bo_handle handle_bo;
}
memset(mm_vbuffer, 0x00, sizeof(MMVideoBuffer));
- media_packet_get_tbm_surface(packet, &surface);
+ ret = media_packet_get_tbm_surface(packet, &surface);
+ if (ret != MEDIA_PACKET_ERROR_NONE) {
+ LOGE("Failed to get tbm surface");
+ free(mm_vbuffer);
+ return NULL;
+ }
+
num_bos = tbm_surface_internal_get_num_bos(surface);
- gint err = tbm_surface_get_info((tbm_surface_h)surface, &surface_info);
+ err = tbm_surface_get_info((tbm_surface_h)surface, &surface_info);
if (err != TBM_SURFACE_ERROR_NONE) {
LOGE("get tbm surface is failed");
free(mm_vbuffer);