
BUG=314 Review URL: https://webrtc-codereview.appspot.com/1307005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3797 4adac7df-926f-26a2-2b94-8c16560cd09d
153 lines
4.0 KiB
C++
153 lines
4.0 KiB
C++
/*
|
|
* Copyright (c) 2012 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(uint32_t instanceID)
|
|
: _vcm(VideoCodingModule::Create(instanceID)),
|
|
_decodedVideo(0)
|
|
{
|
|
_vcm->InitializeSender();
|
|
_vcm->InitializeReceiver();
|
|
|
|
_vcm->RegisterTransportCallback(this);
|
|
_vcm->RegisterReceiveCallback(this);
|
|
}
|
|
|
|
VideoCoder::~VideoCoder()
|
|
{
|
|
VideoCodingModule::Destroy(_vcm);
|
|
}
|
|
|
|
int32_t VideoCoder::ResetDecoder()
|
|
{
|
|
_vcm->ResetDecoder();
|
|
|
|
_vcm->InitializeSender();
|
|
_vcm->InitializeReceiver();
|
|
|
|
_vcm->RegisterTransportCallback(this);
|
|
_vcm->RegisterReceiveCallback(this);
|
|
return 0;
|
|
}
|
|
|
|
int32_t VideoCoder::SetEncodeCodec(VideoCodec& videoCodecInst,
|
|
uint32_t numberOfCores,
|
|
uint32_t maxPayloadSize)
|
|
{
|
|
if(_vcm->RegisterSendCodec(&videoCodecInst, numberOfCores,
|
|
maxPayloadSize) != VCM_OK)
|
|
{
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int32_t VideoCoder::SetDecodeCodec(VideoCodec& videoCodecInst,
|
|
int32_t numberOfCores)
|
|
{
|
|
if (videoCodecInst.plType == 0)
|
|
{
|
|
int8_t plType = DefaultPayloadType(videoCodecInst.plName);
|
|
if (plType == -1)
|
|
{
|
|
return -1;
|
|
}
|
|
videoCodecInst.plType = plType;
|
|
}
|
|
|
|
if(_vcm->RegisterReceiveCodec(&videoCodecInst, numberOfCores) != VCM_OK)
|
|
{
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int32_t VideoCoder::Decode(I420VideoFrame& decodedVideo,
|
|
const EncodedVideoData& encodedData)
|
|
{
|
|
decodedVideo.ResetSize();
|
|
if(encodedData.payloadSize <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
_decodedVideo = &decodedVideo;
|
|
if(_vcm->DecodeFromStorage(encodedData) != VCM_OK)
|
|
{
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int32_t VideoCoder::Encode(const I420VideoFrame& 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;
|
|
}
|
|
|
|
int8_t VideoCoder::DefaultPayloadType(const char* plName)
|
|
{
|
|
VideoCodec tmpCodec;
|
|
int32_t numberOfCodecs = _vcm->NumberOfCodecs();
|
|
for (uint8_t i = 0; i < numberOfCodecs; i++)
|
|
{
|
|
_vcm->Codec(i, &tmpCodec);
|
|
if(strncmp(tmpCodec.plName, plName, kPayloadNameSize) == 0)
|
|
{
|
|
return tmpCodec.plType;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int32_t VideoCoder::FrameToRender(I420VideoFrame& videoFrame)
|
|
{
|
|
return _decodedVideo->CopyFrame(videoFrame);
|
|
}
|
|
|
|
int32_t VideoCoder::SendData(
|
|
const FrameType frameType,
|
|
const uint8_t payloadType,
|
|
const uint32_t timeStamp,
|
|
int64_t capture_time_ms,
|
|
const uint8_t* payloadData,
|
|
uint32_t 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.CopyFrom(fragmentationHeader);
|
|
memcpy(_videoEncodedData->payloadData, payloadData,
|
|
sizeof(uint8_t) * payloadSize);
|
|
_videoEncodedData->payloadSize = payloadSize;
|
|
return 0;
|
|
}
|
|
} // namespace webrtc
|
|
#endif // WEBRTC_MODULE_UTILITY_VIDEO
|