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