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