00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/avassert.h"
00023 #include "libavcodec/avcodec.h"
00024 #include "libavcodec/dsputil.h"
00025 #include "libavcodec/mpegvideo.h"
00026 #include "mpegvideo_arm.h"
00027
00028 void ff_dct_unquantize_h263_armv5te(DCTELEM *block, int qmul, int qadd, int count);
00029
00030 #ifdef ENABLE_ARM_TESTS
00031
00036 static inline void dct_unquantize_h263_helper_c(DCTELEM *block, int qmul, int qadd, int count)
00037 {
00038 int i, level;
00039 for (i = 0; i < count; i++) {
00040 level = block[i];
00041 if (level) {
00042 if (level < 0) {
00043 level = level * qmul - qadd;
00044 } else {
00045 level = level * qmul + qadd;
00046 }
00047 block[i] = level;
00048 }
00049 }
00050 }
00051 #endif
00052
00053 static void dct_unquantize_h263_intra_armv5te(MpegEncContext *s,
00054 DCTELEM *block, int n, int qscale)
00055 {
00056 int level, qmul, qadd;
00057 int nCoeffs;
00058
00059 av_assert2(s->block_last_index[n]>=0);
00060
00061 qmul = qscale << 1;
00062
00063 if (!s->h263_aic) {
00064 if (n < 4)
00065 level = block[0] * s->y_dc_scale;
00066 else
00067 level = block[0] * s->c_dc_scale;
00068 qadd = (qscale - 1) | 1;
00069 }else{
00070 qadd = 0;
00071 level = block[0];
00072 }
00073 if(s->ac_pred)
00074 nCoeffs=63;
00075 else
00076 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
00077
00078 ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
00079 block[0] = level;
00080 }
00081
00082 static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s,
00083 DCTELEM *block, int n, int qscale)
00084 {
00085 int qmul, qadd;
00086 int nCoeffs;
00087
00088 av_assert2(s->block_last_index[n]>=0);
00089
00090 qadd = (qscale - 1) | 1;
00091 qmul = qscale << 1;
00092
00093 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
00094
00095 ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
00096 }
00097
00098 void ff_MPV_common_init_armv5te(MpegEncContext *s)
00099 {
00100 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te;
00101 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te;
00102 }