| @@ -24,6 +24,7 @@ · 23 unmodified lines |
| 24 | 24 | #include "avcodec.h" |
| 25 | 25 | #include "dsputil.h" |
| 26 | 26 | #include "binkdata.h" |
| 27 | +#include "binkdsp.h" |
| 27 | 28 | #include "mathops.h" |
| 28 | 29 | |
| 29 | 30 | #define ALT_BITSTREAM_READER_LE |
| @@ -60,8 +61,8 @@ static const int binkb_bundle_signed[BINKB_NB_SRC] = { · 30 unmodified lines |
| 60 | 61 | 0, 0, 0, 1, 1, 0, 1, 0, 0, 0 |
| 61 | 62 | }; |
| 62 | 63 | |
| 63 | | −static uint32_t binkb_intra_quant[16][64]; |
| 64 | | −static uint32_t binkb_inter_quant[16][64]; |
| 64 | +static int32_t binkb_intra_quant[16][64]; |
| 65 | +static int32_t binkb_inter_quant[16][64]; |
| 65 | 66 | |
| 66 | 67 | /** |
| 67 | 68 | * IDs for different data types used in Bink video codec |
| @@ -109,11 +110,11 @@ typedef struct Bundle { · 41 unmodified lines |
| 109 | 110 | typedef struct BinkContext { |
| 110 | 111 | AVCodecContext *avctx; |
| 111 | 112 | DSPContext dsp; |
| 113 | + BinkDSPContext bdsp; |
| 112 | 114 | AVFrame pic, last; |
| 113 | 115 | int version; ///< internal Bink file version |
| 114 | 116 | int has_alpha; |
| 115 | 117 | int swap_planes; |
| 116 | | − ScanTable scantable; ///< permutated scantable for DCT coeffs decoding |
| 117 | 118 | |
| 118 | 119 | Bundle bundle[BINKB_NB_SRC]; ///< bundles for decoding all data types |
| 119 | 120 | Tree col_high[16]; ///< trees for decoding high nibble in "colours" data type |
| @@ -580,8 +581,8 @@ static inline int binkb_get_value(BinkContext *c, int bundle_num) · 460 unmodified lines |
| 580 | 581 | * @param quant_matrices quantization matrices |
| 581 | 582 | * @return 0 for success, negative value in other cases |
| 582 | 583 | */ |
| 583 | | −static int read_dct_coeffs(GetBitContext *gb, DCTELEM block[64], const uint8_t *scan, |
| 584 | | − const uint32_t quant_matrices[16][64], int q) |
| 584 | +static int read_dct_coeffs(GetBitContext *gb, int32_t block[64], const uint8_t *scan, |
| 585 | + const int32_t quant_matrices[16][64], int q) |
| 585 | 586 | { |
| 586 | 587 | int coef_list[128]; |
| 587 | 588 | int mode_list[128]; |
| @@ -590,7 +591,7 @@ static int read_dct_coeffs(GetBitContext *gb, DCTELEM block[64], const uint8_t * · 2 unmodified lines |
| 590 | 591 | int coef_count = 0; |
| 591 | 592 | int coef_idx[64]; |
| 592 | 593 | int quant_idx; |
| 593 | | − const uint32_t *quant; |
| 594 | + const int32_t *quant; |
| 594 | 595 | |
| 595 | 596 | coef_list[list_end] = 4; mode_list[list_end++] = 0; |
| 596 | 597 | coef_list[list_end] = 24; mode_list[list_end++] = 0; |
| @@ -791,6 +792,7 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 194 unmodified lines |
| 791 | 792 | const uint8_t *scan; |
| 792 | 793 | int xoff, yoff; |
| 793 | 794 | LOCAL_ALIGNED_16(DCTELEM, block, [64]); |
| 795 | + LOCAL_ALIGNED_16(int32_t, dctblock, [64]); |
| 794 | 796 | int coordmap[64]; |
| 795 | 797 | int ybias = is_key ? -15 : 0; |
| 796 | 798 | int qp; |
| @@ -845,11 +847,11 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 48 unmodified lines |
| 845 | 847 | dst[coordmap[*scan++]] = binkb_get_value(c, BINKB_SRC_COLORS); |
| 846 | 848 | break; |
| 847 | 849 | case 2: |
| 848 | | − c->dsp.clear_block(block); |
| 849 | | − block[0] = binkb_get_value(c, BINKB_SRC_INTRA_DC); |
| 850 | + memset(dctblock, 0, sizeof(*dctblock) * 64); |
| 851 | + dctblock[0] = binkb_get_value(c, BINKB_SRC_INTRA_DC); |
| 850 | 852 | qp = binkb_get_value(c, BINKB_SRC_INTRA_Q); |
| 851 | | − read_dct_coeffs(gb, block, c->scantable.permutated, binkb_intra_quant, qp); |
| 852 | | − c->dsp.idct_put(dst, stride, block); |
| 853 | + read_dct_coeffs(gb, dctblock, bink_scan, binkb_intra_quant, qp); |
| 854 | + c->bdsp.idct_put(dst, stride, dctblock); |
| 853 | 855 | break; |
| 854 | 856 | case 3: |
| 855 | 857 | xoff = binkb_get_value(c, BINKB_SRC_X_OFF); |
| @@ -878,11 +880,11 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 22 unmodified lines |
| 878 | 880 | } else { |
| 879 | 881 | put_pixels8x8_overlapped(dst, ref, stride); |
| 880 | 882 | } |
| 881 | | − c->dsp.clear_block(block); |
| 882 | | − block[0] = binkb_get_value(c, BINKB_SRC_INTER_DC); |
| 883 | + memset(dctblock, 0, sizeof(*dctblock) * 64); |
| 884 | + dctblock[0] = binkb_get_value(c, BINKB_SRC_INTER_DC); |
| 883 | 885 | qp = binkb_get_value(c, BINKB_SRC_INTER_Q); |
| 884 | | − read_dct_coeffs(gb, block, c->scantable.permutated, binkb_inter_quant, qp); |
| 885 | | − c->dsp.idct_add(dst, stride, block); |
| 886 | + read_dct_coeffs(gb, dctblock, bink_scan, binkb_inter_quant, qp); |
| 887 | + c->bdsp.idct_add(dst, stride, dctblock); |
| 886 | 888 | break; |
| 887 | 889 | case 5: |
| 888 | 890 | v = binkb_get_value(c, BINKB_SRC_COLORS); |
| @@ -937,6 +939,7 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 48 unmodified lines |
| 937 | 939 | int xoff, yoff; |
| 938 | 940 | LOCAL_ALIGNED_16(DCTELEM, block, [64]); |
| 939 | 941 | LOCAL_ALIGNED_16(uint8_t, ublock, [64]); |
| 942 | + LOCAL_ALIGNED_16(int32_t, dctblock, [64]); |
| 940 | 943 | int coordmap[64]; |
| 941 | 944 | |
| 942 | 945 | const int stride = c->pic.linesize[plane_idx]; |
| @@ -1019,11 +1022,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 76 unmodified lines |
| 1019 | 1022 | ublock[*scan++] = get_value(c, BINK_SRC_COLORS); |
| 1020 | 1023 | break; |
| 1021 | 1024 | case INTRA_BLOCK: |
| 1022 | | − c->dsp.clear_block(block); |
| 1023 | | − block[0] = get_value(c, BINK_SRC_INTRA_DC); |
| 1024 | | − read_dct_coeffs(gb, block, c->scantable.permutated, bink_intra_quant, -1); |
| 1025 | | − c->dsp.idct(block); |
| 1026 | | − c->dsp.put_pixels_nonclamped(block, ublock, 8); |
| 1025 | + memset(dctblock, 0, sizeof(*dctblock) * 64); |
| 1026 | + dctblock[0] = get_value(c, BINK_SRC_INTRA_DC); |
| 1027 | + read_dct_coeffs(gb, dctblock, bink_scan, bink_intra_quant, -1); |
| 1028 | + c->bdsp.idct_put(ublock, 8, dctblock); |
| 1027 | 1029 | break; |
| 1028 | 1030 | case FILL_BLOCK: |
| 1029 | 1031 | v = get_value(c, BINK_SRC_COLORS); |
| @@ -1103,10 +1105,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 73 unmodified lines |
| 1103 | 1105 | c->dsp.add_pixels8(dst, block, stride); |
| 1104 | 1106 | break; |
| 1105 | 1107 | case INTRA_BLOCK: |
| 1106 | | − c->dsp.clear_block(block); |
| 1107 | | − block[0] = get_value(c, BINK_SRC_INTRA_DC); |
| 1108 | | − read_dct_coeffs(gb, block, c->scantable.permutated, bink_intra_quant, -1); |
| 1109 | | − c->dsp.idct_put(dst, stride, block); |
| 1108 | + memset(dctblock, 0, sizeof(*dctblock) * 64); |
| 1109 | + dctblock[0] = get_value(c, BINK_SRC_INTRA_DC); |
| 1110 | + read_dct_coeffs(gb, dctblock, bink_scan, bink_intra_quant, -1); |
| 1111 | + c->bdsp.idct_put(dst, stride, dctblock); |
| 1110 | 1112 | break; |
| 1111 | 1113 | case FILL_BLOCK: |
| 1112 | 1114 | v = get_value(c, BINK_SRC_COLORS); |
| @@ -1117,10 +1119,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx, · 4 unmodified lines |
| 1117 | 1119 | yoff = get_value(c, BINK_SRC_Y_OFF); |
| 1118 | 1120 | ref = prev + xoff + yoff * stride; |
| 1119 | 1121 | c->dsp.put_pixels_tab[1][0](dst, ref, stride, 8); |
| 1120 | | − c->dsp.clear_block(block); |
| 1121 | | − block[0] = get_value(c, BINK_SRC_INTER_DC); |
| 1122 | | − read_dct_coeffs(gb, block, c->scantable.permutated, bink_inter_quant, -1); |
| 1123 | | − c->dsp.idct_add(dst, stride, block); |
| 1122 | + memset(dctblock, 0, sizeof(*dctblock) * 64); |
| 1123 | + dctblock[0] = get_value(c, BINK_SRC_INTER_DC); |
| 1124 | + read_dct_coeffs(gb, dctblock, bink_scan, bink_inter_quant, -1); |
| 1125 | + c->bdsp.idct_add(dst, stride, dctblock); |
| 1124 | 1126 | break; |
| 1125 | 1127 | case PATTERN_BLOCK: |
| 1126 | 1128 | for (i = 0; i < 2; i++) |
| @@ -1288,7 +1290,7 @@ static av_cold int decode_init(AVCodecContext *avctx) · 161 unmodified lines |
| 1288 | 1290 | |
| 1289 | 1291 | avctx->idct_algo = FF_IDCT_BINK; |
| 1290 | 1292 | dsputil_init(&c->dsp, avctx); |
| 1291 | | − ff_init_scantable(c->dsp.idct_permutation, &c->scantable, bink_scan); |
| 1293 | + ff_binkdsp_init(&c->bdsp); |
| 1292 | 1294 | |
| 1293 | 1295 | init_bundles(c); |
| 1294 | 1296 | |