annotate xvmcvideo.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 7b345b735ac7
children 511e3afc43e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
1 /*
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
2 * XVideo Motion Compensation
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
3 * Copyright (c) 2003 Ivan Kalvachev
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
4 *
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
5 * This library is free software; you can redistribute it and/or
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
7 * License as published by the Free Software Foundation; either
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
8 * version 2 of the License, or (at your option) any later version.
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
9 *
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
10 * This library is distributed in the hope that it will be useful,
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
13 * Lesser General Public License for more details.
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
14 *
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
16 * License along with this library; if not, write to the Free Software
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
18 */
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
19
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
20 #include <limits.h>
f07e17427140 initial XvMC support
iive
parents:
diff changeset
21
f07e17427140 initial XvMC support
iive
parents:
diff changeset
22 //avcodec include
f07e17427140 initial XvMC support
iive
parents:
diff changeset
23 #include "avcodec.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
24 #include "dsputil.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
25 #include "mpegvideo.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
26
f07e17427140 initial XvMC support
iive
parents:
diff changeset
27 #undef NDEBUG
f07e17427140 initial XvMC support
iive
parents:
diff changeset
28 #include <assert.h>
f07e17427140 initial XvMC support
iive
parents:
diff changeset
29
f07e17427140 initial XvMC support
iive
parents:
diff changeset
30 #ifdef USE_FASTMEMCPY
f07e17427140 initial XvMC support
iive
parents:
diff changeset
31 #include "fastmemcpy.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
32 #endif
f07e17427140 initial XvMC support
iive
parents:
diff changeset
33
f07e17427140 initial XvMC support
iive
parents:
diff changeset
34 #ifdef HAVE_XVMC
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
35
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
36 //X11 includes are in the xvmc_render.h
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
37 //by replacing it with none-X one
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
38 //XvMC emulation could be performed
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
39
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
40 #include "xvmc_render.h"
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
41
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
42 //#include "xvmc_debug.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
43
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
44 //set s->block
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
45 inline void XVMC_init_block(MpegEncContext *s){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
46 xvmc_render_state_t * render;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
47 render = (xvmc_render_state_t*)s->current_picture.data[2];
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
48 assert(render != NULL);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
49 if( (render == NULL) || (render->magic != MP_XVMC_RENDER_MAGIC) ){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
50 assert(0);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
51 return;//make sure that this is render packet
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
52 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
53 s->block =(DCTELEM *)(render->data_blocks+(render->next_free_data_block_num)*64);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
54 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
55
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
56 void XVMC_pack_pblocks(MpegEncContext *s, int cbp){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
57 int i,j;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
58 const int mb_block_count = 4+(1<<s->chroma_format);
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
59
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
60 j=0;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
61 cbp<<= 12-mb_block_count;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
62 for(i=0; i<mb_block_count; i++){
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
63 if(cbp & (1<<11)) {
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
64 s->pblocks[i] = (short *)(&s->block[(j++)]);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
65 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
66 s->pblocks[i] = NULL;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
67 }
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
68 cbp+=cbp;
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
69 // printf("s->pblocks[%d]=%p ,s->block=%p cbp=%d\n",i,s->pblocks[i],s->block,cbp);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
70 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
71 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
72
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
73 //these functions should be called on every new field or/and frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
74 //They should be safe if they are called few times for same field!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
75 int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
76 xvmc_render_state_t * render,* last, * next;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
77
f07e17427140 initial XvMC support
iive
parents:
diff changeset
78 assert(avctx != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
79
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
80 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
81 assert(render != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
82 if( (render == NULL) || (render->magic != MP_XVMC_RENDER_MAGIC) )
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
83 return -1;//make sure that this is render packet
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
84
f07e17427140 initial XvMC support
iive
parents:
diff changeset
85 render->picture_structure = s->picture_structure;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
86 render->flags = (s->first_field)? 0: XVMC_SECOND_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
87
f07e17427140 initial XvMC support
iive
parents:
diff changeset
88 //make sure that all data is drawn by XVMC_end_frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
89 assert(render->filled_mv_blocks_num==0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
90
f07e17427140 initial XvMC support
iive
parents:
diff changeset
91 render->p_future_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
92 render->p_past_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
93
f07e17427140 initial XvMC support
iive
parents:
diff changeset
94 switch(s->pict_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
95 case I_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
96 return 0;// no prediction from other frames
f07e17427140 initial XvMC support
iive
parents:
diff changeset
97 case B_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
98 next = (xvmc_render_state_t*)s->next_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
99 assert(next!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
100 assert(next->state & MP_XVMC_STATE_PREDICTION);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
101 if(next == NULL) return -1;
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
102 if(next->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
103 render->p_future_surface = next->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
104 //no return here, going to set forward prediction
f07e17427140 initial XvMC support
iive
parents:
diff changeset
105 case P_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
106 last = (xvmc_render_state_t*)s->last_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
107 if(last == NULL)// && !s->first_field)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
108 last = render;//predict second field from the first
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
109 if(last->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
110 assert(last->state & MP_XVMC_STATE_PREDICTION);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
111 render->p_past_surface = last->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
112 return 0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
113 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
114
f07e17427140 initial XvMC support
iive
parents:
diff changeset
115 return -1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
116 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
117
f07e17427140 initial XvMC support
iive
parents:
diff changeset
118 void XVMC_field_end(MpegEncContext *s){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
119 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
120 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
121 assert(render != NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
122
f07e17427140 initial XvMC support
iive
parents:
diff changeset
123 if(render->filled_mv_blocks_num > 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
124 // printf("xvmcvideo.c: rendering %d left blocks after last slice!!!\n",render->filled_mv_blocks_num );
f07e17427140 initial XvMC support
iive
parents:
diff changeset
125 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
126 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
127 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
128
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
129 void XVMC_decode_mb(MpegEncContext *s){
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
130 XvMCMacroBlock * mv_block;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
131 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
132 int i,cbp,blocks_per_mb;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
133
f07e17427140 initial XvMC support
iive
parents:
diff changeset
134 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
135
f07e17427140 initial XvMC support
iive
parents:
diff changeset
136
f07e17427140 initial XvMC support
iive
parents:
diff changeset
137 if(s->encoding){
1830
024752284c25 av_log() patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 1580
diff changeset
138 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
2281
7b345b735ac7 do not call (av_)abort()
michael
parents: 2076
diff changeset
139 return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
140 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
141
f07e17427140 initial XvMC support
iive
parents:
diff changeset
142 //from MPV_decode_mb(),
f07e17427140 initial XvMC support
iive
parents:
diff changeset
143 /* update DC predictors for P macroblocks */
f07e17427140 initial XvMC support
iive
parents:
diff changeset
144 if (!s->mb_intra) {
f07e17427140 initial XvMC support
iive
parents:
diff changeset
145 s->last_dc[0] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
146 s->last_dc[1] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
147 s->last_dc[2] = 128 << s->intra_dc_precision;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
148 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
149
f07e17427140 initial XvMC support
iive
parents:
diff changeset
150 //MC doesn't skip blocks
f07e17427140 initial XvMC support
iive
parents:
diff changeset
151 s->mb_skiped = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
152
f07e17427140 initial XvMC support
iive
parents:
diff changeset
153
f07e17427140 initial XvMC support
iive
parents:
diff changeset
154 // do I need to export quant when I could not perform postprocessing?
f07e17427140 initial XvMC support
iive
parents:
diff changeset
155 // anyway, it doesn't hurrt
f07e17427140 initial XvMC support
iive
parents:
diff changeset
156 s->current_picture.qscale_table[mb_xy] = s->qscale;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
157
f07e17427140 initial XvMC support
iive
parents:
diff changeset
158 //START OF XVMC specific code
f07e17427140 initial XvMC support
iive
parents:
diff changeset
159 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
160 assert(render!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
161 assert(render->magic==MP_XVMC_RENDER_MAGIC);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
162 assert(render->mv_blocks);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
163
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
164 //take the next free macroblock
f07e17427140 initial XvMC support
iive
parents:
diff changeset
165 mv_block = &render->mv_blocks[render->start_mv_blocks_num +
f07e17427140 initial XvMC support
iive
parents:
diff changeset
166 render->filled_mv_blocks_num ];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
167
f07e17427140 initial XvMC support
iive
parents:
diff changeset
168 // memset(mv_block,0,sizeof(XvMCMacroBlock));
f07e17427140 initial XvMC support
iive
parents:
diff changeset
169
f07e17427140 initial XvMC support
iive
parents:
diff changeset
170 mv_block->x = s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
171 mv_block->y = s->mb_y;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
172 mv_block->dct_type = s->interlaced_dct;//XVMC_DCT_TYPE_FRAME/FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
173 // mv_block->motion_type = 0; //zero to silense warnings
f07e17427140 initial XvMC support
iive
parents:
diff changeset
174 if(s->mb_intra){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
175 mv_block->macroblock_type = XVMC_MB_TYPE_INTRA;//no MC, all done
f07e17427140 initial XvMC support
iive
parents:
diff changeset
176 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
177 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
178
f07e17427140 initial XvMC support
iive
parents:
diff changeset
179 if(s->mv_dir & MV_DIR_FORWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
180 mv_block->macroblock_type|= XVMC_MB_TYPE_MOTION_FORWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
181 //pmv[n][dir][xy]=mv[dir][n][xy]
f07e17427140 initial XvMC support
iive
parents:
diff changeset
182 mv_block->PMV[0][0][0] = s->mv[0][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
183 mv_block->PMV[0][0][1] = s->mv[0][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
184 mv_block->PMV[1][0][0] = s->mv[0][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
185 mv_block->PMV[1][0][1] = s->mv[0][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
186 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
187 if(s->mv_dir & MV_DIR_BACKWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
188 mv_block->macroblock_type|=XVMC_MB_TYPE_MOTION_BACKWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
189 mv_block->PMV[0][1][0] = s->mv[1][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
190 mv_block->PMV[0][1][1] = s->mv[1][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
191 mv_block->PMV[1][1][0] = s->mv[1][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
192 mv_block->PMV[1][1][1] = s->mv[1][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
193 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
194
f07e17427140 initial XvMC support
iive
parents:
diff changeset
195 switch(s->mv_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
196 case MV_TYPE_16X16:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
197 mv_block->motion_type = XVMC_PREDICTION_FRAME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
198 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
199 case MV_TYPE_16X8:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
200 mv_block->motion_type = XVMC_PREDICTION_16x8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
201 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
202 case MV_TYPE_FIELD:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
203 mv_block->motion_type = XVMC_PREDICTION_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
204 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
205 mv_block->PMV[0][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
206 mv_block->PMV[1][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
207 mv_block->PMV[0][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
208 mv_block->PMV[1][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
209 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
210 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
211 case MV_TYPE_DMV:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
212 mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
213 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
214
f07e17427140 initial XvMC support
iive
parents:
diff changeset
215 mv_block->PMV[0][0][0] = s->mv[0][0][0];//top from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
216 mv_block->PMV[0][0][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
217
f07e17427140 initial XvMC support
iive
parents:
diff changeset
218 mv_block->PMV[0][1][0] = s->mv[0][0][0];//bottom from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
219 mv_block->PMV[0][1][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
220
f07e17427140 initial XvMC support
iive
parents:
diff changeset
221 mv_block->PMV[1][0][0] = s->mv[0][2][0];//dmv00, top from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
222 mv_block->PMV[1][0][1] = s->mv[0][2][1]<<1;//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
223
f07e17427140 initial XvMC support
iive
parents:
diff changeset
224 mv_block->PMV[1][1][0] = s->mv[0][3][0];//dmv10, bottom from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
225 mv_block->PMV[1][1][1] = s->mv[0][3][1]<<1;//dmv11
f07e17427140 initial XvMC support
iive
parents:
diff changeset
226
f07e17427140 initial XvMC support
iive
parents:
diff changeset
227 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
228 mv_block->PMV[0][1][0] = s->mv[0][2][0];//dmv00
f07e17427140 initial XvMC support
iive
parents:
diff changeset
229 mv_block->PMV[0][1][1] = s->mv[0][2][1];//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
230 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
231 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
232 default:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
233 assert(0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
234 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
235
f07e17427140 initial XvMC support
iive
parents:
diff changeset
236 mv_block->motion_vertical_field_select = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
237
f07e17427140 initial XvMC support
iive
parents:
diff changeset
238 //set correct field referenses
f07e17427140 initial XvMC support
iive
parents:
diff changeset
239 if(s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
240 if( s->field_select[0][0] ) mv_block->motion_vertical_field_select|=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
241 if( s->field_select[1][0] ) mv_block->motion_vertical_field_select|=2;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
242 if( s->field_select[0][1] ) mv_block->motion_vertical_field_select|=4;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
243 if( s->field_select[1][1] ) mv_block->motion_vertical_field_select|=8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
244 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
245 }//!intra
f07e17427140 initial XvMC support
iive
parents:
diff changeset
246 //time to handle data blocks;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
247 mv_block->index = render->next_free_data_block_num;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
248
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
249 blocks_per_mb = 6;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
250 if( s->chroma_format >= 2){
1849
63eafb5b1c38 fix typo
iive
parents: 1848
diff changeset
251 blocks_per_mb = 4 + (1 << (s->chroma_format));
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
252 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
253
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
254 // calculate cbp
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
255 cbp = 0;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
256 for(i=0; i<blocks_per_mb; i++) {
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
257 cbp+= cbp;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
258 if(s->block_last_index[i] >= 0)
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
259 cbp++;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
260 }
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
261
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
262 if(s->flags & CODEC_FLAG_GRAY){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
263 if(s->mb_intra){//intra frames are alwasy full chroma block
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
264 for(i=4; i<blocks_per_mb; i++){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
265 memset(s->pblocks[i],0,sizeof(short)*8*8);//so we need to clear them
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
266 if(!render->unsigned_intra)
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
267 s->pblocks[i][0] = 1<<10;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
268 }
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
269 }else{
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
270 cbp&= 0xf << (blocks_per_mb - 4);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
271 blocks_per_mb = 4;//Luminance blocks only
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
272 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
273 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
274 mv_block->coded_block_pattern = cbp;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
275 if(cbp == 0)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
276 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
277
f07e17427140 initial XvMC support
iive
parents:
diff changeset
278 for(i=0; i<blocks_per_mb; i++){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
279 if(s->block_last_index[i] >= 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
280 // i do not have unsigned_intra MOCO to test, hope it is OK
f07e17427140 initial XvMC support
iive
parents:
diff changeset
281 if( (s->mb_intra) && ( render->idct || (!render->idct && !render->unsigned_intra)) )
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
282 s->pblocks[i][0]-=1<<10;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
283 if(!render->idct){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
284 s->dsp.idct(s->pblocks[i]);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
285 //!!TODO!clip!!!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
286 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
287 //copy blocks only if the codec doesn't support pblocks reordering
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
288 if(s->avctx->xvmc_acceleration == 1){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
289 memcpy(&render->data_blocks[(render->next_free_data_block_num)*64],
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
290 s->pblocks[i],sizeof(short)*8*8);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
291 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
292 /* if(s->pblocks[i] != &render->data_blocks[
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
293 (render->next_free_data_block_num)*64]){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
294 printf("ERROR mb(%d,%d) s->pblocks[i]=%p data_block[]=%p\n",
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
295 s->mb_x,s->mb_y, s->pblocks[i],
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
296 &render->data_blocks[(render->next_free_data_block_num)*64]);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
297 }*/
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
298 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
299 render->next_free_data_block_num++;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
300 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
301 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
302 render->filled_mv_blocks_num++;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
303
f07e17427140 initial XvMC support
iive
parents:
diff changeset
304 assert(render->filled_mv_blocks_num <= render->total_number_of_mv_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
305 assert(render->next_free_data_block_num <= render->total_number_of_data_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
306
f07e17427140 initial XvMC support
iive
parents:
diff changeset
307
f07e17427140 initial XvMC support
iive
parents:
diff changeset
308 if(render->filled_mv_blocks_num >= render->total_number_of_mv_blocks)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
309 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
310
f07e17427140 initial XvMC support
iive
parents:
diff changeset
311 // DumpRenderInfo(render);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
312 // DumpMBlockInfo(mv_block);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
313
f07e17427140 initial XvMC support
iive
parents:
diff changeset
314 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
315
f07e17427140 initial XvMC support
iive
parents:
diff changeset
316 #endif