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