Video playback in linaro using cedar and libhybris stutters and sometimes the 
frame rate drops very low.

There may be an issue in disp_video.c as the included changes sort the issue 
for me. 

My possibly flawed reasoning goes something like...
Its not a good idea to update display_cnt in Hal_Set_Frame called during 
blanking and BSP_disp_video_set_fb which is called from an IOCTL. The value is 
incremented in Hal_Set_Frame and may have been updated (to 0) by a call to 
BSP_disp_video_set_fb. The result is calls to ioctl(fd, 
DISP_CMD_VIDEO_GET_FRAME_ID, args) never returning the updated frame number 
(this I have observed).

Hope this is of some help.

Any thoughts appreciated.

Kind regards,

Phil


diff --git a/drivers/video/sunxi/disp/disp_video.c 
b/drivers/video/sunxi/disp/disp_video.c
index aa07364..460def8 100644
--- a/drivers/video/sunxi/disp/disp_video.c
+++ b/drivers/video/sunxi/disp/disp_video.c
@@ -144,11 +144,19 @@ static inline __s32 Hal_Set_Frame(__u32 sel, __u32 
tcon_index, __u32 id)
                return DIS_FAIL;
        }
 
-       if (g_video[sel][id].display_cnt == 0) {
+  __u32 new_id = g_video[sel][id].video_new.id;
+  __u32 cur_id = g_video[sel][id].video_cur.id;
+  
+//     if (g_video[sel][id].display_cnt == 0) {
+       if (cur_id != new_id) {
                g_video[sel][id].pre_frame_addr0 =
                    g_video[sel][id].video_cur.addr[0];
+    
+    g_video[sel][id].video_new.id = cur_id;
+    
                memcpy(&g_video[sel][id].video_cur, &g_video[sel][id].video_new,
                       sizeof(__disp_video_fb_t));
+               g_video[sel][id].display_cnt = 0;
        }
 
        if (gdisp.screen[sel].layer_manage[id].para.mode ==
@@ -382,6 +390,9 @@ static inline __s32 Hal_Set_Frame(__u32 sel, __u32 
tcon_index, __u32 id)
                g_video[sel][id].video_cur.addr_right[1];
        gdisp.screen[sel].layer_manage[id].para.fb.trd_right_addr[2] =
                g_video[sel][id].video_cur.addr_right[2];
+    
+  g_video[sel][id].video_cur.id = new_id;
+  
        return DIS_SUCCESS;
 }
 
@@ -408,7 +419,7 @@ __s32 BSP_disp_video_set_fb(__u32 sel, __u32 hid, 
__disp_video_fb_t *in_addr)
                memcpy(&g_video[sel][hid].video_new, in_addr,
                       sizeof(__disp_video_fb_t));
                g_video[sel][hid].have_got_frame = TRUE;
-               g_video[sel][hid].display_cnt = 0;
+//             g_video[sel][hid].display_cnt = 0;
 
                return DIS_SUCCESS;
        } else
@@ -462,6 +473,7 @@ __s32 BSP_disp_video_start(__u32 sel, __u32 hid)
        if (gdisp.screen[sel].layer_manage[hid].status & LAYER_USED) {
                memset(&g_video[sel][hid], 0, sizeof(frame_para_t));
                g_video[sel][hid].video_cur.id = -1;
+               g_video[sel][hid].video_new.id = -1;
                g_video[sel][hid].enable = TRUE;
 
                video_enhancement_start(sel, hid);

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to