Originally committed as revision 24416 to svn://svn.ffmpeg.org/ffmpeg/trunk
Unified · Split
| @@ -109,6 +109,7 @@ typedef struct { · 108 unmodified lines | ||
| 109 | 109 | */ |
| 110 | 110 | DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; |
| 111 | 111 | DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16]; |
| 112 | + uint8_t intra4x4_pred_mode_mb[16]; | |
| 112 | 113 | |
| 113 | 114 | int chroma_pred_mode; ///< 8x8c pred mode of the current macroblock |
| 114 | 115 | |
| @@ -670,19 +671,22 @@ static int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, · 555 unmodified lines | ||
| 670 | 671 | static inline void decode_intra4x4_modes(VP56RangeCoder *c, uint8_t *intra4x4, |
| 671 | 672 | int stride, int keyframe) |
| 672 | 673 | { |
| 673 | − int x, y, t, l; | |
| 674 | − const uint8_t *ctx = vp8_pred4x4_prob_inter; | |
| 674 | + int x, y, t, l, i; | |
| 675 | 675 | |
| 676 | − for (y = 0; y < 4; y++) { | |
| 677 | − for (x = 0; x < 4; x++) { | |
| 678 | − if (keyframe) { | |
| 676 | + if (keyframe) { | |
| 677 | + const uint8_t *ctx; | |
| 678 | + for (y = 0; y < 4; y++) { | |
| 679 | + for (x = 0; x < 4; x++) { | |
| 679 | 680 | t = intra4x4[x - stride]; |
| 680 | 681 | l = intra4x4[x - 1]; |
| 681 | 682 | ctx = vp8_pred4x4_prob_intra[t][l]; |
| 683 | + intra4x4[x] = vp8_rac_get_tree(c, vp8_pred4x4_tree, ctx); | |
| 682 | 684 | } |
| 683 | − intra4x4[x] = vp8_rac_get_tree(c, vp8_pred4x4_tree, ctx); | |
| 685 | + intra4x4 += stride; | |
| 684 | 686 | } |
| 685 | − intra4x4 += stride; | |
| 687 | + } else { | |
| 688 | + for (i = 0; i < 16; i++) | |
| 689 | + intra4x4[i] = vp8_rac_get_tree(c, vp8_pred4x4_tree, vp8_pred4x4_prob_inter); | |
| 686 | 690 | } |
| 687 | 691 | } |
| 688 | 692 | |
| @@ -753,7 +757,7 @@ static void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, · 64 unmodified lines | ||
| 753 | 757 | mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_inter, s->prob->pred16x16); |
| 754 | 758 | |
| 755 | 759 | if (mb->mode == MODE_I4x4) |
| 756 | − decode_intra4x4_modes(c, intra4x4, s->b4_stride, 0); | |
| 760 | + decode_intra4x4_modes(c, intra4x4, 4, 0); | |
| 757 | 761 | |
| 758 | 762 | s->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, s->prob->pred8x8c); |
| 759 | 763 | mb->ref_frame = VP56_FRAME_CURRENT; |
| @@ -922,7 +926,7 @@ static int check_intra_pred_mode(int mode, int mb_x, int mb_y) · 162 unmodified lines | ||
| 922 | 926 | } |
| 923 | 927 | |
| 924 | 928 | static void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, |
| 925 | − uint8_t *bmode, int mb_x, int mb_y) | |
| 929 | + uint8_t *intra4x4, int mb_x, int mb_y) | |
| 926 | 930 | { |
| 927 | 931 | int x, y, mode, nnz, tr; |
| 928 | 932 | |
| @@ -938,6 +942,7 @@ static void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, · 9 unmodified lines | ||
| 938 | 942 | s->hpc.pred16x16[mode](dst[0], s->linesize); |
| 939 | 943 | } else { |
| 940 | 944 | uint8_t *ptr = dst[0]; |
| 945 | + int stride = s->keyframe ? s->b4_stride : 4; | |
| 941 | 946 | |
| 942 | 947 | // all blocks on the right edge of the macroblock use bottom edge |
| 943 | 948 | // the top macroblock for their topright edge |
| @@ -956,7 +961,7 @@ static void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, · 12 unmodified lines | ||
| 956 | 961 | if (x == 3) |
| 957 | 962 | topright = tr_right; |
| 958 | 963 | |
| 959 | − s->hpc.pred4x4[bmode[x]](ptr+4*x, topright, s->linesize); | |
| 964 | + s->hpc.pred4x4[intra4x4[x]](ptr+4*x, topright, s->linesize); | |
| 960 | 965 | |
| 961 | 966 | nnz = s->non_zero_count_cache[y][x]; |
| 962 | 967 | if (nnz) { |
| @@ -969,7 +974,7 @@ static void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, · 6 unmodified lines | ||
| 969 | 974 | } |
| 970 | 975 | |
| 971 | 976 | ptr += 4*s->linesize; |
| 972 | − bmode += s->b4_stride; | |
| 977 | + intra4x4 += stride; | |
| 973 | 978 | } |
| 974 | 979 | } |
| 975 | 980 | |
| @@ -1457,11 +1462,13 @@ static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size, · 481 unmodified lines | ||
| 1457 | 1462 | memset(s->top_border, 129, sizeof(*s->top_border)); |
| 1458 | 1463 | |
| 1459 | 1464 | for (mb_x = 0; mb_x < s->mb_width; mb_x++) { |
| 1465 | + uint8_t *intra4x4_mb = s->keyframe ? intra4x4 + 4*mb_x : s->intra4x4_pred_mode_mb; | |
| 1466 | + | |
| 1460 | 1467 | /* Prefetch the current frame, 4 MBs ahead */ |
| 1461 | 1468 | s->dsp.prefetch(dst[0] + (mb_x&3)*4*s->linesize + 64, s->linesize, 4); |
| 1462 | 1469 | s->dsp.prefetch(dst[1] + (mb_x&7)*s->uvlinesize + 64, dst[2] - dst[1], 2); |
| 1463 | 1470 | |
| 1464 | − decode_mb_mode(s, mb, mb_x, mb_y, intra4x4 + 4*mb_x); | |
| 1471 | + decode_mb_mode(s, mb, mb_x, mb_y, intra4x4_mb); | |
| 1465 | 1472 | |
| 1466 | 1473 | if (!mb->skip) |
| 1467 | 1474 | decode_mb_coeffs(s, c, mb, s->top_nnz[mb_x], s->left_nnz); |
| @@ -1471,7 +1478,7 @@ static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size, · 3 unmodified lines | ||
| 1471 | 1478 | } |
| 1472 | 1479 | |
| 1473 | 1480 | if (mb->mode <= MODE_I4x4) { |
| 1474 | − intra_predict(s, dst, mb, intra4x4 + 4*mb_x, mb_x, mb_y); | |
| 1481 | + intra_predict(s, dst, mb, intra4x4_mb, mb_x, mb_y); | |
| 1475 | 1482 | memset(mb->bmv, 0, sizeof(mb->bmv)); |
| 1476 | 1483 | } else { |
| 1477 | 1484 | inter_predict(s, dst, mb, mb_x, mb_y); |