From 538225bd4b8ceac011a27bf1a5fed3edf50080e7 Mon Sep 17 00:00:00 2001 From: Rohit Kulkarni Date: Fri, 25 Mar 2016 10:57:27 -0700 Subject: mm-video-v4l2: vdec: Malloc failure handling in memory prefetch Gracefully handle memory allocation failures encountered during ioctl call setup for secure memory prefetching. Change-Id: Ic251962a1afe54797cdc4f37f4a196f5cb87d2c3 --- mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp index b44adb21..69eaf1c4 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -11863,7 +11863,7 @@ void omx_vdec::prefetchNewBuffers() { uint32_t prefetch_size; uint32_t want_size; uint32_t have_size; - int color_fmt; + int color_fmt, rc; uint32_t new_calculated_size; uint32_t new_buffer_size; uint32_t new_buffer_count; @@ -11902,13 +11902,6 @@ void omx_vdec::prefetchNewBuffers() { old_buffer_size = drv_ctx.op_buf.buffer_size; old_buffer_count = drv_ctx.op_buf.actualcount; - /* - if (new_buffer_count == old_buffer_count) { - prefetch_size = new_buffer_size - old_buffer_size; - DEBUG_PRINT_LOW("Got same count!"); - } else { - prefetch_size = (want_size - have_size) / prefetch_count; - }*/ new_buffer_count = old_buffer_count > new_buffer_count ? old_buffer_count : new_buffer_count; prefetch_count = new_buffer_count; @@ -11923,13 +11916,19 @@ void omx_vdec::prefetchNewBuffers() { int ion_fd = open(MEM_DEVICE, O_RDONLY); if (ion_fd < 0) { DEBUG_PRINT_ERROR("Ion fd open failed : %d\n", ion_fd); + return; } struct ion_custom_data *custom_data = (struct ion_custom_data*) malloc(sizeof(*custom_data)); struct ion_prefetch_data *prefetch_data = (struct ion_prefetch_data*) malloc(sizeof(*prefetch_data)); - struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions) * 1); + struct ion_prefetch_regions *regions = (struct ion_prefetch_regions*) malloc(sizeof(*regions)); size_t *sizes = (size_t*) malloc(sizeof(size_t) * prefetch_count); + if (custom_data == NULL || prefetch_data == NULL || regions == NULL || sizes == NULL) { + DEBUG_PRINT_ERROR("prefetch data allocation failed"); + goto prefetch_exit; + } + for (uint32_t i = 0; i < prefetch_count; i++) { sizes[i] = prefetch_size; } @@ -11945,11 +11944,12 @@ void omx_vdec::prefetchNewBuffers() { custom_data->cmd = ION_IOC_PREFETCH; custom_data->arg = (unsigned long )prefetch_data; - int rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data); + rc = ioctl(ion_fd, ION_IOC_CUSTOM, custom_data); if (rc) { DEBUG_PRINT_ERROR("Custom prefetch ioctl failed rc : %d, errno : %d\n", rc, errno); } +prefetch_exit: close(ion_fd); free(sizes); free(regions); -- cgit v1.2.3