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