1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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 #include "webrtc/video_engine/vie_external_codec_impl.h"
12
13 #include "webrtc/engine_configurations.h"
14 #include "webrtc/system_wrappers/interface/logging.h"
15 #include "webrtc/video_engine/include/vie_errors.h"
16 #include "webrtc/video_engine/vie_channel.h"
17 #include "webrtc/video_engine/vie_channel_manager.h"
18 #include "webrtc/video_engine/vie_encoder.h"
19 #include "webrtc/video_engine/vie_impl.h"
20 #include "webrtc/video_engine/vie_shared_data.h"
21
22 namespace webrtc {
23
GetInterface(VideoEngine * video_engine)24 ViEExternalCodec* ViEExternalCodec::GetInterface(VideoEngine* video_engine) {
25 #ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
26 if (video_engine == NULL) {
27 return NULL;
28 }
29 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
30 ViEExternalCodecImpl* vie_external_codec_impl = vie_impl;
31 // Increase ref count.
32 (*vie_external_codec_impl)++;
33 return vie_external_codec_impl;
34 #else
35 return NULL;
36 #endif
37 }
38
Release()39 int ViEExternalCodecImpl::Release() {
40 // Decrease ref count.
41 (*this)--;
42
43 int32_t ref_count = GetCount();
44 if (ref_count < 0) {
45 LOG(LS_WARNING) << "ViEExternalCodec released too many times.";
46 shared_data_->SetLastError(kViEAPIDoesNotExist);
47 return -1;
48 }
49 return ref_count;
50 }
51
ViEExternalCodecImpl(ViESharedData * shared_data)52 ViEExternalCodecImpl::ViEExternalCodecImpl(ViESharedData* shared_data)
53 : shared_data_(shared_data) {
54 }
55
~ViEExternalCodecImpl()56 ViEExternalCodecImpl::~ViEExternalCodecImpl() {
57 }
58
RegisterExternalSendCodec(const int video_channel,const unsigned char pl_type,VideoEncoder * encoder,bool internal_source)59 int ViEExternalCodecImpl::RegisterExternalSendCodec(const int video_channel,
60 const unsigned char pl_type,
61 VideoEncoder* encoder,
62 bool internal_source) {
63 assert(encoder != NULL);
64 LOG(LS_INFO) << "Register external encoder for channel " << video_channel
65 << ", pl_type " << static_cast<int>(pl_type)
66 << ", internal_source " << internal_source;
67
68 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
69 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
70 if (!vie_encoder) {
71 shared_data_->SetLastError(kViECodecInvalidArgument);
72 return -1;
73 }
74 if (vie_encoder->RegisterExternalEncoder(encoder, pl_type,
75 internal_source) != 0) {
76 shared_data_->SetLastError(kViECodecUnknownError);
77 return -1;
78 }
79 return 0;
80 }
81
DeRegisterExternalSendCodec(const int video_channel,const unsigned char pl_type)82 int ViEExternalCodecImpl::DeRegisterExternalSendCodec(
83 const int video_channel, const unsigned char pl_type) {
84 LOG(LS_INFO) << "Deregister external encoder for channel " << video_channel;
85
86 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
87 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
88 if (!vie_encoder) {
89 shared_data_->SetLastError(kViECodecInvalidArgument);
90 return -1;
91 }
92
93 if (vie_encoder->DeRegisterExternalEncoder(pl_type) != 0) {
94 shared_data_->SetLastError(kViECodecUnknownError);
95 return -1;
96 }
97 return 0;
98 }
99
RegisterExternalReceiveCodec(const int video_channel,const unsigned int pl_type,VideoDecoder * decoder,bool decoder_render,int render_delay)100 int ViEExternalCodecImpl::RegisterExternalReceiveCodec(
101 const int video_channel,
102 const unsigned int pl_type,
103 VideoDecoder* decoder,
104 bool decoder_render,
105 int render_delay) {
106 LOG(LS_INFO) << "Register exrernal decoder for channel " << video_channel
107 << ", pl_type " << pl_type
108 << ", decoder_render " << decoder_render
109 << ", render_delay " << render_delay;
110 assert(decoder != NULL);
111
112 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
113 ViEChannel* vie_channel = cs.Channel(video_channel);
114 if (!vie_channel) {
115 shared_data_->SetLastError(kViECodecInvalidArgument);
116 return -1;
117 }
118
119 if (vie_channel->RegisterExternalDecoder(pl_type, decoder, decoder_render,
120 render_delay) != 0) {
121 shared_data_->SetLastError(kViECodecUnknownError);
122 return -1;
123 }
124 return 0;
125 }
126
DeRegisterExternalReceiveCodec(const int video_channel,const unsigned char pl_type)127 int ViEExternalCodecImpl::DeRegisterExternalReceiveCodec(
128 const int video_channel, const unsigned char pl_type) {
129 LOG(LS_INFO) << "DeRegisterExternalReceiveCodec for channel " << video_channel
130 << ", pl_type " << pl_type;
131
132 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
133 ViEChannel* vie_channel = cs.Channel(video_channel);
134 if (!vie_channel) {
135 shared_data_->SetLastError(kViECodecInvalidArgument);
136 return -1;
137 }
138 if (vie_channel->DeRegisterExternalDecoder(pl_type) != 0) {
139 shared_data_->SetLastError(kViECodecUnknownError);
140 return -1;
141 }
142 return 0;
143 }
144
145 } // namespace webrtc
146