diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-02-18 01:13:17 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-02-18 01:13:17 -0800 |
commit | c3e4fb43d0fb315ae7aac30be2166e2eb0fa29d7 (patch) | |
tree | 19f6dd4238d7f8d22d712d600df849a9625058e2 | |
parent | 8aa40000e3584836af29a5763dff114583036be5 (diff) | |
parent | a699a1315945ba9a639f27b33d7aafac7b8b3dc3 (diff) | |
download | android_hardware_qcom_media-c3e4fb43d0fb315ae7aac30be2166e2eb0fa29d7.tar.gz android_hardware_qcom_media-c3e4fb43d0fb315ae7aac30be2166e2eb0fa29d7.tar.bz2 android_hardware_qcom_media-c3e4fb43d0fb315ae7aac30be2166e2eb0fa29d7.zip |
Merge "mm-video-v4l2: vdec: set 24 fps framerate for 4k clips"
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 3 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 68 |
2 files changed, 49 insertions, 22 deletions
diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index 4e968faa..b64c7cf9 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010 - 2015, The Linux Foundation. All rights reserved. +Copyright (c) 2010 - 2016, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -683,6 +683,7 @@ class omx_vdec: public qc_omx_component int stream_off(OMX_U32 port); void adjust_timestamp(OMX_S64 &act_timestamp); void set_frame_rate(OMX_S64 act_timestamp); + OMX_ERRORTYPE set_frame_rate(OMX_U64 numerator, OMX_U64 denominator); void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr); void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr); void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra); diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp index e296f16f..f4a8c4b7 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp @@ -1,5 +1,5 @@ /*-------------------------------------------------------------------------- -Copyright (c) 2010 - 2015, The Linux Foundation. All rights reserved. +Copyright (c) 2010 - 2016, The Linux Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -107,6 +107,8 @@ char output_extradata_filename [] = "/data/misc/media/extradata"; #define VC1_STRUCT_B_POS 24 #define VC1_SEQ_LAYER_SIZE 36 #define POLL_TIMEOUT 0x7fffffff +#define WIDTH_4K 4096 +#define HEIGHT_4K 2160 #define MEM_DEVICE "/dev/ion" #define MEM_HEAP_ID ION_CP_MM_HEAP_ID @@ -3662,27 +3664,20 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, drv_ctx.frame_rate.fps_numerator = (int) drv_ctx.frame_rate.fps_numerator / drv_ctx.frame_rate.fps_denominator; drv_ctx.frame_rate.fps_denominator = 1; - frm_int = drv_ctx.frame_rate.fps_denominator * 1e6 / - drv_ctx.frame_rate.fps_numerator; - DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", - (unsigned int)frm_int, drv_ctx.frame_rate.fps_numerator / - (float)drv_ctx.frame_rate.fps_denominator); - - struct v4l2_outputparm oparm; - /*XXX: we're providing timing info as seconds per frame rather than frames - * per second.*/ - oparm.timeperframe.numerator = drv_ctx.frame_rate.fps_denominator; - oparm.timeperframe.denominator = drv_ctx.frame_rate.fps_numerator; - - struct v4l2_streamparm sparm; - sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; - sparm.parm.output = oparm; - if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { - DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected"); - eRet = OMX_ErrorHardware; + eRet = set_frame_rate(drv_ctx.frame_rate.fps_numerator,drv_ctx.frame_rate.fps_denominator); + if (eRet != OMX_ErrorNone) + break; + } + // If resolution is 4096x2160 (True UHD), then + // set frame rate to 24fps for best effort decoding. + if (portDefn->format.video.nFrameWidth * portDefn->format.video.nFrameHeight >= WIDTH_4K * HEIGHT_4K) { + drv_ctx.frame_rate.fps_numerator = 24; + drv_ctx.frame_rate.fps_denominator = 1; + DEBUG_PRINT_HIGH("Setting %lu fps framerate for WxH = %dx%d", drv_ctx.frame_rate.fps_numerator, + portDefn->format.video.nFrameWidth, portDefn->format.video.nFrameHeight); + eRet = set_frame_rate(drv_ctx.frame_rate.fps_numerator,drv_ctx.frame_rate.fps_denominator); + if (eRet != OMX_ErrorNone) break; - } - m_perf_control.request_cores(frm_int); } if (drv_ctx.video_resolution.frame_height != @@ -9359,6 +9354,37 @@ void omx_vdec::set_frame_rate(OMX_S64 act_timestamp) prev_ts = act_timestamp; } +OMX_ERRORTYPE omx_vdec::set_frame_rate(OMX_U64 numerator, OMX_U64 denominator) +{ + struct v4l2_outputparm oparm; + struct v4l2_streamparm sparm; + OMX_ERRORTYPE eRet = OMX_ErrorNone; + + /* Sanity Check*/ + if (!numerator || !denominator) { + DEBUG_PRINT_ERROR("%s: Invalid arguments", __func__); + return OMX_ErrorBadParameter; + } + + frm_int = denominator * 1e6 / numerator; + DEBUG_PRINT_LOW("set_parameter: frm_int(%u) fps(%.2f)", + (unsigned int)frm_int, numerator / (float) denominator); + + /*we're providing timing info as seconds per frame rather than frames + * per second.*/ + oparm.timeperframe.numerator = denominator; + oparm.timeperframe.denominator = numerator; + + sparm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + sparm.parm.output = oparm; + if (ioctl(drv_ctx.video_driver_fd, VIDIOC_S_PARM, &sparm)) { + DEBUG_PRINT_ERROR("Unable to convey fps info to driver, performance might be affected"); + return OMX_ErrorHardware; + } + m_perf_control.request_cores(frm_int); + return eRet; +} + void omx_vdec::adjust_timestamp(OMX_S64 &act_timestamp) { if (rst_prev_ts && VALID_TS(act_timestamp)) { |