diff options
author | James Dong <jdong@google.com> | 2010-07-12 21:46:25 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-07-15 13:28:21 -0700 |
commit | 59f566c4ec3dfc097ad8163523e522280b27e5c3 (patch) | |
tree | 6afe2f257d631e487a959e21015152d1d156cb5b /media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp | |
parent | e957045dcfdc7e08a5d76463b125d2a9e92bc0e8 (diff) | |
download | frameworks_av-59f566c4ec3dfc097ad8163523e522280b27e5c3.zip frameworks_av-59f566c4ec3dfc097ad8163523e522280b27e5c3.tar.gz frameworks_av-59f566c4ec3dfc097ad8163523e522280b27e5c3.tar.bz2 |
Initial check-in for software m4v_h263 encoder
Change-Id: I4b49fa5c3a5e6e21cfd2419441d98dd784046367
Diffstat (limited to 'media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp')
-rw-r--r-- | media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp | 375 |
1 files changed, 375 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp b/media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp new file mode 100644 index 0000000..8d18f45 --- /dev/null +++ b/media/libstagefright/codecs/m4v_h263/enc/src/sad.cpp @@ -0,0 +1,375 @@ +/* ------------------------------------------------------------------ + * Copyright (C) 1998-2009 PacketVideo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. + * See the License for the specific language governing permissions + * and limitations under the License. + * ------------------------------------------------------------------- + */ +#include "mp4def.h" +#include "mp4lib_int.h" + +#include "sad_inline.h" + +#define Cached_lx 176 + +#ifdef _SAD_STAT +ULong num_sad_MB = 0; +ULong num_sad_Blk = 0; +ULong num_sad_MB_call = 0; +ULong num_sad_Blk_call = 0; + +#define NUM_SAD_MB_CALL() num_sad_MB_call++ +#define NUM_SAD_MB() num_sad_MB++ +#define NUM_SAD_BLK_CALL() num_sad_Blk_call++ +#define NUM_SAD_BLK() num_sad_Blk++ + +#else + +#define NUM_SAD_MB_CALL() +#define NUM_SAD_MB() +#define NUM_SAD_BLK_CALL() +#define NUM_SAD_BLK() + +#endif + + +/* consist of +Int SAD_Macroblock_C(UChar *ref,UChar *blk,Int dmin,Int lx,void *extra_info) +Int SAD_MB_HTFM_Collect(UChar *ref,UChar *blk,Int dmin,Int lx,void *extra_info) +Int SAD_MB_HTFM(UChar *ref,UChar *blk,Int dmin,Int lx,void *extra_info) +Int SAD_Block_C(UChar *ref,UChar *blk,Int dmin,Int lx,void *extra_info) +Int SAD_Blk_PADDING(UChar *ref,UChar *cur,Int dmin,Int lx,void *extra_info) +Int SAD_MB_PADDING(UChar *ref,UChar *cur,Int dmin,Int lx,void *extra_info) +Int SAD_MB_PAD1(UChar *ref,UChar *cur,Int dmin,Int lx,Int *rep); +Int SAD_MB_PADDING_HTFM_Collect(UChar *ref,UChar *cur,Int dmin,Int lx,void *extra_info) +Int SAD_MB_PADDING_HTFM(UChar *ref,UChar *cur,Int dmin,Int lx,void *vptr) +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif + + Int SAD_MB_PAD1(UChar *ref, UChar *cur, Int dmin, Int lx, Int *rep); + + + /*================================================================== + Function: SAD_Macroblock + Date: 09/07/2000 + Purpose: Compute SAD 16x16 between blk and ref. + To do: Uniform subsampling will be inserted later! + Hypothesis Testing Fast Matching to be used later! + Changes: + 11/7/00: implemented MMX + 1/24/01: implemented SSE + ==================================================================*/ + /********** C ************/ + Int SAD_Macroblock_C(UChar *ref, UChar *blk, Int dmin_lx, void *extra_info) + { + int32 x10; + Int dmin = (ULong)dmin_lx >> 16; + Int lx = dmin_lx & 0xFFFF; + + OSCL_UNUSED_ARG(extra_info); + + NUM_SAD_MB_CALL(); + + x10 = simd_sad_mb(ref, blk, dmin, lx); + + return x10; + } + +#ifdef HTFM /* HTFM with uniform subsampling implementation, 2/28/01 */ + /*=============================================================== + Function: SAD_MB_HTFM_Collect and SAD_MB_HTFM + Date: 3/2/1 + Purpose: Compute the SAD on a 16x16 block using + uniform subsampling and hypothesis testing fast matching + for early dropout. SAD_MB_HP_HTFM_Collect is to collect + the statistics to compute the thresholds to be used in + SAD_MB_HP_HTFM. + Input/Output: + Changes: + ===============================================================*/ + + Int SAD_MB_HTFM_Collect(UChar *ref, UChar *blk, Int dmin_lx, void *extra_info) + { + Int i; + Int sad = 0; + UChar *p1; + Int lx4 = (dmin_lx << 2) & 0x3FFFC; + ULong cur_word; + Int saddata[16], tmp, tmp2; /* used when collecting flag (global) is on */ + Int difmad; + HTFM_Stat *htfm_stat = (HTFM_Stat*) extra_info; + Int *abs_dif_mad_avg = &(htfm_stat->abs_dif_mad_avg); + UInt *countbreak = &(htfm_stat->countbreak); + Int *offsetRef = htfm_stat->offsetRef; + + NUM_SAD_MB_CALL(); + + blk -= 4; + for (i = 0; i < 16; i++) + { + p1 = ref + offsetRef[i]; + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + NUM_SAD_MB(); + + saddata[i] = sad; + + if (i > 0) + { + if ((ULong)sad > ((ULong)dmin_lx >> 16)) + { + difmad = saddata[0] - ((saddata[1] + 1) >> 1); + (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); + (*countbreak)++; + return sad; + } + } + } + + difmad = saddata[0] - ((saddata[1] + 1) >> 1); + (*abs_dif_mad_avg) += ((difmad > 0) ? difmad : -difmad); + (*countbreak)++; + return sad; + } + + Int SAD_MB_HTFM(UChar *ref, UChar *blk, Int dmin_lx, void *extra_info) + { + Int sad = 0; + UChar *p1; + + Int i; + Int tmp, tmp2; + Int lx4 = (dmin_lx << 2) & 0x3FFFC; + Int sadstar = 0, madstar; + Int *nrmlz_th = (Int*) extra_info; + Int *offsetRef = (Int*) extra_info + 32; + ULong cur_word; + + madstar = (ULong)dmin_lx >> 20; + + NUM_SAD_MB_CALL(); + + blk -= 4; + for (i = 0; i < 16; i++) + { + p1 = ref + offsetRef[i]; + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + cur_word = *((ULong*)(blk += 4)); + tmp = p1[12]; + tmp2 = (cur_word >> 24) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[8]; + tmp2 = (cur_word >> 16) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[4]; + tmp2 = (cur_word >> 8) & 0xFF; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = p1[0]; + p1 += lx4; + tmp2 = (cur_word & 0xFF); + sad = SUB_SAD(sad, tmp, tmp2); + + NUM_SAD_MB(); + + sadstar += madstar; + if (((ULong)sad <= ((ULong)dmin_lx >> 16)) && (sad <= (sadstar - *nrmlz_th++))) + ; + else + return 65536; + } + + return sad; + } +#endif /* HTFM */ + +#ifndef NO_INTER4V + /*================================================================== + Function: SAD_Block + Date: 09/07/2000 + Purpose: Compute SAD 16x16 between blk and ref. + To do: Uniform subsampling will be inserted later! + Hypothesis Testing Fast Matching to be used later! + Changes: + 11/7/00: implemented MMX + 1/24/01: implemented SSE + ==================================================================*/ + /********** C ************/ + Int SAD_Block_C(UChar *ref, UChar *blk, Int dmin, Int lx, void *) + { + Int sad = 0; + + Int i; + UChar *ii; + Int *kk; + Int tmp, tmp2, tmp3, mask = 0xFF; + Int width = (lx - 32); + + NUM_SAD_BLK_CALL(); + + ii = ref; + kk = (Int*)blk; /* assuming word-align for blk */ + for (i = 0; i < 8; i++) + { + tmp3 = kk[1]; + tmp = ii[7]; + tmp2 = (UInt)tmp3 >> 24; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = ii[6]; + tmp2 = (tmp3 >> 16) & mask; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = ii[5]; + tmp2 = (tmp3 >> 8) & mask; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = ii[4]; + tmp2 = tmp3 & mask; + sad = SUB_SAD(sad, tmp, tmp2); + tmp3 = *kk; + kk += (width >> 2); + tmp = ii[3]; + tmp2 = (UInt)tmp3 >> 24; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = ii[2]; + tmp2 = (tmp3 >> 16) & mask; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = ii[1]; + tmp2 = (tmp3 >> 8) & mask; + sad = SUB_SAD(sad, tmp, tmp2); + tmp = *ii; + ii += lx; + tmp2 = tmp3 & mask; + sad = SUB_SAD(sad, tmp, tmp2); + + NUM_SAD_BLK(); + + if (sad > dmin) + return sad; + } + + return sad; + } + +#endif /* NO_INTER4V */ + +#ifdef __cplusplus +} +#endif + + + |