⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_decoder.c

📁 vlc stand 0.1.99 ist sehr einfach
💻 C
📖 第 1 页 / 共 2 页
字号:
            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      32(%1),%%mm2\n\t"            "paddw      40(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "addl       %2,%0\n\t"            "movq       (%0),%%mm1\n\t"            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      48(%1),%%mm2\n\t"            "paddw      56(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "addl       %2,%0\n\t"            "movq       (%0),%%mm1\n\t"            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      64(%1),%%mm2\n\t"            "paddw      72(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "addl       %2,%0\n\t"            "movq       (%0),%%mm1\n\t"            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      80(%1),%%mm2\n\t"            "paddw      88(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "addl       %2,%0\n\t"            "movq       (%0),%%mm1\n\t"            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      96(%1),%%mm2\n\t"            "paddw      104(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "addl       %2,%0\n\t"            "movq       (%0),%%mm1\n\t"            "movq       %%mm1,%%mm2\n\t"            "punpckhbw  %%mm7,%%mm1\n\t"            "punpcklbw  %%mm7,%%mm2\n\t"            "paddw      112(%1),%%mm2\n\t"            "paddw      120(%1),%%mm1\n\t"            "packuswb   %%mm1,%%mm2\n\t"            "movq       %%mm2,(%0)\n\t"            "emms"             :"+r" (p_data): "r" (p_block),"r" (i_incr+8));}#endif/***************************************************************************** * CopyBlock : copy a block *****************************************************************************/#ifndef HAVE_MMXstatic __inline__ void CopyBlock( vdec_thread_t * p_vdec, dctelem_t * p_block,                                  yuv_data_t * p_data, int i_incr ){    int i_x, i_y;    for( i_y = 0; i_y < 8; i_y++ )    {        for( i_x = 0; i_x < 8; i_x++ )        {            *p_data++ = p_vdec->pi_crop[*p_block++];        }        p_data += i_incr;    }}#elsestatic  __inline__ void CopyBlock( vdec_thread_t * p_vdec, dctelem_t * p_block,                                          yuv_data_t * p_data, int i_incr ){    asm __volatile__ (            "movq         (%1),%%mm0\n\t"            "packuswb   8(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        16(%1),%%mm0\n\t"            "packuswb   24(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        32(%1),%%mm0\n\t"            "packuswb   40(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        48(%1),%%mm0\n\t"            "packuswb   56(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        64(%1),%%mm0\n\t"            "packuswb   72(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        80(%1),%%mm0\n\t"            "packuswb   88(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        96(%1),%%mm0\n\t"            "packuswb   104(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "addl           %2,%0\n\t"            "movq        112(%1),%%mm0\n\t"            "packuswb   120(%1),%%mm0\n\t"            "movq        %%mm0,(%0)\n\t"            "emms"            :"+r" (p_data): "r" (p_block),"r" (i_incr+8));}#endif/***************************************************************************** * vdec_DecodeMacroblock : decode a macroblock of a picture *****************************************************************************/#define DECODEBLOCKS( OPBLOCK )                                         \{                                                                       \    int             i_b, i_mask;                                        \                                                                        \    i_mask = 1 << (3 + p_mb->i_chroma_nb_blocks);                       \                                                                        \    /* luminance */                                                     \    for( i_b = 0; i_b < 4; i_b++, i_mask >>= 1 )                        \    {                                                                   \        if( p_mb->i_coded_block_pattern & i_mask )                      \        {                                                               \            /*                                                          \             * Inverse DCT (ISO/IEC 13818-2 section Annex A)            \             */                                                         \            (p_mb->pf_idct[i_b])( p_vdec, p_mb->ppi_blocks[i_b],        \                                  p_mb->pi_sparse_pos[i_b] );           \                                                                        \            /*                                                          \             * Adding prediction and coefficient data (ISO/IEC 13818-2  \             * section 7.6.8)                                           \             */                                                         \            OPBLOCK( p_vdec, p_mb->ppi_blocks[i_b],                     \                     p_mb->p_data[i_b], p_mb->i_addb_l_stride );        \        }                                                               \    }                                                                   \                                                                        \    /* chrominance */                                                   \    for( i_b = 4; i_b < 4 + p_mb->i_chroma_nb_blocks;                   \         i_b++, i_mask >>= 1 )                                          \    {                                                                   \        if( p_mb->i_coded_block_pattern & i_mask )                      \        {                                                               \            /*                                                          \             * Inverse DCT (ISO/IEC 13818-2 section Annex A)            \             */                                                         \            (p_mb->pf_idct[i_b])( p_vdec, p_mb->ppi_blocks[i_b],        \                                  p_mb->pi_sparse_pos[i_b] );           \                                                                        \            /*                                                          \             * Adding prediction and coefficient data (ISO/IEC 13818-2  \             * section 7.6.8)                                           \             */                                                         \            OPBLOCK( p_vdec, p_mb->ppi_blocks[i_b],                     \                     p_mb->p_data[i_b], p_mb->i_addb_c_stride );        \        }                                                               \    }                                                                   \}#ifdef VDEC_SMPstatic __inline__ void vdec_DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb )#elsevoid vdec_DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb )#endif{    if( !(p_mb->i_mb_type & MB_INTRA) )    {        /*         * Motion Compensation (ISO/IEC 13818-2 section 7.6)         */        if( p_mb->pf_motion == 0 )        {            intf_ErrMsg( "vdec error: pf_motion set to NULL\n" );        }        else        {            p_mb->pf_motion( p_mb );        }        DECODEBLOCKS( AddBlock )    }    else    {        DECODEBLOCKS( CopyBlock )    }    /*     * Decoding is finished, release the macroblock and free     * unneeded memory.     */    vpar_ReleaseMacroblock( &p_vdec->p_vpar->vfifo, p_mb );}/***************************************************************************** * RunThread: video decoder thread ***************************************************************************** * Video decoder thread. This function does only return when the thread is * terminated. *****************************************************************************/static void RunThread( vdec_thread_t *p_vdec ){    intf_DbgMsg("vdec debug: running video decoder thread (%p) (pid == %i)\n",                p_vdec, getpid());    /*     * Initialize thread and free configuration     */    p_vdec->b_error = vdec_InitThread( p_vdec );    if( p_vdec->b_error )    {        return;    }    p_vdec->b_run = 1;    /*     * Main loop - it is not executed if an error occured during     * initialization     */    while( (!p_vdec->b_die) && (!p_vdec->b_error) )    {        macroblock_t *          p_mb;        if( (p_mb = vpar_GetMacroblock( &p_vdec->p_vpar->vfifo )) != NULL )        {            vdec_DecodeMacroblock( p_vdec, p_mb );        }    }    /*     * Error loop     */    if( p_vdec->b_error )    {        ErrorThread( p_vdec );    }    /* End of thread */    EndThread( p_vdec );    p_vdec->b_run = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -