/* * 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