C# NVIDIA GPU Based H.264 Encoder Library

C# NVIDIA GPU Based H.264 Encoder Library

Cancelled

Job Description

We require the ability to transmit a stream of BITMAPs (not JPEGs) from a Windows based server across the internet to a variety of clients running different operating systems. The network stream needs to be compressed as H.264 in order to reduce the bandwidth required and the H.264 encoding needs to be offloaded from the computer CPU to a graphics card GPU. The library must support BOTH NVENC and NVCUVENC encoding, it and any required components must be deployed by a simple copy of the required binary libraries to the computer as part of an install of our own product.

It is essential that the encoding can be offloaded to the GPU as much as possible as our solution, of which video streaming is only a component, is already CPU-bound. This is the reason for CUDA and NVENC. NVENC appears to be better however only a few graphics cards support it so CUDA is also necessary.

If necessary, we have a computer which you can remotely access for development which has a NVENC capable Nvidia Quadro K2000M chipset.

https://developer.nvidia.com/nvidia-video-codec-sdk

You will be required to fix any issues that arrise out of the solution within a business day for a period of 90 days after delivery.

In order to be able test the solution we require that it can be connected to by a VLC (http://www.videolan.org/) client. The control protocol for the stream does not matter and can be RTSP, HTTP or whatever is easiest so long as mobile devices such as iPhone iOS are natively able to connect. An example of what we require is shown on this project http://www.medialan.de/Wissen001/RTSPStreamerHelloWorld.html but rather than an MJPEG encoding we require an H.264 one.

In addition we need a simple C# interface to the developed library along the lines of the sample code shown below. The IH264Stream interface implementation is the piece we require.

public interface IH264Stream
{
public void Start(IPEndPoint clientSocket);
public void AddBitmap(Bitmap bitmap);
public void Close();
}

class Program
{
public static bool Exit;

static void Main(string[] args)
{
Queue bitmapQueue = new Queue();

IH264Stream streamServer = new object() as IH264Stream;

streamServer.Start(new IPEndPoint(IPAddress.Loopback, 1234));

while (!Exit)
{
var bitmap = bitmapQueue.Dequeue();

streamServer.AddBitmap(bitmap);
}

streamServer.Close();
}
}