common_types.h revision e48d5845c8b35de2ab73ea055c18a61fa3a9f0be
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Use of this source code is governed by a BSD-style license
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  that can be found in the LICENSE file in the root of the source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  tree. An additional intellectual property rights grant can be found
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  in the file PATENTS.  All contributing project authors may
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  be found in the AUTHORS file in the root of the source tree.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBRTC_COMMON_TYPES_H
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define WEBRTC_COMMON_TYPES_H
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "typedefs.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WEBRTC_EXPORT
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define WEBRTC_DLLEXPORT _declspec(dllexport)
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#elif WEBRTC_DLL
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    #define WEBRTC_DLLEXPORT _declspec(dllimport)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define WEBRTC_DLLEXPORT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NULL
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define NULL 0
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webrtc {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InStream
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int Read(void *buf,int len) = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int Rewind() {return -1;}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~InStream() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InStream() {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OutStream
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Write(const void *buf,int len) = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int Rewind() {return -1;}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~OutStream() {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OutStream() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TraceModule
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // not a module, triggered from the engine code
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVoice              = 0x0001,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not a module, triggered from the engine code
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideo              = 0x0002,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not a module, triggered from the utility code
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kTraceUtility            = 0x0003,
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kTraceRtpRtcp            = 0x0004,
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kTraceTransport          = 0x0005,
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kTraceSrtp               = 0x0006,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAudioCoding        = 0x0007,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAudioMixerServer   = 0x0008,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAudioMixerClient   = 0x0009,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceFile               = 0x000a,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAudioProcessing    = 0x000b,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideoCoding        = 0x0010,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideoMixer         = 0x0011,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAudioDevice        = 0x0012,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideoRenderer      = 0x0014,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideoCapture       = 0x0015,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceVideoPreocessing   = 0x0016
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TraceLevel
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceNone               = 0x0000,    // no trace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceStateInfo          = 0x0001,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceWarning            = 0x0002,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceError              = 0x0004,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceCritical           = 0x0008,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceApiCall            = 0x0010,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceDefault            = 0x00ff,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceModuleCall         = 0x0020,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceMemory             = 0x0100,   // memory info
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceTimer              = 0x0200,   // timing info
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceStream             = 0x0400,   // "continuous" stream of data
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // used for debug purposes
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceDebug              = 0x0800,  // debug
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceInfo               = 0x1000,  // debug info
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kTraceAll                = 0xffff
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// External Trace API
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraceCallback
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles){
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void Print(const TraceLevel level,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const char *traceString,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const int length) = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~TraceCallback() {}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TraceCallback() {}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum FileFormats
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatWavFile        = 1,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatCompressedFile = 2,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatAviFile        = 3,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatPreencodedFile = 4,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatPcm16kHzFile   = 7,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatPcm8kHzFile    = 8,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFileFormatPcm32kHzFile   = 9
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ProcessingTypes
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPlaybackPerChannel = 0,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPlaybackAllChannelsMixed,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kRecordingPerChannel,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kRecordingAllChannelsMixed
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encryption enums
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CipherTypes
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kCipherNull               = 0,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kCipherAes128CounterMode  = 1
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum AuthenticationTypes
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kAuthNull       = 0,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kAuthHmacSha1   = 3
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SecurityLevels
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kNoProtection                    = 0,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kEncryption                      = 1,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kAuthentication                  = 2,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kEncryptionAndAuthentication     = 3
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Encryption
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void encrypt(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int channel_no,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* in_data,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* out_data,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int bytes_in,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int* bytes_out) = 0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void decrypt(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int channel_no,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* in_data,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* out_data,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int bytes_in,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int* bytes_out) = 0;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void encrypt_rtcp(
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        int channel_no,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* in_data,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* out_data,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int bytes_in,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int* bytes_out) = 0;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void decrypt_rtcp(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int channel_no,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* in_data,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned char* out_data,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int bytes_in,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int* bytes_out) = 0;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Encryption() {}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Encryption() {}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// External transport callback interface
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Transport
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int SendPacket(int channel, const void *data, int len) = 0;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int SendRTCPPacket(int channel, const void *data, int len) = 0;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Transport() {}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Transport() {}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ==================================================================
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Voice specific types
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ==================================================================
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each codec supported can be described by this structure.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CodecInst
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int pltype;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char plname[32];
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int plfreq;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int pacsize;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int channels;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rate;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum FrameType
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFrameEmpty            = 0,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kAudioFrameSpeech      = 1,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kAudioFrameCN          = 2,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVideoFrameKey         = 3,    // independent frame
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVideoFrameDelta       = 4,    // depends on the previus frame
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVideoFrameGolden      = 5,    // depends on a old known previus frame
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVideoFrameAltRef      = 6
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RTP
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum {kRtpCsrcSize = 15}; // RFC 3550 page 13
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum RTPDirections
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kRtpIncoming = 0,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kRtpOutgoing
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PayloadFrequencies
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFreq8000Hz = 8000,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFreq16000Hz = 16000,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFreq32000Hz = 32000
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum VadModes                 // degree of bandwidth reduction
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVadConventional = 0,      // lowest reduction
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVadAggressiveLow,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVadAggressiveMid,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kVadAggressiveHigh         // highest reduction
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct NetworkStatistics           // NETEQ statistics
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current jitter buffer size in ms
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentBufferSize;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // preferred (optimal) buffer size in ms
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 preferredBufferSize;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // loss rate (network + late) in percent (in Q14)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentPacketLossRate;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // late loss rate in percent (in Q14)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentDiscardRate;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fraction (of original stream) of synthesized speech inserted through
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // expansion (in Q14)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentExpandRate;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fraction of synthesized speech inserted through pre-emptive expansion
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (in Q14)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentPreemptiveRate;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // fraction of data removed through acceleration (in Q14)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRtc_UWord16 currentAccelerateRate;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268struct JitterStatistics
269{
270    // smallest Jitter Buffer size during call in ms
271    WebRtc_UWord32 jbMinSize;
272    // largest Jitter Buffer size during call in ms
273    WebRtc_UWord32 jbMaxSize;
274    // the average JB size, measured over time - ms
275    WebRtc_UWord32 jbAvgSize;
276    // number of times the Jitter Buffer changed (using Accelerate or
277    // Pre-emptive Expand)
278    WebRtc_UWord32 jbChangeCount;
279    // amount (in ms) of audio data received late
280    WebRtc_UWord32 lateLossMs;
281    // milliseconds removed to reduce jitter buffer size
282    WebRtc_UWord32 accelerateMs;
283    // milliseconds discarded through buffer flushing
284    WebRtc_UWord32 flushedMs;
285    // milliseconds of generated silence
286    WebRtc_UWord32 generatedSilentMs;
287    // milliseconds of synthetic audio data (non-background noise)
288    WebRtc_UWord32 interpolatedVoiceMs;
289    // milliseconds of synthetic audio data (background noise level)
290    WebRtc_UWord32 interpolatedSilentMs;
291    // count of tiny expansions in output audio
292    WebRtc_UWord32 countExpandMoreThan120ms;
293    // count of small expansions in output audio
294    WebRtc_UWord32 countExpandMoreThan250ms;
295    // count of medium expansions in output audio
296    WebRtc_UWord32 countExpandMoreThan500ms;
297    // count of long expansions in output audio
298    WebRtc_UWord32 countExpandMoreThan2000ms;
299    // duration of longest audio drop-out
300    WebRtc_UWord32 longestExpandDurationMs;
301    // count of times we got small network outage (inter-arrival time in
302    // [500, 1000) ms)
303    WebRtc_UWord32 countIAT500ms;
304    // count of times we got medium network outage (inter-arrival time in
305    // [1000, 2000) ms)
306    WebRtc_UWord32 countIAT1000ms;
307    // count of times we got large network outage (inter-arrival time >=
308    // 2000 ms)
309    WebRtc_UWord32 countIAT2000ms;
310    // longest packet inter-arrival time in ms
311    WebRtc_UWord32 longestIATms;
312    // min time incoming Packet "waited" to be played
313    WebRtc_UWord32 minPacketDelayMs;
314    // max time incoming Packet "waited" to be played
315    WebRtc_UWord32 maxPacketDelayMs;
316    // avg time incoming Packet "waited" to be played
317    WebRtc_UWord32 avgPacketDelayMs;
318};
319
320typedef struct
321{
322    int min;              // minumum
323    int max;              // maximum
324    int average;          // average
325} StatVal;
326
327typedef struct           // All levels are reported in dBm0
328{
329    StatVal speech_rx;   // long-term speech levels on receiving side
330    StatVal speech_tx;   // long-term speech levels on transmitting side
331    StatVal noise_rx;    // long-term noise/silence levels on receiving side
332    StatVal noise_tx;    // long-term noise/silence levels on transmitting side
333} LevelStatistics;
334
335typedef struct        // All levels are reported in dB
336{
337    StatVal erl;      // Echo Return Loss
338    StatVal erle;     // Echo Return Loss Enhancement
339    StatVal rerl;     // RERL = ERL + ERLE
340    // Echo suppression inside EC at the point just before its NLP
341    StatVal a_nlp;
342} EchoStatistics;
343
344enum TelephoneEventDetectionMethods
345{
346    kInBand = 0,
347    kOutOfBand = 1,
348    kInAndOutOfBand = 2
349};
350
351enum NsModes    // type of Noise Suppression
352{
353    kNsUnchanged = 0,   // previously set mode
354    kNsDefault,         // platform default
355    kNsConference,      // conferencing default
356    kNsLowSuppression,  // lowest suppression
357    kNsModerateSuppression,
358    kNsHighSuppression,
359    kNsVeryHighSuppression,     // highest suppression
360};
361
362enum AgcModes                  // type of Automatic Gain Control
363{
364    kAgcUnchanged = 0,        // previously set mode
365    kAgcDefault,              // platform default
366    // adaptive mode for use when analog volume control exists (e.g. for
367    // PC softphone)
368    kAgcAdaptiveAnalog,
369    // scaling takes place in the digital domain (e.g. for conference servers
370    // and embedded devices)
371    kAgcAdaptiveDigital,
372    // can be used on embedded devices where the the capture signal is level
373    // is predictable
374    kAgcFixedDigital
375};
376
377// EC modes
378enum EcModes                   // type of Echo Control
379{
380    kEcUnchanged = 0,          // previously set mode
381    kEcDefault,                // platform default
382    kEcConference,             // conferencing default (aggressive AEC)
383    kEcAec,                    // Acoustic Echo Cancellation
384    kEcAecm,                   // AEC mobile
385};
386
387// AECM modes
388enum AecmModes                 // mode of AECM
389{
390    kAecmQuietEarpieceOrHeadset = 0,
391                               // Quiet earpiece or headset use
392    kAecmEarpiece,             // most earpiece use
393    kAecmLoudEarpiece,         // Loud earpiece or quiet speakerphone use
394    kAecmSpeakerphone,         // most speakerphone use (default)
395    kAecmLoudSpeakerphone      // Loud speakerphone
396};
397
398// AGC configuration
399typedef struct
400{
401    unsigned short targetLeveldBOv;
402    unsigned short digitalCompressionGaindB;
403    bool           limiterEnable;
404} AgcConfig;                  // AGC configuration parameters
405
406enum StereoChannel
407{
408    kStereoLeft = 0,
409    kStereoRight,
410    kStereoBoth
411};
412
413// Audio device layers
414enum AudioLayers
415{
416    kAudioPlatformDefault = 0,
417    kAudioWindowsWave = 1,
418    kAudioWindowsCore = 2,
419    kAudioLinuxAlsa = 3,
420    kAudioLinuxPulse = 4
421};
422
423enum NetEqModes             // NetEQ playout configurations
424{
425    // Optimized trade-off between low delay and jitter robustness for two-way
426    // communication.
427    kNetEqDefault = 0,
428    // Improved jitter robustness at the cost of increased delay. Can be
429    // used in one-way communication.
430    kNetEqStreaming = 1,
431    // Optimzed for decodability of fax signals rather than for perceived audio
432    // quality.
433    kNetEqFax = 2,
434};
435
436enum NetEqBgnModes          // NetEQ Background Noise (BGN) configurations
437{
438    // BGN is always on and will be generated when the incoming RTP stream
439    // stops (default).
440    kBgnOn = 0,
441    // The BGN is faded to zero (complete silence) after a few seconds.
442    kBgnFade = 1,
443    // BGN is not used at all. Silence is produced after speech extrapolation
444    // has faded.
445    kBgnOff = 2,
446};
447
448enum OnHoldModes            // On Hold direction
449{
450    kHoldSendAndPlay = 0,    // Put both sending and playing in on-hold state.
451    kHoldSendOnly,           // Put only sending in on-hold state.
452    kHoldPlayOnly            // Put only playing in on-hold state.
453};
454
455enum AmrMode
456{
457    kRfc3267BwEfficient = 0,
458    kRfc3267OctetAligned = 1,
459    kRfc3267FileStorage = 2,
460};
461
462// ==================================================================
463// Video specific types
464// ==================================================================
465
466// Raw video types
467enum RawVideoType
468{
469    kVideoI420     = 0,
470    kVideoYV12     = 1,
471    kVideoYUY2     = 2,
472    kVideoUYVY     = 3,
473    kVideoIYUV     = 4,
474    kVideoARGB     = 5,
475    kVideoRGB24    = 6,
476    kVideoRGB565   = 7,
477    kVideoARGB4444 = 8,
478    kVideoARGB1555 = 9,
479    kVideoMJPEG    = 10,
480    kVideoNV12     = 11,
481    kVideoNV21     = 12,
482    kVideoUnknown  = 99
483};
484
485// Video codec
486enum { kConfigParameterSize = 128};
487enum { kPayloadNameSize = 32};
488
489// H.263 specific
490struct VideoCodecH263
491{
492    char quality;
493};
494
495// H.264 specific
496enum H264Packetization
497{
498    kH264SingleMode         = 0,
499    kH264NonInterleavedMode = 1
500};
501
502enum VideoCodecComplexity
503{
504    kComplexityNormal = 0,
505    kComplexityHigh    = 1,
506    kComplexityHigher  = 2,
507    kComplexityMax     = 3
508};
509
510enum VideoCodecProfile
511{
512    kProfileBase = 0x00,
513    kProfileMain = 0x01
514};
515
516struct VideoCodecH264
517{
518    H264Packetization          packetization;
519    VideoCodecComplexity       complexity;
520    VideoCodecProfile          profile;
521    char                       level;
522    char                       quality;
523
524    bool                       useFMO;
525
526    unsigned char              configParameters[kConfigParameterSize];
527    unsigned char              configParametersSize;
528};
529
530// VP8 specific
531struct VideoCodecVP8
532{
533    bool                       pictureLossIndicationOn;
534    bool                       feedbackModeOn;
535    VideoCodecComplexity       complexity;
536};
537
538// MPEG-4 specific
539struct VideoCodecMPEG4
540{
541    unsigned char   configParameters[kConfigParameterSize];
542    unsigned char   configParametersSize;
543    char            level;
544};
545
546// Unknown specific
547struct VideoCodecGeneric
548{
549};
550
551// Video codec types
552enum VideoCodecType
553{
554    kVideoCodecH263,
555    kVideoCodecH264,
556    kVideoCodecVP8,
557    kVideoCodecMPEG4,
558    kVideoCodecI420,
559    kVideoCodecRED,
560    kVideoCodecULPFEC,
561    kVideoCodecUnknown
562};
563
564union VideoCodecUnion
565{
566    VideoCodecH263      H263;
567    VideoCodecH264      H264;
568    VideoCodecVP8       VP8;
569    VideoCodecMPEG4     MPEG4;
570    VideoCodecGeneric   Generic;
571};
572
573// Common video codec properties
574struct VideoCodec
575{
576    VideoCodecType      codecType;
577    char                plName[kPayloadNameSize];
578    unsigned char       plType;
579
580    unsigned short      width;
581    unsigned short      height;
582
583    unsigned int        startBitrate;
584    unsigned int        maxBitrate;
585    unsigned int        minBitrate;
586    unsigned char       maxFramerate;
587
588    VideoCodecUnion     codecSpecific;
589
590    unsigned int        qpMax;
591};
592
593}  // namespace webrtc
594
595#endif  // WEBRTC_COMMON_TYPES_H
596