]> git.vomp.tv Git - vompclient-marten.git/commitdiff
MoComp nearly bug free
authorMarten Richter <marten.richter@freenet.de>
Sun, 8 Jul 2012 14:28:51 +0000 (16:28 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sun, 8 Jul 2012 14:28:51 +0000 (16:28 +0200)
glmocoshader.cc
osdopengl.cc
vfeed.cc [changed mode: 0644->0755]
videovpeogl.cc

index 5f0cd6c6d0cd07288aa051ad6622de9c7928607f..cbeabce5a217fddd3c6dbe6fca02f91e7aa59e3e 100755 (executable)
@@ -72,19 +72,19 @@ const GLchar moco_vertex_shader[] =
                "void main()\n"\r
                "{\n"\r
                // calculate cbp\r
-               "  vec4 cbp_vec=vec4(cbp,cbp,cbp,cbp);\n"\r
+               //"  vec4 cbp_vec=vec4(cbp,cbp,cbp,cbp);\n"\r
 \r
                // old cbp code\r
        //      "  vec4 fmod_cbp_y=mod(cbp_vec,y_cbp);\n"\r
-       //      "  vec2 fmod_cbp_uv=mod(cbp_vec.xy,uv_cbp);\n"\r
+       //      "  vec2 fmod_cbp_uv=mod(cbp_vec.xy,uv_cbp.xy);\n"\r
        //      "  fmod_cbp_y.x=0.;\n"\r
        //      "  fmod_cbp_y=sign(vec4(fmod_cbp_y.yzw,fmod_cbp_uv.x)-fmod_cbp_y);\n"\r
        //      "  fmod_cbp_uv=sign(vec2(fmod_cbp_uv.y,cbp)-fmod_cbp_uv);\n"\r
                // resulting vector should indicate with block is present\r
                // now transform it to a sum (TODO vectorize this)\r
 \r
-\r
-               "  vec4 fmod_cbp_y=mod(cbp_vec,vec4(uv_cbp.zyx,y_cbp.w));\n"\r
+//this code is better but nor really working\r
+       /*      "  vec4 fmod_cbp_y=mod(cbp_vec,vec4(uv_cbp.zyx,y_cbp.w));\n"\r
                "  vec2 fmod_cbp_uv=mod(cbp_vec.xy,y_cbp.zy);\n"\r
                "  fmod_cbp_y=vec4(lessThanEqual(vec4(uv_cbp.yx,y_cbp.wz),fmod_cbp_y));\n"\r
            "  fmod_cbp_uv=vec2(lessThanEqual(y_cbp.yx,fmod_cbp_uv));\n"\r
@@ -95,16 +95,63 @@ const GLchar moco_vertex_shader[] =
                "  fmod_cbp_y2.z+=fmod_cbp_y2.y;\n"\r
                "  fmod_cbp_y2.w+=fmod_cbp_y2.z;\n"\r
                "  fmod_cbp_uv2.x+=fmod_cbp_y2.w;\n"\r
-               "  fmod_cbp_uv2.y+=fmod_cbp_uv2.x;\n"\r
+               "  fmod_cbp_uv2.y+=fmod_cbp_uv2.x;\n"*/\r
+\r
+\r
+               "  float tcbp=cbp;\n"\r
+               "  float tpos=czero;\n"\r
+               "  vec4 fmod_cbp_y=vec4(czero,czero,czero,czero);\n"\r
+               "  vec2 fmod_cbp_uv=vec2(czero,czero);\n"\r
+               "  vec4 fmod_cbp_y2=vec4(czero,czero,czero,czero);\n"\r
+               "  vec2 fmod_cbp_uv2=vec2(czero,czero);\n"\r
+               "  if (tcbp>=uv_cbp.y){\n"\r
+               "    fmod_cbp_y.x=one;\n"\r
+               "    fmod_cbp_y2.x=tpos;\n"\r
+               "    tpos++;\n"\r
+               "    tcbp-=uv_cbp.y;\n"\r
+               "  }\n"\r
+               "  if (tcbp>=uv_cbp.x){\n"\r
+               "    fmod_cbp_y.y=one;\n"\r
+               "    fmod_cbp_y2.y=tpos;\n"\r
+               "    tpos++;\n"\r
+               "    tcbp-=uv_cbp.x;\n"\r
+               "  }\n"\r
+               "  if (tcbp>=y_cbp.w){\n"\r
+               "    fmod_cbp_y.z=one;\n"\r
+               "    fmod_cbp_y2.z=tpos;\n"\r
+               "    tpos++;\n"\r
+               "    tcbp-=y_cbp.w;\n"\r
+               "  }\n"\r
+               "  if (tcbp>=y_cbp.z){\n"\r
+               "    fmod_cbp_y.w=one;\n"\r
+               "    fmod_cbp_y2.w=tpos;\n"\r
+               "    tpos++;\n"\r
+               "    tcbp-=y_cbp.z;\n"\r
+               "  }\n"\r
+               "  if (tcbp>=y_cbp.y){\n"\r
+               "    fmod_cbp_uv.x=one;\n"\r
+               "    fmod_cbp_uv2.x=tpos;\n"\r
+               "    tpos++;\n"\r
+               "    tcbp-=y_cbp.y;\n"\r
+               "  }\n"\r
+               "  if (tcbp>=y_cbp.x){\n"\r
+               "    fmod_cbp_uv.y=one;\n"\r
+               "    fmod_cbp_uv2.y=tpos;\n"\r
+       //      "    tpos++;\n"\r
+       //      "    tcbp-=y_cbp.y;\n"\r
+               "  }\n"\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
 \r
                // now calculate their position inside the short array\r
-               "  float m_index=index.x/*+index.y*c65536*/-one;\n" //Not Endian save\r
+               "  float m_index=index.x/*+index.y*c65536*/;\n" //Not Endian save\r
                "  fmod_cbp_y2+=m_index;\n" //shift to the blocks\r
                "  fmod_cbp_uv2+=m_index;\n"\r
-               "  out_yblockpos_x=(mod(fmod_cbp_y2,c32));\n"\r
-           "  out_uvblockpos_xy.xy=(mod(fmod_cbp_uv2,c32));\n"\r
-               "  out_yblockpos_y=floor((fmod_cbp_y2)/c32);\n"\r
-               "  out_uvblockpos_xy.zw=floor((fmod_cbp_uv2)/c32);\n"\r
 \r
                "  out_yblockpos_y=floor((fmod_cbp_y2)*c1over32);\n"\r
                "  out_uvblockpos_xy.zw=floor((fmod_cbp_uv2)*c1over32);\n"\r
@@ -117,14 +164,14 @@ const GLchar moco_vertex_shader[] =
        //      "  out_yblockpos_y-=sign(fmod_cbp_y-one)*c1024;\n"\r
        //      "  out_uvblockpos_xy.zw-=sign(fmod_cbp_uv-one)*c1024;\n"\r
 \r
-               "  out_yblockpos_y=mix(vec4(c1024,c1024,c1024,c1024)-one,out_yblockpos_y,fmod_cbp_y);\n"\r
-               "  out_uvblockpos_xy.zw=mix(vec2(c1024,c1024)-one,out_uvblockpos_xy.zw,fmod_cbp_uv);\n"\r
+               "  out_yblockpos_y=mix(vec4(c1024,c1024,c1024,c1024),out_yblockpos_y,fmod_cbp_y);\n"\r
+               "  out_uvblockpos_xy.zw=mix(vec2(c1024,c1024),out_uvblockpos_xy.zw,fmod_cbp_uv);\n"\r
 \r
 \r
                // set start positions\r
-               "  vec4 motion_vertical=vec4(block_types.z,block_types.z,block_types.z,block_types.z);\n"\r
-               "  vec4 mod_motion_vertical=mod(motion_vertical,y_cbp);\n"\r
-               "  mod_motion_vertical=sign(vec4(mod_motion_vertical.yzw,block_types.z)-mod_motion_vertical);\n"\r
+       //      "  vec4 motion_vertical=vec4(block_types.z,block_types.z,block_types.z,block_types.z);\n"\r
+       //      "  vec4 mod_motion_vertical=mod(motion_vertical,vec4(y_cbp.yzw,uv_cbp.x));\n"\r
+       //      "  mod_motion_vertical=vec4(lessThanEqual(y_cbp,mod_motion_vertical));\n"\r
 \r
                "  out_moco_pos.xy=(block_pos.xy+block_edge.xy)*uv_cbp.x/*16*/+one;"\r
                "  out_unsupported=czero;\n"\r
@@ -150,18 +197,40 @@ const GLchar moco_vertex_shader[] =
                "        out_moco_backward=vec4(PMV1.zw,PMV1.zw);\n"\r
                //"          out_unsupported=2.;\n"\r
                "     } else if (block_types.y==y_cbp.x /*1*/) {" //Field\r
-               "        out_moco_forward=vec4(PMV1.xy,PMV1.xy);\n"\r
-               "        out_moco_backward=vec4(PMV1.zw,PMV1.zw);\n"\r
-               "        out_moco_forward.y+=mod_motion_vertical.x;\n"\r
+               "        out_moco_forward=vec4(PMV1.xy,PMV2.xy);\n"\r
+               "        out_moco_backward=vec4(PMV1.zw,PMV2.zw);\n"\r
+\r
+               "        float motion_vert=block_types.z;\n"\r
+               "        out_moco_forward.w-=one;\n"\r
+               "        out_moco_backward.w-=one;\n"\r
+               "        if (motion_vert>= y_cbp.w) {\n" //second_backward\r
+               "            motion_vert-=y_cbp.w;\n"\r
+               "            out_moco_backward.w+=one;\n"\r
+               "         }\n"\r
+               "        if (motion_vert>= y_cbp.z) {\n" //second_forward\r
+               "            motion_vert-=y_cbp.z;\n"\r
+               "            out_moco_forward.w+=one;\n"\r
+               "         }\n"\r
+               "        if (motion_vert>= y_cbp.y) {\n" //first_backward\r
+               "            motion_vert-=y_cbp.y;\n"\r
+               "            out_moco_backward.y+=one;\n"\r
+               "         }\n"\r
+               "        if (motion_vert>= y_cbp.x) {\n" //second_forward\r
+               //"            motion_vert-=y_cbp.z;\n"\r
+               "            out_moco_forward.y+=one;\n"\r
+               "         }\n"\r
+       /*      "        out_moco_forward.y+=mod_motion_vertical.x;\n"\r
                "        out_moco_backward.y+=mod_motion_vertical.y;\n"\r
                "        out_moco_forward.w-=one-mod_motion_vertical.z;\n"\r
-               "        out_moco_backward.w-=one-mod_motion_vertical.w;\n"\r
+               "        out_moco_backward.w-=one-mod_motion_vertical.w;\n"*/\r
                "         out_misc_info.y=one;\n" // step to for field based\r
        //      "            out_unsupported=2.;\n"\r
                "     } else {\n"\r
                "            out_unsupported=1.;\n"\r
                "     }\n"\r
                "  }\n"\r
+       //      "   if (cbp==63. || cbp==0.) out_unsupported=2.;\n"\r
+       //      "   if (fmod_cbp_y.w==1. && mod(cbp,8.)>=4.) out_unsupported=2.;\n"\r
 \r
 \r
 \r
@@ -461,7 +530,7 @@ int GLMocoShader::uploadDataBlocks(short* blocks,unsigned int num_blocks, XvMCMa
 \r
 \r
 \r
-//     Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark1 glerror %x %d",glGetError(),height);\r
+       Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark1 %d %d %d",height,num_blocks,num_m_blocks);\r
        glTexSubImage2D(GL_TEXTURE_2D,0,0,0,\r
                BLOCK_TEXTURE_WIDTH>>1,height,\r
                GL_RGBA,GL_UNSIGNED_BYTE,\r
@@ -484,7 +553,10 @@ int GLMocoShader::uploadDataBlocks(short* blocks,unsigned int num_blocks, XvMCMa
        XvMCMacroBlock *m_blocks_end=m_blocks+num_m_blocks;\r
        while (m_blocks_run!=m_blocks_end) {\r
                m_blocks_run->pad0=0xFF00;\r
+       //      Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks coded block %x %x %d",\r
+       //                      m_blocks_run->coded_block_pattern, m_blocks_run->macroblock_type,m_blocks_run->index);\r
                m_blocks_run++;\r
+\r
        }\r
        // debug\r
 /*     m_blocks[0].x=0;\r
@@ -605,7 +677,7 @@ int GLMocoShader::doMoCo(VPEOGLFrame *target,VPEOGLFrame *forward,VPEOGLFrame *b
                glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->macroblock_type));\r
                glEnableVertexAttribArray(2);\r
 \r
-               glVertexAttribPointer(3, 1, GL_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->coded_block_pattern));\r
+               glVertexAttribPointer(3, 1, GL_UNSIGNED_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->coded_block_pattern));\r
                glEnableVertexAttribArray(3);\r
                glVertexAttribPointer(4, 2, GL_UNSIGNED_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->index));\r
                glEnableVertexAttribArray(4);\r
@@ -630,7 +702,7 @@ int GLMocoShader::doMoCo(VPEOGLFrame *target,VPEOGLFrame *forward,VPEOGLFrame *b
 \r
 \r
                if (forward) {\r
-                       Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo forward %x",forward->textures[0]);\r
+               //      Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo forward %x",forward->textures[0]);\r
                        glActiveTexture(GL_TEXTURE1);\r
                        glBindTexture(GL_TEXTURE_2D,forward->textures[0]);\r
                        glUniform1i(forward_pic_loc,1);\r
@@ -643,7 +715,7 @@ int GLMocoShader::doMoCo(VPEOGLFrame *target,VPEOGLFrame *forward,VPEOGLFrame *b
 \r
                if (backward) {\r
                        glActiveTexture(GL_TEXTURE2);\r
-                       Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo backward %x",backward->textures[0]);\r
+               //      Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo backward %x",backward->textures[0]);\r
                        glBindTexture(GL_TEXTURE_2D,backward->textures[0]);\r
                        glUniform1i(backward_pic_loc,2);\r
                        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);\r
index f0bc96b4ce67f524b552239bb0a1ddc712019b4f..9ba5a4e3d91df653f7bae1712b38f0a01135dc66 100755 (executable)
@@ -420,7 +420,7 @@ void OsdOpenGL::threadMethod()
                        if (!frame) frame=video->getReadyOGLFrame();\r
                        if (frame) {\r
                                InternalRendering(frame);\r
-                       //      MILLISLEEP(1000);\r
+                               //MILLISLEEP(1000);\r
                                lastrendertime=getTimeMS();\r
                                video->returnOGLFrame(frame); //please recycle it\r
                                frame=NULL;\r
old mode 100644 (file)
new mode 100755 (executable)
index 6640a13..b0fefab
--- a/vfeed.cc
+++ b/vfeed.cc
@@ -76,7 +76,7 @@ void VFeed::threadMethod()
     }\r
     else\r
     {\r
-      //Log::getInstance()->log("VFeed", Log::DEBUG, "No data delay");\r
+      //Log::getInstance()->log("VFeed", Log::DEBUG, "No data delay FPS");\r
       MILLISLEEP(5);\r
     }\r
   }\r
index 1035ec2c28d77197ff240ac57633549cf790a5f9..2e24791a027bfd38013e49069a01cab4586ebdca 100755 (executable)
@@ -333,7 +333,7 @@ void VideoVPEOGL::recycleOGLRefFrames()
        list<VPEOGLFrame*> keep;
        list<VPEOGLFrame*>::iterator itty=recycle_ref_ogl_frames.begin();
        while (itty!=recycle_ref_ogl_frames.end()) {
-               Log::getInstance()->log("Video", Log::WARN, "recycleOGLRefFrame mark3");
+       //      Log::getInstance()->log("Video", Log::WARN, "recycleOGLRefFrame mark3");
                if ((*itty)->pict_num==ogl_forward_ref_frame_num
                                || (*itty)->pict_num==ogl_backward_ref_frame_num)
                {
@@ -446,6 +446,7 @@ void VideoVPEOGL::threadMethod()
                                int width,height,pixfmt;
                                //First get a free ogl image
                                VPEOGLFrame* out_frame=NULL;
+                               //int msleep=0;
                                while (!out_frame) {
                                        ogl_frame_mutex.Lock();
                                //      Log::getInstance()->log("Video", Log::WARN, "threadMethod mark upload 1a %d %d %d %d %d",all_ogl_frames.size(),free_ogl_frames.size(),
@@ -460,7 +461,13 @@ void VideoVPEOGL::threadMethod()
                                                pixfmt=libavpixfmt;
                                                out_frame=free_ogl_frames.front();
                                                free_ogl_frames.pop_front();
-                                       } else MILLISLEEP(2);
+                                       } else {
+                                               ogl_frame_mutex.Unlock();
+                                               MILLISLEEP(2);
+                                       //      msleep+=2;
+                                               ogl_frame_mutex.Lock();
+                                       }
+                               //      if (msleep)Log::getInstance()->log("Video", Log::WARN, "msleep FPS %d",msleep);
                                        ogl_frame_mutex.Unlock();
                                }
                                bool failed=false;
@@ -658,7 +665,7 @@ void VideoVPEOGL::threadMethod()
                                target_time.tv_sec+=1;
                        }
                        threadWaitForSignalTimed(&target_time);
-                       //Log::getInstance()->log("Video", Log::WARN, "threadMethod signalled");
+                       //Log::getInstance()->log("Video", Log::WARN, "threadMethod signalled FPS");
                }
                threadCheckExit();
        }
@@ -2460,6 +2467,7 @@ int VideoVPEOGL::DecodePacketlibav()
                        } else {
                                libav_hastime=false;
                                dec_frame_libav_mutex.Unlock();
+                               Log::getInstance()->log("Video", Log::DEBUG, "We have no free buffers 2 FPS");
                                threadSignal();
                                // No free buffers
                                return 0;
@@ -2508,7 +2516,7 @@ UINT VideoVPEOGL::DeliverMediaPacketlibav(MediaPacket packet,
                        dec_frame_libav_free.pop_front();
                        dec_frame_libav_mutex.Unlock();
                } else {
-                       Log::getInstance()->log("Video", Log::DEBUG, "We have no free buffers");
+                       Log::getInstance()->log("Video", Log::DEBUG, "We have no free buffers FPS");
                        dec_frame_libav_mutex.Unlock();
                        // No free buffers
                        return 0;