Home | History | Annotate | Download | only in test
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_MODULES_VIDEO_CODING_TEST_TEST_CALLBACKS_H_
     12 #define WEBRTC_MODULES_VIDEO_CODING_TEST_TEST_CALLBACKS_H_
     13 
     14 /*
     15  * Declaration of general callbacks that are used throughout VCM's offline tests
     16  */
     17 
     18 
     19 #include <stdlib.h>
     20 #include <string.h>
     21 
     22 #include <fstream>
     23 #include <list>
     24 
     25 #include "webrtc/modules/interface/module_common_types.h"
     26 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
     27 #include "webrtc/modules/video_coding/main/interface/video_coding.h"
     28 #include "webrtc/modules/video_coding/main/test/test_util.h"
     29 #include "webrtc/system_wrappers/interface/trace.h"
     30 
     31 namespace webrtc
     32 {
     33 class RTPPayloadRegistry;
     34 class RtpDump;
     35 
     36 // Send Side - Packetization callback - send an encoded frame to the VCMReceiver
     37 class VCMEncodeCompleteCallback: public VCMPacketizationCallback
     38 {
     39 public:
     40     // Constructor input: file in which encoded data will be written
     41     VCMEncodeCompleteCallback(FILE* encodedFile);
     42     virtual ~VCMEncodeCompleteCallback();
     43     // Register transport callback
     44     void RegisterTransportCallback(VCMPacketizationCallback* transport);
     45     // Process encoded data received from the encoder, pass stream to the
     46     // VCMReceiver module
     47     int32_t SendData(const FrameType frameType,
     48                            const uint8_t payloadType,
     49                            const uint32_t timeStamp,
     50                            int64_t capture_time_ms,
     51                            const uint8_t* payloadData,
     52                            const uint32_t payloadSize,
     53                            const RTPFragmentationHeader& fragmentationHeader,
     54                            const RTPVideoHeader* videoHdr);
     55     // Register exisitng VCM. Currently - encode and decode under same module.
     56     void RegisterReceiverVCM(VideoCodingModule *vcm) {_VCMReceiver = vcm;}
     57     // Return size of last encoded frame data (all frames in the sequence)
     58     // Good for only one call - after which will reset value
     59     // (to allow detection of frame drop)
     60     float EncodedBytes();
     61     // Return encode complete (true/false)
     62     bool EncodeComplete();
     63     // Inform callback of codec used
     64     void SetCodecType(RtpVideoCodecTypes codecType)
     65     {_codecType = codecType;}
     66     // Inform callback of frame dimensions
     67     void SetFrameDimensions(int32_t width, int32_t height)
     68     {
     69         _width = width;
     70         _height = height;
     71     }
     72     // Initialize callback data
     73     void Initialize();
     74     void ResetByteCount();
     75 
     76     // Conversion function for payload type (needed for the callback function)
     77 
     78 private:
     79     FILE*              _encodedFile;
     80     float              _encodedBytes;
     81     VideoCodingModule* _VCMReceiver;
     82     FrameType          _frameType;
     83     uint16_t     _seqNo;
     84     bool               _encodeComplete;
     85     int32_t      _width;
     86     int32_t      _height;
     87     RtpVideoCodecTypes _codecType;
     88 
     89 }; // end of VCMEncodeCompleteCallback
     90 
     91 // Send Side - Packetization callback - packetize an encoded frame via the
     92 // RTP module
     93 class VCMRTPEncodeCompleteCallback: public VCMPacketizationCallback
     94 {
     95 public:
     96     VCMRTPEncodeCompleteCallback(RtpRtcp* rtp) :
     97         _encodedBytes(0),
     98         _encodeComplete(false),
     99         _RTPModule(rtp) {}
    100 
    101     virtual ~VCMRTPEncodeCompleteCallback() {}
    102     // Process encoded data received from the encoder, pass stream to the
    103     // RTP module
    104     int32_t SendData(const FrameType frameType,
    105                            const uint8_t payloadType,
    106                            const uint32_t timeStamp,
    107                            int64_t capture_time_ms,
    108                            const uint8_t* payloadData,
    109                            const uint32_t payloadSize,
    110                            const RTPFragmentationHeader& fragmentationHeader,
    111                            const RTPVideoHeader* videoHdr);
    112     // Return size of last encoded frame. Value good for one call
    113     // (resets to zero after call to inform test of frame drop)
    114     float EncodedBytes();
    115     // Return encode complete (true/false)
    116     bool EncodeComplete();
    117     // Inform callback of codec used
    118     void SetCodecType(RtpVideoCodecTypes codecType)
    119     {_codecType = codecType;}
    120 
    121     // Inform callback of frame dimensions
    122     void SetFrameDimensions(int16_t width, int16_t height)
    123     {
    124         _width = width;
    125         _height = height;
    126     }
    127 
    128 private:
    129     float              _encodedBytes;
    130     FrameType          _frameType;
    131     bool               _encodeComplete;
    132     RtpRtcp*           _RTPModule;
    133     int16_t      _width;
    134     int16_t      _height;
    135     RtpVideoCodecTypes _codecType;
    136 }; // end of VCMEncodeCompleteCallback
    137 
    138 // Decode Complete callback
    139 // Writes the decoded frames to a given file.
    140 class VCMDecodeCompleteCallback: public VCMReceiveCallback
    141 {
    142 public:
    143     VCMDecodeCompleteCallback(FILE* decodedFile) :
    144         _decodedFile(decodedFile), _decodedBytes(0) {}
    145     virtual ~VCMDecodeCompleteCallback() {}
    146     // Write decoded frame into file
    147     int32_t FrameToRender(webrtc::I420VideoFrame& videoFrame);
    148     int32_t DecodedBytes();
    149 private:
    150     FILE*               _decodedFile;
    151     uint32_t      _decodedBytes;
    152 }; // end of VCMDecodeCompleCallback class
    153 
    154 // Transport callback
    155 // Called by the RTP Sender - simulates sending packets through a network to the
    156 // RTP receiver. User can set network conditions as: RTT, packet loss,
    157 // burst length and jitter.
    158 class RTPSendCompleteCallback: public Transport
    159 {
    160 public:
    161     // Constructor input: (receive side) rtp module to send encoded data to
    162     RTPSendCompleteCallback(Clock* clock,
    163                             const char* filename = NULL);
    164     virtual ~RTPSendCompleteCallback();
    165 
    166     void SetRtpModule(RtpRtcp* rtp_module) { _rtp = rtp_module; }
    167     // Send Packet to receive side RTP module
    168     virtual int SendPacket(int channel, const void *data, int len);
    169     // Send RTCP Packet to receive side RTP module
    170     virtual int SendRTCPPacket(int channel, const void *data, int len);
    171     // Set percentage of channel loss in the network
    172     void SetLossPct(double lossPct);
    173     // Set average size of burst loss
    174     void SetBurstLength(double burstLength);
    175     // Set network delay in the network
    176     void SetNetworkDelay(uint32_t networkDelayMs)
    177                         {_networkDelayMs = networkDelayMs;};
    178     // Set Packet jitter delay
    179     void SetJitterVar(uint32_t jitterVar)
    180                       {_jitterVar = jitterVar;};
    181     // Return send count
    182     int SendCount() {return _sendCount; }
    183     // Return accumulated length in bytes of transmitted packets
    184     uint32_t TotalSentLength() {return _totalSentLength;}
    185 protected:
    186     // Randomly decide whether to drop packets, based on the channel model
    187     bool PacketLoss();
    188     // Random uniform loss model
    189     bool UnifomLoss(double lossPct);
    190 
    191     Clock*                  _clock;
    192     uint32_t          _sendCount;
    193     RTPPayloadRegistry* rtp_payload_registry_;
    194     RtpReceiver* rtp_receiver_;
    195     RtpRtcp*                _rtp;
    196     double                  _lossPct;
    197     double                  _burstLength;
    198     uint32_t          _networkDelayMs;
    199     double                  _jitterVar;
    200     bool                    _prevLossState;
    201     uint32_t          _totalSentLength;
    202     std::list<RtpPacket*>   _rtpPackets;
    203     RtpDump*                _rtpDump;
    204 };
    205 
    206 // Request re-transmission of packets (NACK)
    207 class PacketRequester: public VCMPacketRequestCallback
    208 {
    209 public:
    210     PacketRequester(RtpRtcp& rtp) :
    211         _rtp(rtp) {}
    212     int32_t ResendPackets(const uint16_t* sequenceNumbers,
    213             uint16_t length);
    214 private:
    215     webrtc::RtpRtcp& _rtp;
    216 };
    217 
    218 // Key frame request
    219 class KeyFrameReqTest: public VCMFrameTypeCallback
    220 {
    221 public:
    222     int32_t RequestKeyFrame();
    223 };
    224 
    225 
    226 // VCM statistics
    227 class SendStatsTest: public webrtc::VCMSendStatisticsCallback
    228 {
    229 public:
    230     SendStatsTest() : _framerate(15), _bitrate(500) {}
    231     int32_t SendStatistics(const uint32_t bitRate,
    232             const uint32_t frameRate);
    233     void set_framerate(uint32_t frameRate) {_framerate = frameRate;}
    234     void set_bitrate(uint32_t bitrate) {_bitrate = bitrate;}
    235 private:
    236     uint32_t _framerate;
    237     uint32_t _bitrate;
    238 };
    239 
    240 // Protection callback - allows the VCM (media optimization) to inform the RTP
    241 // module of the required protection(FEC rates/settings and NACK mode).
    242 class VideoProtectionCallback: public VCMProtectionCallback
    243 {
    244 public:
    245     VideoProtectionCallback();
    246     virtual ~VideoProtectionCallback();
    247     void RegisterRtpModule(RtpRtcp* rtp) {_rtp = rtp;}
    248     int32_t ProtectionRequest(
    249         const FecProtectionParams* delta_fec_params,
    250         const FecProtectionParams* key_fec_params,
    251         uint32_t* sent_video_rate_bps,
    252         uint32_t* sent_nack_rate_bps,
    253         uint32_t* sent_fec_rate_bps);
    254     FecProtectionParams DeltaFecParameters() const;
    255     FecProtectionParams KeyFecParameters() const;
    256 private:
    257     RtpRtcp* _rtp;
    258     FecProtectionParams delta_fec_params_;
    259     FecProtectionParams key_fec_params_;
    260 };
    261 }  // namespace webrtc
    262 #endif
    263