summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp')
-rw-r--r--media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp
new file mode 100644
index 0000000..b5574b4
--- /dev/null
+++ b/media/libstagefright/codecs/m4v_h263/dec/src/deringing_luma.cpp
@@ -0,0 +1,231 @@
+/* ------------------------------------------------------------------
+ * 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 "mp4dec_lib.h"
+#include "post_proc.h"
+
+#ifdef PV_POSTPROC_ON
+
+void Deringing_Luma(
+ uint8 *Rec_Y,
+ int width,
+ int height,
+ int16 *QP_store,
+ int,
+ uint8 *pp_mod)
+{
+ /*----------------------------------------------------------------------------
+ ; Define all local variables
+ ----------------------------------------------------------------------------*/
+ int thres[4], range[4], max_range_blk, max_thres_blk;
+ int MB_V, MB_H, BLK_V, BLK_H;
+ int v_blk, h_blk;
+ int max_diff;
+ int max_blk, min_blk;
+ int v0, h0;
+ uint8 *ptr;
+ int thr, blks, incr;
+ int mb_indx, blk_indx;
+
+ /*----------------------------------------------------------------------------
+ ; Function body here
+ ----------------------------------------------------------------------------*/
+ incr = width - BLKSIZE;
+
+ /* Dering the first line of macro blocks */
+ for (MB_H = 0; MB_H < width; MB_H += MBSIZE)
+ {
+ max_diff = (QP_store[(MB_H)>>4] >> 2) + 4;
+
+ /* threshold determination */
+ max_range_blk = max_thres_blk = 0;
+ blks = 0;
+
+ for (BLK_V = 0; BLK_V < MBSIZE; BLK_V += BLKSIZE)
+ {
+ for (BLK_H = 0; BLK_H < MBSIZE; BLK_H += BLKSIZE)
+ {
+ ptr = &Rec_Y[(int32)(BLK_V) * width + MB_H + BLK_H];
+ FindMaxMin(ptr, &min_blk, &max_blk, incr);
+
+ thres[blks] = (max_blk + min_blk + 1) >> 1;
+ range[blks] = max_blk - min_blk;
+
+ if (range[blks] >= max_range_blk)
+ {
+ max_range_blk = range[blks];
+ max_thres_blk = thres[blks];
+ }
+ blks++;
+ }
+ }
+
+ blks = 0;
+ for (v_blk = 0; v_blk < MBSIZE; v_blk += BLKSIZE)
+ {
+ v0 = ((v_blk - 1) >= 1) ? (v_blk - 1) : 1;
+ for (h_blk = MB_H; h_blk < MB_H + MBSIZE; h_blk += BLKSIZE)
+ {
+ h0 = ((h_blk - 1) >= 1) ? (h_blk - 1) : 1;
+
+ /* threshold rearrangement for flat region adjacent to non-flat region */
+ if (range[blks]<32 && max_range_blk >= 64)
+ thres[blks] = max_thres_blk;
+
+ /* threshold rearrangement for deblocking
+ (blockiness annoying at DC dominant region) */
+ if (max_range_blk >= 16)
+ {
+ /* adaptive smoothing */
+ thr = thres[blks];
+
+ AdaptiveSmooth_NoMMX(Rec_Y, v0, h0, v_blk, h_blk,
+ thr, width, max_diff);
+ }
+ blks++;
+ } /* block level (Luminance) */
+ }
+ } /* macroblock level */
+
+
+ /* Do the rest of the macro-block-lines */
+ for (MB_V = MBSIZE; MB_V < height; MB_V += MBSIZE)
+ {
+ /* First macro-block */
+ max_diff = (QP_store[((((int32)MB_V*width)>>4))>>4] >> 2) + 4;
+ /* threshold determination */
+ max_range_blk = max_thres_blk = 0;
+ blks = 0;
+ for (BLK_V = 0; BLK_V < MBSIZE; BLK_V += BLKSIZE)
+ {
+ for (BLK_H = 0; BLK_H < MBSIZE; BLK_H += BLKSIZE)
+ {
+ ptr = &Rec_Y[(int32)(MB_V + BLK_V) * width + BLK_H];
+ FindMaxMin(ptr, &min_blk, &max_blk, incr);
+ thres[blks] = (max_blk + min_blk + 1) >> 1;
+ range[blks] = max_blk - min_blk;
+
+ if (range[blks] >= max_range_blk)
+ {
+ max_range_blk = range[blks];
+ max_thres_blk = thres[blks];
+ }
+ blks++;
+ }
+ }
+
+ blks = 0;
+ for (v_blk = MB_V; v_blk < MB_V + MBSIZE; v_blk += BLKSIZE)
+ {
+ v0 = v_blk - 1;
+ for (h_blk = 0; h_blk < MBSIZE; h_blk += BLKSIZE)
+ {
+ h0 = ((h_blk - 1) >= 1) ? (h_blk - 1) : 1;
+
+ /* threshold rearrangement for flat region adjacent to non-flat region */
+ if (range[blks]<32 && max_range_blk >= 64)
+ thres[blks] = max_thres_blk;
+
+ /* threshold rearrangement for deblocking
+ (blockiness annoying at DC dominant region) */
+ if (max_range_blk >= 16)
+ {
+ /* adaptive smoothing */
+ thr = thres[blks];
+
+ AdaptiveSmooth_NoMMX(Rec_Y, v0, h0, v_blk, h_blk,
+ thr, width, max_diff);
+ }
+ blks++;
+ }
+ } /* block level (Luminance) */
+
+ /* Rest of the macro-blocks */
+ for (MB_H = MBSIZE; MB_H < width; MB_H += MBSIZE)
+ {
+ max_diff = (QP_store[((((int32)MB_V*width)>>4)+MB_H)>>4] >> 2) + 4;
+
+ /* threshold determination */
+ max_range_blk = max_thres_blk = 0;
+ blks = 0;
+
+ mb_indx = (MB_V / 8) * (width / 8) + MB_H / 8;
+ for (BLK_V = 0; BLK_V < MBSIZE; BLK_V += BLKSIZE)
+ {
+ for (BLK_H = 0; BLK_H < MBSIZE; BLK_H += BLKSIZE)
+ {
+ blk_indx = mb_indx + (BLK_V / 8) * width / 8 + BLK_H / 8;
+ /* Update based on pp_mod only */
+ if ((pp_mod[blk_indx]&0x4) != 0)
+ {
+ ptr = &Rec_Y[(int32)(MB_V + BLK_V) * width + MB_H + BLK_H];
+ FindMaxMin(ptr, &min_blk, &max_blk, incr);
+ thres[blks] = (max_blk + min_blk + 1) >> 1;
+ range[blks] = max_blk - min_blk;
+
+ if (range[blks] >= max_range_blk)
+ {
+ max_range_blk = range[blks];
+ max_thres_blk = thres[blks];
+ }
+ }
+ blks++;
+ }
+ }
+
+ blks = 0;
+ for (v_blk = MB_V; v_blk < MB_V + MBSIZE; v_blk += BLKSIZE)
+ {
+ v0 = v_blk - 1;
+ mb_indx = (v_blk / 8) * (width / 8);
+ for (h_blk = MB_H; h_blk < MB_H + MBSIZE; h_blk += BLKSIZE)
+ {
+ h0 = h_blk - 1;
+ blk_indx = mb_indx + h_blk / 8;
+ if ((pp_mod[blk_indx]&0x4) != 0)
+ {
+ /* threshold rearrangement for flat region adjacent to non-flat region */
+ if (range[blks]<32 && max_range_blk >= 64)
+ thres[blks] = max_thres_blk;
+
+ /* threshold rearrangement for deblocking
+ (blockiness annoying at DC dominant region) */
+ if (max_range_blk >= 16)
+ {
+ /* adaptive smoothing */
+ thr = thres[blks];
+#ifdef NoMMX
+ AdaptiveSmooth_NoMMX(Rec_Y, v0, h0, v_blk, h_blk,
+ thr, width, max_diff);
+#else
+ DeringAdaptiveSmoothMMX(&Rec_Y[v0*width+h0],
+ width, thr, max_diff);
+#endif
+ }
+ }
+ blks++;
+ }
+ } /* block level (Luminance) */
+ } /* macroblock level */
+ } /* macroblock level */
+
+ /*----------------------------------------------------------------------------
+ ; Return nothing or data or data pointer
+ ----------------------------------------------------------------------------*/
+ return;
+}
+#endif