mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 12:45:35 +08:00
Opus codec module test pass
This commit is contained in:
@@ -65,10 +65,30 @@ int PeerConnection::Init(PeerConnectionParams params,
|
||||
on_receive_video_buffer_ = params.on_receive_video_buffer;
|
||||
on_receive_audio_buffer_ = params.on_receive_audio_buffer;
|
||||
on_receive_data_buffer_ = params.on_receive_data_buffer;
|
||||
on_signal_status_ = params.on_signal_status;
|
||||
on_connection_status_ = params.on_connection_status;
|
||||
|
||||
on_receive_ws_msg_ = [this](const std::string &msg) { ProcessSignal(msg); };
|
||||
|
||||
on_ws_status_ = [this](WsStatus ws_status) {
|
||||
if (WsStatus::WsOpening == ws_status) {
|
||||
signal_status_ = SignalStatus::SignalConnecting;
|
||||
on_signal_status_(SignalStatus::SignalConnecting);
|
||||
} else if (WsStatus::WsOpened == ws_status) {
|
||||
signal_status_ = SignalStatus::SignalConnected;
|
||||
on_signal_status_(SignalStatus::SignalConnected);
|
||||
} else if (WsStatus::WsFailed == ws_status) {
|
||||
signal_status_ = SignalStatus::SignalFailed;
|
||||
on_signal_status_(SignalStatus::SignalFailed);
|
||||
} else if (WsStatus::WsClosed == ws_status) {
|
||||
signal_status_ = SignalStatus::SignalClosed;
|
||||
on_signal_status_(SignalStatus::SignalClosed);
|
||||
} else if (WsStatus::WsReconnecting == ws_status) {
|
||||
signal_status_ = SignalStatus::SignalReconnecting;
|
||||
on_signal_status_(SignalStatus::SignalReconnecting);
|
||||
}
|
||||
};
|
||||
|
||||
on_receive_video_ = [this](const char *data, size_t size, const char *user_id,
|
||||
size_t user_id_size) {
|
||||
int num_frame_returned = video_decoder_->Decode(
|
||||
@@ -83,9 +103,14 @@ int PeerConnection::Init(PeerConnectionParams params,
|
||||
|
||||
on_receive_audio_ = [this](const char *data, size_t size, const char *user_id,
|
||||
size_t user_id_size) {
|
||||
if (on_receive_audio_buffer_) {
|
||||
on_receive_audio_buffer_(data, size, user_id, user_id_size);
|
||||
}
|
||||
int num_frame_returned = audio_decoder_->Decode(
|
||||
(uint8_t *)data, size,
|
||||
[this, user_id, user_id_size](uint8_t *data, int size) {
|
||||
if (on_receive_audio_buffer_) {
|
||||
on_receive_audio_buffer_((const char *)data, size, user_id,
|
||||
user_id_size);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
on_receive_data_ = [this](const char *data, size_t size, const char *user_id,
|
||||
@@ -96,7 +121,12 @@ int PeerConnection::Init(PeerConnectionParams params,
|
||||
};
|
||||
|
||||
on_ice_status_change_ = [this](std::string ice_status) {
|
||||
if ("completed" == ice_status || "ready" == ice_status) {
|
||||
if ("connecting" == ice_status) {
|
||||
on_connection_status_(ConnectionStatus::Connecting);
|
||||
} else if ("disconnected" == ice_status) {
|
||||
on_connection_status_(ConnectionStatus::Disconnected);
|
||||
} else if ("completed" == ice_status || "ready" == ice_status ||
|
||||
"connected" == ice_status) {
|
||||
ice_ready_ = true;
|
||||
on_connection_status_(ConnectionStatus::Connected);
|
||||
b_force_i_frame_ = true;
|
||||
@@ -110,18 +140,25 @@ int PeerConnection::Init(PeerConnectionParams params,
|
||||
}
|
||||
};
|
||||
|
||||
ws_transport_ = std::make_shared<WsTransmission>(on_receive_ws_msg_);
|
||||
ws_transport_ =
|
||||
std::make_shared<WsTransmission>(on_receive_ws_msg_, on_ws_status_);
|
||||
uri_ = "ws://" + cfg_signal_server_ip_ + ":" + cfg_signal_server_port_;
|
||||
if (ws_transport_) {
|
||||
ws_transport_->Connect(uri_);
|
||||
}
|
||||
|
||||
do {
|
||||
} while (SignalStatus::SignalConnected != GetSignalStatus());
|
||||
// do {
|
||||
// } while (SignalStatus::SignalConnected != GetSignalStatus());
|
||||
|
||||
nv12_data_ = new char[1280 * 720 * 3 / 2];
|
||||
|
||||
if (0 != CreateVideoCodec(hardware_acceleration_)) {
|
||||
LOG_ERROR("Create video codec failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 != CreateAudioCodec()) {
|
||||
LOG_ERROR("Create audio codec failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -185,9 +222,30 @@ int PeerConnection::CreateVideoCodec(bool hardware_acceleration) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PeerConnection::CreateAudioCodec() {
|
||||
audio_encoder_ = std::make_unique<AudioEncoder>(AudioEncoder(48000, 1, 480));
|
||||
if (!audio_encoder_ || 0 != audio_encoder_->Init()) {
|
||||
LOG_ERROR("Audio encoder init failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
audio_decoder_ = std::make_unique<AudioDecoder>(AudioDecoder(48000, 1, 480));
|
||||
if (!audio_decoder_ || 0 != audio_decoder_->Init()) {
|
||||
LOG_ERROR("Audio decoder init failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PeerConnection::Create(PeerConnectionParams params,
|
||||
const std::string &transmission_id,
|
||||
const std::string &password) {
|
||||
if (SignalStatus::SignalConnected != GetSignalStatus()) {
|
||||
LOG_ERROR("Signal not connected");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
|
||||
password_ = password;
|
||||
@@ -208,6 +266,11 @@ int PeerConnection::Create(PeerConnectionParams params,
|
||||
int PeerConnection::Join(PeerConnectionParams params,
|
||||
const std::string &transmission_id,
|
||||
const std::string &password) {
|
||||
if (SignalStatus::SignalConnected != GetSignalStatus()) {
|
||||
LOG_ERROR("Signal not connected");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
|
||||
password_ = password;
|
||||
@@ -218,6 +281,11 @@ int PeerConnection::Join(PeerConnectionParams params,
|
||||
}
|
||||
|
||||
int PeerConnection::Leave() {
|
||||
if (SignalStatus::SignalConnected != GetSignalStatus()) {
|
||||
LOG_ERROR("Signal not connected");
|
||||
return -1;
|
||||
}
|
||||
|
||||
json message = {{"type", "leave_transmission"},
|
||||
{"user_id", user_id_},
|
||||
{"transmission_id", transmission_id_}};
|
||||
@@ -245,8 +313,6 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
||||
ws_connection_id_ = j["ws_connection_id"].get<unsigned int>();
|
||||
LOG_INFO("Receive local peer websocket connection id [{}]",
|
||||
ws_connection_id_);
|
||||
std::lock_guard<std::mutex> l(signal_status_mutex_);
|
||||
signal_status_ = SignalStatus::SignalConnected;
|
||||
break;
|
||||
}
|
||||
case "transmission_id"_H: {
|
||||
@@ -305,7 +371,7 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
||||
ice_transmission_list_[remote_user_id]->JoinTransmission();
|
||||
}
|
||||
|
||||
on_connection_status_(ConnectionStatus::Connecting);
|
||||
// on_connection_status_(ConnectionStatus::Connecting);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -363,6 +429,8 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
||||
ice_transmission_list_[remote_user_id]->SetRemoteSdp(remote_sdp);
|
||||
|
||||
ice_transmission_list_[remote_user_id]->GatherCandidates();
|
||||
|
||||
on_connection_status_(ConnectionStatus::Connecting);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -381,6 +449,8 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
||||
ice_transmission_list_.end()) {
|
||||
ice_transmission_list_[remote_user_id]->SetRemoteSdp(remote_sdp);
|
||||
}
|
||||
|
||||
on_connection_status_(ConnectionStatus::Connecting);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -392,6 +462,11 @@ void PeerConnection::ProcessSignal(const std::string &signal) {
|
||||
|
||||
int PeerConnection::RequestTransmissionMemberList(
|
||||
const std::string &transmission_id, const std::string &password) {
|
||||
if (SignalStatus::SignalConnected != GetSignalStatus()) {
|
||||
LOG_ERROR("Signal not connected");
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOG_INFO("Request member list");
|
||||
|
||||
json message = {{"type", "query_user_id_list"},
|
||||
@@ -445,9 +520,17 @@ int PeerConnection::SendVideoData(const char *data, size_t size) {
|
||||
}
|
||||
|
||||
int PeerConnection::SendAudioData(const char *data, size_t size) {
|
||||
for (auto &ice_trans : ice_transmission_list_) {
|
||||
ice_trans.second->SendData(IceTransmission::DATA_TYPE::AUDIO, data, size);
|
||||
}
|
||||
int ret = audio_encoder_->Encode(
|
||||
(uint8_t *)data, size,
|
||||
[this](char *encoded_audio_buffer, size_t size) -> int {
|
||||
for (auto &ice_trans : ice_transmission_list_) {
|
||||
// LOG_ERROR("opus frame size: [{}]", size);
|
||||
ice_trans.second->SendData(IceTransmission::DATA_TYPE::AUDIO,
|
||||
encoded_audio_buffer, size);
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,17 +5,19 @@
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
|
||||
#include "audio_decoder.h"
|
||||
#include "audio_encoder.h"
|
||||
#include "ice_transmission.h"
|
||||
#include "video_decoder_factory.h"
|
||||
#include "video_encoder_factory.h"
|
||||
#include "ws_transmission.h"
|
||||
#include "x.h"
|
||||
|
||||
enum SignalStatus { SignalConnecting = 0, SignalConnected, SignalClosed };
|
||||
|
||||
typedef void (*OnReceiveBuffer)(const char *, size_t, const char *,
|
||||
const size_t);
|
||||
|
||||
typedef void (*OnSignalStatus)(SignalStatus status);
|
||||
|
||||
typedef void (*OnConnectionStatus)(ConnectionStatus status);
|
||||
|
||||
typedef void (*NetStatusReport)(const unsigned short, const unsigned short);
|
||||
@@ -25,6 +27,7 @@ typedef struct {
|
||||
OnReceiveBuffer on_receive_video_buffer;
|
||||
OnReceiveBuffer on_receive_audio_buffer;
|
||||
OnReceiveBuffer on_receive_data_buffer;
|
||||
OnSignalStatus on_signal_status;
|
||||
OnConnectionStatus on_connection_status;
|
||||
NetStatusReport net_status_report;
|
||||
} PeerConnectionParams;
|
||||
@@ -56,6 +59,7 @@ class PeerConnection {
|
||||
|
||||
private:
|
||||
int CreateVideoCodec(bool hardware_acceleration);
|
||||
int CreateAudioCodec();
|
||||
|
||||
void ProcessSignal(const std::string &signal);
|
||||
|
||||
@@ -81,12 +85,14 @@ class PeerConnection {
|
||||
private:
|
||||
std::shared_ptr<WsTransmission> ws_transport_ = nullptr;
|
||||
std::function<void(const std::string &)> on_receive_ws_msg_ = nullptr;
|
||||
std::function<void(WsStatus)> on_ws_status_ = nullptr;
|
||||
unsigned int ws_connection_id_ = 0;
|
||||
std::string user_id_ = "";
|
||||
std::string transmission_id_ = "";
|
||||
std::vector<std::string> user_id_list_;
|
||||
SignalStatus signal_status_ = SignalStatus::SignalClosed;
|
||||
std::mutex signal_status_mutex_;
|
||||
bool leave_ = false;
|
||||
|
||||
private:
|
||||
std::map<std::string, std::unique_ptr<IceTransmission>>
|
||||
@@ -103,6 +109,7 @@ class PeerConnection {
|
||||
OnReceiveBuffer on_receive_video_buffer_;
|
||||
OnReceiveBuffer on_receive_audio_buffer_;
|
||||
OnReceiveBuffer on_receive_data_buffer_;
|
||||
OnSignalStatus on_signal_status_;
|
||||
OnConnectionStatus on_connection_status_;
|
||||
char *nv12_data_ = nullptr;
|
||||
bool inited_ = false;
|
||||
@@ -114,6 +121,10 @@ class PeerConnection {
|
||||
bool hardware_accelerated_encode_ = false;
|
||||
bool hardware_accelerated_decode_ = false;
|
||||
bool b_force_i_frame_ = false;
|
||||
|
||||
private:
|
||||
std::unique_ptr<AudioEncoder> audio_encoder_ = nullptr;
|
||||
std::unique_ptr<AudioDecoder> audio_decoder_ = nullptr;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user