diff --git a/CHANGES.md b/CHANGES.md index 0f918e03..492edeef 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,16 @@ ## develop +## 18.10.1 + +- [UPDATE] 利用している libwebrtc のライブラリを M71 にする +- [FIX] --metadata を Sora のみのオプションにする +- [FIX] P2P のオプションに --document-root を追加する +- [FIX] P2P モードで Web サーバが立ち上がった場合カレントディレクトリを晒さないようにする +- [FIX] --auido-bitrate を指定した場合に、--auido-bitrate に指定したビットレートがビデオのビットレートとして扱われる問題を修正 + +## 18.10.1-rc0 + - [UPDATE] websocketpp と civietweb を Boost.beast に置き換える ## 18.10.0 diff --git a/build/Makefile b/build/Makefile index c7f3729a..edbe0246 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,6 +1,6 @@ BUILD_NUMBER=$(shell date +"%Y%m%d%H%M%S") -WEBRTC_VERSION=70 -MOMO_VERSION=18.10.1-rc0 +WEBRTC_VERSION=71 +MOMO_VERSION=18.10.1 TARGET=$@ diff --git a/hwenc_il/il_h264_encoder.cpp b/hwenc_il/il_h264_encoder.cpp index 334df8b8..c89ea0dd 100644 --- a/hwenc_il/il_h264_encoder.cpp +++ b/hwenc_il/il_h264_encoder.cpp @@ -606,7 +606,7 @@ int32_t ILH264Encoder::Encode( encoded_image_._encodedWidth = frame_buffer->width(); encoded_image_._encodedHeight = frame_buffer->height(); - encoded_image_._timeStamp = input_frame.timestamp(); + encoded_image_.SetTimestamp(input_frame.timestamp()); encoded_image_.ntp_time_ms_ = input_frame.ntp_time_ms(); encoded_image_.capture_time_ms_ = input_frame.render_time_ms(); encoded_image_.rotation_ = input_frame.rotation(); @@ -671,11 +671,11 @@ int32_t ILH264Encoder::DrainEncodedData() size_t required_size = 0; size_t writtenSize = 0; uint64_t buf_time = (((((uint64_t)out->nTimeStamp.nHighPart << 32) & 0xFFFFFFFF00000000) + (uint64_t)out->nTimeStamp.nLowPart)) / 1000ll; - if (buf_time != encoded_image_._timeStamp) + if (buf_time != encoded_image_.Timestamp()) { - RTC_LOG(LS_ERROR) << "Error timestamp is not match. timestamp:" << encoded_image_._timeStamp << " buf_time:" << buf_time; + RTC_LOG(LS_ERROR) << "Error timestamp is not match. timestamp:" << encoded_image_.Timestamp() << " buf_time:" << buf_time; } - if (buf_time < encoded_image_._timeStamp) + if (buf_time < encoded_image_.Timestamp()) { RTC_LOG(LS_ERROR) << "buf_time is yanger than timestamp. retry get buffer."; out->nFilledLen = 0; diff --git a/src/connection_settings.h b/src/connection_settings.h index dfba97c5..04dbddae 100644 --- a/src/connection_settings.h +++ b/src/connection_settings.h @@ -19,13 +19,13 @@ struct ConnectionSettings int framerate = 0; std::string priority = "BALANCE"; - nlohmann::json metadata; - std::string sora_signaling_host = "wss://example.com/signaling"; std::string sora_channel_id; bool sora_auto_connect = false; + nlohmann::json sora_metadata; int p2p_port = 8080; + std::string p2p_document_root; int getWidth() { if (resolution == "QVGA") { @@ -73,11 +73,12 @@ struct ConnectionSettings os << "resolution: " << cs.resolution << "\n"; os << "framerate: " << cs.framerate << "\n"; os << "priority: " << cs.priority << "\n"; - os << "metadata: " << cs.metadata << "\n"; os << "sora_signaling_host: " << cs.sora_signaling_host << "\n"; os << "sora_channel_id: " << cs.sora_channel_id << "\n"; os << "sora_auto_connect: " << (cs.sora_auto_connect ? "true" : "false") << "\n"; + os << "sora_metadata: " << cs.sora_metadata << "\n"; os << "p2p_port: " << cs.p2p_port << "\n"; + os << "p2p_document_root: " << cs.p2p_document_root << "\n"; return os; } }; diff --git a/src/main.cpp b/src/main.cpp index 37b0b489..f4509f48 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,6 +79,24 @@ struct JsonValue : public CLI::Validator { } }; +// ディレクトリが存在するか確認するバリデータ +struct DirectoryExists : public CLI::Validator { + DirectoryExists() { + tname = "Directory"; + func = [](std::string input) { + auto path = boost::filesystem::path(input); + auto st = boost::filesystem::status(path); + if (!boost::filesystem::exists(st)) { + return "Path " + input + " not exists"; + } + if (!boost::filesystem::is_directory(st)) { + return "Path " + input + " is not directory"; + } + + return std::string(); + }; + } +}; int main(int argc, char* argv[]) { @@ -94,25 +112,26 @@ int main(int argc, char* argv[]) app.add_option("--video-codec", cs.video_codec, "ビデオコーデック")->check(Enum({"VP8", "VP9", "H264"})); app.add_option("--audio-codec", cs.audio_codec, "オーディオコーデック")->check(Enum({"OPUS", "PCMU"})); app.add_option("--video-bitrate", cs.video_bitrate, "ビデオのビットレート")->check(CLI::Range(1, 30000)); - app.add_option("--audio-bitrate", cs.video_bitrate, "オーディオのビットレート")->check(CLI::Range(6, 510)); + app.add_option("--audio-bitrate", cs.audio_bitrate, "オーディオのビットレート")->check(CLI::Range(6, 510)); app.add_option("--resolution", cs.resolution, "解像度")->check(Enum({"QVGA", "VGA", "HD", "FHD", "4K"})); app.add_option("--framerate", cs.framerate, "フレームレート")->check(CLI::Range(1, 60)); app.add_option("--priority", cs.priority, "優先設定 (Experimental)")->check(Enum({"BALANCE", "FRAMERATE", "RESOLUTION"})); app.add_flag("--daemon", is_daemon, "デーモン化する"); app.add_flag("--version", version, "バージョン情報の表示"); app.add_option("--log-level", log_level, "ログレベル")->check(CLI::Range(0, 5)); - // 隠しオプション - std::string metadata; - app.add_option("--metadata", metadata, "メタデータ")->group("")->check(JsonValue()); auto p2p_app = app.add_subcommand("p2p", "P2P"); auto sora_app = app.add_subcommand("sora", "WebRTC SFU Sora"); p2p_app->add_option("--port", cs.p2p_port, "ポート番号")->check(CLI::Range(0, 65535)); + p2p_app->add_option("--document-root", cs.p2p_document_root, "配信ディレクトリ")->check(DirectoryExists()); sora_app->add_option("SIGNALING-URL", cs.sora_signaling_host, "シグナリングホスト")->required(); sora_app->add_option("CHANNEL-ID", cs.sora_channel_id, "チャンネルID")->required(); sora_app->add_flag("--auto", cs.sora_auto_connect, "自動接続する"); + // 隠しオプション + std::string sora_metadata; + sora_app->add_option("--metadata", sora_metadata, "メタデータ")->group("")->check(JsonValue()); try { app.parse(argc, argv); @@ -121,8 +140,12 @@ int main(int argc, char* argv[]) } // メタデータのパース - if (!metadata.empty()) { - cs.metadata = json::parse(metadata); + if (!sora_metadata.empty()) { + cs.sora_metadata = json::parse(sora_metadata); + } + + if (cs.p2p_document_root.empty()) { + cs.p2p_document_root = boost::filesystem::current_path().string(); } if (version) { @@ -162,8 +185,6 @@ int main(int argc, char* argv[]) std::unique_ptr rtc_manager(new RTCManager(cs)); - std::string currentPath = boost::filesystem::path(boost::filesystem::current_path()).string(); - { boost::asio::io_context ioc{1}; @@ -179,7 +200,7 @@ int main(int argc, char* argv[]) if (p2p_app->parsed()) { const boost::asio::ip::tcp::endpoint endpoint{boost::asio::ip::make_address("0.0.0.0"), static_cast(cs.p2p_port)}; - std::make_shared(ioc, endpoint, std::make_shared(currentPath), rtc_manager.get(), cs)->run(); + std::make_shared(ioc, endpoint, std::make_shared(cs.p2p_document_root), rtc_manager.get(), cs)->run(); } ioc.run(); diff --git a/src/sora/sora_websocket_client.cpp b/src/sora/sora_websocket_client.cpp index 176d2d76..b56a760c 100644 --- a/src/sora/sora_websocket_client.cpp +++ b/src/sora/sora_websocket_client.cpp @@ -253,8 +253,8 @@ void SoraWebsocketClient::doSendConnect() {"channel_id", conn_settings_.sora_channel_id}, }; - if (!conn_settings_.metadata.is_null()) { - json_message["metadata"] = conn_settings_.metadata; + if (!conn_settings_.sora_metadata.is_null()) { + json_message["metadata"] = conn_settings_.sora_metadata; } json_message["video"]["codec_type"] = conn_settings_.video_codec;