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