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.

102 lines
3.0KB

  1. /*
  2. * Optimization of some functions from mpegvideo.c for armv5te
  3. * Copyright (c) 2007 Siarhei Siamashka <ssvb@users.sourceforge.net>
  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 "libavcodec/avcodec.h"
  22. #include "libavcodec/dsputil.h"
  23. #include "libavcodec/mpegvideo.h"
  24. #include "mpegvideo_arm.h"
  25. void ff_dct_unquantize_h263_armv5te(DCTELEM *block, int qmul, int qadd, int count);
  26. #ifdef ENABLE_ARM_TESTS
  27. /**
  28. * h263 dequantizer supplementary function, it is performance critical and needs to
  29. * have optimized implementations for each architecture. Is also used as a reference
  30. * implementation in regression tests
  31. */
  32. static inline void dct_unquantize_h263_helper_c(DCTELEM *block, int qmul, int qadd, int count)
  33. {
  34. int i, level;
  35. for (i = 0; i < count; i++) {
  36. level = block[i];
  37. if (level) {
  38. if (level < 0) {
  39. level = level * qmul - qadd;
  40. } else {
  41. level = level * qmul + qadd;
  42. }
  43. block[i] = level;
  44. }
  45. }
  46. }
  47. #endif
  48. static void dct_unquantize_h263_intra_armv5te(MpegEncContext *s,
  49. DCTELEM *block, int n, int qscale)
  50. {
  51. int level, qmul, qadd;
  52. int nCoeffs;
  53. assert(s->block_last_index[n]>=0);
  54. qmul = qscale << 1;
  55. if (!s->h263_aic) {
  56. if (n < 4)
  57. level = block[0] * s->y_dc_scale;
  58. else
  59. level = block[0] * s->c_dc_scale;
  60. qadd = (qscale - 1) | 1;
  61. }else{
  62. qadd = 0;
  63. level = block[0];
  64. }
  65. if(s->ac_pred)
  66. nCoeffs=63;
  67. else
  68. nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
  69. ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
  70. block[0] = level;
  71. }
  72. static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s,
  73. DCTELEM *block, int n, int qscale)
  74. {
  75. int qmul, qadd;
  76. int nCoeffs;
  77. assert(s->block_last_index[n]>=0);
  78. qadd = (qscale - 1) | 1;
  79. qmul = qscale << 1;
  80. nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
  81. ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
  82. }
  83. void ff_MPV_common_init_armv5te(MpegEncContext *s)
  84. {
  85. s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te;
  86. s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te;
  87. }