comparison h263.c @ 245:a023f78e0cc2 libavcodec

* simplified indexing
author kabi
date Mon, 18 Feb 2002 09:32:11 +0000
parents 4bb6289eff93
children 56ee684c48bb
comparison
equal deleted inserted replaced
244:3860331a1ecb 245:a023f78e0cc2
274 } 274 }
275 275
276 static inline int mid_pred(int a, int b, int c) 276 static inline int mid_pred(int a, int b, int c)
277 { 277 {
278 int vmin, vmax; 278 int vmin, vmax;
279 vmin = a; 279 vmax = vmin = a;
280 if (b < vmin) 280 if (b < vmin)
281 vmin = b; 281 vmin = b;
282 else
283 vmax = b;
284
282 if (c < vmin) 285 if (c < vmin)
283 vmin = c; 286 vmin = c;
284 287 else if (c > vmax)
285 vmax = a;
286 if (b > vmax)
287 vmax = b;
288 if (c > vmax)
289 vmax = c; 288 vmax = c;
290 289
291 return a + b + c - vmin - vmax; 290 return a + b + c - vmin - vmax;
292 } 291 }
293 292
294 INT16 *h263_pred_motion(MpegEncContext * s, int block, 293 INT16 *h263_pred_motion(MpegEncContext * s, int block,
295 int *px, int *py) 294 int *px, int *py)
296 { 295 {
297 int x, y, wrap; 296 int xy, y, wrap;
298 INT16 *A, *B, *C, *mot_val; 297 INT16 *A, *B, *C, *mot_val;
299 298
300 x = 2 * s->mb_x + 1 + (block & 1);
301 y = 2 * s->mb_y + 1 + ((block >> 1) & 1);
302 wrap = 2 * s->mb_width + 2; 299 wrap = 2 * s->mb_width + 2;
303 300 y = xy = 2 * s->mb_y + 1 + ((block >> 1) & 1); // y
304 mot_val = s->motion_val[(x) + (y) * wrap]; 301 xy *= wrap; // y * wrap
302 xy += 2 * s->mb_x + 1 + (block & 1); // x + y * wrap
303
304 mot_val = s->motion_val[xy];
305 305
306 /* special case for first line */ 306 /* special case for first line */
307 if (y == 1 || s->first_slice_line || s->first_gob_line) { 307 if (y == 1 || s->first_slice_line || s->first_gob_line) {
308 A = s->motion_val[(x-1) + (y) * wrap]; 308 A = s->motion_val[xy - 1];
309 *px = A[0]; 309 *px = A[0];
310 *py = A[1]; 310 *py = A[1];
311 } else { 311 } else {
312 switch(block) { 312 switch(block) {
313 default: 313 default:
314 case 0: 314 case 0:
315 A = s->motion_val[(x-1) + (y) * wrap]; 315 A = s->motion_val[xy - 1];
316 B = s->motion_val[(x) + (y-1) * wrap]; 316 B = s->motion_val[xy - wrap];
317 C = s->motion_val[(x+2) + (y-1) * wrap]; 317 C = s->motion_val[xy + 2 - wrap];
318 break; 318 break;
319 case 1: 319 case 1:
320 case 2: 320 case 2:
321 A = s->motion_val[(x-1) + (y) * wrap]; 321 A = s->motion_val[xy - 1];
322 B = s->motion_val[(x) + (y-1) * wrap]; 322 B = s->motion_val[xy - wrap];
323 C = s->motion_val[(x+1) + (y-1) * wrap]; 323 C = s->motion_val[xy + 1 - wrap];
324 break; 324 break;
325 case 3: 325 case 3:
326 A = s->motion_val[(x-1) + (y) * wrap]; 326 A = s->motion_val[xy - 1];
327 B = s->motion_val[(x-1) + (y-1) * wrap]; 327 B = s->motion_val[xy - 1 - wrap];
328 C = s->motion_val[(x) + (y-1) * wrap]; 328 C = s->motion_val[xy - wrap];
329 break; 329 break;
330 } 330 }
331 *px = mid_pred(A[0], B[0], C[0]); 331 *px = mid_pred(A[0], B[0], C[0]);
332 *py = mid_pred(A[1], B[1], C[1]); 332 *py = mid_pred(A[1], B[1], C[1]);
333 } 333 }
536 s->c_dc_scale = (quant - 6); 536 s->c_dc_scale = (quant - 6);
537 } 537 }
538 538
539 static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) 539 static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
540 { 540 {
541 int a, b, c, x, y, wrap, pred, scale; 541 int a, b, c, xy, wrap, pred, scale;
542 UINT16 *dc_val; 542 UINT16 *dc_val;
543 543
544 /* find prediction */ 544 /* find prediction */
545 if (n < 4) { 545 if (n < 4) {
546 x = 2 * s->mb_x + 1 + (n & 1);
547 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
548 wrap = s->mb_width * 2 + 2; 546 wrap = s->mb_width * 2 + 2;
547 xy = 2 * s->mb_y + 1 + ((n & 2) >> 1);
548 xy *= wrap;
549 xy += 2 * s->mb_x + 1 + (n & 1);
549 dc_val = s->dc_val[0]; 550 dc_val = s->dc_val[0];
550 scale = s->y_dc_scale; 551 scale = s->y_dc_scale;
551 } else { 552 } else {
552 x = s->mb_x + 1;
553 y = s->mb_y + 1;
554 wrap = s->mb_width + 2; 553 wrap = s->mb_width + 2;
554 xy = s->mb_y + 1;
555 xy *= wrap;
556 xy += s->mb_x + 1;
555 dc_val = s->dc_val[n - 4 + 1]; 557 dc_val = s->dc_val[n - 4 + 1];
556 scale = s->c_dc_scale; 558 scale = s->c_dc_scale;
557 } 559 }
558 560
559 /* B C 561 /* B C
560 * A X 562 * A X
561 */ 563 */
562 a = dc_val[(x - 1) + (y) * wrap]; 564 a = dc_val[xy - 1];
563 b = dc_val[(x - 1) + (y - 1) * wrap]; 565 b = dc_val[xy - 1 - wrap];
564 c = dc_val[(x) + (y - 1) * wrap]; 566 c = dc_val[xy - wrap];
565 567
566 if (abs(a - b) < abs(b - c)) { 568 if (abs(a - b) < abs(b - c)) {
567 pred = c; 569 pred = c;
568 *dir_ptr = 1; /* top */ 570 *dir_ptr = 1; /* top */
569 } else { 571 } else {
572 } 574 }
573 /* we assume pred is positive */ 575 /* we assume pred is positive */
574 pred = (pred + (scale >> 1)) / scale; 576 pred = (pred + (scale >> 1)) / scale;
575 577
576 /* prepare address for prediction update */ 578 /* prepare address for prediction update */
577 *dc_val_ptr = &dc_val[(x) + (y) * wrap]; 579 *dc_val_ptr = &dc_val[xy];
578 580
579 return pred; 581 return pred;
580 } 582 }
581 583
582 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n, 584 void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,