| Index: webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h
|
| diff --git a/webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h b/webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f429bdab3c7c594940e3f6cfb88c7112fe2f8813
|
| --- /dev/null
|
| +++ b/webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h
|
| @@ -0,0 +1,210 @@
|
| +/*
|
| + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +// This file contains codec dependent definitions that are needed in
|
| +// order to compile the WebRTC codebase, even if this codec is not used.
|
| +
|
| +#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
|
| +#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
|
| +
|
| +#include "webrtc/modules/video_coding/codecs/interface/common_constants.h"
|
| +
|
| +namespace webrtc {
|
| +
|
| +const int16_t kMaxOneBytePictureId = 0x7F; // 7 bits
|
| +const int16_t kMaxTwoBytePictureId = 0x7FFF; // 15 bits
|
| +const uint8_t kNoSpatialIdx = 0xFF;
|
| +const uint8_t kNoGofIdx = 0xFF;
|
| +const uint8_t kNumVp9Buffers = 8;
|
| +const size_t kMaxVp9RefPics = 3;
|
| +const size_t kMaxVp9FramesInGof = 0xFF; // 8 bits
|
| +const size_t kMaxVp9NumberOfSpatialLayers = 8;
|
| +
|
| +enum TemporalStructureMode {
|
| + kTemporalStructureMode1, // 1 temporal layer structure - i.e., IPPP...
|
| + kTemporalStructureMode2, // 2 temporal layers 01...
|
| + kTemporalStructureMode3, // 3 temporal layers 0212...
|
| + kTemporalStructureMode4 // 3 temporal layers 02120212...
|
| +};
|
| +
|
| +struct GofInfoVP9 {
|
| + void SetGofInfoVP9(TemporalStructureMode tm) {
|
| + switch (tm) {
|
| + case kTemporalStructureMode1:
|
| + num_frames_in_gof = 1;
|
| + temporal_idx[0] = 0;
|
| + temporal_up_switch[0] = false;
|
| + num_ref_pics[0] = 1;
|
| + pid_diff[0][0] = 1;
|
| + break;
|
| + case kTemporalStructureMode2:
|
| + num_frames_in_gof = 2;
|
| + temporal_idx[0] = 0;
|
| + temporal_up_switch[0] = false;
|
| + num_ref_pics[0] = 1;
|
| + pid_diff[0][0] = 2;
|
| +
|
| + temporal_idx[1] = 1;
|
| + temporal_up_switch[1] = true;
|
| + num_ref_pics[1] = 1;
|
| + pid_diff[1][0] = 1;
|
| + break;
|
| + case kTemporalStructureMode3:
|
| + num_frames_in_gof = 4;
|
| + temporal_idx[0] = 0;
|
| + temporal_up_switch[0] = false;
|
| + num_ref_pics[0] = 1;
|
| + pid_diff[0][0] = 4;
|
| +
|
| + temporal_idx[1] = 2;
|
| + temporal_up_switch[1] = true;
|
| + num_ref_pics[1] = 1;
|
| + pid_diff[1][0] = 1;
|
| +
|
| + temporal_idx[2] = 1;
|
| + temporal_up_switch[2] = true;
|
| + num_ref_pics[2] = 1;
|
| + pid_diff[2][0] = 2;
|
| +
|
| + temporal_idx[3] = 2;
|
| + temporal_up_switch[3] = false;
|
| + num_ref_pics[3] = 2;
|
| + pid_diff[3][0] = 1;
|
| + pid_diff[3][1] = 2;
|
| + break;
|
| + case kTemporalStructureMode4:
|
| + num_frames_in_gof = 8;
|
| + temporal_idx[0] = 0;
|
| + temporal_up_switch[0] = false;
|
| + num_ref_pics[0] = 1;
|
| + pid_diff[0][0] = 4;
|
| +
|
| + temporal_idx[1] = 2;
|
| + temporal_up_switch[1] = true;
|
| + num_ref_pics[1] = 1;
|
| + pid_diff[1][0] = 1;
|
| +
|
| + temporal_idx[2] = 1;
|
| + temporal_up_switch[2] = true;
|
| + num_ref_pics[2] = 1;
|
| + pid_diff[2][0] = 2;
|
| +
|
| + temporal_idx[3] = 2;
|
| + temporal_up_switch[3] = false;
|
| + num_ref_pics[3] = 2;
|
| + pid_diff[3][0] = 1;
|
| + pid_diff[3][1] = 2;
|
| +
|
| + temporal_idx[4] = 0;
|
| + temporal_up_switch[0] = false;
|
| + num_ref_pics[4] = 1;
|
| + pid_diff[4][0] = 4;
|
| +
|
| + temporal_idx[5] = 2;
|
| + temporal_up_switch[1] = false;
|
| + num_ref_pics[5] = 2;
|
| + pid_diff[5][0] = 1;
|
| + pid_diff[5][1] = 2;
|
| +
|
| + temporal_idx[6] = 1;
|
| + temporal_up_switch[2] = false;
|
| + num_ref_pics[6] = 2;
|
| + pid_diff[6][0] = 2;
|
| + pid_diff[6][1] = 4;
|
| +
|
| + temporal_idx[7] = 2;
|
| + temporal_up_switch[3] = false;
|
| + num_ref_pics[7] = 2;
|
| + pid_diff[7][0] = 1;
|
| + pid_diff[7][1] = 2;
|
| + break;
|
| + default:
|
| + assert(false);
|
| + }
|
| + }
|
| +
|
| + void CopyGofInfoVP9(const GofInfoVP9& src) {
|
| + num_frames_in_gof = src.num_frames_in_gof;
|
| + for (size_t i = 0; i < num_frames_in_gof; ++i) {
|
| + temporal_idx[i] = src.temporal_idx[i];
|
| + temporal_up_switch[i] = src.temporal_up_switch[i];
|
| + num_ref_pics[i] = src.num_ref_pics[i];
|
| + for (uint8_t r = 0; r < num_ref_pics[i]; ++r) {
|
| + pid_diff[i][r] = src.pid_diff[i][r];
|
| + }
|
| + }
|
| + }
|
| +
|
| + size_t num_frames_in_gof;
|
| + uint8_t temporal_idx[kMaxVp9FramesInGof];
|
| + bool temporal_up_switch[kMaxVp9FramesInGof];
|
| + uint8_t num_ref_pics[kMaxVp9FramesInGof];
|
| + uint8_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
|
| + uint16_t pid_start;
|
| +};
|
| +
|
| +struct RTPVideoHeaderVP9 {
|
| + void InitRTPVideoHeaderVP9() {
|
| + inter_pic_predicted = false;
|
| + flexible_mode = false;
|
| + beginning_of_frame = false;
|
| + end_of_frame = false;
|
| + ss_data_available = false;
|
| + picture_id = kNoPictureId;
|
| + max_picture_id = kMaxTwoBytePictureId;
|
| + tl0_pic_idx = kNoTl0PicIdx;
|
| + temporal_idx = kNoTemporalIdx;
|
| + spatial_idx = kNoSpatialIdx;
|
| + temporal_up_switch = false;
|
| + inter_layer_predicted = false;
|
| + gof_idx = kNoGofIdx;
|
| + num_ref_pics = 0;
|
| + num_spatial_layers = 1;
|
| + }
|
| +
|
| + bool inter_pic_predicted; // This layer frame is dependent on previously
|
| + // coded frame(s).
|
| + bool flexible_mode; // This frame is in flexible mode.
|
| + bool beginning_of_frame; // True if this packet is the first in a VP9 layer
|
| + // frame.
|
| + bool end_of_frame; // True if this packet is the last in a VP9 layer frame.
|
| + bool ss_data_available; // True if SS data is available in this payload
|
| + // descriptor.
|
| + int16_t picture_id; // PictureID index, 15 bits;
|
| + // kNoPictureId if PictureID does not exist.
|
| + int16_t max_picture_id; // Maximum picture ID index; either 0x7F or 0x7FFF;
|
| + int16_t tl0_pic_idx; // TL0PIC_IDX, 8 bits;
|
| + // kNoTl0PicIdx means no value provided.
|
| + uint8_t temporal_idx; // Temporal layer index, or kNoTemporalIdx.
|
| + uint8_t spatial_idx; // Spatial layer index, or kNoSpatialIdx.
|
| + bool temporal_up_switch; // True if upswitch to higher frame rate is possible
|
| + // starting from this frame.
|
| + bool inter_layer_predicted; // Frame is dependent on directly lower spatial
|
| + // layer frame.
|
| +
|
| + uint8_t gof_idx; // Index to predefined temporal frame info in SS data.
|
| +
|
| + uint8_t num_ref_pics; // Number of reference pictures used by this layer
|
| + // frame.
|
| + uint8_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID
|
| + // of the reference pictures.
|
| + int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures.
|
| +
|
| + // SS data.
|
| + size_t num_spatial_layers; // Always populated.
|
| + bool spatial_layer_resolution_present;
|
| + uint16_t width[kMaxVp9NumberOfSpatialLayers];
|
| + uint16_t height[kMaxVp9NumberOfSpatialLayers];
|
| + GofInfoVP9 gof;
|
| +};
|
| +
|
| +} // namespace webrtc
|
| +
|
| +#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
|
|
|