1 /* 2 * Copyright (c) 2016 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 // This file contains codec dependent definitions that are needed in 12 // order to compile the WebRTC codebase, even if this codec is not used. 13 14 #ifndef MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_ 15 #define MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_ 16 17 #include <assert.h> 18 #include <stdint.h> 19 20 #include "modules/video_coding/codecs/interface/common_constants.h" 21 22 namespace webrtc { 23 24 const int16_t kMaxOneBytePictureId = 0x7F; // 7 bits 25 const int16_t kMaxTwoBytePictureId = 0x7FFF; // 15 bits 26 const uint8_t kNoSpatialIdx = 0xFF; 27 const uint8_t kNoGofIdx = 0xFF; 28 const uint8_t kNumVp9Buffers = 8; 29 const size_t kMaxVp9RefPics = 3; 30 const size_t kMaxVp9FramesInGof = 0xFF; // 8 bits 31 const size_t kMaxVp9NumberOfSpatialLayers = 8; 32 33 const size_t kMinVp9SpatialLayerWidth = 240; 34 const size_t kMinVp9SpatialLayerHeight = 135; 35 36 enum TemporalStructureMode { 37 kTemporalStructureMode1, // 1 temporal layer structure - i.e., IPPP... 38 kTemporalStructureMode2, // 2 temporal layers 01... 39 kTemporalStructureMode3, // 3 temporal layers 0212... 40 kTemporalStructureMode4 // 3 temporal layers 02120212... 41 }; 42 43 struct GofInfoVP9 { SetGofInfoVP9GofInfoVP944 void SetGofInfoVP9(TemporalStructureMode tm) { 45 switch (tm) { 46 case kTemporalStructureMode1: 47 num_frames_in_gof = 1; 48 temporal_idx[0] = 0; 49 temporal_up_switch[0] = false; 50 num_ref_pics[0] = 1; 51 pid_diff[0][0] = 1; 52 break; 53 case kTemporalStructureMode2: 54 num_frames_in_gof = 2; 55 temporal_idx[0] = 0; 56 temporal_up_switch[0] = false; 57 num_ref_pics[0] = 1; 58 pid_diff[0][0] = 2; 59 60 temporal_idx[1] = 1; 61 temporal_up_switch[1] = true; 62 num_ref_pics[1] = 1; 63 pid_diff[1][0] = 1; 64 break; 65 case kTemporalStructureMode3: 66 num_frames_in_gof = 4; 67 temporal_idx[0] = 0; 68 temporal_up_switch[0] = false; 69 num_ref_pics[0] = 1; 70 pid_diff[0][0] = 4; 71 72 temporal_idx[1] = 2; 73 temporal_up_switch[1] = true; 74 num_ref_pics[1] = 1; 75 pid_diff[1][0] = 1; 76 77 temporal_idx[2] = 1; 78 temporal_up_switch[2] = true; 79 num_ref_pics[2] = 1; 80 pid_diff[2][0] = 2; 81 82 temporal_idx[3] = 2; 83 temporal_up_switch[3] = true; 84 num_ref_pics[3] = 1; 85 pid_diff[3][0] = 1; 86 break; 87 case kTemporalStructureMode4: 88 num_frames_in_gof = 8; 89 temporal_idx[0] = 0; 90 temporal_up_switch[0] = false; 91 num_ref_pics[0] = 1; 92 pid_diff[0][0] = 4; 93 94 temporal_idx[1] = 2; 95 temporal_up_switch[1] = true; 96 num_ref_pics[1] = 1; 97 pid_diff[1][0] = 1; 98 99 temporal_idx[2] = 1; 100 temporal_up_switch[2] = true; 101 num_ref_pics[2] = 1; 102 pid_diff[2][0] = 2; 103 104 temporal_idx[3] = 2; 105 temporal_up_switch[3] = false; 106 num_ref_pics[3] = 2; 107 pid_diff[3][0] = 1; 108 pid_diff[3][1] = 2; 109 110 temporal_idx[4] = 0; 111 temporal_up_switch[4] = false; 112 num_ref_pics[4] = 1; 113 pid_diff[4][0] = 4; 114 115 temporal_idx[5] = 2; 116 temporal_up_switch[5] = false; 117 num_ref_pics[5] = 2; 118 pid_diff[5][0] = 1; 119 pid_diff[5][1] = 2; 120 121 temporal_idx[6] = 1; 122 temporal_up_switch[6] = false; 123 num_ref_pics[6] = 2; 124 pid_diff[6][0] = 2; 125 pid_diff[6][1] = 4; 126 127 temporal_idx[7] = 2; 128 temporal_up_switch[7] = false; 129 num_ref_pics[7] = 2; 130 pid_diff[7][0] = 1; 131 pid_diff[7][1] = 2; 132 break; 133 default: 134 assert(false); 135 } 136 } 137 CopyGofInfoVP9GofInfoVP9138 void CopyGofInfoVP9(const GofInfoVP9& src) { 139 num_frames_in_gof = src.num_frames_in_gof; 140 for (size_t i = 0; i < num_frames_in_gof; ++i) { 141 temporal_idx[i] = src.temporal_idx[i]; 142 temporal_up_switch[i] = src.temporal_up_switch[i]; 143 num_ref_pics[i] = src.num_ref_pics[i]; 144 for (uint8_t r = 0; r < num_ref_pics[i]; ++r) { 145 pid_diff[i][r] = src.pid_diff[i][r]; 146 } 147 } 148 } 149 150 size_t num_frames_in_gof; 151 uint8_t temporal_idx[kMaxVp9FramesInGof]; 152 bool temporal_up_switch[kMaxVp9FramesInGof]; 153 uint8_t num_ref_pics[kMaxVp9FramesInGof]; 154 uint8_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics]; 155 uint16_t pid_start; 156 }; 157 158 struct RTPVideoHeaderVP9 { InitRTPVideoHeaderVP9RTPVideoHeaderVP9159 void InitRTPVideoHeaderVP9() { 160 inter_pic_predicted = false; 161 flexible_mode = false; 162 beginning_of_frame = false; 163 end_of_frame = false; 164 ss_data_available = false; 165 non_ref_for_inter_layer_pred = false; 166 picture_id = kNoPictureId; 167 max_picture_id = kMaxTwoBytePictureId; 168 tl0_pic_idx = kNoTl0PicIdx; 169 temporal_idx = kNoTemporalIdx; 170 spatial_idx = kNoSpatialIdx; 171 temporal_up_switch = false; 172 inter_layer_predicted = false; 173 gof_idx = kNoGofIdx; 174 num_ref_pics = 0; 175 num_spatial_layers = 1; 176 first_active_layer = 0; 177 end_of_picture = true; 178 } 179 180 bool inter_pic_predicted; // This layer frame is dependent on previously 181 // coded frame(s). 182 bool flexible_mode; // This frame is in flexible mode. 183 bool beginning_of_frame; // True if this packet is the first in a VP9 layer 184 // frame. 185 bool end_of_frame; // True if this packet is the last in a VP9 layer frame. 186 bool ss_data_available; // True if SS data is available in this payload 187 // descriptor. 188 bool non_ref_for_inter_layer_pred; // True for frame which is not used as 189 // reference for inter-layer prediction. 190 int16_t picture_id; // PictureID index, 15 bits; 191 // kNoPictureId if PictureID does not exist. 192 int16_t max_picture_id; // Maximum picture ID index; either 0x7F or 0x7FFF; 193 int16_t tl0_pic_idx; // TL0PIC_IDX, 8 bits; 194 // kNoTl0PicIdx means no value provided. 195 uint8_t temporal_idx; // Temporal layer index, or kNoTemporalIdx. 196 uint8_t spatial_idx; // Spatial layer index, or kNoSpatialIdx. 197 bool temporal_up_switch; // True if upswitch to higher frame rate is possible 198 // starting from this frame. 199 bool inter_layer_predicted; // Frame is dependent on directly lower spatial 200 // layer frame. 201 202 uint8_t gof_idx; // Index to predefined temporal frame info in SS data. 203 204 uint8_t num_ref_pics; // Number of reference pictures used by this layer 205 // frame. 206 uint8_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID 207 // of the reference pictures. 208 int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures. 209 210 // SS data. 211 size_t num_spatial_layers; // Always populated. 212 size_t first_active_layer; // Not sent on wire, used to adjust ss data. 213 bool spatial_layer_resolution_present; 214 uint16_t width[kMaxVp9NumberOfSpatialLayers]; 215 uint16_t height[kMaxVp9NumberOfSpatialLayers]; 216 GofInfoVP9 gof; 217 218 bool end_of_picture; // This frame is the last frame in picture. 219 }; 220 221 } // namespace webrtc 222 223 #endif // MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_ 224