diff options
author | Chinmay Sawarkar <chinmays@codeaurora.org> | 2017-08-28 11:50:35 -0700 |
---|---|---|
committer | Chinmay Sawarkar <chinmays@codeaurora.org> | 2017-09-01 10:38:38 -0700 |
commit | f1d63351daeb7e5611f269acfca36e43b1890565 (patch) | |
tree | 7c2a5d2e448fd9ce1abd6ac843a1e8dc0e1df005 | |
parent | aa2c764ea4b7b04c9c7515a8a389b2530f0d3b94 (diff) | |
download | media-f1d63351daeb7e5611f269acfca36e43b1890565.tar.gz |
mm-video-v4l2: Enable Color Space Conversion
Enable Color Space Conversion, if camera provides colorspace 601
and client sets 709.
CRs-Fixed: 2100064
Change-Id: I000f9481b46fad053e6a5d714fc32a7c438d89d7
-rw-r--r-- | conf_files/sdm845/system_properties.xml | 1 | ||||
-rw-r--r-- | libplatformconfig/PlatformConfig.h | 2 | ||||
-rwxr-xr-x | mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h | 2 | ||||
-rwxr-xr-x | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 40 |
4 files changed, 42 insertions, 3 deletions
diff --git a/conf_files/sdm845/system_properties.xml b/conf_files/sdm845/system_properties.xml index 0d557244..31f1fea1 100644 --- a/conf_files/sdm845/system_properties.xml +++ b/conf_files/sdm845/system_properties.xml @@ -32,4 +32,5 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. <property name="vidc_dec_log_out" value="0"/> <property name="vidc_enc_log_in" value="0"/> <property name="vidc_enc_log_out" value="0"/> + <property name="vidc_enc_csc_custom_matrix" value="0"/> </configs> diff --git a/libplatformconfig/PlatformConfig.h b/libplatformconfig/PlatformConfig.h index ebe27e40..7cfcc608 100644 --- a/libplatformconfig/PlatformConfig.h +++ b/libplatformconfig/PlatformConfig.h @@ -56,6 +56,7 @@ typedef enum { vidc_enc_log_out, vidc_dec_conceal_color_8bit, vidc_dec_conceal_color_10bit, + vidc_enc_csc_custom_matrix, } Config_t; struct configStr { @@ -70,6 +71,7 @@ static const struct configStr configStrMap[] = { {vidc_enc_log_out, "vidc_enc_log_out"}, {vidc_dec_conceal_color_8bit, "vidc_dec_conceal_color_8bit"}, {vidc_dec_conceal_color_10bit, "vidc_dec_conceal_color_10bit"}, + {vidc_enc_csc_custom_matrix, "vidc_enc_csc_custom_matrix"}, }; class Config { diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h index fcb2e3ff..d9501b4f 100755 --- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h +++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h @@ -421,7 +421,7 @@ class venc_dev bool hw_overload; bool is_gralloc_source_ubwc; bool is_camera_source_ubwc; - bool is_csc_enabled; + bool is_csc_custom_matrix_enabled; OMX_U32 fd_list[64]; private: diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 6d714b34..485c737b 100755 --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -154,6 +154,8 @@ venc_dev::venc_dev(class omx_venc *venc_class) (int32_t *)&m_debug.in_buffer_log, 0); Platform::Config::getInt32(Platform::vidc_enc_log_out, (int32_t *)&m_debug.out_buffer_log, 0); + Platform::Config::getInt32(Platform::vidc_enc_csc_custom_matrix, + (int32_t *)&is_csc_custom_matrix_enabled, 0); char property_value[PROPERTY_VALUE_MAX] = {0}; @@ -178,8 +180,6 @@ venc_dev::venc_dev(class omx_venc *venc_class) #else is_gralloc_source_ubwc = 0; #endif - // TODO: Support in XML - is_csc_enabled = 0; property_value[0] = '\0'; property_get("vendor.vidc.log.loc", property_value, BUFFER_LOG_LOC); @@ -3630,6 +3630,7 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, if (!streaming[OUTPUT_PORT] && !(m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGB32 || m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGBA8888_UBWC)) { + unsigned int is_csc_enabled = 0; struct v4l2_format fmt; OMX_COLOR_FORMATTYPE color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; @@ -3721,6 +3722,7 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, } if (!streaming[OUTPUT_PORT]) { + unsigned int is_csc_enabled = 0; ColorMetaData colorData= {}; // Moment of truth... actual colorspace is known here.. if (getMetaData(handle, GET_COLOR_METADATA, &colorData) == 0) { @@ -3755,14 +3757,48 @@ bool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = NV12 Linear"); } + DEBUG_PRINT_INFO("color_space.primaries %d colorData.colorPrimaries %d, is_csc_custom_matrix_enabled=%d", + color_space.primaries, colorData.colorPrimaries, is_csc_custom_matrix_enabled); + + bool is_color_space_601fr = (colorData.colorPrimaries == ColorPrimaries_BT601_6_525) && + (colorData.range == Range_Full) && + (colorData.transfer == Transfer_SMPTE_170M) && + (colorData.matrixCoefficients == MatrixCoEff_BT601_6_525); + + if (is_color_space_601fr && + color_space.primaries == ColorPrimaries_BT709_5) + { + DEBUG_PRINT_INFO("Enable CSC from BT601 to BT709 supported."); + is_csc_enabled = 1; + } + // If CSC is enabled, then set control with colorspace from gralloc metadata if (is_csc_enabled) { struct v4l2_control control; + + /* Set 601FR as the Color Space. When we set CSC, this will be passed to + fimrware as the InputPrimaries */ + venc_set_colorspace(colorData.colorPrimaries, colorData.range, + colorData.transfer, colorData.matrixCoefficients); + control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC; control.value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE; if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { DEBUG_PRINT_ERROR("venc_empty_buf: Failed to set VPE CSC"); } + if (is_csc_custom_matrix_enabled) { + control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX; + control.value = 1; + if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { + DEBUG_PRINT_ERROR("venc_empty_buf: Failed to enable VPE CSC custom matrix"); + } else { + DEBUG_PRINT_INFO("venc_empty_buf: Enabled VPE CSC custom matrix"); + colorData.colorPrimaries = ColorPrimaries_BT709_5; + colorData.range = Range_Limited; + colorData.transfer = Transfer_sRGB; + colorData.matrixCoefficients = MatrixCoEff_BT709_5; + } + } } /* Enum values from gralloc ColorMetaData matches with the driver values |