summaryrefslogtreecommitdiff
path: root/msm8998/mm-video-v4l2
diff options
context:
space:
mode:
Diffstat (limited to 'msm8998/mm-video-v4l2')
-rw-r--r--msm8998/mm-video-v4l2/vidc/vdec/Android.mk2
-rw-r--r--msm8998/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp92
-rw-r--r--msm8998/mm-video-v4l2/vidc/venc/Android.mk6
-rw-r--r--msm8998/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp1
4 files changed, 83 insertions, 18 deletions
diff --git a/msm8998/mm-video-v4l2/vidc/vdec/Android.mk b/msm8998/mm-video-v4l2/vidc/vdec/Android.mk
index 287bba7..c29710d 100644
--- a/msm8998/mm-video-v4l2/vidc/vdec/Android.mk
+++ b/msm8998/mm-video-v4l2/vidc/vdec/Android.mk
@@ -28,7 +28,7 @@ libmm-vdec-def += -DMAX_RES_1080P_EBI
TARGETS_THAT_USE_HEVC_ADSP_HEAP := msm8226 msm8974
TARGETS_THAT_HAVE_VENUS_HEVC := apq8084 msm8994 msm8996
-TARGETS_THAT_SUPPORT_UBWC := msm8996 msm8953 msmcobalt
+TARGETS_THAT_SUPPORT_UBWC := msm8996 msm8953 msm8998
TARGETS_THAT_NEED_SW_VDEC := msm8937
ifeq ($(call is-board-platform-in-list, $(TARGETS_THAT_USE_HEVC_ADSP_HEAP)),true)
diff --git a/msm8998/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/msm8998/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
index ae02358..99b0c6e 100644
--- a/msm8998/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/msm8998/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -148,6 +148,8 @@ extern "C" {
#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE
#endif
+#define LUMINANCE_DIV_FACTOR 10000.0
+
static OMX_U32 maxSmoothStreamingWidth = 1920;
static OMX_U32 maxSmoothStreamingHeight = 1088;
@@ -237,6 +239,14 @@ void* async_message_thread (void *input)
omx->m_progressive = ptr[4];
DEBUG_PRINT_HIGH("VIDC Port Reconfig PicStruct change - %d", ptr[4]);
}
+ if(ptr[2] & V4L2_EVENT_COLOUR_SPACE_FLAG) {
+ if (ptr[5] == MSM_VIDC_BT2020) {
+ omx->m_color_space = omx_vdec::BT2020;
+ } else {
+ omx->m_color_space = omx_vdec::EXCEPT_BT2020;
+ }
+ DEBUG_PRINT_HIGH("VIDC Port Reconfig ColorSpace change - %d", omx->m_color_space);
+ }
if (omx->async_message_process(input,&vdec_msg) < 0) {
DEBUG_PRINT_HIGH("async_message_thread Exited");
break;
@@ -559,7 +569,7 @@ bool is_platform_tp10capture_supported()
{
char platform_name[PROPERTY_VALUE_MAX] = {0};
property_get("ro.board.platform", platform_name, "0");
- if (!strncmp(platform_name, "msmcobalt", 9)) {
+ if (!strncmp(platform_name, "msm8998", 9)) {
DEBUG_PRINT_HIGH("TP10 on capture port is supported");
return true;
}
@@ -828,7 +838,17 @@ omx_vdec::omx_vdec(): m_error_propogated(false),
m_internal_hdr_info.nPortIndex = (OMX_U32)OMX_CORE_OUTPUT_PORT_INDEX;
m_change_client_hdr_info = false;
pthread_mutex_init(&m_hdr_info_client_lock, NULL);
- m_dither_config = is_platform_tp10capture_supported() ? DITHER_DISABLE : DITHER_ALL_COLORSPACE;
+
+ char dither_value[PROPERTY_VALUE_MAX] = {0};
+ property_get("vidc.dec.dither", dither_value, "0");
+ if ((atoi(dither_value) > DITHER_ALL_COLORSPACE) ||
+ (atoi(dither_value) < DITHER_DISABLE)) {
+ m_dither_config = DITHER_ALL_COLORSPACE;
+ } else {
+ m_dither_config = is_platform_tp10capture_supported() ? (dither_type)atoi(dither_value) : DITHER_ALL_COLORSPACE;
+ }
+
+ DEBUG_PRINT_HIGH("Dither config is %d", m_dither_config);
m_color_space = EXCEPT_BT2020;
}
@@ -3925,6 +3945,16 @@ OMX_ERRORTYPE omx_vdec::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
eRet = OMX_ErrorNone;
break;
}
+ case OMX_QTIIndexParamDitherControl:
+ {
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
+ DEBUG_PRINT_LOW("get_parameter: QOMX_VIDEO_DITHER_CONTROL");
+ QOMX_VIDEO_DITHER_CONTROL *pParam =
+ (QOMX_VIDEO_DITHER_CONTROL *) paramData;
+ pParam->eDitherType = (QOMX_VIDEO_DITHERTYPE) m_dither_config;
+ eRet = OMX_ErrorNone;
+ break;
+ }
default: {
DEBUG_PRINT_ERROR("get_parameter: unknown param %08x", paramIndex);
eRet =OMX_ErrorUnsupportedIndex;
@@ -5107,7 +5137,22 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
}
break;
}
-
+ case OMX_QTIIndexParamDitherControl:
+ {
+ VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_DITHER_CONTROL);
+ DEBUG_PRINT_LOW("set_parameter: OMX_QTIIndexParamDitherControl");
+ QOMX_VIDEO_DITHER_CONTROL *pParam = (QOMX_VIDEO_DITHER_CONTROL *)paramData;
+ DEBUG_PRINT_LOW("set_parameter: Dither Config from client is: %d", pParam->eDitherType);
+ if (( pParam->eDitherType < QOMX_DITHER_DISABLE ) ||
+ ( pParam->eDitherType > QOMX_DITHER_ALL_COLORSPACE)) {
+ DEBUG_PRINT_ERROR("set_parameter: DitherType outside the range");
+ eRet = OMX_ErrorBadParameter;
+ break;
+ }
+ m_dither_config = is_platform_tp10capture_supported() ? (dither_type)pParam->eDitherType : DITHER_ALL_COLORSPACE;
+ DEBUG_PRINT_LOW("set_parameter: Final Dither Config is: %d", m_dither_config);
+ break;
+ }
default: {
DEBUG_PRINT_ERROR("Setparameter: unknown param %d", paramIndex);
eRet = OMX_ErrorUnsupportedIndex;
@@ -8460,21 +8505,35 @@ OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp,
}
// add current framerate to gralloc meta data
- if (buffer->nFilledLen > 0 && m_drc_enable && m_enable_android_native_buffers && m_out_mem_ptr) {
- //If valid fps was received, directly send it to display for the 1st fbd.
- //Otherwise, calculate fps using fbd timestamps,
- // when received 2 fbds, send a coarse fps,
- // when received 30 fbds, update fps again as it should be
- // more accurate than the one when only 2 fbds received.
- //For other frames, set value 0 to inform that refresh rate has no update
+ if ((buffer->nFilledLen > 0) && m_enable_android_native_buffers && m_out_mem_ptr) {
+ // If valid fps was received, directly send it to display for the 1st fbd.
+ // Otherwise, calculate fps using fbd timestamps
float refresh_rate = m_fps_prev;
if (m_fps_received) {
if (1 == proc_frms) {
refresh_rate = m_fps_received / (float)(1<<16);
}
} else {
- if (2 == proc_frms || 30 == proc_frms) {
- refresh_rate = drv_ctx.frame_rate.fps_numerator / (float) drv_ctx.frame_rate.fps_denominator;
+ // check if dynamic refresh rate change feature enabled or not
+ if (m_drc_enable) {
+ // set coarse fps when 2 fbds received and
+ // set fps again when 30 fbds received as it should be
+ // more accurate than the one set when only 2 fbds received.
+ if (2 == proc_frms || 30 == proc_frms) {
+ if (drv_ctx.frame_rate.fps_denominator) {
+ refresh_rate = drv_ctx.frame_rate.fps_numerator /
+ (float) drv_ctx.frame_rate.fps_denominator;
+ }
+ }
+ } else {
+ // calculate and set refresh rate for every frame from second frame onwards
+ // display will assume the default refresh rate for first frame (which is 60 fps)
+ if (m_fps_prev) {
+ if (drv_ctx.frame_rate.fps_denominator) {
+ refresh_rate = drv_ctx.frame_rate.fps_numerator /
+ (float) drv_ctx.frame_rate.fps_denominator;
+ }
+ }
}
}
if (refresh_rate > 60) {
@@ -10833,7 +10892,12 @@ bool omx_vdec::handle_mastering_display_color_info(void* data)
internal_disp_changed_flag |= (hdr_info->sType1.mW.x != mastering_display_payload->nWhitePointX) ||
(hdr_info->sType1.mW.y != mastering_display_payload->nWhitePointY);
- internal_disp_changed_flag != (hdr_info->sType1.mMaxDisplayLuminance != mastering_display_payload->nMaxDisplayMasteringLuminance) ||
+ /* Maximum Display Luminance from the bitstream is in 0.0001 cd/m2 while the HDRStaticInfo extension
+ requires it in cd/m2, so dividing by 10000 and rounding the value after division
+ */
+ uint16_t max_display_luminance_cd_m2 =
+ static_cast<int>((mastering_display_payload->nMaxDisplayMasteringLuminance / LUMINANCE_DIV_FACTOR) + 0.5);
+ internal_disp_changed_flag |= (hdr_info->sType1.mMaxDisplayLuminance != max_display_luminance_cd_m2) ||
(hdr_info->sType1.mMinDisplayLuminance != mastering_display_payload->nMinDisplayMasteringLuminance);
if (internal_disp_changed_flag) {
@@ -10846,7 +10910,7 @@ bool omx_vdec::handle_mastering_display_color_info(void* data)
hdr_info->sType1.mW.x = mastering_display_payload->nWhitePointX;
hdr_info->sType1.mW.y = mastering_display_payload->nWhitePointY;
- hdr_info->sType1.mMaxDisplayLuminance = mastering_display_payload->nMaxDisplayMasteringLuminance;
+ hdr_info->sType1.mMaxDisplayLuminance = max_display_luminance_cd_m2;
hdr_info->sType1.mMinDisplayLuminance = mastering_display_payload->nMinDisplayMasteringLuminance;
}
diff --git a/msm8998/mm-video-v4l2/vidc/venc/Android.mk b/msm8998/mm-video-v4l2/vidc/venc/Android.mk
index bf74532..e1cd555 100644
--- a/msm8998/mm-video-v4l2/vidc/venc/Android.mk
+++ b/msm8998/mm-video-v4l2/vidc/venc/Android.mk
@@ -24,9 +24,9 @@ libmm-venc-def += -D_MSM8974_
TARGETS_THAT_USE_FLAG_MSM8226 := msm8226 msm8916 msm8909
TARGETS_THAT_NEED_SW_VENC_MPEG4 := msm8909 msm8937
TARGETS_THAT_NEED_SW_VENC_HEVC := msm8992
-TARGETS_THAT_SUPPORT_UBWC := msm8996 msmcobalt
-TARGETS_THAT_SUPPORT_VQZIP := msm8996 msmcobalt
-TARGETS_THAT_SUPPORT_PQ := msm8996 msmcobalt
+TARGETS_THAT_SUPPORT_UBWC := msm8996 msm8998
+TARGETS_THAT_SUPPORT_VQZIP := msm8996 msm8998
+TARGETS_THAT_SUPPORT_PQ := msm8996 msm8998
ifeq ($(TARGET_BOARD_PLATFORM),msm8610)
libmm-venc-def += -DMAX_RES_720P
diff --git a/msm8998/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp b/msm8998/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
index b6c6160..358f797 100644
--- a/msm8998/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
+++ b/msm8998/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp
@@ -2379,6 +2379,7 @@ int omx_venc::swvenc_input_log_buffers(const char *buffer, int bufferlen)
fwrite(temp, width, 1, m_debug.infile);
temp += stride;
}
+ temp = (char*)(buffer + (stride * scanlines));
for(int i = 0; i < height/2; i++)
{
fwrite(temp, width, 1, m_debug.infile);