annotate xvmcvideo.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents fc98cdbe29b8
children 493dc59d469a
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
f07e17427140 initial XvMC support
iive
parents:
diff changeset
32 #ifdef HAVE_XVMC
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
33
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
34 //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
35 //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
36 //XvMC emulation could be performed
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
37
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
38 #include "xvmc_render.h"
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
39
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
40 //#include "xvmc_debug.h"
f07e17427140 initial XvMC support
iive
parents:
diff changeset
41
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
42 //set s->block
5691
fc98cdbe29b8 Remove inline from function that is exported.
iive
parents: 5077
diff changeset
43 void XVMC_init_block(MpegEncContext *s){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
44 xvmc_render_state_t * render;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
45 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
46 assert(render != NULL);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
47 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
48 assert(0);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
49 return;//make sure that this is render packet
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 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
52 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
53
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
54 void XVMC_pack_pblocks(MpegEncContext *s, int cbp){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
55 int i,j;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
56 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
57
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
58 j=0;
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
59 cbp<<= 12-mb_block_count;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
60 for(i=0; i<mb_block_count; i++){
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
61 if(cbp & (1<<11)) {
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
62 s->pblocks[i] = (short *)(&s->block[(j++)]);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
63 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
64 s->pblocks[i] = NULL;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
65 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
66 cbp+=cbp;
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
67 // 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
68 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
69 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
70
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
71 //these functions should be called on every new field or/and frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
72 //They should be safe if they are called few times for same field!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
73 int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
74 xvmc_render_state_t * render,* last, * next;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
75
f07e17427140 initial XvMC support
iive
parents:
diff changeset
76 assert(avctx != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
77
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
78 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
79 assert(render != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
80 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
81 return -1;//make sure that this is render packet
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
82
f07e17427140 initial XvMC support
iive
parents:
diff changeset
83 render->picture_structure = s->picture_structure;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
84 render->flags = (s->first_field)? 0: XVMC_SECOND_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
85
f07e17427140 initial XvMC support
iive
parents:
diff changeset
86 //make sure that all data is drawn by XVMC_end_frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
87 assert(render->filled_mv_blocks_num==0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
88
f07e17427140 initial XvMC support
iive
parents:
diff changeset
89 render->p_future_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
90 render->p_past_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
91
f07e17427140 initial XvMC support
iive
parents:
diff changeset
92 switch(s->pict_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
93 case I_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
94 return 0;// no prediction from other frames
f07e17427140 initial XvMC support
iive
parents:
diff changeset
95 case B_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
96 next = (xvmc_render_state_t*)s->next_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
97 assert(next!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
98 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
99 if(next == NULL) return -1;
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
100 if(next->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
101 render->p_future_surface = next->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
102 //no return here, going to set forward prediction
f07e17427140 initial XvMC support
iive
parents:
diff changeset
103 case P_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
104 last = (xvmc_render_state_t*)s->last_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
105 if(last == NULL)// && !s->first_field)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
106 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
107 if(last->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
108 assert(last->state & MP_XVMC_STATE_PREDICTION);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
109 render->p_past_surface = last->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
110 return 0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
111 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
112
f07e17427140 initial XvMC support
iive
parents:
diff changeset
113 return -1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
114 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
115
f07e17427140 initial XvMC support
iive
parents:
diff changeset
116 void XVMC_field_end(MpegEncContext *s){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
117 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
118 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
119 assert(render != NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
120
f07e17427140 initial XvMC support
iive
parents:
diff changeset
121 if(render->filled_mv_blocks_num > 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
122 // printf("xvmcvideo.c: rendering %d left blocks after last slice!!!\n",render->filled_mv_blocks_num );
f07e17427140 initial XvMC support
iive
parents:
diff changeset
123 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
124 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
125 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
126
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
127 void XVMC_decode_mb(MpegEncContext *s){
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
128 XvMCMacroBlock * mv_block;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
129 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
130 int i,cbp,blocks_per_mb;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
131
f07e17427140 initial XvMC support
iive
parents:
diff changeset
132 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
133
f07e17427140 initial XvMC support
iive
parents:
diff changeset
134
f07e17427140 initial XvMC support
iive
parents:
diff changeset
135 if(s->encoding){
1830
024752284c25 av_log() patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 1580
diff changeset
136 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
4010
rathann
parents: 3947
diff changeset
137 return;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
138 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
139
f07e17427140 initial XvMC support
iive
parents:
diff changeset
140 //from MPV_decode_mb(),
f07e17427140 initial XvMC support
iive
parents:
diff changeset
141 /* update DC predictors for P macroblocks */
f07e17427140 initial XvMC support
iive
parents:
diff changeset
142 if (!s->mb_intra) {
f07e17427140 initial XvMC support
iive
parents:
diff changeset
143 s->last_dc[0] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
144 s->last_dc[1] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
145 s->last_dc[2] = 128 << s->intra_dc_precision;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
146 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
147
f07e17427140 initial XvMC support
iive
parents:
diff changeset
148 //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
149 s->mb_skipped = 0;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
150
f07e17427140 initial XvMC support
iive
parents:
diff changeset
151
f07e17427140 initial XvMC support
iive
parents:
diff changeset
152 // do I need to export quant when I could not perform postprocessing?
f07e17427140 initial XvMC support
iive
parents:
diff changeset
153 // anyway, it doesn't hurrt
f07e17427140 initial XvMC support
iive
parents:
diff changeset
154 s->current_picture.qscale_table[mb_xy] = s->qscale;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
155
f07e17427140 initial XvMC support
iive
parents:
diff changeset
156 //START OF XVMC specific code
f07e17427140 initial XvMC support
iive
parents:
diff changeset
157 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
158 assert(render!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
159 assert(render->magic==MP_XVMC_RENDER_MAGIC);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
160 assert(render->mv_blocks);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
161
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
162 //take the next free macroblock
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2628
diff changeset
163 mv_block = &render->mv_blocks[render->start_mv_blocks_num +
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
164 render->filled_mv_blocks_num ];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
165
f07e17427140 initial XvMC support
iive
parents:
diff changeset
166 // memset(mv_block,0,sizeof(XvMCMacroBlock));
f07e17427140 initial XvMC support
iive
parents:
diff changeset
167
f07e17427140 initial XvMC support
iive
parents:
diff changeset
168 mv_block->x = s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
169 mv_block->y = s->mb_y;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
170 mv_block->dct_type = s->interlaced_dct;//XVMC_DCT_TYPE_FRAME/FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
171 // mv_block->motion_type = 0; //zero to silense warnings
f07e17427140 initial XvMC support
iive
parents:
diff changeset
172 if(s->mb_intra){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
173 mv_block->macroblock_type = XVMC_MB_TYPE_INTRA;//no MC, all done
f07e17427140 initial XvMC support
iive
parents:
diff changeset
174 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
175 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
176
f07e17427140 initial XvMC support
iive
parents:
diff changeset
177 if(s->mv_dir & MV_DIR_FORWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
178 mv_block->macroblock_type|= XVMC_MB_TYPE_MOTION_FORWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
179 //pmv[n][dir][xy]=mv[dir][n][xy]
f07e17427140 initial XvMC support
iive
parents:
diff changeset
180 mv_block->PMV[0][0][0] = s->mv[0][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
181 mv_block->PMV[0][0][1] = s->mv[0][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
182 mv_block->PMV[1][0][0] = s->mv[0][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
183 mv_block->PMV[1][0][1] = s->mv[0][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
184 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
185 if(s->mv_dir & MV_DIR_BACKWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
186 mv_block->macroblock_type|=XVMC_MB_TYPE_MOTION_BACKWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
187 mv_block->PMV[0][1][0] = s->mv[1][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
188 mv_block->PMV[0][1][1] = s->mv[1][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
189 mv_block->PMV[1][1][0] = s->mv[1][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
190 mv_block->PMV[1][1][1] = s->mv[1][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
191 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
192
f07e17427140 initial XvMC support
iive
parents:
diff changeset
193 switch(s->mv_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
194 case MV_TYPE_16X16:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
195 mv_block->motion_type = XVMC_PREDICTION_FRAME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
196 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
197 case MV_TYPE_16X8:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
198 mv_block->motion_type = XVMC_PREDICTION_16x8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
199 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
200 case MV_TYPE_FIELD:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
201 mv_block->motion_type = XVMC_PREDICTION_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
202 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
203 mv_block->PMV[0][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
204 mv_block->PMV[1][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
205 mv_block->PMV[0][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
206 mv_block->PMV[1][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
207 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
208 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
209 case MV_TYPE_DMV:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
210 mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
211 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
212
f07e17427140 initial XvMC support
iive
parents:
diff changeset
213 mv_block->PMV[0][0][0] = s->mv[0][0][0];//top from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
214 mv_block->PMV[0][0][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
215
f07e17427140 initial XvMC support
iive
parents:
diff changeset
216 mv_block->PMV[0][1][0] = s->mv[0][0][0];//bottom from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
217 mv_block->PMV[0][1][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
218
f07e17427140 initial XvMC support
iive
parents:
diff changeset
219 mv_block->PMV[1][0][0] = s->mv[0][2][0];//dmv00, top from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
220 mv_block->PMV[1][0][1] = s->mv[0][2][1]<<1;//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
221
f07e17427140 initial XvMC support
iive
parents:
diff changeset
222 mv_block->PMV[1][1][0] = s->mv[0][3][0];//dmv10, bottom from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
223 mv_block->PMV[1][1][1] = s->mv[0][3][1]<<1;//dmv11
f07e17427140 initial XvMC support
iive
parents:
diff changeset
224
f07e17427140 initial XvMC support
iive
parents:
diff changeset
225 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
226 mv_block->PMV[0][1][0] = s->mv[0][2][0];//dmv00
f07e17427140 initial XvMC support
iive
parents:
diff changeset
227 mv_block->PMV[0][1][1] = s->mv[0][2][1];//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
228 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
229 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
230 default:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
231 assert(0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
232 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
233
f07e17427140 initial XvMC support
iive
parents:
diff changeset
234 mv_block->motion_vertical_field_select = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
235
f07e17427140 initial XvMC support
iive
parents:
diff changeset
236 //set correct field referenses
f07e17427140 initial XvMC support
iive
parents:
diff changeset
237 if(s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
238 if( s->field_select[0][0] ) mv_block->motion_vertical_field_select|=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
239 if( s->field_select[1][0] ) mv_block->motion_vertical_field_select|=2;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
240 if( s->field_select[0][1] ) mv_block->motion_vertical_field_select|=4;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
241 if( s->field_select[1][1] ) mv_block->motion_vertical_field_select|=8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
242 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
243 }//!intra
f07e17427140 initial XvMC support
iive
parents:
diff changeset
244 //time to handle data blocks;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
245 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
246
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
247 blocks_per_mb = 6;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
248 if( s->chroma_format >= 2){
1849
63eafb5b1c38 fix typo
iive
parents: 1848
diff changeset
249 blocks_per_mb = 4 + (1 << (s->chroma_format));
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
250 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
251
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
252 // calculate cbp
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
253 cbp = 0;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
254 for(i=0; i<blocks_per_mb; i++) {
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
255 cbp+= cbp;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
256 if(s->block_last_index[i] >= 0)
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
257 cbp++;
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
258 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2628
diff changeset
259
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
260 if(s->flags & CODEC_FLAG_GRAY){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
261 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
262 for(i=4; i<blocks_per_mb; i++){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
263 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
264 if(!render->unsigned_intra)
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
265 s->pblocks[i][0] = 1<<10;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
266 }
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
267 }else{
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
268 cbp&= 0xf << (blocks_per_mb - 4);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
269 blocks_per_mb = 4;//Luminance blocks only
2076
23280e1b8dbf better cbp handling and small speedup in mpeg12
iive
parents: 1849
diff changeset
270 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
271 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
272 mv_block->coded_block_pattern = cbp;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
273 if(cbp == 0)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
274 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
275
f07e17427140 initial XvMC support
iive
parents:
diff changeset
276 for(i=0; i<blocks_per_mb; i++){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
277 if(s->block_last_index[i] >= 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
278 // i do not have unsigned_intra MOCO to test, hope it is OK
f07e17427140 initial XvMC support
iive
parents:
diff changeset
279 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
280 s->pblocks[i][0]-=1<<10;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
281 if(!render->idct){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
282 s->dsp.idct(s->pblocks[i]);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
283 //!!TODO!clip!!!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
284 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
285 //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
286 if(s->avctx->xvmc_acceleration == 1){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
287 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
288 s->pblocks[i],sizeof(short)*8*8);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
289 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
290 /* if(s->pblocks[i] != &render->data_blocks[
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
291 (render->next_free_data_block_num)*64]){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
292 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
293 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
294 &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
295 }*/
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
296 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
297 render->next_free_data_block_num++;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
298 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
299 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
300 render->filled_mv_blocks_num++;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
301
f07e17427140 initial XvMC support
iive
parents:
diff changeset
302 assert(render->filled_mv_blocks_num <= render->total_number_of_mv_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
303 assert(render->next_free_data_block_num <= render->total_number_of_data_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
304
f07e17427140 initial XvMC support
iive
parents:
diff changeset
305
f07e17427140 initial XvMC support
iive
parents:
diff changeset
306 if(render->filled_mv_blocks_num >= render->total_number_of_mv_blocks)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
307 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
308
f07e17427140 initial XvMC support
iive
parents:
diff changeset
309 // DumpRenderInfo(render);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
310 // DumpMBlockInfo(mv_block);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
311
f07e17427140 initial XvMC support
iive
parents:
diff changeset
312 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
313
f07e17427140 initial XvMC support
iive
parents:
diff changeset
314 #endif