diff options
author | Ivan Kalvachev <ikalvachev@gmail.com> | 2003-10-27 23:22:43 +0000 |
---|---|---|
committer | Ivan Kalvachev <ikalvachev@gmail.com> | 2003-10-27 23:22:43 +0000 |
commit | a579db0c4fe026d49c71d1ff64a2d1d07c152d68 (patch) | |
tree | 00c972c3f705b30ec93aef1e10eb798767808485 /libavcodec/xvmcvideo.c | |
parent | 6b56c616d9954e1c64efc9d16a579622a06f962c (diff) | |
download | ffmpeg-a579db0c4fe026d49c71d1ff64a2d1d07c152d68.tar.gz |
XvMC speedup by removing one memcpy and doing MB packing
Originally committed as revision 2442 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/xvmcvideo.c')
-rw-r--r-- | libavcodec/xvmcvideo.c | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/libavcodec/xvmcvideo.c b/libavcodec/xvmcvideo.c index b13135b99b..6e6e58fd40 100644 --- a/libavcodec/xvmcvideo.c +++ b/libavcodec/xvmcvideo.c @@ -41,6 +41,33 @@ //#include "xvmc_debug.h" +//set s->block +inline void XVMC_init_block(MpegEncContext *s){ +xvmc_render_state_t * render; + render = (xvmc_render_state_t*)s->current_picture.data[2]; + assert(render != NULL); + if( (render == NULL) || (render->magic != MP_XVMC_RENDER_MAGIC) ){ + assert(0); + return;//make sure that this is render packet + } + s->block =(DCTELEM *)(render->data_blocks+(render->next_free_data_block_num)*64); +} + +void XVMC_pack_pblocks(MpegEncContext *s, int cbp){ +int i,j; +#define numblocks 6 + + j=0; + for(i=0;i<numblocks;i++){ + if(cbp & (1<<(numblocks-1-i)) ){ + s->pblocks[i] = (short *)(&s->block[(j++)]); + }else{ + s->pblocks[i] = NULL; + } +// printf("s->pblocks[%d]=%p ,s->block=%p cbp=%d\n",i,s->pblocks[i],s->block,cbp); + } +} + static int calc_cbp(MpegEncContext *s, int blocknum){ /* compute cbp */ // for I420 bit_offset=5 @@ -110,7 +137,7 @@ xvmc_render_state_t * render; } } -void XVMC_decode_mb(MpegEncContext *s, DCTELEM block[6][64]){ +void XVMC_decode_mb(MpegEncContext *s){ XvMCMacroBlock * mv_block; xvmc_render_state_t * render; int i,cbp,blocks_per_mb; @@ -242,14 +269,14 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; */ if(s->flags & CODEC_FLAG_GRAY){ if(s->mb_intra){//intra frames are alwasy full chroma block - memset(block[4],0,sizeof(short)*8*8);//so we need to clear them - memset(block[5],0,sizeof(short)*8*8); - if(!render->unsigned_intra) - block[4][0] = block[5][0] = 1<<10; - } - else + for(i=4; i<blocks_per_mb; i++){ + memset(s->pblocks[i],0,sizeof(short)*8*8);//so we need to clear them + if(!render->unsigned_intra) + s->pblocks[i][0] = 1<<10; + } + }else blocks_per_mb = 4;//Luminance blocks only - }; + } cbp = calc_cbp(s,blocks_per_mb); mv_block->coded_block_pattern = cbp; if(cbp == 0) @@ -259,14 +286,24 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; if(s->block_last_index[i] >= 0){ // i do not have unsigned_intra MOCO to test, hope it is OK if( (s->mb_intra) && ( render->idct || (!render->idct && !render->unsigned_intra)) ) - block[i][0]-=1<<10; + s->pblocks[i][0]-=1<<10; if(!render->idct){ - s->dsp.idct(block[i]); + s->dsp.idct(s->pblocks[i]); //!!TODO!clip!!! } -//TODO:avoid block copy by modifying s->block pointer - memcpy(&render->data_blocks[(render->next_free_data_block_num++)*64], - block[i],sizeof(short)*8*8); +//copy blocks only if the codec doesn't support pblocks reordering + if(s->avctx->xvmc_acceleration == 1){ + memcpy(&render->data_blocks[(render->next_free_data_block_num)*64], + s->pblocks[i],sizeof(short)*8*8); + }else{ +/* if(s->pblocks[i] != &render->data_blocks[ + (render->next_free_data_block_num)*64]){ + printf("ERROR mb(%d,%d) s->pblocks[i]=%p data_block[]=%p\n", + s->mb_x,s->mb_y, s->pblocks[i], + &render->data_blocks[(render->next_free_data_block_num)*64]); + }*/ + } + render->next_free_data_block_num++; } } render->filled_mv_blocks_num++; |