Home | History | Annotate | Download | only in video_coding
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_DATA_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_DATA_H_
     13 
     14 /***************************************************************
     15 *QMSelectData.h
     16 * This file includes parameters for content-aware media optimization
     17 ****************************************************************/
     18 
     19 #include "webrtc/typedefs.h"
     20 
     21 namespace webrtc {
     22 //
     23 // PARAMETERS FOR RESOLUTION ADAPTATION
     24 //
     25 
     26 // Initial level of buffer in secs.
     27 const float kInitBufferLevel = 0.5f;
     28 
     29 // Threshold of (max) buffer size below which we consider too low (underflow).
     30 const float kPercBufferThr = 0.10f;
     31 
     32 // Threshold on the occurrences of low buffer levels.
     33 const float kMaxBufferLow = 0.30f;
     34 
     35 // Threshold on rate mismatch.
     36 const float kMaxRateMisMatch = 0.5f;
     37 
     38 // Threshold on amount of under/over encoder shooting.
     39 const float kRateOverShoot = 0.75f;
     40 const float kRateUnderShoot = 0.75f;
     41 
     42 // Factor to favor weighting the average rates with the current/last data.
     43 const float kWeightRate = 0.70f;
     44 
     45 // Factor for transitional rate for going back up in resolution.
     46 const float kTransRateScaleUpSpatial = 1.25f;
     47 const float kTransRateScaleUpTemp = 1.25f;
     48 const float kTransRateScaleUpSpatialTemp = 1.25f;
     49 
     50 // Threshold on packet loss rate, above which favor resolution reduction.
     51 const float kPacketLossThr = 0.1f;
     52 
     53 // Factor for reducing transitional bitrate under packet loss.
     54 const float kPacketLossRateFac = 1.0f;
     55 
     56 // Maximum possible transitional rate for down-sampling:
     57 // (units in kbps), for 30fps.
     58 const uint16_t kMaxRateQm[9] = {
     59     0,     // QCIF
     60     50,    // kHCIF
     61     125,   // kQVGA
     62     200,   // CIF
     63     280,   // HVGA
     64     400,   // VGA
     65     700,   // QFULLHD
     66     1000,  // WHD
     67     1500   // FULLHD
     68 };
     69 
     70 // Frame rate scale for maximum transition rate.
     71 const float kFrameRateFac[4] = {
     72     0.5f,   // Low
     73     0.7f,   // Middle level 1
     74     0.85f,  // Middle level 2
     75     1.0f,   // High
     76 };
     77 
     78 // Scale for transitional rate: based on content class
     79 // motion=L/H/D,spatial==L/H/D: for low, high, middle levels
     80 const float kScaleTransRateQm[18] = {
     81     // VGA and lower
     82     0.40f,  // L, L
     83     0.50f,  // L, H
     84     0.40f,  // L, D
     85     0.60f,  // H ,L
     86     0.60f,  // H, H
     87     0.60f,  // H, D
     88     0.50f,  // D, L
     89     0.50f,  // D, D
     90     0.50f,  // D, H
     91 
     92     // over VGA
     93     0.40f,  // L, L
     94     0.50f,  // L, H
     95     0.40f,  // L, D
     96     0.60f,  // H ,L
     97     0.60f,  // H, H
     98     0.60f,  // H, D
     99     0.50f,  // D, L
    100     0.50f,  // D, D
    101     0.50f,  // D, H
    102 };
    103 
    104 // Threshold on the target rate relative to transitional rate.
    105 const float kFacLowRate = 0.5f;
    106 
    107 // Action for down-sampling:
    108 // motion=L/H/D,spatial==L/H/D, for low, high, middle levels;
    109 // rate = 0/1/2, for target rate state relative to transition rate.
    110 const uint8_t kSpatialAction[27] = {
    111     // rateClass = 0:
    112     1,  // L, L
    113     1,  // L, H
    114     1,  // L, D
    115     4,  // H ,L
    116     1,  // H, H
    117     4,  // H, D
    118     4,  // D, L
    119     1,  // D, H
    120     2,  // D, D
    121 
    122     // rateClass = 1:
    123     1,  // L, L
    124     1,  // L, H
    125     1,  // L, D
    126     2,  // H ,L
    127     1,  // H, H
    128     2,  // H, D
    129     2,  // D, L
    130     1,  // D, H
    131     2,  // D, D
    132 
    133     // rateClass = 2:
    134     1,  // L, L
    135     1,  // L, H
    136     1,  // L, D
    137     2,  // H ,L
    138     1,  // H, H
    139     2,  // H, D
    140     2,  // D, L
    141     1,  // D, H
    142     2,  // D, D
    143 };
    144 
    145 const uint8_t kTemporalAction[27] = {
    146     // rateClass = 0:
    147     3,  // L, L
    148     2,  // L, H
    149     2,  // L, D
    150     1,  // H ,L
    151     3,  // H, H
    152     1,  // H, D
    153     1,  // D, L
    154     2,  // D, H
    155     1,  // D, D
    156 
    157     // rateClass = 1:
    158     3,  // L, L
    159     3,  // L, H
    160     3,  // L, D
    161     1,  // H ,L
    162     3,  // H, H
    163     1,  // H, D
    164     1,  // D, L
    165     3,  // D, H
    166     1,  // D, D
    167 
    168     // rateClass = 2:
    169     1,  // L, L
    170     3,  // L, H
    171     3,  // L, D
    172     1,  // H ,L
    173     3,  // H, H
    174     1,  // H, D
    175     1,  // D, L
    176     3,  // D, H
    177     1,  // D, D
    178 };
    179 
    180 // Control the total amount of down-sampling allowed.
    181 const float kMaxSpatialDown = 8.0f;
    182 const float kMaxTempDown = 3.0f;
    183 const float kMaxTotalDown = 9.0f;
    184 
    185 // Minimum image size for a spatial down-sampling.
    186 const int kMinImageSize = 176 * 144;
    187 
    188 // Minimum frame rate for temporal down-sampling:
    189 // no frame rate reduction if incomingFrameRate <= MIN_FRAME_RATE.
    190 const int kMinFrameRate = 8;
    191 
    192 //
    193 // PARAMETERS FOR FEC ADJUSTMENT: TODO (marpan)
    194 //
    195 
    196 //
    197 // PARAMETETS FOR SETTING LOW/HIGH STATES OF CONTENT METRICS:
    198 //
    199 
    200 // Thresholds for frame rate:
    201 const int kLowFrameRate = 10;
    202 const int kMiddleFrameRate = 15;
    203 const int kHighFrameRate = 25;
    204 
    205 // Thresholds for motion: motion level is from NFD.
    206 const float kHighMotionNfd = 0.075f;
    207 const float kLowMotionNfd = 0.03f;
    208 
    209 // Thresholds for spatial prediction error:
    210 // this is applied on the average of (2x2,1x2,2x1).
    211 const float kHighTexture = 0.035f;
    212 const float kLowTexture = 0.020f;
    213 
    214 // Used to reduce thresholds for larger/HD scenes: correction factor since
    215 // higher correlation in HD scenes means lower spatial prediction error.
    216 const float kScaleTexture = 0.9f;
    217 
    218 // Percentage reduction in transitional bitrate for 2x2 selected over 1x2/2x1.
    219 const float kRateRedSpatial2X2 = 0.6f;
    220 
    221 const float kSpatialErr2x2VsHoriz = 0.1f;   // percentage to favor 2x2 over H
    222 const float kSpatialErr2X2VsVert = 0.1f;    // percentage to favor 2x2 over V
    223 const float kSpatialErrVertVsHoriz = 0.1f;  // percentage to favor H over V
    224 
    225 }  // namespace webrtc
    226 
    227 #endif  // WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_DATA_H_
    228