Mercurial > libavcodec.hg
comparison mpegvideo.c @ 853:eacc2dd8fd9d libavcodec
* using DSPContext - so each codec could use its local (sub)set of CPU extension
author | kabi |
---|---|
date | Mon, 11 Nov 2002 09:40:17 +0000 |
parents | f3c369b8ddca |
children | 058194d7ade6 |
comparison
equal
deleted
inserted
replaced
852:c01c98206ee6 | 853:eacc2dd8fd9d |
---|---|
55 | 55 |
56 | 56 |
57 /* for jpeg fast DCT */ | 57 /* for jpeg fast DCT */ |
58 #define CONST_BITS 14 | 58 #define CONST_BITS 14 |
59 | 59 |
60 static const unsigned short aanscales[64] = { | 60 static const uint16_t aanscales[64] = { |
61 /* precomputed values scaled up by 14 bits */ | 61 /* precomputed values scaled up by 14 bits */ |
62 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, | 62 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, |
63 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, | 63 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, |
64 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, | 64 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, |
65 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, | 65 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, |
68 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, | 68 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, |
69 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 | 69 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 |
70 }; | 70 }; |
71 | 71 |
72 /* Input permutation for the simple_idct_mmx */ | 72 /* Input permutation for the simple_idct_mmx */ |
73 static const UINT8 simple_mmx_permutation[64]={ | 73 static const uint8_t simple_mmx_permutation[64]={ |
74 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, | 74 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, |
75 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, | 75 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, |
76 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, | 76 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, |
77 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, | 77 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, |
78 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, | 78 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, |
79 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, | 79 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, |
80 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, | 80 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, |
81 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, | 81 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, |
82 }; | 82 }; |
83 | 83 |
84 static UINT8 h263_chroma_roundtab[16] = { | 84 static const uint8_t h263_chroma_roundtab[16] = { |
85 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, | 85 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, |
86 }; | 86 }; |
87 | 87 |
88 static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL; | 88 static UINT16 (*default_mv_penalty)[MAX_MV*2+1]=NULL; |
89 static UINT8 default_fcode_tab[MAX_MV*2+1]; | 89 static UINT8 default_fcode_tab[MAX_MV*2+1]; |
170 st->raster_end[i]= end; | 170 st->raster_end[i]= end; |
171 } | 171 } |
172 } | 172 } |
173 | 173 |
174 /* XXX: those functions should be suppressed ASAP when all IDCTs are | 174 /* XXX: those functions should be suppressed ASAP when all IDCTs are |
175 converted */ | 175 converted */ |
176 // *FIXME* this is ugly hack using local static | |
177 static void (*ff_put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); | |
178 static void (*ff_add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); | |
176 static void ff_jref_idct_put(UINT8 *dest, int line_size, DCTELEM *block) | 179 static void ff_jref_idct_put(UINT8 *dest, int line_size, DCTELEM *block) |
177 { | 180 { |
178 j_rev_dct (block); | 181 j_rev_dct (block); |
179 put_pixels_clamped(block, dest, line_size); | 182 ff_put_pixels_clamped(block, dest, line_size); |
180 } | 183 } |
181 static void ff_jref_idct_add(UINT8 *dest, int line_size, DCTELEM *block) | 184 static void ff_jref_idct_add(UINT8 *dest, int line_size, DCTELEM *block) |
182 { | 185 { |
183 j_rev_dct (block); | 186 j_rev_dct (block); |
184 add_pixels_clamped(block, dest, line_size); | 187 ff_add_pixels_clamped(block, dest, line_size); |
185 } | 188 } |
186 | 189 |
187 /* init common dct for both encoder and decoder */ | 190 /* init common dct for both encoder and decoder */ |
188 int DCT_common_init(MpegEncContext *s) | 191 int DCT_common_init(MpegEncContext *s) |
189 { | 192 { |
190 int i; | 193 int i; |
194 | |
195 ff_put_pixels_clamped = s->dsp.put_pixels_clamped; | |
196 ff_add_pixels_clamped = s->dsp.add_pixels_clamped; | |
191 | 197 |
192 s->dct_unquantize_h263 = dct_unquantize_h263_c; | 198 s->dct_unquantize_h263 = dct_unquantize_h263_c; |
193 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c; | 199 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c; |
194 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c; | 200 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c; |
195 s->dct_quantize= dct_quantize_c; | 201 s->dct_quantize= dct_quantize_c; |
266 int MPV_common_init(MpegEncContext *s) | 272 int MPV_common_init(MpegEncContext *s) |
267 { | 273 { |
268 UINT8 *pict; | 274 UINT8 *pict; |
269 int y_size, c_size, yc_size, i; | 275 int y_size, c_size, yc_size, i; |
270 | 276 |
277 dsputil_init(&s->dsp, s->avctx->dsp_mask); | |
271 DCT_common_init(s); | 278 DCT_common_init(s); |
272 | 279 |
273 s->flags= s->avctx->flags; | 280 s->flags= s->avctx->flags; |
274 | 281 |
275 s->mb_width = (s->width + 15) / 16; | 282 s->mb_width = (s->width + 15) / 16; |
276 s->mb_height = (s->height + 15) / 16; | 283 s->mb_height = (s->height + 15) / 16; |
277 | 284 |
285 /* set default edge pos, will be overriden in decode_header if needed */ | |
286 s->h_edge_pos= s->mb_width*16; | |
287 s->v_edge_pos= s->mb_height*16; | |
288 | |
289 s->mb_num = s->mb_width * s->mb_height; | |
290 | |
278 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); | 291 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); |
279 c_size = (s->mb_width + 2) * (s->mb_height + 2); | 292 c_size = (s->mb_width + 2) * (s->mb_height + 2); |
280 yc_size = y_size + 2 * c_size; | 293 yc_size = y_size + 2 * c_size; |
281 | 294 |
282 /* set default edge pos, will be overriden in decode_header if needed */ | |
283 s->h_edge_pos= s->mb_width*16; | |
284 s->v_edge_pos= s->mb_height*16; | |
285 | |
286 /* convert fourcc to upper case */ | 295 /* convert fourcc to upper case */ |
287 s->avctx->fourcc= toupper( s->avctx->fourcc &0xFF) | 296 s->avctx->fourcc= toupper( s->avctx->fourcc &0xFF) |
288 + (toupper((s->avctx->fourcc>>8 )&0xFF)<<8 ) | 297 + (toupper((s->avctx->fourcc>>8 )&0xFF)<<8 ) |
289 + (toupper((s->avctx->fourcc>>16)&0xFF)<<16) | 298 + (toupper((s->avctx->fourcc>>16)&0xFF)<<16) |
290 + (toupper((s->avctx->fourcc>>24)&0xFF)<<24); | 299 + (toupper((s->avctx->fourcc>>24)&0xFF)<<24); |
291 | 300 |
292 s->mb_num = s->mb_width * s->mb_height; | |
293 | |
294 if(!(s->flags&CODEC_FLAG_DR1)){ | 301 if(!(s->flags&CODEC_FLAG_DR1)){ |
295 s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH; | 302 s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH; |
296 s->uvlinesize = s->mb_width * 8 + EDGE_WIDTH; | 303 s->uvlinesize = s->mb_width * 8 + EDGE_WIDTH; |
297 | 304 |
298 for(i=0;i<3;i++) { | 305 for(i=0;i<3;i++) { |
1131 emu=1; | 1138 emu=1; |
1132 } | 1139 } |
1133 } | 1140 } |
1134 | 1141 |
1135 if((motion_x|motion_y)&7){ | 1142 if((motion_x|motion_y)&7){ |
1136 ff_gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding); | 1143 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding); |
1137 ff_gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding); | 1144 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding); |
1138 }else{ | 1145 }else{ |
1139 int dxy; | 1146 int dxy; |
1140 | 1147 |
1141 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2); | 1148 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2); |
1142 if (s->no_rounding){ | 1149 if (s->no_rounding){ |
1143 put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); | 1150 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16); |
1144 }else{ | 1151 }else{ |
1145 put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16); | 1152 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16); |
1146 } | 1153 } |
1147 } | 1154 } |
1148 | 1155 |
1149 if(s->flags&CODEC_FLAG_GRAY) return; | 1156 if(s->flags&CODEC_FLAG_GRAY) return; |
1150 | 1157 |
1151 motion_x= s->sprite_offset[1][0]; | 1158 motion_x= s->sprite_offset[1][0]; |
1165 ptr = ref_picture[1] + offset; | 1172 ptr = ref_picture[1] + offset; |
1166 if(emu){ | 1173 if(emu){ |
1167 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); | 1174 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); |
1168 ptr= s->edge_emu_buffer; | 1175 ptr= s->edge_emu_buffer; |
1169 } | 1176 } |
1170 ff_gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); | 1177 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); |
1171 | 1178 |
1172 ptr = ref_picture[2] + offset; | 1179 ptr = ref_picture[2] + offset; |
1173 if(emu){ | 1180 if(emu){ |
1174 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); | 1181 emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); |
1175 ptr= s->edge_emu_buffer; | 1182 ptr= s->edge_emu_buffer; |
1176 } | 1183 } |
1177 ff_gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); | 1184 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); |
1178 | 1185 |
1179 return; | 1186 return; |
1180 } | 1187 } |
1181 | 1188 |
1182 static inline void gmc_motion(MpegEncContext *s, | 1189 static inline void gmc_motion(MpegEncContext *s, |
1197 dest_y+=dest_offset; | 1204 dest_y+=dest_offset; |
1198 | 1205 |
1199 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16; | 1206 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16; |
1200 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16; | 1207 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16; |
1201 | 1208 |
1202 ff_gmc(dest_y, ptr, linesize, 16, | 1209 s->dsp.gmc(dest_y, ptr, linesize, 16, |
1203 ox, | 1210 ox, |
1204 oy, | 1211 oy, |
1205 s->sprite_delta[0][0], s->sprite_delta[0][1], | 1212 s->sprite_delta[0][0], s->sprite_delta[0][1], |
1206 s->sprite_delta[1][0], s->sprite_delta[1][1], | 1213 s->sprite_delta[1][0], s->sprite_delta[1][1], |
1207 a+1, (1<<(2*a+1)) - s->no_rounding, | 1214 a+1, (1<<(2*a+1)) - s->no_rounding, |
1208 s->h_edge_pos, s->v_edge_pos); | 1215 s->h_edge_pos, s->v_edge_pos); |
1209 ff_gmc(dest_y+8, ptr, linesize, 16, | 1216 s->dsp.gmc(dest_y+8, ptr, linesize, 16, |
1210 ox + s->sprite_delta[0][0]*8, | 1217 ox + s->sprite_delta[0][0]*8, |
1211 oy + s->sprite_delta[1][0]*8, | 1218 oy + s->sprite_delta[1][0]*8, |
1212 s->sprite_delta[0][0], s->sprite_delta[0][1], | 1219 s->sprite_delta[0][0], s->sprite_delta[0][1], |
1213 s->sprite_delta[1][0], s->sprite_delta[1][1], | 1220 s->sprite_delta[1][0], s->sprite_delta[1][1], |
1214 a+1, (1<<(2*a+1)) - s->no_rounding, | 1221 a+1, (1<<(2*a+1)) - s->no_rounding, |
1222 | 1229 |
1223 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8; | 1230 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8; |
1224 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8; | 1231 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8; |
1225 | 1232 |
1226 ptr = ref_picture[1] + (src_offset>>1); | 1233 ptr = ref_picture[1] + (src_offset>>1); |
1227 ff_gmc(dest_cb, ptr, uvlinesize, 8, | 1234 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8, |
1228 ox, | 1235 ox, |
1229 oy, | 1236 oy, |
1230 s->sprite_delta[0][0], s->sprite_delta[0][1], | 1237 s->sprite_delta[0][0], s->sprite_delta[0][1], |
1231 s->sprite_delta[1][0], s->sprite_delta[1][1], | 1238 s->sprite_delta[1][0], s->sprite_delta[1][1], |
1232 a+1, (1<<(2*a+1)) - s->no_rounding, | 1239 a+1, (1<<(2*a+1)) - s->no_rounding, |
1233 s->h_edge_pos>>1, s->v_edge_pos>>1); | 1240 s->h_edge_pos>>1, s->v_edge_pos>>1); |
1234 | 1241 |
1235 ptr = ref_picture[2] + (src_offset>>1); | 1242 ptr = ref_picture[2] + (src_offset>>1); |
1236 ff_gmc(dest_cr, ptr, uvlinesize, 8, | 1243 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8, |
1237 ox, | 1244 ox, |
1238 oy, | 1245 oy, |
1239 s->sprite_delta[0][0], s->sprite_delta[0][1], | 1246 s->sprite_delta[0][0], s->sprite_delta[0][1], |
1240 s->sprite_delta[1][0], s->sprite_delta[1][1], | 1247 s->sprite_delta[1][0], s->sprite_delta[1][1], |
1241 a+1, (1<<(2*a+1)) - s->no_rounding, | 1248 a+1, (1<<(2*a+1)) - s->no_rounding, |
1246 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, | 1253 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, |
1247 int src_x, int src_y, int w, int h){ | 1254 int src_x, int src_y, int w, int h){ |
1248 int x, y; | 1255 int x, y; |
1249 int start_y, start_x, end_y, end_x; | 1256 int start_y, start_x, end_y, end_x; |
1250 UINT8 *buf= s->edge_emu_buffer; | 1257 UINT8 *buf= s->edge_emu_buffer; |
1251 | 1258 |
1252 if(src_y>= h){ | 1259 if(src_y>= h){ |
1253 src+= (h-1-src_y)*linesize; | 1260 src+= (h-1-src_y)*linesize; |
1254 src_y=h-1; | 1261 src_y=h-1; |
1255 }else if(src_y<=-block_h){ | 1262 }else if(src_y<=-block_h){ |
1256 src+= (1-block_h-src_y)*linesize; | 1263 src+= (1-block_h-src_y)*linesize; |
1858 if (!s->mb_intra) { | 1865 if (!s->mb_intra) { |
1859 /* motion handling */ | 1866 /* motion handling */ |
1860 /* decoding or more than one mb_type (MC was allready done otherwise) */ | 1867 /* decoding or more than one mb_type (MC was allready done otherwise) */ |
1861 if((!s->encoding) || (s->mb_type[mb_xy]&(s->mb_type[mb_xy]-1))){ | 1868 if((!s->encoding) || (s->mb_type[mb_xy]&(s->mb_type[mb_xy]-1))){ |
1862 if ((!s->no_rounding) || s->pict_type==B_TYPE){ | 1869 if ((!s->no_rounding) || s->pict_type==B_TYPE){ |
1863 op_pix = put_pixels_tab; | 1870 op_pix = s->dsp.put_pixels_tab; |
1864 op_qpix= put_qpel_pixels_tab; | 1871 op_qpix= s->dsp.put_qpel_pixels_tab; |
1865 }else{ | 1872 }else{ |
1866 op_pix = put_no_rnd_pixels_tab; | 1873 op_pix = s->dsp.put_no_rnd_pixels_tab; |
1867 op_qpix= put_no_rnd_qpel_pixels_tab; | 1874 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab; |
1868 } | 1875 } |
1869 | 1876 |
1870 if (s->mv_dir & MV_DIR_FORWARD) { | 1877 if (s->mv_dir & MV_DIR_FORWARD) { |
1871 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); | 1878 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); |
1872 op_pix = avg_pixels_tab; | 1879 op_pix = s->dsp.avg_pixels_tab; |
1873 op_qpix= avg_qpel_pixels_tab; | 1880 op_qpix= s->dsp.avg_qpel_pixels_tab; |
1874 } | 1881 } |
1875 if (s->mv_dir & MV_DIR_BACKWARD) { | 1882 if (s->mv_dir & MV_DIR_BACKWARD) { |
1876 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); | 1883 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); |
1877 } | 1884 } |
1878 } | 1885 } |
2222 wrap_y<<=1; | 2229 wrap_y<<=1; |
2223 }else | 2230 }else |
2224 s->interlaced_dct=0; | 2231 s->interlaced_dct=0; |
2225 } | 2232 } |
2226 | 2233 |
2227 get_pixels(s->block[0], ptr , wrap_y); | 2234 s->dsp.get_pixels(s->block[0], ptr , wrap_y); |
2228 get_pixels(s->block[1], ptr + 8, wrap_y); | 2235 s->dsp.get_pixels(s->block[1], ptr + 8, wrap_y); |
2229 get_pixels(s->block[2], ptr + dct_offset , wrap_y); | 2236 s->dsp.get_pixels(s->block[2], ptr + dct_offset , wrap_y); |
2230 get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y); | 2237 s->dsp.get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y); |
2231 | 2238 |
2232 if(s->flags&CODEC_FLAG_GRAY){ | 2239 if(s->flags&CODEC_FLAG_GRAY){ |
2233 skip_dct[4]= 1; | 2240 skip_dct[4]= 1; |
2234 skip_dct[5]= 1; | 2241 skip_dct[5]= 1; |
2235 }else{ | 2242 }else{ |
2237 ptr = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8; | 2244 ptr = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8; |
2238 if(emu){ | 2245 if(emu){ |
2239 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | 2246 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
2240 ptr= s->edge_emu_buffer; | 2247 ptr= s->edge_emu_buffer; |
2241 } | 2248 } |
2242 get_pixels(s->block[4], ptr, wrap_c); | 2249 s->dsp.get_pixels(s->block[4], ptr, wrap_c); |
2243 | 2250 |
2244 ptr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8; | 2251 ptr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8; |
2245 if(emu){ | 2252 if(emu){ |
2246 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | 2253 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
2247 ptr= s->edge_emu_buffer; | 2254 ptr= s->edge_emu_buffer; |
2248 } | 2255 } |
2249 get_pixels(s->block[5], ptr, wrap_c); | 2256 s->dsp.get_pixels(s->block[5], ptr, wrap_c); |
2250 } | 2257 } |
2251 }else{ | 2258 }else{ |
2252 op_pixels_func (*op_pix)[4]; | 2259 op_pixels_func (*op_pix)[4]; |
2253 qpel_mc_func (*op_qpix)[16]; | 2260 qpel_mc_func (*op_qpix)[16]; |
2254 UINT8 *dest_y, *dest_cb, *dest_cr; | 2261 UINT8 *dest_y, *dest_cb, *dest_cr; |
2264 ptr_y = s->new_picture[0] + (mb_y * 16 * wrap_y) + mb_x * 16; | 2271 ptr_y = s->new_picture[0] + (mb_y * 16 * wrap_y) + mb_x * 16; |
2265 ptr_cb = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8; | 2272 ptr_cb = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8; |
2266 ptr_cr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8; | 2273 ptr_cr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8; |
2267 | 2274 |
2268 if ((!s->no_rounding) || s->pict_type==B_TYPE){ | 2275 if ((!s->no_rounding) || s->pict_type==B_TYPE){ |
2269 op_pix = put_pixels_tab; | 2276 op_pix = s->dsp.put_pixels_tab; |
2270 op_qpix= put_qpel_pixels_tab; | 2277 op_qpix= s->dsp.put_qpel_pixels_tab; |
2271 }else{ | 2278 }else{ |
2272 op_pix = put_no_rnd_pixels_tab; | 2279 op_pix = s->dsp.put_no_rnd_pixels_tab; |
2273 op_qpix= put_no_rnd_qpel_pixels_tab; | 2280 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab; |
2274 } | 2281 } |
2275 | 2282 |
2276 if (s->mv_dir & MV_DIR_FORWARD) { | 2283 if (s->mv_dir & MV_DIR_FORWARD) { |
2277 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); | 2284 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); |
2278 op_pix = avg_pixels_tab; | 2285 op_pix = s->dsp.avg_pixels_tab; |
2279 op_qpix= avg_qpel_pixels_tab; | 2286 op_qpix= s->dsp.avg_qpel_pixels_tab; |
2280 } | 2287 } |
2281 if (s->mv_dir & MV_DIR_BACKWARD) { | 2288 if (s->mv_dir & MV_DIR_BACKWARD) { |
2282 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); | 2289 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix); |
2283 } | 2290 } |
2284 | 2291 |
2303 wrap_y<<=1; | 2310 wrap_y<<=1; |
2304 }else | 2311 }else |
2305 s->interlaced_dct=0; | 2312 s->interlaced_dct=0; |
2306 } | 2313 } |
2307 | 2314 |
2308 diff_pixels(s->block[0], ptr_y , dest_y , wrap_y); | 2315 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y); |
2309 diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y); | 2316 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y); |
2310 diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y); | 2317 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y); |
2311 diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y); | 2318 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y); |
2312 | 2319 |
2313 if(s->flags&CODEC_FLAG_GRAY){ | 2320 if(s->flags&CODEC_FLAG_GRAY){ |
2314 skip_dct[4]= 1; | 2321 skip_dct[4]= 1; |
2315 skip_dct[5]= 1; | 2322 skip_dct[5]= 1; |
2316 }else{ | 2323 }else{ |
2317 if(emu){ | 2324 if(emu){ |
2318 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | 2325 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
2319 ptr_cb= s->edge_emu_buffer; | 2326 ptr_cb= s->edge_emu_buffer; |
2320 } | 2327 } |
2321 diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); | 2328 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); |
2322 if(emu){ | 2329 if(emu){ |
2323 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); | 2330 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); |
2324 ptr_cr= s->edge_emu_buffer; | 2331 ptr_cr= s->edge_emu_buffer; |
2325 } | 2332 } |
2326 diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); | 2333 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); |
2327 } | 2334 } |
2328 | 2335 |
2329 /* pre quantization */ | 2336 /* pre quantization */ |
2330 if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){ | 2337 if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){ |
2331 //FIXME optimize | 2338 //FIXME optimize |
2332 if(pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1; | 2339 if(s->dsp.pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1; |
2333 if(pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1; | 2340 if(s->dsp.pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1; |
2334 if(pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1; | 2341 if(s->dsp.pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1; |
2335 if(pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1; | 2342 if(s->dsp.pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1; |
2336 if(pix_abs8x8(ptr_cb , dest_cb , wrap_y) < 20*s->qscale) skip_dct[4]= 1; | 2343 if(s->dsp.pix_abs8x8(ptr_cb , dest_cb , wrap_y) < 20*s->qscale) skip_dct[4]= 1; |
2337 if(pix_abs8x8(ptr_cr , dest_cr , wrap_y) < 20*s->qscale) skip_dct[5]= 1; | 2344 if(s->dsp.pix_abs8x8(ptr_cr , dest_cr , wrap_y) < 20*s->qscale) skip_dct[5]= 1; |
2338 #if 0 | 2345 #if 0 |
2339 { | 2346 { |
2340 static int stat[7]; | 2347 static int stat[7]; |
2341 int num=0; | 2348 int num=0; |
2342 for(i=0; i<6; i++) | 2349 for(i=0; i<6; i++) |
2599 for(mb_x=0; mb_x < s->mb_width; mb_x++) { | 2606 for(mb_x=0; mb_x < s->mb_width; mb_x++) { |
2600 int xx = mb_x * 16; | 2607 int xx = mb_x * 16; |
2601 int yy = mb_y * 16; | 2608 int yy = mb_y * 16; |
2602 uint8_t *pix = s->new_picture[0] + (yy * s->linesize) + xx; | 2609 uint8_t *pix = s->new_picture[0] + (yy * s->linesize) + xx; |
2603 int varc; | 2610 int varc; |
2604 int sum = pix_sum(pix, s->linesize); | 2611 int sum = s->dsp.pix_sum(pix, s->linesize); |
2605 | 2612 |
2606 varc = (pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; | 2613 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8; |
2607 | 2614 |
2608 s->mb_var [s->mb_width * mb_y + mb_x] = varc; | 2615 s->mb_var [s->mb_width * mb_y + mb_x] = varc; |
2609 s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+128)>>8; | 2616 s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+128)>>8; |
2610 s->mb_var_sum += varc; | 2617 s->mb_var_sum += varc; |
2611 } | 2618 } |