annotate xvmcvideo.c @ 7351:1502ba3beb72 libavcodec

The codebook generator algorithm involves picking three different codebook centroids ("high utility", "low utility" and "closest to the low utility one"). This change avoid the corner case of choosing two times the same centroid.
author vitor
date Wed, 23 Jul 2008 03:54:31 +0000
parents ca55b7b133c7
children 5dffd656f606
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 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
8 * 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
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
13 * 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
14 * 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
15 * 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
16 *
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3589
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
20 */
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
21
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
22 #include <limits.h>
f07e17427140 initial XvMC support
iive
parents:
diff changeset
23
f07e17427140 initial XvMC support
iive
parents:
diff changeset
24 //avcodec include
f07e17427140 initial XvMC support
iive
parents:
diff changeset
25 #include "avcodec.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
26 #include "dsputil.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
27 #include "mpegvideo.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
28
f07e17427140 initial XvMC support
iive
parents:
diff changeset
29 #undef NDEBUG
f07e17427140 initial XvMC support
iive
parents:
diff changeset
30 #include <assert.h>
f07e17427140 initial XvMC support
iive
parents:
diff changeset
31
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
32 //X11 includes are in xvmc_render.h
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
33 //by replacing it with non-X one
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
34 //XvMC emulation could be performed
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 #include "xvmc_render.h"
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
37
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
38 //#include "xvmc_debug.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
39
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
40 //set s->block
5691
fc98cdbe29b8 Remove inline from function that is exported.
iive
parents: 5077
diff changeset
41 void XVMC_init_block(MpegEncContext *s){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
42 xvmc_render_state_t * render;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
43 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
44 assert(render != NULL);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
45 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
46 assert(0);
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
47 return;//make sure that this is a render packet
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
48 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
49 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
50 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
51
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
52 void XVMC_pack_pblocks(MpegEncContext *s, int cbp){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
53 int i,j;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
54 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
55
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
56 j=0;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
57 cbp<<= 12-mb_block_count;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
58 for(i=0; i<mb_block_count; i++){
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
59 if(cbp & (1<<11)) {
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
60 s->pblocks[i] = (short *)(&s->block[(j++)]);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
61 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
62 s->pblocks[i] = NULL;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
63 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
64 cbp+=cbp;
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
65 // 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
66 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
67 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
68
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
69 //These functions should be called on every new field and/or frame.
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
70 //They should be safe if they are called a few times for the same field!
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
71 int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
72 xvmc_render_state_t * render,* last, * next;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
73
f07e17427140 initial XvMC support
iive
parents:
diff changeset
74 assert(avctx != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
75
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
76 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
77 assert(render != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
78 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
79 return -1;//make sure that this is render packet
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
80
f07e17427140 initial XvMC support
iive
parents:
diff changeset
81 render->picture_structure = s->picture_structure;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
82 render->flags = (s->first_field)? 0: XVMC_SECOND_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
83
f07e17427140 initial XvMC support
iive
parents:
diff changeset
84 //make sure that all data is drawn by XVMC_end_frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
85 assert(render->filled_mv_blocks_num==0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
86
f07e17427140 initial XvMC support
iive
parents:
diff changeset
87 render->p_future_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
88 render->p_past_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
89
f07e17427140 initial XvMC support
iive
parents:
diff changeset
90 switch(s->pict_type){
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5691
diff changeset
91 case FF_I_TYPE:
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
92 return 0;// no prediction from other frames
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5691
diff changeset
93 case FF_B_TYPE:
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
94 next = (xvmc_render_state_t*)s->next_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
95 assert(next!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
96 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
97 if(next == NULL) return -1;
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
98 if(next->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
99 render->p_future_surface = next->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
100 //no return here, going to set forward prediction
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5691
diff changeset
101 case FF_P_TYPE:
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
102 last = (xvmc_render_state_t*)s->last_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
103 if(last == NULL)// && !s->first_field)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
104 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
105 if(last->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
106 assert(last->state & MP_XVMC_STATE_PREDICTION);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
107 render->p_past_surface = last->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
108 return 0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
109 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
110
f07e17427140 initial XvMC support
iive
parents:
diff changeset
111 return -1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
112 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
113
f07e17427140 initial XvMC support
iive
parents:
diff changeset
114 void XVMC_field_end(MpegEncContext *s){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
115 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
116 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
117 assert(render != NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
118
f07e17427140 initial XvMC support
iive
parents:
diff changeset
119 if(render->filled_mv_blocks_num > 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
120 // printf("xvmcvideo.c: rendering %d left blocks after last slice!!!\n",render->filled_mv_blocks_num );
f07e17427140 initial XvMC support
iive
parents:
diff changeset
121 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
122 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
123 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
124
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
125 void XVMC_decode_mb(MpegEncContext *s){
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
126 XvMCMacroBlock * mv_block;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
127 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
128 int i,cbp,blocks_per_mb;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
129
f07e17427140 initial XvMC support
iive
parents:
diff changeset
130 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
131
f07e17427140 initial XvMC support
iive
parents:
diff changeset
132
f07e17427140 initial XvMC support
iive
parents:
diff changeset
133 if(s->encoding){
1830
024752284c25 av_log() patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 1580
diff changeset
134 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
4010
rathann
parents: 3947
diff changeset
135 return;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
136 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
137
f07e17427140 initial XvMC support
iive
parents:
diff changeset
138 //from MPV_decode_mb(),
f07e17427140 initial XvMC support
iive
parents:
diff changeset
139 /* update DC predictors for P macroblocks */
f07e17427140 initial XvMC support
iive
parents:
diff changeset
140 if (!s->mb_intra) {
f07e17427140 initial XvMC support
iive
parents:
diff changeset
141 s->last_dc[0] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
142 s->last_dc[1] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
143 s->last_dc[2] = 128 << s->intra_dc_precision;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
144 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
145
f07e17427140 initial XvMC support
iive
parents:
diff changeset
146 //MC doesn't skip blocks
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2281
diff changeset
147 s->mb_skipped = 0;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
148
f07e17427140 initial XvMC support
iive
parents:
diff changeset
149
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
150 // Do I need to export quant when I could not perform postprocessing?
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
151 // Anyway, it doesn't hurt.
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
152 s->current_picture.qscale_table[mb_xy] = s->qscale;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
153
f07e17427140 initial XvMC support
iive
parents:
diff changeset
154 //START OF XVMC specific code
f07e17427140 initial XvMC support
iive
parents:
diff changeset
155 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
156 assert(render!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
157 assert(render->magic==MP_XVMC_RENDER_MAGIC);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
158 assert(render->mv_blocks);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
159
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
160 //take the next free macroblock
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2628
diff changeset
161 mv_block = &render->mv_blocks[render->start_mv_blocks_num +
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
162 render->filled_mv_blocks_num ];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
163
f07e17427140 initial XvMC support
iive
parents:
diff changeset
164 // memset(mv_block,0,sizeof(XvMCMacroBlock));
f07e17427140 initial XvMC support
iive
parents:
diff changeset
165
f07e17427140 initial XvMC support
iive
parents:
diff changeset
166 mv_block->x = s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
167 mv_block->y = s->mb_y;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
168 mv_block->dct_type = s->interlaced_dct;//XVMC_DCT_TYPE_FRAME/FIELD;
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
169 // mv_block->motion_type = 0; //zero to silence warnings
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
170 if(s->mb_intra){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
171 mv_block->macroblock_type = XVMC_MB_TYPE_INTRA;//no MC, all done
f07e17427140 initial XvMC support
iive
parents:
diff changeset
172 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
173 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
174
f07e17427140 initial XvMC support
iive
parents:
diff changeset
175 if(s->mv_dir & MV_DIR_FORWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
176 mv_block->macroblock_type|= XVMC_MB_TYPE_MOTION_FORWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
177 //pmv[n][dir][xy]=mv[dir][n][xy]
f07e17427140 initial XvMC support
iive
parents:
diff changeset
178 mv_block->PMV[0][0][0] = s->mv[0][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
179 mv_block->PMV[0][0][1] = s->mv[0][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
180 mv_block->PMV[1][0][0] = s->mv[0][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
181 mv_block->PMV[1][0][1] = s->mv[0][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
182 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
183 if(s->mv_dir & MV_DIR_BACKWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
184 mv_block->macroblock_type|=XVMC_MB_TYPE_MOTION_BACKWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
185 mv_block->PMV[0][1][0] = s->mv[1][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
186 mv_block->PMV[0][1][1] = s->mv[1][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
187 mv_block->PMV[1][1][0] = s->mv[1][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
188 mv_block->PMV[1][1][1] = s->mv[1][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
189 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
190
f07e17427140 initial XvMC support
iive
parents:
diff changeset
191 switch(s->mv_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
192 case MV_TYPE_16X16:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
193 mv_block->motion_type = XVMC_PREDICTION_FRAME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
194 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
195 case MV_TYPE_16X8:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
196 mv_block->motion_type = XVMC_PREDICTION_16x8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
197 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
198 case MV_TYPE_FIELD:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
199 mv_block->motion_type = XVMC_PREDICTION_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
200 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
201 mv_block->PMV[0][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
202 mv_block->PMV[1][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
203 mv_block->PMV[0][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
204 mv_block->PMV[1][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
205 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
206 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
207 case MV_TYPE_DMV:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
208 mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
209 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
210
f07e17427140 initial XvMC support
iive
parents:
diff changeset
211 mv_block->PMV[0][0][0] = s->mv[0][0][0];//top from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
212 mv_block->PMV[0][0][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
213
f07e17427140 initial XvMC support
iive
parents:
diff changeset
214 mv_block->PMV[0][1][0] = s->mv[0][0][0];//bottom from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
215 mv_block->PMV[0][1][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
216
f07e17427140 initial XvMC support
iive
parents:
diff changeset
217 mv_block->PMV[1][0][0] = s->mv[0][2][0];//dmv00, top from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
218 mv_block->PMV[1][0][1] = s->mv[0][2][1]<<1;//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
219
f07e17427140 initial XvMC support
iive
parents:
diff changeset
220 mv_block->PMV[1][1][0] = s->mv[0][3][0];//dmv10, bottom from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
221 mv_block->PMV[1][1][1] = s->mv[0][3][1]<<1;//dmv11
f07e17427140 initial XvMC support
iive
parents:
diff changeset
222
f07e17427140 initial XvMC support
iive
parents:
diff changeset
223 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
224 mv_block->PMV[0][1][0] = s->mv[0][2][0];//dmv00
f07e17427140 initial XvMC support
iive
parents:
diff changeset
225 mv_block->PMV[0][1][1] = s->mv[0][2][1];//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
226 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
227 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
228 default:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
229 assert(0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
230 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
231
f07e17427140 initial XvMC support
iive
parents:
diff changeset
232 mv_block->motion_vertical_field_select = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
233
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
234 //set correct field references
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
235 if(s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
236 if( s->field_select[0][0] ) mv_block->motion_vertical_field_select|=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
237 if( s->field_select[1][0] ) mv_block->motion_vertical_field_select|=2;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
238 if( s->field_select[0][1] ) mv_block->motion_vertical_field_select|=4;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
239 if( s->field_select[1][1] ) mv_block->motion_vertical_field_select|=8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
240 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
241 }//!intra
f07e17427140 initial XvMC support
iive
parents:
diff changeset
242 //time to handle data blocks;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
243 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
244
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
245 blocks_per_mb = 6;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
246 if( s->chroma_format >= 2){
1849
63eafb5b1c38 fix typo
iive
parents: 1848
diff changeset
247 blocks_per_mb = 4 + (1 << (s->chroma_format));
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
248 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
249
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
250 // calculate cbp
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
251 cbp = 0;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
252 for(i=0; i<blocks_per_mb; i++) {
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
253 cbp+= cbp;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
254 if(s->block_last_index[i] >= 0)
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
255 cbp++;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
256 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2628
diff changeset
257
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
258 if(s->flags & CODEC_FLAG_GRAY){
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
259 if(s->mb_intra){//intra frames are always full chroma block
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
260 for(i=4; i<blocks_per_mb; i++){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
261 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
262 if(!render->unsigned_intra)
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
263 s->pblocks[i][0] = 1<<10;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
264 }
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
265 }else{
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
266 cbp&= 0xf << (blocks_per_mb - 4);
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
267 blocks_per_mb = 4;//luminance blocks only
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
268 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
269 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
270 mv_block->coded_block_pattern = cbp;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
271 if(cbp == 0)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
272 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
273
f07e17427140 initial XvMC support
iive
parents:
diff changeset
274 for(i=0; i<blocks_per_mb; i++){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
275 if(s->block_last_index[i] >= 0){
6553
ca55b7b133c7 Fix a bunch of typos in comments.
diego
parents: 6552
diff changeset
276 // I do not have unsigned_intra MOCO to test, hope it is OK.
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
277 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
278 s->pblocks[i][0]-=1<<10;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
279 if(!render->idct){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
280 s->dsp.idct(s->pblocks[i]);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
281 //!!TODO!clip!!!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
282 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
283 //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
284 if(s->avctx->xvmc_acceleration == 1){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
285 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
286 s->pblocks[i],sizeof(short)*8*8);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
287 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
288 /* if(s->pblocks[i] != &render->data_blocks[
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
289 (render->next_free_data_block_num)*64]){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
290 printf("ERROR mb(%d,%d) s->pblocks[i]=%p data_block[]=%p\n",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2628
diff changeset
291 s->mb_x,s->mb_y, s->pblocks[i],
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
292 &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
293 }*/
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
294 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
295 render->next_free_data_block_num++;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
296 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
297 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
298 render->filled_mv_blocks_num++;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
299
f07e17427140 initial XvMC support
iive
parents:
diff changeset
300 assert(render->filled_mv_blocks_num <= render->total_number_of_mv_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
301 assert(render->next_free_data_block_num <= render->total_number_of_data_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
302
f07e17427140 initial XvMC support
iive
parents:
diff changeset
303
f07e17427140 initial XvMC support
iive
parents:
diff changeset
304 if(render->filled_mv_blocks_num >= render->total_number_of_mv_blocks)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
305 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
306
f07e17427140 initial XvMC support
iive
parents:
diff changeset
307 // DumpRenderInfo(render);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
308 // DumpMBlockInfo(mv_block);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
309
f07e17427140 initial XvMC support
iive
parents:
diff changeset
310 }