Mercurial > libavcodec.hg
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, |