blob: cff2bddfad6f923dbc72fee1738663b18177a299 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.org52fd98d2012-02-13 09:03:53 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifdef WEBRTC_MODULE_UTILITY_VIDEO
12
13#include "video_coder.h"
14
15namespace webrtc {
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000016VideoCoder::VideoCoder(uint32_t instanceID)
wu@webrtc.org2259f852012-06-19 14:56:50 +000017 : _vcm(VideoCodingModule::Create(instanceID)),
niklase@google.com470e71d2011-07-07 08:21:25 +000018 _decodedVideo(0)
19{
20 _vcm->InitializeSender();
21 _vcm->InitializeReceiver();
22
23 _vcm->RegisterTransportCallback(this);
24 _vcm->RegisterReceiveCallback(this);
25}
26
27VideoCoder::~VideoCoder()
28{
29 VideoCodingModule::Destroy(_vcm);
30}
31
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000032int32_t VideoCoder::ResetDecoder()
niklase@google.com470e71d2011-07-07 08:21:25 +000033{
34 _vcm->ResetDecoder();
niklase@google.com470e71d2011-07-07 08:21:25 +000035
36 _vcm->InitializeSender();
37 _vcm->InitializeReceiver();
38
39 _vcm->RegisterTransportCallback(this);
40 _vcm->RegisterReceiveCallback(this);
41 return 0;
42}
43
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000044int32_t VideoCoder::SetEncodeCodec(VideoCodec& videoCodecInst,
45 uint32_t numberOfCores,
46 uint32_t maxPayloadSize)
niklase@google.com470e71d2011-07-07 08:21:25 +000047{
48 if(_vcm->RegisterSendCodec(&videoCodecInst, numberOfCores,
49 maxPayloadSize) != VCM_OK)
50 {
51 return -1;
52 }
53 return 0;
54}
55
56
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000057int32_t VideoCoder::SetDecodeCodec(VideoCodec& videoCodecInst,
58 int32_t numberOfCores)
niklase@google.com470e71d2011-07-07 08:21:25 +000059{
60 if (videoCodecInst.plType == 0)
61 {
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000062 int8_t plType = DefaultPayloadType(videoCodecInst.plName);
niklase@google.com470e71d2011-07-07 08:21:25 +000063 if (plType == -1)
64 {
65 return -1;
66 }
67 videoCodecInst.plType = plType;
68 }
69
70 if(_vcm->RegisterReceiveCodec(&videoCodecInst, numberOfCores) != VCM_OK)
71 {
72 return -1;
73 }
74 return 0;
75}
76
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000077int32_t VideoCoder::Decode(I420VideoFrame& decodedVideo,
78 const EncodedVideoData& encodedData)
niklase@google.com470e71d2011-07-07 08:21:25 +000079{
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +000080 decodedVideo.ResetSize();
niklase@google.com470e71d2011-07-07 08:21:25 +000081 if(encodedData.payloadSize <= 0)
82 {
83 return -1;
84 }
85
86 _decodedVideo = &decodedVideo;
87 if(_vcm->DecodeFromStorage(encodedData) != VCM_OK)
88 {
89 return -1;
90 }
91 return 0;
92}
93
94
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000095int32_t VideoCoder::Encode(const I420VideoFrame& videoFrame,
96 EncodedVideoData& videoEncodedData)
niklase@google.com470e71d2011-07-07 08:21:25 +000097{
98 // The AddVideoFrame(..) call will (indirectly) call SendData(). Store a
99 // pointer to videoFrame so that it can be updated.
100 _videoEncodedData = &videoEncodedData;
101 videoEncodedData.payloadSize = 0;
102 if(_vcm->AddVideoFrame(videoFrame) != VCM_OK)
103 {
104 return -1;
105 }
106 return 0;
107}
108
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000109int8_t VideoCoder::DefaultPayloadType(const char* plName)
niklase@google.com470e71d2011-07-07 08:21:25 +0000110{
111 VideoCodec tmpCodec;
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000112 int32_t numberOfCodecs = _vcm->NumberOfCodecs();
113 for (uint8_t i = 0; i < numberOfCodecs; i++)
niklase@google.com470e71d2011-07-07 08:21:25 +0000114 {
115 _vcm->Codec(i, &tmpCodec);
116 if(strncmp(tmpCodec.plName, plName, kPayloadNameSize) == 0)
117 {
118 return tmpCodec.plType;
119 }
120 }
121 return -1;
122}
123
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000124int32_t VideoCoder::FrameToRender(I420VideoFrame& videoFrame)
niklase@google.com470e71d2011-07-07 08:21:25 +0000125{
126 return _decodedVideo->CopyFrame(videoFrame);
127}
128
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000129int32_t VideoCoder::SendData(
stefan@webrtc.orgddfdfed2012-07-03 13:21:22 +0000130 const FrameType frameType,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000131 const uint8_t payloadType,
132 const uint32_t timeStamp,
stefan@webrtc.orgddfdfed2012-07-03 13:21:22 +0000133 int64_t capture_time_ms,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000134 const uint8_t* payloadData,
135 uint32_t payloadSize,
niklase@google.com470e71d2011-07-07 08:21:25 +0000136 const RTPFragmentationHeader& fragmentationHeader,
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +0000137 const RTPVideoHeader* /*rtpVideoHdr*/)
niklase@google.com470e71d2011-07-07 08:21:25 +0000138{
139 // Store the data in _videoEncodedData which is a pointer to videoFrame in
140 // Encode(..)
141 _videoEncodedData->VerifyAndAllocate(payloadSize);
142 _videoEncodedData->frameType = frameType;
143 _videoEncodedData->payloadType = payloadType;
144 _videoEncodedData->timeStamp = timeStamp;
andrew@webrtc.org418443c2012-11-23 19:17:23 +0000145 _videoEncodedData->fragmentationHeader.CopyFrom(fragmentationHeader);
niklase@google.com470e71d2011-07-07 08:21:25 +0000146 memcpy(_videoEncodedData->payloadData, payloadData,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000147 sizeof(uint8_t) * payloadSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000148 _videoEncodedData->payloadSize = payloadSize;
149 return 0;
150}
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000151} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000152#endif // WEBRTC_MODULE_UTILITY_VIDEO