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 |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "vp9/encoder/vp9_encodemb.h" | 22 #include "vp9/encoder/vp9_encodemb.h" |
23 #include "vp9/encoder/vp9_quantize.h" | 23 #include "vp9/encoder/vp9_quantize.h" |
24 #include "vp9/encoder/vp9_rd.h" | 24 #include "vp9/encoder/vp9_rd.h" |
25 #include "vp9/encoder/vp9_tokenize.h" | 25 #include "vp9/encoder/vp9_tokenize.h" |
26 | 26 |
27 struct optimize_ctx { | 27 struct optimize_ctx { |
28 ENTROPY_CONTEXT ta[MAX_MB_PLANE][16]; | 28 ENTROPY_CONTEXT ta[MAX_MB_PLANE][16]; |
29 ENTROPY_CONTEXT tl[MAX_MB_PLANE][16]; | 29 ENTROPY_CONTEXT tl[MAX_MB_PLANE][16]; |
30 }; | 30 }; |
31 | 31 |
32 struct encode_b_args { | |
33 MACROBLOCK *x; | |
34 struct optimize_ctx *ctx; | |
35 int8_t *skip; | |
36 }; | |
37 | |
38 void vp9_subtract_block_c(int rows, int cols, | 32 void vp9_subtract_block_c(int rows, int cols, |
39 int16_t *diff, ptrdiff_t diff_stride, | 33 int16_t *diff, ptrdiff_t diff_stride, |
40 const uint8_t *src, ptrdiff_t src_stride, | 34 const uint8_t *src, ptrdiff_t src_stride, |
41 const uint8_t *pred, ptrdiff_t pred_stride) { | 35 const uint8_t *pred, ptrdiff_t pred_stride) { |
42 int r, c; | 36 int r, c; |
43 | 37 |
44 for (r = 0; r < rows; r++) { | 38 for (r = 0; r < rows; r++) { |
45 for (c = 0; c < cols; c++) | 39 for (c = 0; c < cols; c++) |
46 diff[c] = src[c] - pred[c]; | 40 diff[c] = src[c] - pred[c]; |
47 | 41 |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 scan_order->iscan); | 431 scan_order->iscan); |
438 break; | 432 break; |
439 case TX_16X16: | 433 case TX_16X16: |
440 vp9_fdct16x16(src_diff, coeff, diff_stride); | 434 vp9_fdct16x16(src_diff, coeff, diff_stride); |
441 vp9_quantize_fp(coeff, 256, x->skip_block, p->zbin, p->round_fp, | 435 vp9_quantize_fp(coeff, 256, x->skip_block, p->zbin, p->round_fp, |
442 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, | 436 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, |
443 pd->dequant, p->zbin_extra, eob, | 437 pd->dequant, p->zbin_extra, eob, |
444 scan_order->scan, scan_order->iscan); | 438 scan_order->scan, scan_order->iscan); |
445 break; | 439 break; |
446 case TX_8X8: | 440 case TX_8X8: |
447 vp9_fdct8x8(src_diff, coeff, diff_stride); | 441 vp9_fdct8x8_quant(src_diff, diff_stride, coeff, 64, |
448 vp9_quantize_fp(coeff, 64, x->skip_block, p->zbin, p->round_fp, | 442 x->skip_block, p->zbin, p->round_fp, |
449 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, | 443 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, |
450 pd->dequant, p->zbin_extra, eob, | 444 pd->dequant, p->zbin_extra, eob, |
451 scan_order->scan, scan_order->iscan); | 445 scan_order->scan, scan_order->iscan); |
452 break; | 446 break; |
453 case TX_4X4: | 447 case TX_4X4: |
454 x->fwd_txm4x4(src_diff, coeff, diff_stride); | 448 x->fwd_txm4x4(src_diff, coeff, diff_stride); |
455 vp9_quantize_fp(coeff, 16, x->skip_block, p->zbin, p->round_fp, | 449 vp9_quantize_fp(coeff, 16, x->skip_block, p->zbin, p->round_fp, |
456 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, | 450 p->quant_fp, p->quant_shift, qcoeff, dqcoeff, |
457 pd->dequant, p->zbin_extra, eob, | 451 pd->dequant, p->zbin_extra, eob, |
458 scan_order->scan, scan_order->iscan); | 452 scan_order->scan, scan_order->iscan); |
459 break; | 453 break; |
460 default: | 454 default: |
461 assert(0); | 455 assert(0); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 l = &ctx->tl[plane][j]; | 645 l = &ctx->tl[plane][j]; |
652 | 646 |
653 // TODO(jingning): per transformed block zero forcing only enabled for | 647 // TODO(jingning): per transformed block zero forcing only enabled for |
654 // luma component. will integrate chroma components as well. | 648 // luma component. will integrate chroma components as well. |
655 if (x->zcoeff_blk[tx_size][block] && plane == 0) { | 649 if (x->zcoeff_blk[tx_size][block] && plane == 0) { |
656 p->eobs[block] = 0; | 650 p->eobs[block] = 0; |
657 *a = *l = 0; | 651 *a = *l = 0; |
658 return; | 652 return; |
659 } | 653 } |
660 | 654 |
| 655 #if CONFIG_VP9_HIGHBITDEPTH |
| 656 if (!x->skip_recode) |
| 657 vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
| 658 #else |
661 if (!x->skip_recode) { | 659 if (!x->skip_recode) { |
662 if (max_txsize_lookup[plane_bsize] == tx_size) { | 660 if (max_txsize_lookup[plane_bsize] == tx_size) { |
663 if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] == 0) { | 661 if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] == 0) { |
664 // full forward transform and quantization | 662 // full forward transform and quantization |
665 if (x->quant_fp) | 663 if (x->quant_fp) |
666 vp9_xform_quant_fp(x, plane, block, plane_bsize, tx_size); | 664 vp9_xform_quant_fp(x, plane, block, plane_bsize, tx_size); |
667 else | 665 else |
668 vp9_xform_quant(x, plane, block, plane_bsize, tx_size); | 666 vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
669 } else if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] == 2) { | 667 } else if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] == 2) { |
670 // fast path forward transform and quantization | 668 // fast path forward transform and quantization |
671 vp9_xform_quant_dc(x, plane, block, plane_bsize, tx_size); | 669 vp9_xform_quant_dc(x, plane, block, plane_bsize, tx_size); |
672 } else { | 670 } else { |
673 // skip forward transform | 671 // skip forward transform |
674 p->eobs[block] = 0; | 672 p->eobs[block] = 0; |
675 *a = *l = 0; | 673 *a = *l = 0; |
676 return; | 674 return; |
677 } | 675 } |
678 } else { | 676 } else { |
679 vp9_xform_quant(x, plane, block, plane_bsize, tx_size); | 677 if (x->quant_fp) |
| 678 vp9_xform_quant_fp(x, plane, block, plane_bsize, tx_size); |
| 679 else |
| 680 vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
680 } | 681 } |
681 } | 682 } |
| 683 #endif |
682 | 684 |
683 if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { | 685 if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { |
684 const int ctx = combine_entropy_contexts(*a, *l); | 686 const int ctx = combine_entropy_contexts(*a, *l); |
685 *a = *l = optimize_b(x, plane, block, tx_size, ctx) > 0; | 687 *a = *l = optimize_b(x, plane, block, tx_size, ctx) > 0; |
686 } else { | 688 } else { |
687 *a = *l = p->eobs[block] > 0; | 689 *a = *l = p->eobs[block] > 0; |
688 } | 690 } |
689 | 691 |
690 if (p->eobs[block]) | 692 if (p->eobs[block]) |
691 *(args->skip) = 0; | 693 *(args->skip) = 0; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd) : mbmi->tx_size; | 797 const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd) : mbmi->tx_size; |
796 vp9_get_entropy_contexts(bsize, tx_size, pd, | 798 vp9_get_entropy_contexts(bsize, tx_size, pd, |
797 ctx.ta[plane], ctx.tl[plane]); | 799 ctx.ta[plane], ctx.tl[plane]); |
798 } | 800 } |
799 | 801 |
800 vp9_foreach_transformed_block_in_plane(xd, bsize, plane, encode_block, | 802 vp9_foreach_transformed_block_in_plane(xd, bsize, plane, encode_block, |
801 &arg); | 803 &arg); |
802 } | 804 } |
803 } | 805 } |
804 | 806 |
805 static void encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, | 807 void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, |
806 TX_SIZE tx_size, void *arg) { | 808 TX_SIZE tx_size, void *arg) { |
807 struct encode_b_args* const args = arg; | 809 struct encode_b_args* const args = arg; |
808 MACROBLOCK *const x = args->x; | 810 MACROBLOCK *const x = args->x; |
809 MACROBLOCKD *const xd = &x->e_mbd; | 811 MACROBLOCKD *const xd = &x->e_mbd; |
810 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; | 812 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; |
811 struct macroblock_plane *const p = &x->plane[plane]; | 813 struct macroblock_plane *const p = &x->plane[plane]; |
812 struct macroblockd_plane *const pd = &xd->plane[plane]; | 814 struct macroblockd_plane *const pd = &xd->plane[plane]; |
813 tran_low_t *coeff = BLOCK_OFFSET(p->coeff, block); | 815 tran_low_t *coeff = BLOCK_OFFSET(p->coeff, block); |
814 tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); | 816 tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); |
815 tran_low_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); | 817 tran_low_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 } | 1035 } |
1034 break; | 1036 break; |
1035 default: | 1037 default: |
1036 assert(0); | 1038 assert(0); |
1037 break; | 1039 break; |
1038 } | 1040 } |
1039 if (*eob) | 1041 if (*eob) |
1040 *(args->skip) = 0; | 1042 *(args->skip) = 0; |
1041 } | 1043 } |
1042 | 1044 |
1043 void vp9_encode_block_intra(MACROBLOCK *x, int plane, int block, | |
1044 BLOCK_SIZE plane_bsize, TX_SIZE tx_size, | |
1045 int8_t *skip) { | |
1046 struct encode_b_args arg = {x, NULL, skip}; | |
1047 encode_block_intra(plane, block, plane_bsize, tx_size, &arg); | |
1048 } | |
1049 | |
1050 | |
1051 void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { | 1045 void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
1052 const MACROBLOCKD *const xd = &x->e_mbd; | 1046 const MACROBLOCKD *const xd = &x->e_mbd; |
1053 struct encode_b_args arg = {x, NULL, &xd->mi[0].src_mi->mbmi.skip}; | 1047 struct encode_b_args arg = {x, NULL, &xd->mi[0].src_mi->mbmi.skip}; |
1054 | 1048 |
1055 vp9_foreach_transformed_block_in_plane(xd, bsize, plane, encode_block_intra, | 1049 vp9_foreach_transformed_block_in_plane(xd, bsize, plane, |
1056 &arg); | 1050 vp9_encode_block_intra, &arg); |
1057 } | 1051 } |
OLD | NEW |