tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

seg_common.c (3327B)


      1 /*
      2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
      3 *
      4 * This source code is subject to the terms of the BSD 2 Clause License and
      5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6 * was not distributed with this source code in the LICENSE file, you can
      7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8 * Media Patent License 1.0 was not distributed with this source code in the
      9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10 */
     11 
     12 #include <assert.h>
     13 
     14 #include "av1/common/av1_loopfilter.h"
     15 #include "av1/common/blockd.h"
     16 #include "av1/common/seg_common.h"
     17 #include "av1/common/quant_common.h"
     18 
     19 static const int seg_feature_data_signed[SEG_LVL_MAX] = {
     20  1, 1, 1, 1, 1, 0, 0, 0
     21 };
     22 
     23 static const int seg_feature_data_max[SEG_LVL_MAX] = { MAXQ,
     24                                                       MAX_LOOP_FILTER,
     25                                                       MAX_LOOP_FILTER,
     26                                                       MAX_LOOP_FILTER,
     27                                                       MAX_LOOP_FILTER,
     28                                                       7,
     29                                                       0,
     30                                                       0 };
     31 
     32 // These functions provide access to new segment level features.
     33 // Eventually these function may be "optimized out" but for the moment,
     34 // the coding mechanism is still subject to change so these provide a
     35 // convenient single point of change.
     36 
     37 void av1_clearall_segfeatures(struct segmentation *seg) {
     38  av1_zero(seg->feature_data);
     39  av1_zero(seg->feature_mask);
     40 }
     41 
     42 void av1_calculate_segdata(struct segmentation *seg) {
     43  seg->segid_preskip = 0;
     44  seg->last_active_segid = 0;
     45  for (int i = 0; i < MAX_SEGMENTS; i++) {
     46    for (int j = 0; j < SEG_LVL_MAX; j++) {
     47      if (seg->feature_mask[i] & (1 << j)) {
     48        seg->segid_preskip |= (j >= SEG_LVL_REF_FRAME);
     49        seg->last_active_segid = i;
     50      }
     51    }
     52  }
     53 }
     54 
     55 void av1_enable_segfeature(struct segmentation *seg, int segment_id,
     56                           SEG_LVL_FEATURES feature_id) {
     57  seg->feature_mask[segment_id] |= 1 << feature_id;
     58 }
     59 
     60 int av1_seg_feature_data_max(SEG_LVL_FEATURES feature_id) {
     61  return seg_feature_data_max[feature_id];
     62 }
     63 
     64 int av1_is_segfeature_signed(SEG_LVL_FEATURES feature_id) {
     65  return seg_feature_data_signed[feature_id];
     66 }
     67 
     68 // The 'seg_data' given for each segment can be either deltas (from the default
     69 // value chosen for the frame) or absolute values.
     70 //
     71 // Valid range for abs values is (0-127 for MB_LVL_ALT_Q), (0-63 for
     72 // SEGMENT_ALT_LF)
     73 // Valid range for delta values are (+/-127 for MB_LVL_ALT_Q), (+/-63 for
     74 // SEGMENT_ALT_LF)
     75 //
     76 // abs_delta = SEGMENT_DELTADATA (deltas) abs_delta = SEGMENT_ABSDATA (use
     77 // the absolute values given).
     78 
     79 void av1_set_segdata(struct segmentation *seg, int segment_id,
     80                     SEG_LVL_FEATURES feature_id, int seg_data) {
     81  if (seg_data < 0) {
     82    assert(seg_feature_data_signed[feature_id]);
     83    assert(-seg_data <= seg_feature_data_max[feature_id]);
     84  } else {
     85    assert(seg_data <= seg_feature_data_max[feature_id]);
     86  }
     87 
     88  seg->feature_data[segment_id][feature_id] = seg_data;
     89 }
     90 
     91 // TBD? Functions to read and write segment data with range / validity checking