summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChinmay Sawarkar <chinmays@codeaurora.org>2017-08-28 11:50:35 -0700
committerChinmay Sawarkar <chinmays@codeaurora.org>2017-09-01 10:38:38 -0700
commitf1d63351daeb7e5611f269acfca36e43b1890565 (patch)
tree7c2a5d2e448fd9ce1abd6ac843a1e8dc0e1df005
parentaa2c764ea4b7b04c9c7515a8a389b2530f0d3b94 (diff)
downloadmedia-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.xml1
-rw-r--r--libplatformconfig/PlatformConfig.h2
-rwxr-xr-xmm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h2
-rwxr-xr-xmm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp40
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