module_common_types.h revision c55a96383497a772a307b346368133960b02ad03
1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifndef MODULE_COMMON_TYPES_H 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define MODULE_COMMON_TYPES_H 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <cstring> // memcpy 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <assert.h> 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "typedefs.h" 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "common_types.h" 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent #pragma warning(disable:4351) // remove warning "new behavior: elements of array 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // 'array' will be default initialized" 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTPHeader 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool markerBit; 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 payloadType; 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 sequenceNumber; 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 timestamp; 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 ssrc; 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 numCSRCs; 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 arrOfCSRCs[kRtpCsrcSize]; 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 paddingLength; 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 headerLength; 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 30c55a96383497a772a307b346368133960b02ad03Eric Laurentstruct RTPHeaderExtension 31c55a96383497a772a307b346368133960b02ad03Eric Laurent{ 32c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word32 transmissionTimeOffset; 33c55a96383497a772a307b346368133960b02ad03Eric Laurent}; 34c55a96383497a772a307b346368133960b02ad03Eric Laurent 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTPAudioHeader 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 numEnergy; // number of valid entries in arrOfEnergy 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 arrOfEnergy[kRtpCsrcSize]; // one energy byte (0-9) per channel 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool isCNG; // is this CNG 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 channel; // number of channels 2 = stereo 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTPVideoHeaderH263 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 45c55a96383497a772a307b346368133960b02ad03Eric Laurent void InitRTPVideoHeaderH263() {}; 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool independentlyDecodable; // H.263-1998 if no P bit it's not independently decodable 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool bits; // H.263 mode B, Xor the lasy byte of previus packet with the 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // first byte of this packet 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 50c55a96383497a772a307b346368133960b02ad03Eric Laurent 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentenum {kNoPictureId = -1}; 52c55a96383497a772a307b346368133960b02ad03Eric Laurentenum {kNoTl0PicIdx = -1}; 53c55a96383497a772a307b346368133960b02ad03Eric Laurentenum {kNoTemporalIdx = -1}; 54c55a96383497a772a307b346368133960b02ad03Eric Laurentenum {kNoKeyIdx = -1}; 55c55a96383497a772a307b346368133960b02ad03Eric Laurentenum {kNoSimulcastIdx = 0}; 56c55a96383497a772a307b346368133960b02ad03Eric Laurent 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTPVideoHeaderVP8 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 59c55a96383497a772a307b346368133960b02ad03Eric Laurent void InitRTPVideoHeaderVP8() 60c55a96383497a772a307b346368133960b02ad03Eric Laurent { 61c55a96383497a772a307b346368133960b02ad03Eric Laurent nonReference = false; 62c55a96383497a772a307b346368133960b02ad03Eric Laurent pictureId = kNoPictureId; 63c55a96383497a772a307b346368133960b02ad03Eric Laurent tl0PicIdx = kNoTl0PicIdx; 64c55a96383497a772a307b346368133960b02ad03Eric Laurent temporalIdx = kNoTemporalIdx; 65c55a96383497a772a307b346368133960b02ad03Eric Laurent layerSync = false; 66c55a96383497a772a307b346368133960b02ad03Eric Laurent keyIdx = kNoKeyIdx; 67c55a96383497a772a307b346368133960b02ad03Eric Laurent partitionId = 0; 68c55a96383497a772a307b346368133960b02ad03Eric Laurent beginningOfPartition = false; 69c55a96383497a772a307b346368133960b02ad03Eric Laurent frameWidth = 0; 70c55a96383497a772a307b346368133960b02ad03Eric Laurent frameHeight = 0; 71c55a96383497a772a307b346368133960b02ad03Eric Laurent } 72c55a96383497a772a307b346368133960b02ad03Eric Laurent 73c55a96383497a772a307b346368133960b02ad03Eric Laurent bool nonReference; // Frame is discardable. 74c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 pictureId; // Picture ID index, 15 bits; 75c55a96383497a772a307b346368133960b02ad03Eric Laurent // kNoPictureId if PictureID does not exist. 76c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word16 tl0PicIdx; // TL0PIC_IDX, 8 bits; 77c55a96383497a772a307b346368133960b02ad03Eric Laurent // kNoTl0PicIdx means no value provided. 78c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_Word8 temporalIdx; // Temporal layer index, or kNoTemporalIdx. 79c55a96383497a772a307b346368133960b02ad03Eric Laurent bool layerSync; // This frame is a layer sync frame. 80c55a96383497a772a307b346368133960b02ad03Eric Laurent // Disabled if temporalIdx == kNoTemporalIdx. 81c55a96383497a772a307b346368133960b02ad03Eric Laurent int keyIdx; // 5 bits; kNoKeyIdx means not used. 82c55a96383497a772a307b346368133960b02ad03Eric Laurent int partitionId; // VP8 partition ID 83c55a96383497a772a307b346368133960b02ad03Eric Laurent bool beginningOfPartition; // True if this packet is the first 84c55a96383497a772a307b346368133960b02ad03Eric Laurent // in a VP8 partition. Otherwise false 85c55a96383497a772a307b346368133960b02ad03Eric Laurent int frameWidth; // Exists for key frames. 86c55a96383497a772a307b346368133960b02ad03Eric Laurent int frameHeight; // Exists for key frames. 87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentunion RTPVideoTypeHeader 89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPVideoHeaderH263 H263; 91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPVideoHeaderVP8 VP8; 92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentenum RTPVideoCodecTypes 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoGeneric = 0, 97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoH263 = 1, 98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoMPEG4 = 5, 99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoVP8 = 8, 100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoNoVideo = 10, 101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoFEC = 11, 102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kRTPVideoI420 = 12 103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTPVideoHeader 105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 width; // size 107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 height; 108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool isFirstPacket; // first packet in frame 110c55a96383497a772a307b346368133960b02ad03Eric Laurent WebRtc_UWord8 simulcastIdx; // Index if the simulcast encoder creating 111c55a96383497a772a307b346368133960b02ad03Eric Laurent // this frame, 0 if not using simulcast. 112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPVideoCodecTypes codec; 113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPVideoTypeHeader codecHeader; 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentunion RTPTypeHeader 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPAudioHeader Audio; 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPVideoHeader Video; 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct WebRtcRTPHeader 122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPHeader header; 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent FrameType frameType; 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPTypeHeader type; 126c55a96383497a772a307b346368133960b02ad03Eric Laurent RTPHeaderExtension extension; 127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass RTPFragmentationHeader 130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPFragmentationHeader() : 133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationVectorSize(0), 134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationOffset(NULL), 135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationLength(NULL), 136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationTimeDiff(NULL), 137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationPlType(NULL) 138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent {}; 139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ~RTPFragmentationHeader() 141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationOffset; 143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationLength; 144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationTimeDiff; 145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationPlType; 146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPFragmentationHeader& operator=(const RTPFragmentationHeader& header) 149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(this == &header) 151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationVectorSize != fragmentationVectorSize) 156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // new size of vectors 158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // delete old 160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationOffset; 161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationOffset = NULL; 162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationLength; 163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationLength = NULL; 164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationTimeDiff; 165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationTimeDiff = NULL; 166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] fragmentationPlType; 167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationPlType = NULL; 168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationVectorSize > 0) 170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // allocate new 172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationOffset) 173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationOffset = new WebRtc_UWord32[header.fragmentationVectorSize]; 175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationLength) 177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationLength = new WebRtc_UWord32[header.fragmentationVectorSize]; 179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationTimeDiff) 181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationTimeDiff = new WebRtc_UWord16[header.fragmentationVectorSize]; 183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationPlType) 185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationPlType = new WebRtc_UWord8[header.fragmentationVectorSize]; 187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // set new size 190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationVectorSize = header.fragmentationVectorSize; 191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationVectorSize > 0) 194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // copy values 196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationOffset) 197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationOffset, header.fragmentationOffset, 199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent header.fragmentationVectorSize * sizeof(WebRtc_UWord32)); 200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationLength) 202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationLength, header.fragmentationLength, 204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent header.fragmentationVectorSize * sizeof(WebRtc_UWord32)); 205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationTimeDiff) 207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationTimeDiff, header.fragmentationTimeDiff, 209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent header.fragmentationVectorSize * sizeof(WebRtc_UWord16)); 210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(header.fragmentationPlType) 212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationPlType, header.fragmentationPlType, 214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent header.fragmentationVectorSize * sizeof(WebRtc_UWord8)); 215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void VerifyAndAllocateFragmentationHeader( const WebRtc_UWord16 size) 220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if( fragmentationVectorSize < size) 222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 oldVectorSize = fragmentationVectorSize; 224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // offset 226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32* oldOffsets = fragmentationOffset; 227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationOffset = new WebRtc_UWord32[size]; 228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(fragmentationOffset+oldVectorSize, 0, 229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord32)*(size-oldVectorSize)); 230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // copy old values 231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationOffset,oldOffsets, sizeof(WebRtc_UWord32) * oldVectorSize); 232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete[] oldOffsets; 233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // length 235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32* oldLengths = fragmentationLength; 237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationLength = new WebRtc_UWord32[size]; 238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(fragmentationLength+oldVectorSize, 0, 239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord32) * (size- oldVectorSize)); 240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationLength, oldLengths, 241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord32) * oldVectorSize); 242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete[] oldLengths; 243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // time diff 245e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 246e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16* oldTimeDiffs = fragmentationTimeDiff; 247e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationTimeDiff = new WebRtc_UWord16[size]; 248e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(fragmentationTimeDiff+oldVectorSize, 0, 249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord16) * (size- oldVectorSize)); 250e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationTimeDiff, oldTimeDiffs, 251e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord16) * oldVectorSize); 252e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete[] oldTimeDiffs; 253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 254e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // payload type 255e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 256e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* oldTimePlTypes = fragmentationPlType; 257e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationPlType = new WebRtc_UWord8[size]; 258e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(fragmentationPlType+oldVectorSize, 0, 259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord8) * (size- oldVectorSize)); 260e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(fragmentationPlType, oldTimePlTypes, 261e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_UWord8) * oldVectorSize); 262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete[] oldTimePlTypes; 263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 264e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationVectorSize = size; 265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 266e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 267e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 268e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 fragmentationVectorSize; // Number of fragmentations 269e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32* fragmentationOffset; // Offset of pointer to data for each fragm. 270e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32* fragmentationLength; // Data size for each fragmentation 271e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16* fragmentationTimeDiff; // Timestamp difference relative "now" for 272e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // each fragmentation 273e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* fragmentationPlType; // Payload type of each fragmentation 274e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 275e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 276e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct RTCPVoIPMetric 277e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 278e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // RFC 3611 4.7 279e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 lossRate; 280e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 discardRate; 281e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 burstDensity; 282e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 gapDensity; 283e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 burstDuration; 284e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 gapDuration; 285e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 roundTripDelay; 286e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 endSystemDelay; 287e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 signalLevel; 288e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 noiseLevel; 289e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 RERL; 290e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 Gmin; 291e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 Rfactor; 292e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 extRfactor; 293e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 MOSLQ; 294e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 MOSCQ; 295e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 RXconfig; 296e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 JBnominal; 297e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 JBmax; 298e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 JBabsMax; 299e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 300e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 301e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// class describing a complete, or parts of an encoded frame. 302e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass EncodedVideoData 303e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 304e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 305e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EncodedVideoData() : 306e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent completeFrame(false), 307e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent missingFrame(false), 308e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadData(NULL), 309e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadSize(0), 310e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bufferSize(0) 311e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent {}; 312e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 313e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EncodedVideoData(const EncodedVideoData& data) 314e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 315e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadType = data.payloadType; 316e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent timeStamp = data.timeStamp; 317e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent renderTimeMs = data.renderTimeMs; 318e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent encodedWidth = data.encodedWidth; 319e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent encodedHeight = data.encodedHeight; 320e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent completeFrame = data.completeFrame; 321e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent missingFrame = data.missingFrame; 322e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadSize = data.payloadSize; 323e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationHeader = data.fragmentationHeader; 324e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frameType = data.frameType; 325e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent codec = data.codec; 326e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (data.payloadSize > 0) 327e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 328e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadData = new WebRtc_UWord8[data.payloadSize]; 329e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(payloadData, data.payloadData, data.payloadSize); 330e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 331e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else 332e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 333e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadData = NULL; 334e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 335e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 336e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 337e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 338e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ~EncodedVideoData() 339e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 340e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] payloadData; 341e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }; 342e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 343e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EncodedVideoData& operator=(const EncodedVideoData& data) 344e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 345e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (this == &data) 346e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 347e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 348e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 349e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadType = data.payloadType; 350e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent timeStamp = data.timeStamp; 351e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent renderTimeMs = data.renderTimeMs; 352e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent encodedWidth = data.encodedWidth; 353e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent encodedHeight = data.encodedHeight; 354e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent completeFrame = data.completeFrame; 355e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent missingFrame = data.missingFrame; 356e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadSize = data.payloadSize; 357e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent fragmentationHeader = data.fragmentationHeader; 358e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frameType = data.frameType; 359e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent codec = data.codec; 360e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (data.payloadSize > 0) 361e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 362e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] payloadData; 363e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadData = new WebRtc_UWord8[data.payloadSize]; 364e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(payloadData, data.payloadData, data.payloadSize); 365e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bufferSize = data.payloadSize; 366e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 367e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 368e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }; 369e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void VerifyAndAllocate( const WebRtc_UWord32 size) 370e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 371e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (bufferSize < size) 372e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 373e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* oldPayload = payloadData; 374e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadData = new WebRtc_UWord8[size]; 375e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(payloadData, oldPayload, sizeof(WebRtc_UWord8) * payloadSize); 376e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 377e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bufferSize = size; 378e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete[] oldPayload; 379e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 380e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 381e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 382e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 payloadType; 383e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 timeStamp; 384e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word64 renderTimeMs; 385e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 encodedWidth; 386e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 encodedHeight; 387e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool completeFrame; 388e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool missingFrame; 389e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* payloadData; 390e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 payloadSize; 391e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 bufferSize; 392e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent RTPFragmentationHeader fragmentationHeader; 393e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent FrameType frameType; 394e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent VideoCodecType codec; 395e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 396e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 397e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Video Content Metrics 398e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentstruct VideoContentMetrics 399e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 400e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent VideoContentMetrics(): motionMagnitudeNZ(0), sizeZeroMotion(0), spatialPredErr(0), 401c55a96383497a772a307b346368133960b02ad03Eric Laurent spatialPredErrH(0), spatialPredErrV(0), motionPredErr(0), 402e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent motionHorizontalness(0), motionClusterDistortion(0), 403e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent nativeWidth(0), nativeHeight(0), contentChange(false) { } 404e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void Reset(){ motionMagnitudeNZ = 0; sizeZeroMotion = 0; spatialPredErr = 0; 405c55a96383497a772a307b346368133960b02ad03Eric Laurent spatialPredErrH = 0; spatialPredErrV = 0; motionPredErr = 0; 406e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent motionHorizontalness = 0; motionClusterDistortion = 0; 407e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent nativeWidth = 0; nativeHeight = 0; contentChange = false; } 408e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 409e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float motionMagnitudeNZ; 410e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float sizeZeroMotion; 411e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float spatialPredErr; 412e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float spatialPredErrH; 413e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float spatialPredErrV; 414e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float motionPredErr; 415e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float motionHorizontalness; 416e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent float motionClusterDistortion; 417e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 nativeWidth; 418e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 nativeHeight; 419e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 nativeFrameRate; 420e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool contentChange; 421e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 422e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 423e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/************************************************* 424e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 425e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * VideoFrame class 426e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 427e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * The VideoFrame class allows storing and 428e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * handling of video frames. 429e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 430e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 431e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *************************************************/ 432e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass VideoFrame 433e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 434e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 435e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent VideoFrame(); 436e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ~VideoFrame(); 437e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 438e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Verifies that current allocated buffer size is larger than or equal to the input size. 439e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * If the current buffer size is smaller, a new allocation is made and the old buffer data 440e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * is copied to the new buffer. 441e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Buffer size is updated to minimumSize. 442e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 443e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 VerifyAndAllocate(const WebRtc_UWord32 minimumSize); 444e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 445e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Update length of data buffer in frame. Function verifies that new length is less or 446e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * equal to allocated size. 447e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 448e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 SetLength(const WebRtc_UWord32 newLength); 449e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /* 450e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Swap buffer and size data 451e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 452e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 Swap(WebRtc_UWord8*& newMemory, 453e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32& newLength, 454e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32& newSize); 455e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /* 456e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Swap buffer and size data 457e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 458e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 SwapFrame(VideoFrame& videoFrame); 459e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 460e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copy buffer: If newLength is bigger than allocated size, a new buffer of size length 461e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * is allocated. 462e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 463e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 CopyFrame(const VideoFrame& videoFrame); 464e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 465e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copy buffer: If newLength is bigger than allocated size, a new buffer of size length 466e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * is allocated. 467e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 468e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 CopyFrame(WebRtc_UWord32 length, const WebRtc_UWord8* sourceBuffer); 469e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 470e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Delete VideoFrame and resets members to zero 471e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 472e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void Free(); 473e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 474e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Set frame timestamp (90kHz) 475e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 476e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void SetTimeStamp(const WebRtc_UWord32 timeStamp) {_timeStamp = timeStamp;} 477e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 478e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get pointer to frame buffer 479e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 480e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* Buffer() const {return _buffer;} 481e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 482e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8*& Buffer() {return _buffer;} 483e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 484e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 485e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get allocated buffer size 486e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 487e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 Size() const {return _bufferSize;} 488e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 489e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get frame length 490e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 491e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 Length() const {return _bufferLength;} 492e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 493e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get frame timestamp (90kHz) 494e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 495e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 TimeStamp() const {return _timeStamp;} 496e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 497e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get frame width 498e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 499e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 Width() const {return _width;} 500e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 501e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get frame height 502e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 503e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 Height() const {return _height;} 504e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 505e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Set frame width 506e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 507e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void SetWidth(const WebRtc_UWord32 width) {_width = width;} 508e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 509e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Set frame height 510e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 511e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void SetHeight(const WebRtc_UWord32 height) {_height = height;} 512e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 513e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Set render time in miliseconds 514e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 515e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void SetRenderTime(const WebRtc_Word64 renderTimeMs) {_renderTimeMs = renderTimeMs;} 516e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent /** 517e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Get render time in miliseconds 518e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 519e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word64 RenderTimeMs() const {return _renderTimeMs;} 520e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 521e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate: 522e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void Set(WebRtc_UWord8* buffer, 523e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 size, 524e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 length, 525e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 timeStamp); 526e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 527e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* _buffer; // Pointer to frame buffer 528e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _bufferSize; // Allocated buffer size 529e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _bufferLength; // Length (in bytes) of buffer 530e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _timeStamp; // Timestamp of frame (90kHz) 531e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _width; 532e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _height; 533e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word64 _renderTimeMs; 534e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; // end of VideoFrame class declaration 535e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 536e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// inline implementation of VideoFrame class: 537e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 538e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::VideoFrame(): 539e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _buffer(0), 540e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferSize(0), 541e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferLength(0), 542e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp(0), 543e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _width(0), 544e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _height(0), 545e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _renderTimeMs(0) 546e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 547e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // 548e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 549e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 550e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::~VideoFrame() 551e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 552e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_buffer) 553e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 554e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] _buffer; 555e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _buffer = NULL; 556e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 557e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 558e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 559e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 560e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 561e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 562e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::VerifyAndAllocate(const WebRtc_UWord32 minimumSize) 563e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 564e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (minimumSize < 1) 565e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 566e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 567e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 568e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(minimumSize > _bufferSize) 569e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 570e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // create buffer of sufficient size 571e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* newBufferBuffer = new WebRtc_UWord8[minimumSize]; 572e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_buffer) 573e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 574e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // copy old data 575e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(newBufferBuffer, _buffer, _bufferSize); 576e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] _buffer; 577e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 578e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _buffer = newBufferBuffer; 579e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferSize = minimumSize; 580e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 581e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 582e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 583e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 584e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 585e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 586e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::SetLength(const WebRtc_UWord32 newLength) 587e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 588e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (newLength >_bufferSize ) 589e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { // can't accomodate new value 590e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 591e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 592e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferLength = newLength; 593e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 594e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 595e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 596e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 597e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 598e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::SwapFrame(VideoFrame& videoFrame) 599e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 600e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 tmpTimeStamp = _timeStamp; 601e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 tmpWidth = _width; 602e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 tmpHeight = _height; 603e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word64 tmpRenderTime = _renderTimeMs; 604e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 605e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp = videoFrame._timeStamp; 606e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _width = videoFrame._width; 607e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _height = videoFrame._height; 608e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _renderTimeMs = videoFrame._renderTimeMs; 609e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 610e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent videoFrame._timeStamp = tmpTimeStamp; 611e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent videoFrame._width = tmpWidth; 612e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent videoFrame._height = tmpHeight; 613e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent videoFrame._renderTimeMs = tmpRenderTime; 614e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 615e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return Swap(videoFrame._buffer, videoFrame._bufferLength, videoFrame._bufferSize); 616e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 617e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 618e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 619e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 620e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::Swap(WebRtc_UWord8*& newMemory, WebRtc_UWord32& newLength, WebRtc_UWord32& newSize) 621e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 622e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8* tmpBuffer = _buffer; 623e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 tmpLength = _bufferLength; 624e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 tmpSize = _bufferSize; 625e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _buffer = newMemory; 626e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferLength = newLength; 627e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferSize = newSize; 628e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent newMemory = tmpBuffer; 629e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent newLength = tmpLength; 630e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent newSize = tmpSize; 631e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 632e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 633e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 634e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 635e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 636e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::CopyFrame(WebRtc_UWord32 length, const WebRtc_UWord8* sourceBuffer) 637e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 638e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (length > _bufferSize) 639e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 640e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 ret = VerifyAndAllocate(length); 641e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (ret < 0) 642e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 643e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return ret; 644e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 645e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 646e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_buffer, sourceBuffer, length); 647e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferLength = length; 648e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 649e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 650e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 651e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 652e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 653e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::CopyFrame(const VideoFrame& videoFrame) 654e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 655e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(CopyFrame(videoFrame.Length(), videoFrame.Buffer()) != 0) 656e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 657e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 658e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 659e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp = videoFrame._timeStamp; 660e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _width = videoFrame._width; 661e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _height = videoFrame._height; 662e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _renderTimeMs = videoFrame._renderTimeMs; 663e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 664e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 665e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 666e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 667e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid 668e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentVideoFrame::Free() 669e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 670e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp = 0; 671e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferLength = 0; 672e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _bufferSize = 0; 673e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _height = 0; 674e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _width = 0; 675e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _renderTimeMs = 0; 676e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 677e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_buffer) 678e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 679e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete [] _buffer; 680e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _buffer = NULL; 681e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 682e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 683e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 684e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 685e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/************************************************* 686e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 687e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * AudioFrame class 688e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 689e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * The AudioFrame class holds up to 60 ms wideband 690e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * audio. It allows for adding and subtracting frames 691e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * while keeping track of the resulting states. 692e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 693e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Note 694e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * - The +operator assume that you would never add 695e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * exact opposite frames when deciding the resulting 696e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * state. To do this use the -operator. 697e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 698e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * - _audioChannel of 1 indicated mono, and 2 699e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * indicates stereo. 700e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 701e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * - _payloadDataLengthInSamples is the number of 702e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * samples per channel. Therefore, the total 703e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * number of samples in _payloadData is 704e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * (_payloadDataLengthInSamples * _audioChannel). 705e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 706e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * - Stereo data is stored in interleaved fashion 707e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * starting with the left channel. 708e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 709e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *************************************************/ 710e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass AudioFrame 711e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 712e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 713e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent enum{kMaxAudioFrameSizeSamples = 3840}; // stereo 32KHz 60ms 2*32*60 714e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 715e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent enum VADActivity 716e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 717e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kVadActive = 0, 718e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kVadPassive = 1, 719e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kVadUnknown = 2 720e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }; 721e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent enum SpeechType 722e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 723e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kNormalSpeech = 0, 724e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kPLC = 1, 725e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kCNG = 2, 726e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kPLCCNG = 3, 727e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent kUndefined = 4 728e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }; 729e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 730e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame(); 731e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ~AudioFrame(); 732e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 733e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 UpdateFrame( 734e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id, 735e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 timeStamp, 736e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word16* payloadData, 737e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 payloadDataLengthInSamples, 738c55a96383497a772a307b346368133960b02ad03Eric Laurent const int frequencyInHz, 739e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const SpeechType speechType, 740e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const VADActivity vadActivity, 741e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord8 audioChannel = 1, 742e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 volume = -1, 743e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 energy = -1); 744e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 745e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame& Append(const AudioFrame& rhs); 746e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 747e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent void Mute() const; 748e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 749e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame& operator=(const AudioFrame& rhs); 750e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame& operator>>=(const WebRtc_Word32 rhs); 751e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame& operator+=(const AudioFrame& rhs); 752e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent AudioFrame& operator-=(const AudioFrame& rhs); 753e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 754e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 _id; 755e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _timeStamp; 756e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 757e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Supporting Stereo, stereo samples are interleaved 758e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent mutable WebRtc_Word16 _payloadData[kMaxAudioFrameSizeSamples]; 759e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 _payloadDataLengthInSamples; 760c55a96383497a772a307b346368133960b02ad03Eric Laurent int _frequencyInHz; 761e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord8 _audioChannel; 762e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent SpeechType _speechType; 763e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent VADActivity _vadActivity; 764e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 765e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord32 _energy; 766e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 _volume; 767e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 768e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 769e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 770e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::AudioFrame() 771e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent : 772e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _id(-1), 773e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp(0), 774e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData(), 775e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples(0), 776e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _frequencyInHz(0), 777e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _audioChannel(1), 778e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType(kUndefined), 779e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity(kVadUnknown), 780e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _energy(0xffffffff), 781e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _volume(0xffffffff) 782e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 783e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 784e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 785e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 786e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::~AudioFrame() 787e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 788e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 789e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 790e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 791e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 792e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::UpdateFrame( 793e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 id, 794e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord32 timeStamp, 795e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word16* payloadData, 796e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord16 payloadDataLengthInSamples, 797c55a96383497a772a307b346368133960b02ad03Eric Laurent const int frequencyInHz, 798e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const SpeechType speechType, 799e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const VADActivity vadActivity, 800e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_UWord8 audioChannel, 801e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 volume, 802e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const WebRtc_Word32 energy) 803e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 804e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _id = id; 805e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp = timeStamp; 806e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _frequencyInHz = frequencyInHz; 807e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType = speechType; 808e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = vadActivity; 809e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _volume = volume; 810e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _audioChannel = audioChannel; 811e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _energy = energy; 812e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 813e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((payloadDataLengthInSamples > kMaxAudioFrameSizeSamples) || 814e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (audioChannel > 2) || (audioChannel < 1)) 815e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 816e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples = 0; 817e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 818e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 819e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples = payloadDataLengthInSamples; 820e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(payloadData != NULL) 821e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 822e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_payloadData, payloadData, sizeof(WebRtc_Word16) * 823e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadDataLengthInSamples * _audioChannel); 824e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 825e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else 826e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 827e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(_payloadData,0,sizeof(WebRtc_Word16) * 828e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent payloadDataLengthInSamples * _audioChannel); 829e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 830e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 831e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 832e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 833e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 834e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid 835e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::Mute() const 836e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 837e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memset(_payloadData, 0, _payloadDataLengthInSamples * sizeof(WebRtc_Word16)); 838e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 839e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 840e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 841e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame& 842e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::operator=(const AudioFrame& rhs) 843e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 844e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Sanity Check 845e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((rhs._payloadDataLengthInSamples > kMaxAudioFrameSizeSamples) || 846e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (rhs._audioChannel > 2) || 847e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (rhs._audioChannel < 1)) 848e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 849e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 850e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 851e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(this == &rhs) 852e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 853e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 854e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 855e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _id = rhs._id; 856e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _timeStamp = rhs._timeStamp; 857e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _frequencyInHz = rhs._frequencyInHz; 858e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType = rhs._speechType; 859e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = rhs._vadActivity; 860e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _volume = rhs._volume; 861e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _audioChannel = rhs._audioChannel; 862e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _energy = rhs._energy; 863e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 864e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples = rhs._payloadDataLengthInSamples; 865e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_payloadData, rhs._payloadData, 866e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_Word16) * rhs._payloadDataLengthInSamples * _audioChannel); 867e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 868e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 869e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 870e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 871e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 872e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame& 873e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::operator>>=(const WebRtc_Word32 rhs) 874e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 875e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert((_audioChannel > 0) && (_audioChannel < 3)); 876e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_audioChannel > 2) || 877e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (_audioChannel < 1)) 878e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 879e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 880e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 881e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++) 882e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 883e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = WebRtc_Word16(_payloadData[i] >> rhs); 884e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 885e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 886e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 887e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 888e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 889e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame& 890e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::Append(const AudioFrame& rhs) 891e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 892e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Sanity check 893e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert((_audioChannel > 0) && (_audioChannel < 3)); 894e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_audioChannel > 2) || 895e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (_audioChannel < 1)) 896e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 897e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 898e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 899e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_audioChannel != rhs._audioChannel) 900e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 901e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 902e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 903e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_vadActivity == kVadActive) || 904e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs._vadActivity == kVadActive) 905e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 906e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = kVadActive; 907e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 908e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else if((_vadActivity == kVadUnknown) || 909e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs._vadActivity == kVadUnknown) 910e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 911e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = kVadUnknown; 912e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 913e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_speechType != rhs._speechType) 914e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 915e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType = kUndefined; 916e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 917e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 918e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_UWord16 offset = _payloadDataLengthInSamples * _audioChannel; 919e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(WebRtc_UWord16 i = 0; 920e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent i < rhs._payloadDataLengthInSamples * rhs._audioChannel; 921e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent i++) 922e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 923e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[offset+i] = rhs._payloadData[i]; 924e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 925e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples += rhs._payloadDataLengthInSamples; 926e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 927e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 928e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 929e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// merge vectors 930e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 931e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame& 932e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::operator+=(const AudioFrame& rhs) 933e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 934e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Sanity check 935e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert((_audioChannel > 0) && (_audioChannel < 3)); 936e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_audioChannel > 2) || 937e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (_audioChannel < 1)) 938e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 939e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 940e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 941e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_audioChannel != rhs._audioChannel) 942e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 943e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 944e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 945e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool noPrevData = false; 946e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_payloadDataLengthInSamples != rhs._payloadDataLengthInSamples) 947e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 948e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_payloadDataLengthInSamples == 0) 949e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 950e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // special case we have no data to start with 951e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadDataLengthInSamples = rhs._payloadDataLengthInSamples; 952e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent noPrevData = true; 953e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else 954e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 955e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 956e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 957e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 958e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 959e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_vadActivity == kVadActive) || 960e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs._vadActivity == kVadActive) 961e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 962e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = kVadActive; 963e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 964e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else if((_vadActivity == kVadUnknown) || 965e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs._vadActivity == kVadUnknown) 966e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 967e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = kVadUnknown; 968e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 969e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 970e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(_speechType != rhs._speechType) 971e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 972e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType = kUndefined; 973e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 974e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 975e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(noPrevData) 976e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 977e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent memcpy(_payloadData, rhs._payloadData, 978e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent sizeof(WebRtc_Word16) * rhs._payloadDataLengthInSamples * _audioChannel); 979e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else 980e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 981e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // IMPROVEMENT this can be done very fast in assembly 982e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++) 983e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 984e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 wrapGuard = (WebRtc_Word32)_payloadData[i] + 985e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (WebRtc_Word32)rhs._payloadData[i]; 986e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(wrapGuard < -32768) 987e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 988e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = -32768; 989e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }else if(wrapGuard > 32767) 990e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 991e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = 32767; 992e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent }else 993e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 994e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = (WebRtc_Word16)wrapGuard; 995e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 996e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 997e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 998e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _energy = 0xffffffff; 999e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _volume = 0xffffffff; 1000e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 1001e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 1002e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 1003e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentinline 1004e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame& 1005e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAudioFrame::operator-=(const AudioFrame& rhs) 1006e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 1007e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Sanity check 1008e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent assert((_audioChannel > 0) && (_audioChannel < 3)); 1009e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_audioChannel > 2)|| 1010e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (_audioChannel < 1)) 1011e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1012e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 1013e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1014e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_payloadDataLengthInSamples != rhs._payloadDataLengthInSamples) || 1015e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (_audioChannel != rhs._audioChannel)) 1016e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1017e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 1018e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1019e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if((_vadActivity != kVadPassive) || 1020e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs._vadActivity != kVadPassive) 1021e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1022e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _vadActivity = kVadUnknown; 1023e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1024e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _speechType = kUndefined; 1025e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 1026e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for(WebRtc_UWord16 i = 0; i < _payloadDataLengthInSamples * _audioChannel; i++) 1027e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1028e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word32 wrapGuard = (WebRtc_Word32)_payloadData[i] - 1029e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (WebRtc_Word32)rhs._payloadData[i]; 1030e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(wrapGuard < -32768) 1031e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1032e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = -32768; 1033e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1034e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else if(wrapGuard > 32767) 1035e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1036e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = 32767; 1037e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1038e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent else 1039e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 1040e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _payloadData[i] = (WebRtc_Word16)wrapGuard; 1041e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1042e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 1043e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _energy = 0xffffffff; 1044e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent _volume = 0xffffffff; 1045e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *this; 1046e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 1047e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 1048e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc 1049e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 1050e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // MODULE_COMMON_TYPES_H 1051