mm-video: Add extradata size to output buffer size only on client's request

Extradata size should be added to output buffer size only
if client has requested that extradata. Without this fix,
gralloc might allocate less buffer size than needed causing
playback failures.

Change-Id: Id0e93e0c1b4b801856efc18682d0b42c1df3643d
diff --git a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
index c82df29..e195aa2 100644
--- a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -1331,7 +1331,6 @@
 	int r,ret=0;
 	bool codec_ambiguous = false;
 	OMX_STRING device_name = "/dev/video32";
-
 	if(!strncmp(role, "OMX.qcom.video.decoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)){
 		struct v4l2_control control;
 		secure_mode = true;
@@ -1647,7 +1646,7 @@
 		DEBUG_PRINT_HIGH("Input Buffer Size =%d \n ",drv_ctx.ip_buf.buffer_size);
 #ifdef DEFAULT_EXTRADATA
     if (eRet == OMX_ErrorNone && !secure_mode)
-      enable_extradata(DEFAULT_EXTRADATA, 1);
+      enable_extradata(DEFAULT_EXTRADATA, true, true);
 #endif
 		if (drv_ctx.decoder_format == VDEC_CODECTYPE_H264)
 		{
@@ -3443,7 +3442,7 @@
 	}
     case OMX_QcomIndexParamConcealMBMapExtraData:
       if(!secure_mode)
-          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP,
+          eRet = enable_extradata(VDEC_EXTRADATA_MB_ERROR_MAP, false,
                                   ((QOMX_ENABLETYPE *)paramData)->bEnable);
       else {
           DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3453,7 +3452,7 @@
     case OMX_QcomIndexParamFrameInfoExtraData:
       {
         if(!secure_mode)
-            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA,
+            eRet = enable_extradata(OMX_FRAMEINFO_EXTRADATA, false,
                                 ((QOMX_ENABLETYPE *)paramData)->bEnable);
         else {
             DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3463,7 +3462,7 @@
       }
     case OMX_QcomIndexParamInterlaceExtraData:
       if(!secure_mode)
-          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA,
+          eRet = enable_extradata(OMX_INTERLACE_EXTRADATA, false,
                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
       else {
           DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3472,7 +3471,7 @@
       break;
     case OMX_QcomIndexParamH264TimeInfo:
       if(!secure_mode)
-          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA,
+          eRet = enable_extradata(OMX_TIMEINFO_EXTRADATA, false,
                               ((QOMX_ENABLETYPE *)paramData)->bEnable);
       else {
           DEBUG_PRINT_ERROR("\n secure mode setting not supported");
@@ -3541,7 +3540,7 @@
                    (extradataIndexType->nPortIndex == 1))
             {
               DEBUG_PRINT_HIGH("set_parameter:  OMX_QcomIndexParamIndexExtraDataType SmoothStreaming\n");
-              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, extradataIndexType->bEnabled);
+              eRet = enable_extradata(OMX_PORTDEF_EXTRADATA, false, extradataIndexType->bEnabled);
 
             }
          }
@@ -7807,9 +7806,6 @@
     extra_idx = EXTRADATA_IDX(drv_ctx.num_planes);
     if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
       extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
-      /*Temporary workaround for FW bug*/
-      extra_data_size += 128;
-      client_extra_data_size += 128;
     } else if (extra_idx >= VIDEO_MAX_PLANES) {
       DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
       return OMX_ErrorBadParameter;
@@ -8347,7 +8343,8 @@
   return;
 }
 
-OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata, bool enable)
+OMX_ERRORTYPE omx_vdec::enable_extradata(OMX_U32 requested_extradata,
+	 bool is_internal, bool enable)
 {
   OMX_ERRORTYPE ret = OMX_ErrorNone;
   struct v4l2_control control;
@@ -8356,13 +8353,15 @@
      DEBUG_PRINT_ERROR("ERROR: enable extradata allowed in Loaded state only");
      return OMX_ErrorIncorrectStateOperation;
   }
-  DEBUG_PRINT_ERROR("enable_extradata: actual[%x] requested[%x] enable[%d]",
-    client_extradata, requested_extradata, enable);
+  DEBUG_PRINT_ERROR("NOTE: enable_extradata: actual[%x] requested[%x] enable[%d], is_internal: %d\n",
+    client_extradata, requested_extradata, enable, is_internal);
 
-  if (enable)
-    client_extradata |= requested_extradata;
-  else
-    client_extradata = client_extradata & ~requested_extradata;
+  if (!is_internal) {
+	  if (enable)
+		  client_extradata |= requested_extradata;
+	  else
+		  client_extradata = client_extradata & ~requested_extradata;
+  }
 
   if (enable) {
     if (requested_extradata & OMX_INTERLACE_EXTRADATA) {
@@ -8477,6 +8476,9 @@
 {
   OMX_STREAMINTERLACEFORMAT *interlace_format;
   OMX_U32 mbaff = 0;
+  if (!(client_extradata & OMX_INTERLACE_EXTRADATA)) {
+	return;
+  }
   extra->nSize = OMX_INTERLACE_EXTRADATA_SIZE;
   extra->nVersion.nVersion = OMX_SPEC_VERSION;
   extra->nPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
@@ -8565,6 +8567,9 @@
 
 void omx_vdec::append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra)
 {
+  if (!client_extradata) {
+	return;
+  }
   extra->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
   extra->nVersion.nVersion = OMX_SPEC_VERSION;
   extra->eType = OMX_ExtraDataNone;