xref: /aosp_15_r20/external/libvpx/vp8/encoder/segmentation.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "segmentation.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
13*fb1b10abSAndroid Build Coastguard Worker 
vp8_update_gf_usage_maps(VP8_COMP * cpi,VP8_COMMON * cm,MACROBLOCK * x)14*fb1b10abSAndroid Build Coastguard Worker void vp8_update_gf_usage_maps(VP8_COMP *cpi, VP8_COMMON *cm, MACROBLOCK *x) {
15*fb1b10abSAndroid Build Coastguard Worker   int mb_row, mb_col;
16*fb1b10abSAndroid Build Coastguard Worker 
17*fb1b10abSAndroid Build Coastguard Worker   MODE_INFO *this_mb_mode_info = cm->mi;
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker   x->gf_active_ptr = (signed char *)cpi->gf_active_flags;
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker   if ((cm->frame_type == KEY_FRAME) || (cm->refresh_golden_frame)) {
22*fb1b10abSAndroid Build Coastguard Worker     /* Reset Gf usage monitors */
23*fb1b10abSAndroid Build Coastguard Worker     memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
24*fb1b10abSAndroid Build Coastguard Worker     cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
25*fb1b10abSAndroid Build Coastguard Worker   } else {
26*fb1b10abSAndroid Build Coastguard Worker     /* for each macroblock row in image */
27*fb1b10abSAndroid Build Coastguard Worker     for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
28*fb1b10abSAndroid Build Coastguard Worker       /* for each macroblock col in image */
29*fb1b10abSAndroid Build Coastguard Worker       for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
30*fb1b10abSAndroid Build Coastguard Worker         /* If using golden then set GF active flag if not already set.
31*fb1b10abSAndroid Build Coastguard Worker          * If using last frame 0,0 mode then leave flag as it is
32*fb1b10abSAndroid Build Coastguard Worker          * else if using non 0,0 motion or intra modes then clear
33*fb1b10abSAndroid Build Coastguard Worker          * flag if it is currently set
34*fb1b10abSAndroid Build Coastguard Worker          */
35*fb1b10abSAndroid Build Coastguard Worker         if ((this_mb_mode_info->mbmi.ref_frame == GOLDEN_FRAME) ||
36*fb1b10abSAndroid Build Coastguard Worker             (this_mb_mode_info->mbmi.ref_frame == ALTREF_FRAME)) {
37*fb1b10abSAndroid Build Coastguard Worker           if (*(x->gf_active_ptr) == 0) {
38*fb1b10abSAndroid Build Coastguard Worker             *(x->gf_active_ptr) = 1;
39*fb1b10abSAndroid Build Coastguard Worker             cpi->gf_active_count++;
40*fb1b10abSAndroid Build Coastguard Worker           }
41*fb1b10abSAndroid Build Coastguard Worker         } else if ((this_mb_mode_info->mbmi.mode != ZEROMV) &&
42*fb1b10abSAndroid Build Coastguard Worker                    *(x->gf_active_ptr)) {
43*fb1b10abSAndroid Build Coastguard Worker           *(x->gf_active_ptr) = 0;
44*fb1b10abSAndroid Build Coastguard Worker           cpi->gf_active_count--;
45*fb1b10abSAndroid Build Coastguard Worker         }
46*fb1b10abSAndroid Build Coastguard Worker 
47*fb1b10abSAndroid Build Coastguard Worker         x->gf_active_ptr++;  /* Step onto next entry */
48*fb1b10abSAndroid Build Coastguard Worker         this_mb_mode_info++; /* skip to next mb */
49*fb1b10abSAndroid Build Coastguard Worker       }
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker       /* this is to account for the border */
52*fb1b10abSAndroid Build Coastguard Worker       this_mb_mode_info++;
53*fb1b10abSAndroid Build Coastguard Worker     }
54*fb1b10abSAndroid Build Coastguard Worker   }
55*fb1b10abSAndroid Build Coastguard Worker }
56