Mirror only. Please do not send pull requests.
C C++ Makefile

README

UDPSample  
===============

This sample illustrates using vp8 for a live video transmission over lossy 
UDP with a back channel.

It includes two sample console based subprograms: 


GrabCompressAndSend 
upon receipt of session initiation requests from ReceiveDecompressAndPlay, 
captures live video from an installed direct show camera, compresses it, 
packetizes it, adds forward error correction (if specified) and then sends 
the data across a port using UDP. Upon any receipt of a request for recovery 
or for a packet resend it responds appropriately. 

ReceiveDecompressAndPlay 
initiates a session with GrabCompressAndSend sending parameters regarding 
forward error correction, simulated packetloss, datarate, frame size, etc.  
The program then awaits arrival of packets from GrabCompressAndSend and uses 
them to reassemble frames, which it then decompress and plays for the user.  
Any lost packets that can be rebuilt using forward error correction are 
rebuilt.   If a packet is lost and can't be rebuilt, packet resend requests 
are sent.  If there is still not a timely response or a large number of 
packets are lost the program requests a recovery frame. 

Build requirements : 

Linux -> 64-bit, libsdl and libvpx must be installed and in your paths. 
MacOSX -> libsdk, libvpx and libvidcap must be installed and in your paths.
Windows -> VS2005, PlatformSDK ( + DirectShow Baseclasses ) in include and lib 
  path, DirectX in include and libpath  

DISCLAIMER: This sample code has only been tested on a very limited set of 
machines - we can use your help to expand and make it work on a wider range 
of platforms.   



============================================================
Usage:  Open up two command prompt windows.  in one run : 

grabcompressandsend

in the other run 

receivedecompressandplay 

Two video windows should open and video should be played.  


On 2 separate computers the following command lines requests 400 kbps 
960x720 video compressed at 15fps, to be sent with 1 xor-packet created from 
every 5 packets over ports 1407 and 1408. Recovery frames are requested if a 
lost packet ages to 800 ms.  

receivedecompressandplay -w 960 -h 720 -f 15 -b 400 -n 6 -d 5 -t 800 -s 1408 -r 1407

grabcompressandsend -i 10.10.28.1 -s 1407 -r 1408

============================================================

ReceiveDecompressAndPlay has the following other options: 

-w [640]  request capture width
-h [480]  request capture height
-f [30]   request capture frame rate
-b [300]  videoBitrate = ato
-n [6]    fecNumerator ( redundancy numerator)
-d [5]    fecDenominator ( redundancy denominator)
          6/5 means 1 xor packet for every 5 packets,
          4/1 means 3 duplicate packets for every packet
-t [800]  milliseconds before giving up and requesting recovery
-i [50]   time in milliseconds between attempts at a packet resend
-c [12]   number of lost packets before requesting recovery
-l [0]    packets to lose out of every 1000
-s [1408] port to send requests to
-r [1407] port to receive requests on.


GrabCompressAndSend has the following options: 

-i [127.0.0.1]    Port to send data to.
-s [1408] port to send requests to
-r [1407] port to receive requests on.



Caveats:   This is just sample code. There are many problems that this 
code does not make any attempt at all to resolve.   Ie. Getting through 
firewalls, sensible session initiation  (IE SIP),  responding to datarate 
or packetloss fluctuation, keeping audio and video and synch.   Nor does it 
resolve issues like long term dropouts or other common problems in any 
ensible way.   The handling of packets and skipped packets is rudimentary 
with extra copies, and a very rudimentary way of handling skips.   The program 
requires directx7 or better with yv12 offscreen surfaces for decode, and a web 
camera / capture device capable of supplying i420.  Basic RTP is used but RTCP 
isn't.