mm-video: vidc: Stop setting frame rate on ETB

Setting the frame rate is only useful for the driver which relies on
this information for clock scaling.  Since we can't trust input
timestamps to be accurate, the call into set_frame_rate is inherently
wrong.  As such only set the initial framerate when the client
informs it as part of the port definition and in the output path in
fill_buffer_done.

Also fix a minor bug where get_parameter of the framerate wasn't being
returned in the Q16 format as mandated by spec.
Change-Id: I9a0e460f3eb55da4054516ba8d67db05190671e3
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 e921397..9dc6c3f 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -2989,6 +2989,7 @@
                                        }
                                    }
                                } else if (OMX_DirInput == portDefn->eDir) {
+                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
                                    bool port_format_changed = false;
                                    if ((portDefn->format.video.xFramerate >> 16) > 0 &&
                                            (portDefn->format.video.xFramerate >> 16) <= MAX_SUPPORTED_FPS) {
@@ -3012,8 +3013,23 @@
                                        DEBUG_PRINT_LOW("set_parameter: frm_int(%lu) fps(%.2f)",
                                                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;
+                                           break;
+                                       }
                                    }
-                                   DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition IP port");
+
                                    if (drv_ctx.video_resolution.frame_height !=
                                            portDefn->format.video.nFrameHeight ||
                                            drv_ctx.video_resolution.frame_width  !=
@@ -5591,9 +5607,6 @@
 
     }
 
-    if (!(client_extradata & OMX_TIMEINFO_EXTRADATA))
-        set_frame_rate(buffer->nTimeStamp);
-
     frameinfo.bufferaddr = temp_buffer->bufferaddr;
     frameinfo.client_data = (void *) buffer;
     frameinfo.datalen = temp_buffer->buffer_len;
@@ -6543,12 +6556,14 @@
 
 
     }
+
     if (m_cb.FillBufferDone) {
         if (buffer->nFilledLen > 0) {
-            if (client_extradata & OMX_TIMEINFO_EXTRADATA)
-                set_frame_rate(buffer->nTimeStamp);
-            else if (arbitrary_bytes)
+            if (arbitrary_bytes)
                 adjust_timestamp(buffer->nTimeStamp);
+            else
+                set_frame_rate(buffer->nTimeStamp);
+
             if (perf_flag) {
                 if (!proc_frms) {
                     dec_time.stop();
@@ -7852,8 +7867,8 @@
     portDefn->nSize = sizeof(portDefn);
     portDefn->eDomain    = OMX_PortDomainVideo;
     if (drv_ctx.frame_rate.fps_denominator > 0)
-        portDefn->format.video.xFramerate = drv_ctx.frame_rate.fps_numerator /
-            drv_ctx.frame_rate.fps_denominator;
+        portDefn->format.video.xFramerate = (drv_ctx.frame_rate.fps_numerator /
+            drv_ctx.frame_rate.fps_denominator) << 16; //Q16 format
     else {
         DEBUG_PRINT_ERROR("Error: Divide by zero");
         return OMX_ErrorBadParameter;