blob: 470e6b2f082aa058d01798b86af470c53e53968c [file] [log] [blame]
/*
* 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::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,
const RTPVideoHeader* /*rtpVideoHdr*/)
{
// 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