mm-video: vidc: Fix issues in extradata processing

- For interlaced field pictures the duplicate timestamp needs
to be removed. For interlaced frame pictures only one timestamp
needs to be removed. To handle this properly OMX component needs
to process extradata before handling timestamps.

- Extradata pointer needs to be updated once the data is written.
If not done it will be overwritten by next extradata type.

This change fixes the above two issues.

Change-Id: I9b448ff750febd6f6cf72eab6e71c090489fafc2
CRs-Fixed: 547129
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 1c5e1e5..b384467 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -6364,6 +6364,11 @@
     DEBUG_PRINT_LOW("\n In fill Buffer done call address %p ",buffer);
     log_output_buffers(buffer);
 
+    if (!output_flush_progress && (buffer->nFilledLen > 0)) {
+        DEBUG_PRINT_LOW("Processing extradata");
+        handle_extradata(buffer);
+    }
+
     /* For use buffer we need to copy the data */
     if (!output_flush_progress) {
         /* This is the error check for non-recoverable errros */
@@ -6412,7 +6417,6 @@
     }
     if (m_cb.FillBufferDone) {
         if (buffer->nFilledLen > 0) {
-            handle_extradata(buffer);
             if (client_extradata & OMX_TIMEINFO_EXTRADATA)
                 set_frame_rate(buffer->nTimeStamp);
             else if (arbitrary_bytes)
@@ -8053,7 +8057,11 @@
                     mbaff = (h264_parser)? (h264_parser->is_mbaff()): false;
                     if (payload && (payload->format == INTERLACE_FRAME_PROGRESSIVE)  && !mbaff)
                         drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
-                    else {
+                    else if (payload && (payload->format == INTERLACE_FRAME_TOPFIELDFIRST ||
+                        payload->format == INTERLACE_FRAME_BOTTOMFIELDFIRST)  && !mbaff) {
+                        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+                        enable = 1;
+                    } else {
                         drv_ctx.interlace = VDEC_InterlaceInterleaveFrameTopFieldFirst;
                         enable = 1;
                     }
@@ -8133,6 +8141,7 @@
                     num_conceal_MB, ((struct vdec_output_frameinfo *)p_buf_hdr->pOutputPortPrivate)->pic_type, frame_rate,
                     time_stamp, panscan_payload,&((struct vdec_output_frameinfo *)
                         p_buf_hdr->pOutputPortPrivate)->aspect_ratio_info);
+            p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + p_extra->nSize);
         }
     }
 unrecognized_extradata:
@@ -8322,6 +8331,14 @@
         interlace_format->bInterlaceFormat = OMX_FALSE;
         interlace_format->nInterlaceFormats = OMX_InterlaceFrameProgressive;
         drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+    } else if ((interlaced_format_type == INTERLACE_FRAME_TOPFIELDFIRST)  && !mbaff) {
+        interlace_format->bInterlaceFormat = OMX_TRUE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceFrameTopFieldFirst;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
+    } else if ((interlaced_format_type == INTERLACE_FRAME_BOTTOMFIELDFIRST)  && !mbaff) {
+        interlace_format->bInterlaceFormat = OMX_TRUE;
+        interlace_format->nInterlaceFormats = OMX_InterlaceFrameBottomFieldFirst;
+        drv_ctx.interlace = VDEC_InterlaceFrameProgressive;
     } else {
         interlace_format->bInterlaceFormat = OMX_TRUE;
         interlace_format->nInterlaceFormats = OMX_InterlaceInterleaveFrameTopFieldFirst;