summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-02-18 01:13:17 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-02-18 01:13:17 -0800
commitc3e4fb43d0fb315ae7aac30be2166e2eb0fa29d7 (patch)
tree19f6dd4238d7f8d22d712d600df849a9625058e2
parent8aa40000e3584836af29a5763dff114583036be5 (diff)
parenta699a1315945ba9a639f27b33d7aafac7b8b3dc3 (diff)
downloadandroid_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.h3
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp68
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)) {