| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| 11 | 11 | 
| 12 #include "vpx_ports/config.h" | 12 #include "vpx_ports/config.h" | 
| 13 #include "encodemb.h" | 13 #include "encodemb.h" | 
| 14 #include "vp8/common/reconinter.h" | 14 #include "vp8/common/reconinter.h" | 
| 15 #include "quantize.h" | 15 #include "quantize.h" | 
| 16 #include "tokenize.h" | 16 #include "tokenize.h" | 
| 17 #include "vp8/common/invtrans.h" | 17 #include "vp8/common/invtrans.h" | 
| 18 #include "vp8/common/recon.h" | 18 #include "vp8/common/recon.h" | 
| 19 #include "vp8/common/reconintra.h" | 19 #include "vp8/common/reconintra.h" | 
| 20 #include "dct.h" | 20 #include "dct.h" | 
| 21 #include "vpx_mem/vpx_mem.h" | 21 #include "vpx_mem/vpx_mem.h" | 
|  | 22 #include "rdopt.h" | 
| 22 | 23 | 
| 23 #if CONFIG_RUNTIME_CPU_DETECT | 24 #if CONFIG_RUNTIME_CPU_DETECT | 
| 24 #define IF_RTCD(x) (x) | 25 #define IF_RTCD(x) (x) | 
| 25 #else | 26 #else | 
| 26 #define IF_RTCD(x) NULL | 27 #define IF_RTCD(x) NULL | 
| 27 #endif | 28 #endif | 
| 28 void vp8_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) | 29 void vp8_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) | 
| 29 { | 30 { | 
| 30     unsigned char *src_ptr = (*(be->base_src) + be->src); | 31     unsigned char *src_ptr = (*(be->base_src) + be->src); | 
| 31     short *diff_ptr = be->src_diff; | 32     short *diff_ptr = be->src_diff; | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 93         } | 94         } | 
| 94 | 95 | 
| 95         diff += 16; | 96         diff += 16; | 
| 96         pred += 16; | 97         pred += 16; | 
| 97         src  += stride; | 98         src  += stride; | 
| 98     } | 99     } | 
| 99 } | 100 } | 
| 100 | 101 | 
| 101 static void vp8_subtract_mb(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 102 static void vp8_subtract_mb(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 
| 102 { | 103 { | 
| 103     ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, x->src.y_buffer, x->e_
     mbd.predictor, x->src.y_stride); | 104     BLOCK *b = &x->block[0]; | 
|  | 105 | 
|  | 106     ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, *(b->base_src), x->e_m
     bd.predictor, b->src_stride); | 
| 104     ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->s
     rc.v_buffer, x->e_mbd.predictor, x->src.uv_stride); | 107     ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->s
     rc.v_buffer, x->e_mbd.predictor, x->src.uv_stride); | 
