git-svn-id: http://webrtc.googlecode.com/svn/trunk@4 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/utility/source/video_coder.cc b/modules/utility/source/video_coder.cc
new file mode 100644
index 0000000..2ac7160
--- /dev/null
+++ b/modules/utility/source/video_coder.cc
@@ -0,0 +1,166 @@
+/*
+ *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifdef WEBRTC_MODULE_UTILITY_VIDEO
+
+#include "video_coder.h"
+
+namespace webrtc {
+VideoCoder::VideoCoder(WebRtc_UWord32 instanceID)
+    : _instanceID( instanceID),
+      _vcm(VideoCodingModule::Create(instanceID)),
+      _decodedVideo(0)
+{
+    _vcm->InitializeSender();
+    _vcm->InitializeReceiver();
+
+    _vcm->RegisterTransportCallback(this);
+    _vcm->RegisterReceiveCallback(this);
+}
+
+VideoCoder::~VideoCoder()
+{
+    VideoCodingModule::Destroy(_vcm);
+}
+
+WebRtc_Word32 VideoCoder::Reset()
+{
+    _vcm->ResetDecoder();
+    _vcm->ResetEncoder();
+
+    _vcm->InitializeSender();
+    _vcm->InitializeReceiver();
+
+    _vcm->RegisterTransportCallback(this);
+    _vcm->RegisterReceiveCallback(this);
+    return 0;
+}
+
+WebRtc_Word32 VideoCoder::SetEncodeCodec(VideoCodec& videoCodecInst,
+                                         WebRtc_UWord32 numberOfCores,
+                                         WebRtc_UWord32 maxPayloadSize)
+{
+    if(_vcm->RegisterSendCodec(&videoCodecInst, numberOfCores,
+                               maxPayloadSize) != VCM_OK)
+    {
+        return -1;
+    }
+    return 0;
+}
+
+
+WebRtc_Word32 VideoCoder::SetDecodeCodec(VideoCodec& videoCodecInst,
+                                         WebRtc_Word32 numberOfCores)
+{
+    if (videoCodecInst.plType == 0)
+    {
+        WebRtc_Word8 plType = DefaultPayloadType(videoCodecInst.plName);
+        if (plType == -1)
+        {
+            return -1;
+        }
+        videoCodecInst.plType = plType;
+    }
+
+    if(_vcm->RegisterReceiveCodec(&videoCodecInst, numberOfCores) != VCM_OK)
+    {
+        return -1;
+    }
+    return 0;
+}
+
+
+WebRtc_Word32 VideoCoder::CodecConfigParameters(WebRtc_UWord8* buffer,
+                                                WebRtc_Word32 size)
+{
+    return _vcm->CodecConfigParameters(buffer, size);
+}
+
+WebRtc_Word32 VideoCoder::SetCodecConfigParameters(WebRtc_UWord8 payloadType,
+                                                   const WebRtc_UWord8* buffer,
+                                                   WebRtc_Word32 length)
+{
+    return _vcm->SetCodecConfigParameters(payloadType, buffer, length);
+}
+
+WebRtc_Word32 VideoCoder::Decode(VideoFrame& decodedVideo,
+                                 const EncodedVideoData& encodedData)
+{
+    decodedVideo.SetLength(0);
+    if(encodedData.payloadSize <= 0)
+    {
+        return -1;
+    }
+
+    _decodedVideo = &decodedVideo;
+    if(_vcm->DecodeFromStorage(encodedData) != VCM_OK)
+    {
+        return -1;
+    }
+    return 0;
+}
+
+
+WebRtc_Word32 VideoCoder::Encode(const VideoFrame& videoFrame,
+                                 EncodedVideoData& videoEncodedData)
+{
+    // The AddVideoFrame(..) call will (indirectly) call SendData(). Store a
+    // pointer to videoFrame so that it can be updated.
+    _videoEncodedData = &videoEncodedData;
+    videoEncodedData.payloadSize = 0;
+    if(_vcm->AddVideoFrame(videoFrame) != VCM_OK)
+    {
+        return -1;
+    }
+    return 0;
+}
+
+WebRtc_Word8 VideoCoder::DefaultPayloadType(const WebRtc_Word8* plName)
+{
+    VideoCodec tmpCodec;
+    WebRtc_Word32 numberOfCodecs = _vcm->NumberOfCodecs();
+    for (WebRtc_UWord8 i = 0; i < numberOfCodecs; i++)
+    {
+        _vcm->Codec(i, &tmpCodec);
+        if(strncmp(tmpCodec.plName, plName, kPayloadNameSize) == 0)
+        {
+            return tmpCodec.plType;
+        }
+    }
+    return -1;
+}
+
+WebRtc_Word32 VideoCoder::FrameToRender(VideoFrame& videoFrame)
+{
+    return _decodedVideo->CopyFrame(videoFrame);
+}
+
+WebRtc_Word32 VideoCoder::SendData(
+    FrameType frameType,
+    WebRtc_UWord8  payloadType,
+    WebRtc_UWord32 timeStamp,
+    const WebRtc_UWord8* payloadData,
+    WebRtc_UWord32 payloadSize,
+    const RTPFragmentationHeader& fragmentationHeader)
+{
+    // Store the data in _videoEncodedData which is a pointer to videoFrame in
+    // Encode(..)
+    _videoEncodedData->VerifyAndAllocate(payloadSize);
+    _videoEncodedData->frameType = frameType;
+    _videoEncodedData->payloadType = payloadType;
+    _videoEncodedData->timeStamp = timeStamp;
+    _videoEncodedData->fragmentationHeader = fragmentationHeader;
+    memcpy(_videoEncodedData->payloadData, payloadData,
+           sizeof(WebRtc_UWord8) * payloadSize);
+    _videoEncodedData->payloadSize = payloadSize;
+    return 0;
+}
+} // namespace webrtc
+#endif // WEBRTC_MODULE_UTILITY_VIDEO