X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fxvmcvideo.c;h=93d93a62a6312a646383c4139b6f66d76efb0c21;hb=c325b5054f7cedb541ebd2f36059d7315a965d5f;hp=cd64f4c3afe507e1c3069b57091fe21a30da83e2;hpb=5e5c247a7c2e00372ced497528c5fa000181e34c;p=ffmpeg diff --git a/libavcodec/xvmcvideo.c b/libavcodec/xvmcvideo.c index cd64f4c3afe..93d93a62a63 100644 --- a/libavcodec/xvmcvideo.c +++ b/libavcodec/xvmcvideo.c @@ -2,19 +2,21 @@ * XVideo Motion Compensation * Copyright (c) 2003 Ivan Kalvachev * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -27,14 +29,8 @@ #undef NDEBUG #include -#ifdef USE_FASTMEMCPY -#include "fastmemcpy.h" -#endif - -#ifdef HAVE_XVMC - -//X11 includes are in the xvmc_render.h -//by replacing it with none-X one +//X11 includes are in xvmc_render.h +//by replacing it with non-X one //XvMC emulation could be performed #include "xvmc_render.h" @@ -42,86 +38,36 @@ //#include "xvmc_debug.h" //set s->block -inline void XVMC_init_block(MpegEncContext *s){ +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 + return;//make sure that this is a 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; +const int mb_block_count = 4+(1<chroma_format); j=0; - for(i=0;i<6;i++){ - if(cbp & (1<<(5-i)) ){ + cbp<<= 12-mb_block_count; + for(i=0; ipblocks[i] = (short *)(&s->block[(j++)]); }else{ s->pblocks[i] = NULL; } + cbp+=cbp; // printf("s->pblocks[%d]=%p ,s->block=%p cbp=%d\n",i,s->pblocks[i],s->block,cbp); } - if (s->chroma_format >= 2){ - if (s->chroma_format == 2){//CHROMA_422 - for(i=6;i<8;i++){ - if(cbp & (1<<(6+7-i)) ){ - s->pblocks[i] = (short *)(&s->block[(j++)]); - }else{ - s->pblocks[i] = NULL; - } - } - }else{//CHROMA_444 - for(i=6; i<12; i++){ - if(cbp & (1<<(6+11-i)) ){ - s->pblocks[i] = (short *)(&s->block[(j++)]); - }else{ - s->pblocks[i] = NULL; - } - } - } - } } -static int calc_cbp(MpegEncContext *s){ -/* compute cbp */ -int i,cbp = 0; - for(i=0; i<4; i++) { - if(s->block_last_index[i] >= 0) - cbp |= 1 << (5 - i); - } - if(s->flags & CODEC_FLAG_GRAY) - return cbp; //4 block for grayscale one done - - - for(i=4; i<6; i++) { - if(s->block_last_index[i] >= 0) - cbp |= 1 << (5 - i); - } - if(s->chroma_format < 2) return cbp; - - - if(s->chroma_format == 2){/*CHROMA_422*/ - for(i=6; i<8; i++) { - if(s->block_last_index[i] >= 0) - cbp |= 1 << (6+7 - i); - } - }else{/*CHROMA_444*/ - for(i=6; i<12; i++) { - if(s->block_last_index[i] >= 0) - cbp |= 1 << (6+11 - i); - } - } - return cbp; -} - - - -//these functions should be called on every new field or/and frame -//They should be safe if they are called few times for same field! +//These functions should be called on every new field and/or frame. +//They should be safe if they are called a few times for the same field! int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx){ xvmc_render_state_t * render,* last, * next; @@ -142,9 +88,9 @@ xvmc_render_state_t * render,* last, * next; render->p_past_surface = NULL; switch(s->pict_type){ - case I_TYPE: + case FF_I_TYPE: return 0;// no prediction from other frames - case B_TYPE: + case FF_B_TYPE: next = (xvmc_render_state_t*)s->next_picture.data[2]; assert(next!=NULL); assert(next->state & MP_XVMC_STATE_PREDICTION); @@ -152,7 +98,7 @@ xvmc_render_state_t * render,* last, * next; if(next->magic != MP_XVMC_RENDER_MAGIC) return -1; render->p_future_surface = next->p_surface; //no return here, going to set forward prediction - case P_TYPE: + case FF_P_TYPE: last = (xvmc_render_state_t*)s->last_picture.data[2]; if(last == NULL)// && !s->first_field) last = render;//predict second field from the first @@ -186,7 +132,7 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; if(s->encoding){ av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n"); - av_abort(); + return; } //from MPV_decode_mb(), @@ -198,11 +144,11 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; } //MC doesn't skip blocks - s->mb_skiped = 0; + s->mb_skipped = 0; - // do I need to export quant when I could not perform postprocessing? - // anyway, it doesn't hurrt + // Do I need to export quant when I could not perform postprocessing? + // Anyway, it doesn't hurt. s->current_picture.qscale_table[mb_xy] = s->qscale; //START OF XVMC specific code @@ -212,7 +158,7 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; assert(render->mv_blocks); //take the next free macroblock - mv_block = &render->mv_blocks[render->start_mv_blocks_num + + mv_block = &render->mv_blocks[render->start_mv_blocks_num + render->filled_mv_blocks_num ]; // memset(mv_block,0,sizeof(XvMCMacroBlock)); @@ -220,7 +166,7 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; mv_block->x = s->mb_x; mv_block->y = s->mb_y; mv_block->dct_type = s->interlaced_dct;//XVMC_DCT_TYPE_FRAME/FIELD; -// mv_block->motion_type = 0; //zero to silense warnings +// mv_block->motion_type = 0; //zero to silence warnings if(s->mb_intra){ mv_block->macroblock_type = XVMC_MB_TYPE_INTRA;//no MC, all done }else{ @@ -285,7 +231,7 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; mv_block->motion_vertical_field_select = 0; -//set correct field referenses +//set correct field references if(s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8){ if( s->field_select[0][0] ) mv_block->motion_vertical_field_select|=1; if( s->field_select[1][0] ) mv_block->motion_vertical_field_select|=2; @@ -298,27 +244,36 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; blocks_per_mb = 6; if( s->chroma_format >= 2){ - block_per_mb = 4 + (1 << (s->chroma_format)); + blocks_per_mb = 4 + (1 << (s->chroma_format)); + } + +// calculate cbp + cbp = 0; + for(i=0; iblock_last_index[i] >= 0) + cbp++; } if(s->flags & CODEC_FLAG_GRAY){ - if(s->mb_intra){//intra frames are alwasy full chroma block + if(s->mb_intra){//intra frames are always full chroma block for(i=4; ipblocks[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 + }else{ + cbp&= 0xf << (blocks_per_mb - 4); + blocks_per_mb = 4;//luminance blocks only + } } - cbp = calc_cbp(s); mv_block->coded_block_pattern = cbp; if(cbp == 0) mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN; for(i=0; iblock_last_index[i] >= 0){ - // i do not have unsigned_intra MOCO to test, hope it is OK + // I do not have unsigned_intra MOCO to test, hope it is OK. if( (s->mb_intra) && ( render->idct || (!render->idct && !render->unsigned_intra)) ) s->pblocks[i][0]-=1<<10; if(!render->idct){ @@ -333,7 +288,7 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; /* 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], + s->mb_x,s->mb_y, s->pblocks[i], &render->data_blocks[(render->next_free_data_block_num)*64]); }*/ } @@ -353,5 +308,3 @@ const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; // DumpMBlockInfo(mv_block); } - -#endif