blob: 7eb015c4b6bfa2c5db416f68c37d2029209ff749 [file] [log] [blame]
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +00001/*
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
pbos@webrtc.org281cff82013-05-17 13:44:48 +000011#include "webrtc/video_engine/vie_external_codec_impl.h"
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000012
pbos@webrtc.org281cff82013-05-17 13:44:48 +000013#include "webrtc/engine_configurations.h"
mflodman@webrtc.org022615b2014-04-07 10:56:31 +000014#include "webrtc/system_wrappers/interface/logging.h"
pbos@webrtc.org281cff82013-05-17 13:44:48 +000015#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"
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000021
22namespace webrtc {
23
24ViEExternalCodec* ViEExternalCodec::GetInterface(VideoEngine* video_engine) {
25#ifdef WEBRTC_VIDEO_ENGINE_EXTERNAL_CODEC_API
26 if (video_engine == NULL) {
27 return NULL;
28 }
andrew@webrtc.org7ab72682013-05-09 02:12:07 +000029 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000030 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
39int ViEExternalCodecImpl::Release() {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000040 // Decrease ref count.
41 (*this)--;
42
pbos@webrtc.org67879bc2013-04-09 13:41:51 +000043 int32_t ref_count = GetCount();
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000044 if (ref_count < 0) {
mflodman@webrtc.org022615b2014-04-07 10:56:31 +000045 LOG(LS_WARNING) << "ViEExternalCodec released too many times.";
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000046 shared_data_->SetLastError(kViEAPIDoesNotExist);
47 return -1;
48 }
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000049 return ref_count;
50}
51
52ViEExternalCodecImpl::ViEExternalCodecImpl(ViESharedData* shared_data)
53 : shared_data_(shared_data) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000054}
55
56ViEExternalCodecImpl::~ViEExternalCodecImpl() {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000057}
58
59int ViEExternalCodecImpl::RegisterExternalSendCodec(const int video_channel,
60 const unsigned char pl_type,
stefan@webrtc.org71f3f682013-01-09 08:35:40 +000061 VideoEncoder* encoder,
62 bool internal_source) {
mflodman@webrtc.org022615b2014-04-07 10:56:31 +000063 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;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000067
68 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
69 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
70 if (!vie_encoder) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000071 shared_data_->SetLastError(kViECodecInvalidArgument);
72 return -1;
73 }
mflodman@webrtc.org022615b2014-04-07 10:56:31 +000074 if (vie_encoder->RegisterExternalEncoder(encoder, pl_type,
75 internal_source) != 0) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000076 shared_data_->SetLastError(kViECodecUnknownError);
77 return -1;
78 }
79 return 0;
80}
81
82int ViEExternalCodecImpl::DeRegisterExternalSendCodec(
83 const int video_channel, const unsigned char pl_type) {
mflodman@webrtc.org022615b2014-04-07 10:56:31 +000084 LOG(LS_INFO) << "Deregister external encoder for channel " << video_channel;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000085
86 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
87 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
88 if (!vie_encoder) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +000089 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
100int ViEExternalCodecImpl::RegisterExternalReceiveCodec(
101 const int video_channel,
102 const unsigned int pl_type,
103 VideoDecoder* decoder,
104 bool decoder_render,
105 int render_delay) {
mflodman@webrtc.org022615b2014-04-07 10:56:31 +0000106 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);
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000111
112 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
113 ViEChannel* vie_channel = cs.Channel(video_channel);
114 if (!vie_channel) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000115 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
127int ViEExternalCodecImpl::DeRegisterExternalReceiveCodec(
mflodman@webrtc.org022615b2014-04-07 10:56:31 +0000128 const int video_channel, const unsigned char pl_type) {
129 LOG(LS_INFO) << "DeRegisterExternalReceiveCodec for channel " << video_channel
130 << ", pl_type " << pl_type;
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000131
132 ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
133 ViEChannel* vie_channel = cs.Channel(video_channel);
134 if (!vie_channel) {
andrew@webrtc.orgb015cbe2012-10-22 18:19:23 +0000135 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