Fix Layer warning of wait_vbuf. 15/27515/1
authorAndrii Sokolenko <a.sokolenko@samsung.com>
Mon, 15 Sep 2014 08:49:31 +0000 (11:49 +0300)
committerAndrii Sokolenko <a.sokolenko@samsung.com>
Mon, 15 Sep 2014 08:49:31 +0000 (11:49 +0300)
Change-Id: I15d91eb484f1f3de77613c262eb942a3e91dfae5

src/crtcconfig/sec_layer.c
src/crtcconfig/sec_layer.h
src/xv/sec_video.c

index db3270c..26dd054 100644 (file)
@@ -577,6 +577,24 @@ secLayerRemoveNotifyFunc (SECLayer* layer, NotifyFunc func)
 }
 
 Bool
+secLayerExistNotifyFunc (SECLayer* layer, NotifyFunc func)
+{
+    NotifyFuncData *data = NULL, *data_next = NULL;
+
+    XDBG_RETURN_VAL_IF_FAIL (layer != NULL, FALSE);
+    XDBG_RETURN_VAL_IF_FAIL (func != NULL, FALSE);
+
+    xorg_list_for_each_entry_safe (data, data_next, &layer->noti_data, link)
+    {
+        if (data->func == func)
+        {
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+Bool
 secLayerIsVisible (SECLayer *layer)
 {
     XDBG_RETURN_VAL_IF_FAIL (layer != NULL, FALSE);
index e3f0685..1cd2e14 100644 (file)
@@ -101,5 +101,5 @@ SECVideoBuf* secLayerGetBuffer (SECLayer *layer);
 
 void        secLayerVBlankEventHandler (unsigned int frame, unsigned int tv_sec,
                                         unsigned int tv_usec, void *event_data);
-
+Bool        secLayerExistNotifyFunc (SECLayer* layer, NotifyFunc func);
 #endif /* __SEC_LAYER_H__ */
index 0ccd0c7..3ac0862 100644 (file)
@@ -1804,9 +1804,7 @@ _secVideoPutImageTvout (SECPortPrivPtr pPort, int output, SECVideoBuf *inbuf)
             goto fail_to_put_tvout;
         }
 
-        tv_cvt = secVideoTvGetConverter (pPort->tv);
-
-        if (tv_cvt == NULL)
+        if (!secVideoTvGetConverter (pPort->tv))
         {
             if (!secVideoCanDirectDrawing (NULL, pPort->d.src.width, pPort->d.src.height,
                                            pPort->d.dst.width, pPort->d.dst.height))
@@ -1815,6 +1813,9 @@ _secVideoPutImageTvout (SECPortPrivPtr pPort, int output, SECVideoBuf *inbuf)
                                    fail_to_put_tvout);
             }
         }
+
+        tv_cvt = secVideoTvGetConverter (pPort->tv);
+
         if (tv_cvt)
         {
             /* HDMI    : SN12
@@ -1862,7 +1863,6 @@ _secVideoPutImageTvout (SECPortPrivPtr pPort, int output, SECVideoBuf *inbuf)
         {
             SECLayer *layer = secVideoTvGetLayer (pPort->tv);
             XDBG_GOTO_IF_FAIL (layer != NULL, fail_to_put_tvout);
-
             secLayerEnableVBlank (layer, TRUE);
             secLayerAddNotifyFunc (layer, _secVideoLayerNotifyFunc, pPort);
         }
@@ -2684,7 +2684,7 @@ SECVideoPutImage (ScrnInfoPtr pScrn,
 
     if (pPort->tv)
     {
-        SECCvt *tv_cvt = secVideoTvGetConverter (pPort->tv);
+        SECCvt *old_tv_cvt = secVideoTvGetConverter (pPort->tv);
         if (pPort->d.id != pPort->old_d.id ||
             pPort->d.width != pPort->old_d.width ||
             pPort->d.height != pPort->old_d.height ||
@@ -2693,10 +2693,10 @@ SECVideoPutImage (ScrnInfoPtr pScrn,
             _secVideoCloseInBuffer (pPort);
             pPort->inbuf_is_fb = FALSE;
         }
-        else if (tv_cvt != NULL)
+        else if (old_tv_cvt != NULL)
         {
             SECCvtProp dst_prop;
-            secCvtGetProperpty (tv_cvt, NULL, &dst_prop);
+            secCvtGetProperpty (old_tv_cvt, NULL, &dst_prop);
 
             if (dst_prop.degree != pPort->hw_rotate ||
                 dst_prop.hflip != pPort->hflip ||
@@ -2717,15 +2717,30 @@ SECVideoPutImage (ScrnInfoPtr pScrn,
             XDBG_DEBUG(MTVO, "==> new frame: (x%d,y%d) (w%d-h%d)\n",
                        pPort->d.dst.x, pPort->d.dst.y,
                        pPort->d.dst.width, pPort->d.dst.height);
-            SECCvt *old_tv_cvt = secVideoTvGetConverter (pPort->tv);
             if (secVideoTvResizeOutput (pPort->tv, &pPort->d.src, &pPort->d.dst) == TRUE)
             {
                 SECCvt *new_tv_cvt = secVideoTvGetConverter (pPort->tv);
-                if (tv_cvt != NULL)
+                if (new_tv_cvt != NULL)
                 {
                     if (secCvtGetStamp (new_tv_cvt) != secCvtGetStamp(old_tv_cvt))
                     {
-                        secCvtAddCallback (tv_cvt, _secVideoTvoutCvtCallback, pPort);
+                        SECLayer *layer = secVideoTvGetLayer (pPort->tv);
+                        /* TODO: Clear if fail */
+                        XDBG_RETURN_VAL_IF_FAIL (layer != NULL, BadRequest);
+                        secLayerRemoveNotifyFunc (layer, _secVideoLayerNotifyFunc);
+                        secLayerEnableVBlank (layer, FALSE);
+                        secCvtAddCallback (new_tv_cvt, _secVideoTvoutCvtCallback, pPort);
+                    }
+                }
+                else
+                {
+                    SECLayer *layer = secVideoTvGetLayer (pPort->tv);
+                    /* TODO: Clear if fail */
+                    XDBG_RETURN_VAL_IF_FAIL (layer != NULL, BadRequest);
+                    secLayerEnableVBlank (layer, TRUE);
+                    if (!secLayerExistNotifyFunc (layer, _secVideoLayerNotifyFunc))
+                    {
+                        secLayerAddNotifyFunc (layer, _secVideoLayerNotifyFunc, pPort);
                     }
                 }
             }