| Index: webrtc/modules/include/module_common_types.h
|
| diff --git a/webrtc/modules/include/module_common_types.h b/webrtc/modules/include/module_common_types.h
|
| index fa0826a551a456294310af4874aa6ec907247766..80c7b24732948c5f93c5a59b0a35914fbd3a39e1 100644
|
| --- a/webrtc/modules/include/module_common_types.h
|
| +++ b/webrtc/modules/include/module_common_types.h
|
| @@ -22,6 +22,9 @@
|
| #include "webrtc/base/safe_conversions.h"
|
| #include "webrtc/common_types.h"
|
| #include "webrtc/common_video/rotation.h"
|
| +#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_globals.h"
|
| +#include "webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h"
|
| +#include "webrtc/modules/video_coding/codecs/h264/include/h264_globals.h"
|
| #include "webrtc/typedefs.h"
|
|
|
| namespace webrtc {
|
| @@ -33,288 +36,6 @@ struct RTPAudioHeader {
|
| size_t channel; // number of channels 2 = stereo
|
| };
|
|
|
| -const int16_t kNoPictureId = -1;
|
| -const int16_t kMaxOneBytePictureId = 0x7F; // 7 bits
|
| -const int16_t kMaxTwoBytePictureId = 0x7FFF; // 15 bits
|
| -const int16_t kNoTl0PicIdx = -1;
|
| -const uint8_t kNoTemporalIdx = 0xFF;
|
| -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;
|
| -const int kNoKeyIdx = -1;
|
| -
|
| -struct RTPVideoHeaderVP8 {
|
| - void InitRTPVideoHeaderVP8() {
|
| - nonReference = false;
|
| - pictureId = kNoPictureId;
|
| - tl0PicIdx = kNoTl0PicIdx;
|
| - temporalIdx = kNoTemporalIdx;
|
| - layerSync = false;
|
| - keyIdx = kNoKeyIdx;
|
| - partitionId = 0;
|
| - beginningOfPartition = false;
|
| - }
|
| -
|
| - bool nonReference; // Frame is discardable.
|
| - int16_t pictureId; // Picture ID index, 15 bits;
|
| - // kNoPictureId if PictureID does not exist.
|
| - int16_t tl0PicIdx; // TL0PIC_IDX, 8 bits;
|
| - // kNoTl0PicIdx means no value provided.
|
| - uint8_t temporalIdx; // Temporal layer index, or kNoTemporalIdx.
|
| - bool layerSync; // This frame is a layer sync frame.
|
| - // Disabled if temporalIdx == kNoTemporalIdx.
|
| - int keyIdx; // 5 bits; kNoKeyIdx means not used.
|
| - int partitionId; // VP8 partition ID
|
| - bool beginningOfPartition; // True if this packet is the first
|
| - // in a VP8 partition. Otherwise false
|
| -};
|
| -
|
| -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;
|
| -};
|
| -
|
| -// The packetization types that we support: single, aggregated, and fragmented.
|
| -enum H264PacketizationTypes {
|
| - kH264SingleNalu, // This packet contains a single NAL unit.
|
| - kH264StapA, // This packet contains STAP-A (single time
|
| - // aggregation) packets. If this packet has an
|
| - // associated NAL unit type, it'll be for the
|
| - // first such aggregated packet.
|
| - kH264FuA, // This packet contains a FU-A (fragmentation
|
| - // unit) packet, meaning it is a part of a frame
|
| - // that was too large to fit into a single packet.
|
| -};
|
| -
|
| -// Packetization modes are defined in RFC 6184 section 6
|
| -// Due to the structure containing this being initialized with zeroes
|
| -// in some places, and mode 1 being default, mode 1 needs to have the value
|
| -// zero. https://crbug.com/webrtc/6803
|
| -enum class H264PacketizationMode {
|
| - NonInterleaved = 0, // Mode 1 - STAP-A, FU-A is allowed
|
| - SingleNalUnit // Mode 0 - only single NALU allowed
|
| -};
|
| -
|
| -// This function is declared inline because it is not clear which
|
| -// .cc file it should belong to.
|
| -// TODO(hta): Refactor. https://bugs.webrtc.org/6842
|
| -inline std::ostream& operator<<(std::ostream& stream,
|
| - H264PacketizationMode mode) {
|
| - switch (mode) {
|
| - case H264PacketizationMode::NonInterleaved:
|
| - stream << "NonInterleaved";
|
| - break;
|
| - case H264PacketizationMode::SingleNalUnit:
|
| - stream << "SingleNalUnit";
|
| - break;
|
| - }
|
| - return stream;
|
| -}
|
| -
|
| -struct NaluInfo {
|
| - uint8_t type;
|
| - int sps_id;
|
| - int pps_id;
|
| -
|
| - // Offset and size are only valid for non-FuA packets.
|
| - size_t offset;
|
| - size_t size;
|
| -};
|
| -
|
| -const size_t kMaxNalusPerPacket = 10;
|
| -
|
| -struct RTPVideoHeaderH264 {
|
| - // The NAL unit type. If this is a header for a
|
| - // fragmented packet, it's the NAL unit type of
|
| - // the original data. If this is the header for an
|
| - // aggregated packet, it's the NAL unit type of
|
| - // the first NAL unit in the packet.
|
| - uint8_t nalu_type;
|
| - // The packetization type of this buffer - single, aggregated or fragmented.
|
| - H264PacketizationTypes packetization_type;
|
| - NaluInfo nalus[kMaxNalusPerPacket];
|
| - size_t nalus_length;
|
| - // The packetization mode of this transport. Packetization mode
|
| - // determines which packetization types are allowed when packetizing.
|
| - H264PacketizationMode packetization_mode;
|
| -};
|
| -
|
| union RTPVideoTypeHeader {
|
| RTPVideoHeaderVP8 VP8;
|
| RTPVideoHeaderVP9 VP9;
|
|
|