| 105 } | 108 } | 
| 106 | 109 | 
| 107 static void build_dcblock(MACROBLOCK *x) | 110 static void build_dcblock(MACROBLOCK *x) | 
| 108 { | 111 { | 
| 109     short *src_diff_ptr = &x->src_diff[384]; | 112     short *src_diff_ptr = &x->src_diff[384]; | 
| 110     int i; | 113     int i; | 
| 111 | 114 | 
| 112     for (i = 0; i < 16; i++) | 115     for (i = 0; i < 16; i++) | 
| 113     { | 116     { | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 188     // build dc block from 16 y dc values | 191     // build dc block from 16 y dc values | 
| 189     if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) | 192     if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) | 
| 190     { | 193     { | 
| 191         build_dcblock(x); | 194         build_dcblock(x); | 
| 192         x->short_walsh4x4(&x->block[24].src_diff[0], | 195         x->short_walsh4x4(&x->block[24].src_diff[0], | 
| 193             &x->block[24].coeff[0], 8); | 196             &x->block[24].coeff[0], 8); | 
| 194     } | 197     } | 
| 195 } | 198 } | 
| 196 | 199 | 
| 197 | 200 | 
| 198 void vp8_stuff_inter16x16(MACROBLOCK *x) |  | 
| 199 { |  | 
| 200     vp8_build_inter_predictors_mb_s(&x->e_mbd); |  | 
| 201     /* |  | 
| 202         // recon = copy from predictors to destination |  | 
| 203         { |  | 
| 204             BLOCKD *b = &x->e_mbd.block[0]; |  | 
| 205             unsigned char *pred_ptr = b->predictor; |  | 
| 206             unsigned char *dst_ptr = *(b->base_dst) + b->dst; |  | 
| 207             int stride = b->dst_stride; |  | 
| 208 | 201 | 
| 209             int i; |  | 
| 210             for(i=0;i<16;i++) |  | 
| 211                 vpx_memcpy(dst_ptr+i*stride,pred_ptr+16*i,16); |  | 
| 212 |  | 
| 213             b = &x->e_mbd.block[16]; |  | 
| 214             pred_ptr = b->predictor; |  | 
| 215             dst_ptr = *(b->base_dst) + b->dst; |  | 
| 216             stride = b->dst_stride; |  | 
| 217 |  | 
| 218             for(i=0;i<8;i++) |  | 
| 219                 vpx_memcpy(dst_ptr+i*stride,pred_ptr+8*i,8); |  | 
| 220 |  | 
| 221             b = &x->e_mbd.block[20]; |  | 
| 222             pred_ptr = b->predictor; |  | 
| 223             dst_ptr = *(b->base_dst) + b->dst; |  | 
| 224             stride = b->dst_stride; |  | 
| 225 |  | 
| 226             for(i=0;i<8;i++) |  | 
| 227                 vpx_memcpy(dst_ptr+i*stride,pred_ptr+8*i,8); |  | 
| 228         } |  | 
| 229     */ |  | 
| 230 } |  | 
| 231 |  | 
| 232 #if !(CONFIG_REALTIME_ONLY) |  | 
| 233 #define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) ) |  | 
| 234 #define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF ) | 202 #define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF ) | 
| 235 | 203 | 
| 236 typedef struct vp8_token_state vp8_token_state; | 204 typedef struct vp8_token_state vp8_token_state; | 
| 237 | 205 | 
| 238 struct vp8_token_state{ | 206 struct vp8_token_state{ | 
| 239   int           rate; | 207   int           rate; | 
| 240   int           error; | 208   int           error; | 
| 241   signed char   next; | 209   signed char   next; | 
| 242   signed char   token; | 210   signed char   token; | 
| 243   short         qc; | 211   short         qc; | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 265     vp8_token_state tokens[17][2]; | 233     vp8_token_state tokens[17][2]; | 
| 266     unsigned best_mask[2]; | 234     unsigned best_mask[2]; | 
| 267     const short *dequant_ptr; | 235     const short *dequant_ptr; | 
| 268     const short *coeff_ptr; | 236     const short *coeff_ptr; | 
| 269     short *qcoeff_ptr; | 237     short *qcoeff_ptr; | 
| 270     short *dqcoeff_ptr; | 238     short *dqcoeff_ptr; | 
| 271     int eob; | 239     int eob; | 
| 272     int i0; | 240     int i0; | 
| 273     int rc; | 241     int rc; | 
| 274     int x; | 242     int x; | 
| 275     int sz; | 243     int sz = 0; | 
| 276     int next; | 244     int next; | 
| 277     int rdmult; | 245     int rdmult; | 
| 278     int rddiv; | 246     int rddiv; | 
| 279     int final_eob; | 247     int final_eob; | 
| 280     int rd_cost0; | 248     int rd_cost0; | 
| 281     int rd_cost1; | 249     int rd_cost1; | 
| 282     int rate0; | 250     int rate0; | 
| 283     int rate1; | 251     int rate1; | 
| 284     int error0; | 252     int error0; | 
| 285     int error1; | 253     int error1; | 
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 601 | 569 | 
| 602     ta = (ENTROPY_CONTEXT *)&t_above; | 570     ta = (ENTROPY_CONTEXT *)&t_above; | 
| 603     tl = (ENTROPY_CONTEXT *)&t_left; | 571     tl = (ENTROPY_CONTEXT *)&t_left; | 
| 604 | 572 | 
| 605     for (b = 16; b < 24; b++) | 573     for (b = 16; b < 24; b++) | 
| 606     { | 574     { | 
| 607         optimize_b(x, b, PLANE_TYPE_UV, | 575         optimize_b(x, b, PLANE_TYPE_UV, | 
| 608             ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); | 576             ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); | 
| 609     } | 577     } | 
| 610 } | 578 } | 
| 611 #endif |  | 
| 612 | 579 | 
| 613 void vp8_encode_inter16x16(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 580 void vp8_encode_inter16x16(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 
| 614 { | 581 { | 
| 615     vp8_build_inter_predictors_mb(&x->e_mbd); | 582     vp8_build_inter_predictors_mb(&x->e_mbd); | 
| 616 | 583 | 
| 617     vp8_subtract_mb(rtcd, x); | 584     vp8_subtract_mb(rtcd, x); | 
| 618 | 585 | 
| 619     transform_mb(x); | 586     transform_mb(x); | 
| 620 | 587 | 
| 621     vp8_quantize_mb(x); | 588     vp8_quantize_mb(x); | 
| 622 | 589 | 
| 623 #if !(CONFIG_REALTIME_ONLY) |  | 
| 624     if (x->optimize) | 590     if (x->optimize) | 
| 625         optimize_mb(x, rtcd); | 591         optimize_mb(x, rtcd); | 
| 626 #endif |  | 
| 627 | 592 | 
| 628     vp8_inverse_transform_mb(IF_RTCD(&rtcd->common->idct), &x->e_mbd); | 593     vp8_inverse_transform_mb(IF_RTCD(&rtcd->common->idct), &x->e_mbd); | 
| 629 | 594 | 
| 630     RECON_INVOKE(&rtcd->common->recon, recon_mb) | 595     RECON_INVOKE(&rtcd->common->recon, recon_mb) | 
| 631         (IF_RTCD(&rtcd->common->recon), &x->e_mbd); | 596         (IF_RTCD(&rtcd->common->recon), &x->e_mbd); | 
| 632 } | 597 } | 
| 633 | 598 | 
| 634 | 599 | 
| 635 /* this funciton is used by first pass only */ | 600 /* this funciton is used by first pass only */ | 
| 636 void vp8_encode_inter16x16y(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 601 void vp8_encode_inter16x16y(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 
| 637 { | 602 { | 
| 638     vp8_build_inter_predictors_mby(&x->e_mbd); | 603     BLOCK *b = &x->block[0]; | 
| 639 | 604 | 
| 640     ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, x->src.y_buffer, x->e_
     mbd.predictor, x->src.y_stride); | 605     vp8_build_inter16x16_predictors_mby(&x->e_mbd); | 
|  | 606 | 
|  | 607     ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, *(b->base_src), x->e_m
     bd.predictor, b->src_stride); | 
| 641 | 608 | 
| 642     transform_mby(x); | 609     transform_mby(x); | 
| 643 | 610 | 
| 644     vp8_quantize_mby(x); | 611     vp8_quantize_mby(x); | 
| 645 | 612 | 
| 646     vp8_inverse_transform_mby(IF_RTCD(&rtcd->common->idct), &x->e_mbd); | 613     vp8_inverse_transform_mby(IF_RTCD(&rtcd->common->idct), &x->e_mbd); | 
| 647 | 614 | 
| 648     RECON_INVOKE(&rtcd->common->recon, recon_mby) | 615     RECON_INVOKE(&rtcd->common->recon, recon_mby) | 
| 649         (IF_RTCD(&rtcd->common->recon), &x->e_mbd); | 616         (IF_RTCD(&rtcd->common->recon), &x->e_mbd); | 
| 650 } | 617 } | 
| 651 | 618 | 
| 652 | 619 | 
| 653 void vp8_encode_inter16x16uvrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 620 void vp8_encode_inter16x16uvrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) | 
| 654 { | 621 { | 
| 655     vp8_build_inter_predictors_mbuv(&x->e_mbd); | 622     vp8_build_inter_predictors_mbuv(&x->e_mbd); | 
| 656     ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->s
     rc.v_buffer, x->e_mbd.predictor, x->src.uv_stride); | 623     ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->s
     rc.v_buffer, x->e_mbd.predictor, x->src.uv_stride); | 
| 657 | 624 | 
| 658     vp8_transform_mbuv(x); | 625     vp8_transform_mbuv(x); | 
| 659 | 626 | 
| 660     vp8_quantize_mbuv(x); | 627     vp8_quantize_mbuv(x); | 
| 661 | 628 | 
| 662 } | 629 } | 
| OLD | NEW | 
|---|