blob: 5096acecd25496a979b5e287624d02978c82cd14 [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
pbos@webrtc.org8b062002013-07-12 08:28:10 +000013#include "webrtc/modules/utility/source/video_coder.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000014
15namespace webrtc {
stefan@webrtc.org34c5da62014-04-11 14:08:35 +000016VideoCoder::VideoCoder() : _vcm(VideoCodingModule::Create()), _decodedVideo(0) {
niklase@google.com470e71d2011-07-07 08:21:25 +000017 _vcm->InitializeSender();
18 _vcm->InitializeReceiver();
19
20 _vcm->RegisterTransportCallback(this);
21 _vcm->RegisterReceiveCallback(this);
22}
23
24VideoCoder::~VideoCoder()
25{
26 VideoCodingModule::Destroy(_vcm);
27}
28
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000029int32_t VideoCoder::SetEncodeCodec(VideoCodec& videoCodecInst,
30 uint32_t numberOfCores,
31 uint32_t maxPayloadSize)
niklase@google.com470e71d2011-07-07 08:21:25 +000032{
33 if(_vcm->RegisterSendCodec(&videoCodecInst, numberOfCores,
34 maxPayloadSize) != VCM_OK)
35 {
36 return -1;
37 }
38 return 0;
39}
40
41
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000042int32_t VideoCoder::SetDecodeCodec(VideoCodec& videoCodecInst,
43 int32_t numberOfCores)
niklase@google.com470e71d2011-07-07 08:21:25 +000044{
45 if (videoCodecInst.plType == 0)
46 {
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000047 int8_t plType = DefaultPayloadType(videoCodecInst.plName);
niklase@google.com470e71d2011-07-07 08:21:25 +000048 if (plType == -1)
49 {
50 return -1;
51 }
52 videoCodecInst.plType = plType;
53 }
54
55 if(_vcm->RegisterReceiveCodec(&videoCodecInst, numberOfCores) != VCM_OK)
56 {
57 return -1;
58 }
59 return 0;
60}
61
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000062int32_t VideoCoder::Decode(I420VideoFrame& decodedVideo,
63 const EncodedVideoData& encodedData)
niklase@google.com470e71d2011-07-07 08:21:25 +000064{
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +000065 decodedVideo.ResetSize();
niklase@google.com470e71d2011-07-07 08:21:25 +000066 if(encodedData.payloadSize <= 0)
67 {
68 return -1;
69 }
70
71 _decodedVideo = &decodedVideo;
niklase@google.com470e71d2011-07-07 08:21:25 +000072 return 0;
73}
74
75
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000076int32_t VideoCoder::Encode(const I420VideoFrame& videoFrame,
77 EncodedVideoData& videoEncodedData)
niklase@google.com470e71d2011-07-07 08:21:25 +000078{
79 // The AddVideoFrame(..) call will (indirectly) call SendData(). Store a
80 // pointer to videoFrame so that it can be updated.
81 _videoEncodedData = &videoEncodedData;
82 videoEncodedData.payloadSize = 0;
83 if(_vcm->AddVideoFrame(videoFrame) != VCM_OK)
84 {
85 return -1;
86 }
87 return 0;
88}
89
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000090int8_t VideoCoder::DefaultPayloadType(const char* plName)
niklase@google.com470e71d2011-07-07 08:21:25 +000091{
92 VideoCodec tmpCodec;
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +000093 int32_t numberOfCodecs = _vcm->NumberOfCodecs();
94 for (uint8_t i = 0; i < numberOfCodecs; i++)
niklase@google.com470e71d2011-07-07 08:21:25 +000095 {
96 _vcm->Codec(i, &tmpCodec);
97 if(strncmp(tmpCodec.plName, plName, kPayloadNameSize) == 0)
98 {
99 return tmpCodec.plType;
100 }
101 }
102 return -1;
103}
104
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000105int32_t VideoCoder::FrameToRender(I420VideoFrame& videoFrame)
niklase@google.com470e71d2011-07-07 08:21:25 +0000106{
107 return _decodedVideo->CopyFrame(videoFrame);
108}
109
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000110int32_t VideoCoder::SendData(
stefan@webrtc.orgddfdfed2012-07-03 13:21:22 +0000111 const FrameType frameType,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000112 const uint8_t payloadType,
113 const uint32_t timeStamp,
stefan@webrtc.orgddfdfed2012-07-03 13:21:22 +0000114 int64_t capture_time_ms,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000115 const uint8_t* payloadData,
116 uint32_t payloadSize,
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 const RTPFragmentationHeader& fragmentationHeader,
pwestin@webrtc.org1da1ce02011-10-13 15:19:55 +0000118 const RTPVideoHeader* /*rtpVideoHdr*/)
niklase@google.com470e71d2011-07-07 08:21:25 +0000119{
120 // Store the data in _videoEncodedData which is a pointer to videoFrame in
121 // Encode(..)
122 _videoEncodedData->VerifyAndAllocate(payloadSize);
123 _videoEncodedData->frameType = frameType;
124 _videoEncodedData->payloadType = payloadType;
125 _videoEncodedData->timeStamp = timeStamp;
andrew@webrtc.org418443c2012-11-23 19:17:23 +0000126 _videoEncodedData->fragmentationHeader.CopyFrom(fragmentationHeader);
niklase@google.com470e71d2011-07-07 08:21:25 +0000127 memcpy(_videoEncodedData->payloadData, payloadData,
pbos@webrtc.orgc75102e2013-04-09 13:32:55 +0000128 sizeof(uint8_t) * payloadSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000129 _videoEncodedData->payloadSize = payloadSize;
130 return 0;
131}
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000132} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000133#endif // WEBRTC_MODULE_UTILITY_VIDEO