summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRohit Kulkarni <rkulkarn@codeaurora.org>2016-03-25 10:57:27 -0700
committerRohit Kulkarni <rkulkarn@codeaurora.org>2016-03-28 12:31:08 -0700
commit538225bd4b8ceac011a27bf1a5fed3edf50080e7 (patch)
tree8167973e133019fb44a7ca84b3ce06a14be19404
parentc1c9a542c7d1e6a6069b0519c64fdce9314f8d2e (diff)
downloadandroid_hardware_qcom_media-538225bd4b8ceac011a27bf1a5fed3edf50080e7.tar.gz
android_hardware_qcom_media-538225bd4b8ceac011a27bf1a5fed3edf50080e7.tar.bz2
android_hardware_qcom_media-538225bd4b8ceac011a27bf1a5fed3edf50080e7.zip
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
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp20
1 files 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);