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