annotate xvmcvideo.c @ 1985:b2bc62fdecc0 libavcodec

move the 0x80 vector outside of the function, thus saving the compiler the trouble of having to initialize each byte on the stack individually
author melanson
date Tue, 27 Apr 2004 04:06:24 +0000
parents 63eafb5b1c38
children 23280e1b8dbf
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;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
58
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
59 j=0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
60 for(i=0;i<6;i++){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
61 if(cbp & (1<<(5-i)) ){
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 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
66 // 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
67 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
68 if (s->chroma_format >= 2){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
69 if (s->chroma_format == 2){//CHROMA_422
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
70 for(i=6;i<8;i++){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
71 if(cbp & (1<<(6+7-i)) ){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
72 s->pblocks[i] = (short *)(&s->block[(j++)]);
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
73 }else{
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
74 s->pblocks[i] = NULL;
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
75 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
76 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
77 }else{//CHROMA_444
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
78 for(i=6; i<12; i++){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
79 if(cbp & (1<<(6+11-i)) ){
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
80 s->pblocks[i] = (short *)(&s->block[(j++)]);
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
81 }else{
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
82 s->pblocks[i] = NULL;
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
83 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
84 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
85 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
86 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
87 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
88
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
89 static int calc_cbp(MpegEncContext *s){
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
90 /* compute cbp */
f07e17427140 initial XvMC support
iive
parents:
diff changeset
91 int i,cbp = 0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
92 for(i=0; i<4; i++) {
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
93 if(s->block_last_index[i] >= 0)
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
94 cbp |= 1 << (5 - i);
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
95 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
96 if(s->flags & CODEC_FLAG_GRAY)
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
97 return cbp; //4 block for grayscale one done
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
98
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
99
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
100 for(i=4; i<6; i++) {
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
101 if(s->block_last_index[i] >= 0)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
102 cbp |= 1 << (5 - i);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
103 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
104 if(s->chroma_format < 2) return cbp;
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
105
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
106
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
107 if(s->chroma_format == 2){/*CHROMA_422*/
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
108 for(i=6; i<8; i++) {
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
109 if(s->block_last_index[i] >= 0)
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
110 cbp |= 1 << (6+7 - i);
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
111 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
112 }else{/*CHROMA_444*/
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
113 for(i=6; i<12; i++) {
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
114 if(s->block_last_index[i] >= 0)
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
115 cbp |= 1 << (6+11 - i);
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
116 }
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
117 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
118 return cbp;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
119 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
120
f07e17427140 initial XvMC support
iive
parents:
diff changeset
121
f07e17427140 initial XvMC support
iive
parents:
diff changeset
122
f07e17427140 initial XvMC support
iive
parents:
diff changeset
123 //these functions should be called on every new field or/and frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
124 //They should be safe if they are called few times for same field!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
125 int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
126 xvmc_render_state_t * render,* last, * next;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
127
f07e17427140 initial XvMC support
iive
parents:
diff changeset
128 assert(avctx != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
129
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
130 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
131 assert(render != NULL);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
132 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
133 return -1;//make sure that this is render packet
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
134
f07e17427140 initial XvMC support
iive
parents:
diff changeset
135 render->picture_structure = s->picture_structure;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
136 render->flags = (s->first_field)? 0: XVMC_SECOND_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
137
f07e17427140 initial XvMC support
iive
parents:
diff changeset
138 //make sure that all data is drawn by XVMC_end_frame
f07e17427140 initial XvMC support
iive
parents:
diff changeset
139 assert(render->filled_mv_blocks_num==0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
140
f07e17427140 initial XvMC support
iive
parents:
diff changeset
141 render->p_future_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
142 render->p_past_surface = NULL;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
143
f07e17427140 initial XvMC support
iive
parents:
diff changeset
144 switch(s->pict_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
145 case I_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
146 return 0;// no prediction from other frames
f07e17427140 initial XvMC support
iive
parents:
diff changeset
147 case B_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
148 next = (xvmc_render_state_t*)s->next_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
149 assert(next!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
150 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
151 if(next == NULL) return -1;
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
152 if(next->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
153 render->p_future_surface = next->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
154 //no return here, going to set forward prediction
f07e17427140 initial XvMC support
iive
parents:
diff changeset
155 case P_TYPE:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
156 last = (xvmc_render_state_t*)s->last_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
157 if(last == NULL)// && !s->first_field)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
158 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
159 if(last->magic != MP_XVMC_RENDER_MAGIC) return -1;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
160 assert(last->state & MP_XVMC_STATE_PREDICTION);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
161 render->p_past_surface = last->p_surface;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
162 return 0;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
163 }
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
164
f07e17427140 initial XvMC support
iive
parents:
diff changeset
165 return -1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
166 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
167
f07e17427140 initial XvMC support
iive
parents:
diff changeset
168 void XVMC_field_end(MpegEncContext *s){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
169 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
170 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
171 assert(render != NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
172
f07e17427140 initial XvMC support
iive
parents:
diff changeset
173 if(render->filled_mv_blocks_num > 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
174 // printf("xvmcvideo.c: rendering %d left blocks after last slice!!!\n",render->filled_mv_blocks_num );
f07e17427140 initial XvMC support
iive
parents:
diff changeset
175 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
176 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
177 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
178
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
179 void XVMC_decode_mb(MpegEncContext *s){
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
180 XvMCMacroBlock * mv_block;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
181 xvmc_render_state_t * render;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
182 int i,cbp,blocks_per_mb;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
183
f07e17427140 initial XvMC support
iive
parents:
diff changeset
184 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
185
f07e17427140 initial XvMC support
iive
parents:
diff changeset
186
f07e17427140 initial XvMC support
iive
parents:
diff changeset
187 if(s->encoding){
1830
024752284c25 av_log() patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 1580
diff changeset
188 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
1517
d107c545d745 using av_abort
alex
parents: 1444
diff changeset
189 av_abort();
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
190 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
191
f07e17427140 initial XvMC support
iive
parents:
diff changeset
192 //from MPV_decode_mb(),
f07e17427140 initial XvMC support
iive
parents:
diff changeset
193 /* update DC predictors for P macroblocks */
f07e17427140 initial XvMC support
iive
parents:
diff changeset
194 if (!s->mb_intra) {
f07e17427140 initial XvMC support
iive
parents:
diff changeset
195 s->last_dc[0] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
196 s->last_dc[1] =
f07e17427140 initial XvMC support
iive
parents:
diff changeset
197 s->last_dc[2] = 128 << s->intra_dc_precision;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
198 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
199
f07e17427140 initial XvMC support
iive
parents:
diff changeset
200 //MC doesn't skip blocks
f07e17427140 initial XvMC support
iive
parents:
diff changeset
201 s->mb_skiped = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
202
f07e17427140 initial XvMC support
iive
parents:
diff changeset
203
f07e17427140 initial XvMC support
iive
parents:
diff changeset
204 // do I need to export quant when I could not perform postprocessing?
f07e17427140 initial XvMC support
iive
parents:
diff changeset
205 // anyway, it doesn't hurrt
f07e17427140 initial XvMC support
iive
parents:
diff changeset
206 s->current_picture.qscale_table[mb_xy] = s->qscale;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
207
f07e17427140 initial XvMC support
iive
parents:
diff changeset
208 //START OF XVMC specific code
f07e17427140 initial XvMC support
iive
parents:
diff changeset
209 render = (xvmc_render_state_t*)s->current_picture.data[2];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
210 assert(render!=NULL);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
211 assert(render->magic==MP_XVMC_RENDER_MAGIC);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
212 assert(render->mv_blocks);
1392
13a02518ffb6 Add GNU header, remove X includes, add more check for xvmc render packet
iive
parents: 1381
diff changeset
213
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
214 //take the next free macroblock
f07e17427140 initial XvMC support
iive
parents:
diff changeset
215 mv_block = &render->mv_blocks[render->start_mv_blocks_num +
f07e17427140 initial XvMC support
iive
parents:
diff changeset
216 render->filled_mv_blocks_num ];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
217
f07e17427140 initial XvMC support
iive
parents:
diff changeset
218 // memset(mv_block,0,sizeof(XvMCMacroBlock));
f07e17427140 initial XvMC support
iive
parents:
diff changeset
219
f07e17427140 initial XvMC support
iive
parents:
diff changeset
220 mv_block->x = s->mb_x;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
221 mv_block->y = s->mb_y;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
222 mv_block->dct_type = s->interlaced_dct;//XVMC_DCT_TYPE_FRAME/FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
223 // mv_block->motion_type = 0; //zero to silense warnings
f07e17427140 initial XvMC support
iive
parents:
diff changeset
224 if(s->mb_intra){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
225 mv_block->macroblock_type = XVMC_MB_TYPE_INTRA;//no MC, all done
f07e17427140 initial XvMC support
iive
parents:
diff changeset
226 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
227 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
228
f07e17427140 initial XvMC support
iive
parents:
diff changeset
229 if(s->mv_dir & MV_DIR_FORWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
230 mv_block->macroblock_type|= XVMC_MB_TYPE_MOTION_FORWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
231 //pmv[n][dir][xy]=mv[dir][n][xy]
f07e17427140 initial XvMC support
iive
parents:
diff changeset
232 mv_block->PMV[0][0][0] = s->mv[0][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
233 mv_block->PMV[0][0][1] = s->mv[0][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
234 mv_block->PMV[1][0][0] = s->mv[0][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
235 mv_block->PMV[1][0][1] = s->mv[0][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
236 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
237 if(s->mv_dir & MV_DIR_BACKWARD){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
238 mv_block->macroblock_type|=XVMC_MB_TYPE_MOTION_BACKWARD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
239 mv_block->PMV[0][1][0] = s->mv[1][0][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
240 mv_block->PMV[0][1][1] = s->mv[1][0][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
241 mv_block->PMV[1][1][0] = s->mv[1][1][0];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
242 mv_block->PMV[1][1][1] = s->mv[1][1][1];
f07e17427140 initial XvMC support
iive
parents:
diff changeset
243 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
244
f07e17427140 initial XvMC support
iive
parents:
diff changeset
245 switch(s->mv_type){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
246 case MV_TYPE_16X16:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
247 mv_block->motion_type = XVMC_PREDICTION_FRAME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
248 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
249 case MV_TYPE_16X8:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
250 mv_block->motion_type = XVMC_PREDICTION_16x8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
251 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
252 case MV_TYPE_FIELD:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
253 mv_block->motion_type = XVMC_PREDICTION_FIELD;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
254 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
255 mv_block->PMV[0][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
256 mv_block->PMV[1][0][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
257 mv_block->PMV[0][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
258 mv_block->PMV[1][1][1]<<=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
259 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
260 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
261 case MV_TYPE_DMV:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
262 mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
263 if(s->picture_structure == PICT_FRAME){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
264
f07e17427140 initial XvMC support
iive
parents:
diff changeset
265 mv_block->PMV[0][0][0] = s->mv[0][0][0];//top from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
266 mv_block->PMV[0][0][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
267
f07e17427140 initial XvMC support
iive
parents:
diff changeset
268 mv_block->PMV[0][1][0] = s->mv[0][0][0];//bottom from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
269 mv_block->PMV[0][1][1] = s->mv[0][0][1]<<1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
270
f07e17427140 initial XvMC support
iive
parents:
diff changeset
271 mv_block->PMV[1][0][0] = s->mv[0][2][0];//dmv00, top from bottom
f07e17427140 initial XvMC support
iive
parents:
diff changeset
272 mv_block->PMV[1][0][1] = s->mv[0][2][1]<<1;//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
273
f07e17427140 initial XvMC support
iive
parents:
diff changeset
274 mv_block->PMV[1][1][0] = s->mv[0][3][0];//dmv10, bottom from top
f07e17427140 initial XvMC support
iive
parents:
diff changeset
275 mv_block->PMV[1][1][1] = s->mv[0][3][1]<<1;//dmv11
f07e17427140 initial XvMC support
iive
parents:
diff changeset
276
f07e17427140 initial XvMC support
iive
parents:
diff changeset
277 }else{
f07e17427140 initial XvMC support
iive
parents:
diff changeset
278 mv_block->PMV[0][1][0] = s->mv[0][2][0];//dmv00
f07e17427140 initial XvMC support
iive
parents:
diff changeset
279 mv_block->PMV[0][1][1] = s->mv[0][2][1];//dmv01
f07e17427140 initial XvMC support
iive
parents:
diff changeset
280 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
281 break;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
282 default:
f07e17427140 initial XvMC support
iive
parents:
diff changeset
283 assert(0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
284 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
285
f07e17427140 initial XvMC support
iive
parents:
diff changeset
286 mv_block->motion_vertical_field_select = 0;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
287
f07e17427140 initial XvMC support
iive
parents:
diff changeset
288 //set correct field referenses
f07e17427140 initial XvMC support
iive
parents:
diff changeset
289 if(s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
290 if( s->field_select[0][0] ) mv_block->motion_vertical_field_select|=1;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
291 if( s->field_select[1][0] ) mv_block->motion_vertical_field_select|=2;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
292 if( s->field_select[0][1] ) mv_block->motion_vertical_field_select|=4;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
293 if( s->field_select[1][1] ) mv_block->motion_vertical_field_select|=8;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
294 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
295 }//!intra
f07e17427140 initial XvMC support
iive
parents:
diff changeset
296 //time to handle data blocks;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
297 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
298
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
299 blocks_per_mb = 6;
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
300 if( s->chroma_format >= 2){
1849
63eafb5b1c38 fix typo
iive
parents: 1848
diff changeset
301 blocks_per_mb = 4 + (1 << (s->chroma_format));
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
302 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
303
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
304 if(s->flags & CODEC_FLAG_GRAY){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
305 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
306 for(i=4; i<blocks_per_mb; i++){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
307 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
308 if(!render->unsigned_intra)
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
309 s->pblocks[i][0] = 1<<10;
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
310 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
311 }else
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
312 blocks_per_mb = 4;//Luminance blocks only
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
313 }
1848
c72589baee53 initial chroma_format changes,xvmc tweaks and codec_cap
iive
parents: 1830
diff changeset
314 cbp = calc_cbp(s);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
315 mv_block->coded_block_pattern = cbp;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
316 if(cbp == 0)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
317 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
318
f07e17427140 initial XvMC support
iive
parents:
diff changeset
319 for(i=0; i<blocks_per_mb; i++){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
320 if(s->block_last_index[i] >= 0){
f07e17427140 initial XvMC support
iive
parents:
diff changeset
321 // i do not have unsigned_intra MOCO to test, hope it is OK
f07e17427140 initial XvMC support
iive
parents:
diff changeset
322 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
323 s->pblocks[i][0]-=1<<10;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
324 if(!render->idct){
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
325 s->dsp.idct(s->pblocks[i]);
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
326 //!!TODO!clip!!!
f07e17427140 initial XvMC support
iive
parents:
diff changeset
327 }
1580
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
328 //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
329 if(s->avctx->xvmc_acceleration == 1){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
330 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
331 s->pblocks[i],sizeof(short)*8*8);
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
332 }else{
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
333 /* if(s->pblocks[i] != &render->data_blocks[
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
334 (render->next_free_data_block_num)*64]){
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
335 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
336 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
337 &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
338 }*/
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
339 }
628bf341e099 XvMC speedup by removing one memcpy and doing MB packing
iive
parents: 1517
diff changeset
340 render->next_free_data_block_num++;
1381
f07e17427140 initial XvMC support
iive
parents:
diff changeset
341 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
342 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
343 render->filled_mv_blocks_num++;
f07e17427140 initial XvMC support
iive
parents:
diff changeset
344
f07e17427140 initial XvMC support
iive
parents:
diff changeset
345 assert(render->filled_mv_blocks_num <= render->total_number_of_mv_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
346 assert(render->next_free_data_block_num <= render->total_number_of_data_blocks);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
347
f07e17427140 initial XvMC support
iive
parents:
diff changeset
348
f07e17427140 initial XvMC support
iive
parents:
diff changeset
349 if(render->filled_mv_blocks_num >= render->total_number_of_mv_blocks)
f07e17427140 initial XvMC support
iive
parents:
diff changeset
350 ff_draw_horiz_band(s,0,0);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
351
f07e17427140 initial XvMC support
iive
parents:
diff changeset
352 // DumpRenderInfo(render);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
353 // DumpMBlockInfo(mv_block);
f07e17427140 initial XvMC support
iive
parents:
diff changeset
354
f07e17427140 initial XvMC support
iive
parents:
diff changeset
355 }
f07e17427140 initial XvMC support
iive
parents:
diff changeset
356
f07e17427140 initial XvMC support
iive
parents:
diff changeset
357 #endif