From 679c6f14fb4ed13d3035ce82ecd9dddd44587c3d Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 2 Jun 2025 21:29:32 +0900 Subject: [PATCH] Support fd for decode [Version] 1.1.2 [Issue Type] New feature Change-Id: I81f810a996b4249549fec5772962488f1856e8f4 Signed-off-by: Jeongmo Yang --- packaging/hal-backend-codec-v4l2.spec | 2 +- src/hal_backend_codec_v4l2.c | 60 +++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/packaging/hal-backend-codec-v4l2.spec b/packaging/hal-backend-codec-v4l2.spec index d203593..df88b9d 100644 --- a/packaging/hal-backend-codec-v4l2.spec +++ b/packaging/hal-backend-codec-v4l2.spec @@ -1,6 +1,6 @@ Name: hal-backend-codec-v4l2 Summary: Tizen Codec HAL using generic V4L2 interface -Version: 1.1.1 +Version: 1.1.2 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/hal_backend_codec_v4l2.c b/src/hal_backend_codec_v4l2.c index 0c67ad0..8f99483 100644 --- a/src/hal_backend_codec_v4l2.c +++ b/src/hal_backend_codec_v4l2.c @@ -2410,6 +2410,51 @@ static void __codec_v4l2_add_idle_buffer(codec_hal_buffer_control_s *buffer_cont } +static int __codec_v4l2_set_data_to_decode(codec_hal_handle_s *handle, hal_codec_buffer_s *src_buffer, hal_codec_buffer_s *dst_buffer) +{ + tbm_bo_handle bo_handle = {NULL, }; + tbm_bo bo = NULL; + + if (!handle || !src_buffer || !dst_buffer) { + LOGE("NULL param[%p,%p,%p]", handle, src_buffer, dst_buffer); + return HAL_CODEC_ERROR_INVALID_PARAMETER; + } + + dst_buffer->planes.plane[0].bytesused = src_buffer->planes.plane[0].bytesused; + memcpy(&dst_buffer->meta, &src_buffer->meta, sizeof(hal_codec_meta_s)); + + if (src_buffer->memory.num_fd == 0) { + memcpy(dst_buffer->planes.plane[0].data, + src_buffer->planes.plane[0].data, + src_buffer->planes.plane[0].bytesused); + return HAL_CODEC_ERROR_NONE; + } + + bo = tbm_bo_import_fd(handle->bufmgr, src_buffer->memory.fd[0]); + if (!bo) { + LOGE("fd[%d] import failed", src_buffer->memory.fd[0]); + return HAL_CODEC_ERROR_INTERNAL; + } + + bo_handle = tbm_bo_get_handle(bo, TBM_DEVICE_CPU); + if (!bo_handle.ptr) { + LOGE("fd[%d], bo[%p] get handle failed", src_buffer->memory.fd[0], bo); + tbm_bo_unref(bo); + return HAL_CODEC_ERROR_INTERNAL; + } + + LOGD("import fd[%d] -> bo[%p], ptr[%p], bytesused[%u]", + src_buffer->memory.fd[0], bo, bo_handle.ptr, + src_buffer->planes.plane[0].bytesused); + + memcpy(dst_buffer->planes.plane[0].data, bo_handle.ptr, src_buffer->planes.plane[0].bytesused); + + tbm_bo_unref(bo); + + return HAL_CODEC_ERROR_NONE; +} + + int codec_v4l2_decode(void *codec_handle, hal_codec_buffer_s *buffer) { int ret = HAL_CODEC_ERROR_NONE; @@ -2455,14 +2500,13 @@ int codec_v4l2_decode(void *codec_handle, hal_codec_buffer_s *buffer) return HAL_CODEC_ERROR_DEVICE_BUSY; } - memcpy(idle_buffer->planes.plane[0].data, buffer->planes.plane[0].data, buffer->planes.plane[0].bytesused); - idle_buffer->planes.plane[0].bytesused = buffer->planes.plane[0].bytesused; - - memcpy(&idle_buffer->meta, &buffer->meta, sizeof(hal_codec_meta_s)); - - ret = __codec_v4l2_qbuf(handle->device_fd, - buffer_control, idle_buffer); + ret = __codec_v4l2_set_data_to_decode(handle, buffer, idle_buffer); + if (ret != HAL_CODEC_ERROR_NONE) { + __codec_v4l2_add_idle_buffer(buffer_control, idle_buffer, NULL); + return ret; + } + ret = __codec_v4l2_qbuf(handle->device_fd, buffer_control, idle_buffer); if (ret != HAL_CODEC_ERROR_NONE) { LOGE("QBUF[%p] failed[i:%d], 0x%x", buffer, idle_buffer->index, ret); @@ -2474,7 +2518,7 @@ int codec_v4l2_decode(void *codec_handle, hal_codec_buffer_s *buffer) __codec_v4l2_message_send(handle, HAL_CODEC_MESSAGE_TYPE_INPUT_BUFFER_USED, buffer); - return HAL_CODEC_ERROR_NONE; + return ret; } -- 2.34.1