You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.5KB

  1. /*
  2. * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
  3. * Copyright (c) 2003-2010 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "h264qpel.h"
  22. #define pixeltmp int16_t
  23. #define BIT_DEPTH 8
  24. #include "h264qpel_template.c"
  25. #undef BIT_DEPTH
  26. #define BIT_DEPTH 9
  27. #include "h264qpel_template.c"
  28. #undef BIT_DEPTH
  29. #define BIT_DEPTH 10
  30. #include "h264qpel_template.c"
  31. #undef BIT_DEPTH
  32. #undef pixeltmp
  33. #define pixeltmp int32_t
  34. #define BIT_DEPTH 12
  35. #include "h264qpel_template.c"
  36. #undef BIT_DEPTH
  37. #define BIT_DEPTH 14
  38. #include "h264qpel_template.c"
  39. #undef BIT_DEPTH
  40. void ff_h264qpel_init(H264QpelContext *c, int bit_depth)
  41. {
  42. #undef FUNCC
  43. #define FUNCC(f, depth) f ## _ ## depth ## _c
  44. #define dspfunc2(PFX, IDX, NUM, depth) \
  45. c->PFX ## _pixels_tab[IDX][ 0] = FUNCC(PFX ## NUM ## _mc00, depth); \
  46. c->PFX ## _pixels_tab[IDX][ 1] = FUNCC(PFX ## NUM ## _mc10, depth); \
  47. c->PFX ## _pixels_tab[IDX][ 2] = FUNCC(PFX ## NUM ## _mc20, depth); \
  48. c->PFX ## _pixels_tab[IDX][ 3] = FUNCC(PFX ## NUM ## _mc30, depth); \
  49. c->PFX ## _pixels_tab[IDX][ 4] = FUNCC(PFX ## NUM ## _mc01, depth); \
  50. c->PFX ## _pixels_tab[IDX][ 5] = FUNCC(PFX ## NUM ## _mc11, depth); \
  51. c->PFX ## _pixels_tab[IDX][ 6] = FUNCC(PFX ## NUM ## _mc21, depth); \
  52. c->PFX ## _pixels_tab[IDX][ 7] = FUNCC(PFX ## NUM ## _mc31, depth); \
  53. c->PFX ## _pixels_tab[IDX][ 8] = FUNCC(PFX ## NUM ## _mc02, depth); \
  54. c->PFX ## _pixels_tab[IDX][ 9] = FUNCC(PFX ## NUM ## _mc12, depth); \
  55. c->PFX ## _pixels_tab[IDX][10] = FUNCC(PFX ## NUM ## _mc22, depth); \
  56. c->PFX ## _pixels_tab[IDX][11] = FUNCC(PFX ## NUM ## _mc32, depth); \
  57. c->PFX ## _pixels_tab[IDX][12] = FUNCC(PFX ## NUM ## _mc03, depth); \
  58. c->PFX ## _pixels_tab[IDX][13] = FUNCC(PFX ## NUM ## _mc13, depth); \
  59. c->PFX ## _pixels_tab[IDX][14] = FUNCC(PFX ## NUM ## _mc23, depth); \
  60. c->PFX ## _pixels_tab[IDX][15] = FUNCC(PFX ## NUM ## _mc33, depth)
  61. #define SET_QPEL(depth) \
  62. dspfunc2(put_h264_qpel, 0, 16, depth); \
  63. dspfunc2(put_h264_qpel, 1, 8, depth); \
  64. dspfunc2(put_h264_qpel, 2, 4, depth); \
  65. dspfunc2(put_h264_qpel, 3, 2, depth); \
  66. dspfunc2(avg_h264_qpel, 0, 16, depth); \
  67. dspfunc2(avg_h264_qpel, 1, 8, depth); \
  68. dspfunc2(avg_h264_qpel, 2, 4, depth)
  69. switch (bit_depth) {
  70. default:
  71. SET_QPEL(8);
  72. break;
  73. case 9:
  74. SET_QPEL(9);
  75. break;
  76. case 10:
  77. SET_QPEL(10);
  78. break;
  79. case 12:
  80. SET_QPEL(12);
  81. break;
  82. case 14:
  83. SET_QPEL(14);
  84. break;
  85. }
  86. if (ARCH_ARM)
  87. ff_h264qpel_init_arm(c, bit_depth);
  88. if (ARCH_PPC)
  89. ff_h264qpel_init_ppc(c, bit_depth);
  90. if (ARCH_X86)
  91. ff_h264qpel_init_x86(c, bit_depth);
  92. }