📄 video_decoder.c
字号:
"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 + -