|  | /* | 
|  | *  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 "webrtc/modules/utility/source/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::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; | 
|  | 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 |