diff --git a/examples/usbstream/usbstream.cpp b/examples/usbstream/usbstream.cpp index 6ea0ee43ae..b9c47c4890 100644 --- a/examples/usbstream/usbstream.cpp +++ b/examples/usbstream/usbstream.cpp @@ -5,7 +5,8 @@ int main() { cs::USBCamera camera{"usbcam", 1}; camera.SetVideoMode(cs::VideoMode::kMJPEG, 320, 240, 30); - cs::HTTPSink httpServer{"httpserver", 8080}; - httpServer.SetSource(camera); + cs::MJPEGServer mjpegServer{"httpserver", 8080}; + mjpegServer.SetSource(camera); + for (;;) std::this_thread::sleep_for(std::chrono::seconds(1)); } diff --git a/include/cameraserver_c.h b/include/cameraserver_c.h index f4a5c71726..16a9566f79 100644 --- a/include/cameraserver_c.h +++ b/include/cameraserver_c.h @@ -164,8 +164,8 @@ void CS_RemoveSourcePropertyByName(CS_Source source, const char* name, // // Sink Creation Functions // -CS_Sink CS_CreateHTTPSink(const char* name, const char* listenAddress, int port, - CS_Status* status); +CS_Sink CS_CreateMJPEGServer(const char* name, const char* listenAddress, + int port, CS_Status* status); CS_Sink CS_CreateCvSink(const char* name, CS_Status* status); CS_Sink CS_CreateCvSinkCallback(const char* name, void* data, void (*processFrame)(void* data, uint64_t time), diff --git a/include/cameraserver_cpp.h b/include/cameraserver_cpp.h index cb40a3252c..489d119286 100644 --- a/include/cameraserver_cpp.h +++ b/include/cameraserver_cpp.h @@ -151,8 +151,8 @@ void RemoveSourceProperty(CS_Source source, llvm::StringRef name, // // Sink Creation Functions // -CS_Sink CreateHTTPSink(llvm::StringRef name, llvm::StringRef listenAddress, - int port, CS_Status* status); +CS_Sink CreateMJPEGServer(llvm::StringRef name, llvm::StringRef listenAddress, + int port, CS_Status* status); CS_Sink CreateCvSink(llvm::StringRef name, CS_Status* status); CS_Sink CreateCvSinkCallback(llvm::StringRef name, std::function processFrame, diff --git a/include/cameraserver_oo.h b/include/cameraserver_oo.h index ae90f788b2..054b9e7c6a 100644 --- a/include/cameraserver_oo.h +++ b/include/cameraserver_oo.h @@ -304,18 +304,18 @@ class VideoSink { }; /// A sink that acts as a MJPEG-over-HTTP network server. -class HTTPSink : public VideoSink { +class MJPEGServer : public VideoSink { public: /// Create a MJPEG-over-HTTP server sink. /// @param name Sink name (arbitrary unique identifier) /// @param listenAddress TCP listen address (empty string for all addresses) /// @param port TCP port number - HTTPSink(llvm::StringRef name, llvm::StringRef listenAddress, int port); + MJPEGServer(llvm::StringRef name, llvm::StringRef listenAddress, int port); /// Create a MJPEG-over-HTTP server sink. /// @param name Sink name (arbitrary unique identifier) /// @param port TCP port number - HTTPSink(llvm::StringRef name, int port) : HTTPSink(name, "", port) {} + MJPEGServer(llvm::StringRef name, int port) : MJPEGServer(name, "", port) {} }; /// A sink for user code to accept video frames as OpenCV images. diff --git a/include/cameraserver_oo.inl b/include/cameraserver_oo.inl index 856a0dbbf1..8056230984 100644 --- a/include/cameraserver_oo.inl +++ b/include/cameraserver_oo.inl @@ -270,9 +270,9 @@ inline VideoProperty VideoSink::GetSourceProperty(llvm::StringRef name) { return VideoProperty{GetSinkSourceProperty(m_handle, name, &m_status)}; } -inline HTTPSink::HTTPSink(llvm::StringRef name, llvm::StringRef listenAddress, - int port) { - m_handle = CreateHTTPSink(name, listenAddress, port, &m_status); +inline MJPEGServer::MJPEGServer(llvm::StringRef name, + llvm::StringRef listenAddress, int port) { + m_handle = CreateMJPEGServer(name, listenAddress, port, &m_status); } inline CvSink::CvSink(llvm::StringRef name) { diff --git a/java/lib/CameraServerJNI.cpp b/java/lib/CameraServerJNI.cpp index e21718e9c3..3b80dc509a 100644 --- a/java/lib/CameraServerJNI.cpp +++ b/java/lib/CameraServerJNI.cpp @@ -591,16 +591,15 @@ JNIEXPORT void JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_removeSourcePro /* * Class: edu_wpi_cameraserver_CameraServerJNI - * Method: createHTTPSink + * Method: createMJPEGServer * Signature: (Ljava/lang/String;Ljava/lang/String;I)I */ -JNIEXPORT jint JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_createHTTPSink +JNIEXPORT jint JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_createMJPEGServer (JNIEnv *env, jclass, jstring name, jstring listenAddress, jint port) { CS_Status status; - auto val = - cs::CreateHTTPSink(JStringRef{env, name}, - JStringRef{env, listenAddress}, port, &status); + auto val = cs::CreateMJPEGServer( + JStringRef{env, name}, JStringRef{env, listenAddress}, port, &status); CheckStatus(env, status); return val; } diff --git a/java/src/edu/wpi/cameraserver/CameraServerJNI.java b/java/src/edu/wpi/cameraserver/CameraServerJNI.java index 4642566760..1da23853eb 100644 --- a/java/src/edu/wpi/cameraserver/CameraServerJNI.java +++ b/java/src/edu/wpi/cameraserver/CameraServerJNI.java @@ -130,7 +130,7 @@ public class CameraServerJNI { // // Sink Creation Functions // - public static native int createHTTPSink(String name, String listenAddress, int port); + public static native int createMJPEGServer(String name, String listenAddress, int port); public static native int createCvSink(String name); //public static native int createCvSinkCallback(String name, // void (*processFrame)(long time)); diff --git a/java/src/edu/wpi/cameraserver/HTTPSink.java b/java/src/edu/wpi/cameraserver/MJPEGServer.java similarity index 80% rename from java/src/edu/wpi/cameraserver/HTTPSink.java rename to java/src/edu/wpi/cameraserver/MJPEGServer.java index 4ede4d27bf..4d4704cc98 100644 --- a/java/src/edu/wpi/cameraserver/HTTPSink.java +++ b/java/src/edu/wpi/cameraserver/MJPEGServer.java @@ -8,19 +8,19 @@ package edu.wpi.cameraserver; /// A sink that acts as a MJPEG-over-HTTP network server. -public class HTTPSink extends VideoSink { +public class MJPEGServer extends VideoSink { /// Create a MJPEG-over-HTTP server sink. /// @param name Sink name (arbitrary unique identifier) /// @param listenAddress TCP listen address (empty string for all addresses) /// @param port TCP port number - public HTTPSink(String name, String listenAddress, int port) { - super(CameraServerJNI.createHTTPSink(name, listenAddress, port)); + public MJPEGServer(String name, String listenAddress, int port) { + super(CameraServerJNI.createMJPEGServer(name, listenAddress, port)); } /// Create a MJPEG-over-HTTP server sink. /// @param name Sink name (arbitrary unique identifier) /// @param port TCP port number - public HTTPSink(String name, int port) { + public MJPEGServer(String name, int port) { this(name, "", port); } } diff --git a/src/HTTPSinkImpl.cpp b/src/MJPEGServerImpl.cpp similarity index 88% rename from src/HTTPSinkImpl.cpp rename to src/MJPEGServerImpl.cpp index a694ea494e..9e36561b40 100644 --- a/src/HTTPSinkImpl.cpp +++ b/src/MJPEGServerImpl.cpp @@ -5,7 +5,7 @@ /* the project. */ /*----------------------------------------------------------------------------*/ -#include "HTTPSinkImpl.h" +#include "MJPEGServerImpl.h" #include @@ -33,10 +33,10 @@ using namespace cs; // A browser should connect for each file and not serve files from its cache. // Using cached pictures would lead to showing old/outdated pictures. // Many browsers seem to ignore, or at least not always obey, those headers. -void HTTPSinkImpl::SendHeader(llvm::raw_ostream& os, int code, - llvm::StringRef codeText, - llvm::StringRef contentType, - llvm::StringRef extra) { +void MJPEGServerImpl::SendHeader(llvm::raw_ostream& os, int code, + llvm::StringRef codeText, + llvm::StringRef contentType, + llvm::StringRef extra) { os << "HTTP/1.0 " << code << ' ' << codeText << "\r\n"; os << "Connection: close\r\n" "Server: CameraServer/1.0\r\n" @@ -52,8 +52,8 @@ void HTTPSinkImpl::SendHeader(llvm::raw_ostream& os, int code, // Send error header and message // @param code HTTP error code (e.g. 404) // @param message Additional message text -void HTTPSinkImpl::SendError(llvm::raw_ostream& os, int code, - llvm::StringRef message) { +void MJPEGServerImpl::SendError(llvm::raw_ostream& os, int code, + llvm::StringRef message) { llvm::StringRef codeText, extra, baseMessage; switch (code) { case 401: @@ -90,8 +90,9 @@ void HTTPSinkImpl::SendError(llvm::raw_ostream& os, int code, // Read a line from an input stream (up to a maximum length). // The returned buffer will contain the trailing \n (unless the maximum length // was reached). -bool HTTPSinkImpl::ReadLine(wpi::raw_istream& istream, - llvm::SmallVectorImpl& buffer, int maxLen) { +bool MJPEGServerImpl::ReadLine(wpi::raw_istream& istream, + llvm::SmallVectorImpl& buffer, + int maxLen) { buffer.clear(); for (int i = 0; i < maxLen; ++i) { char c; @@ -104,8 +105,8 @@ bool HTTPSinkImpl::ReadLine(wpi::raw_istream& istream, } // Unescape a %xx-encoded URI. Returns false on error. -bool HTTPSinkImpl::UnescapeURI(llvm::StringRef str, - llvm::SmallVectorImpl& out) { +bool MJPEGServerImpl::UnescapeURI(llvm::StringRef str, + llvm::SmallVectorImpl& out) { for (auto i = str.begin(), end = str.end(); i != end; ++i) { // pass non-escaped characters to output if (*i != '%') { @@ -132,8 +133,8 @@ bool HTTPSinkImpl::UnescapeURI(llvm::StringRef str, } // Perform a command specified by HTTP GET parameters. -bool HTTPSinkImpl::ProcessCommand(llvm::raw_ostream& os, SourceImpl& source, - llvm::StringRef parameters, bool respond) { +bool MJPEGServerImpl::ProcessCommand(llvm::raw_ostream& os, SourceImpl& source, + llvm::StringRef parameters, bool respond) { llvm::SmallString<256> responseBuf; llvm::raw_svector_ostream response{responseBuf}; // command format: param1=value1¶m2=value2... @@ -216,8 +217,8 @@ bool HTTPSinkImpl::ProcessCommand(llvm::raw_ostream& os, SourceImpl& source, } // Send a JSON file which is contains information about the source parameters. -void HTTPSinkImpl::SendJSON(llvm::raw_ostream& os, SourceImpl& source, - bool header) { +void MJPEGServerImpl::SendJSON(llvm::raw_ostream& os, SourceImpl& source, + bool header) { if (header) SendHeader(os, 200, "OK", "application/x-javascript"); os << "{\n\"controls\": [\n"; @@ -282,23 +283,24 @@ void HTTPSinkImpl::SendJSON(llvm::raw_ostream& os, SourceImpl& source, os.flush(); } -HTTPSinkImpl::HTTPSinkImpl(llvm::StringRef name, llvm::StringRef description, - std::unique_ptr acceptor) +MJPEGServerImpl::MJPEGServerImpl(llvm::StringRef name, + llvm::StringRef description, + std::unique_ptr acceptor) : SinkImpl{name}, m_description(description), m_acceptor{std::move(acceptor)} { m_active = true; - m_serverThread = std::thread(&HTTPSinkImpl::ServerThreadMain, this); + m_serverThread = std::thread(&MJPEGServerImpl::ServerThreadMain, this); } -HTTPSinkImpl::~HTTPSinkImpl() { Stop(); } +MJPEGServerImpl::~MJPEGServerImpl() { Stop(); } -llvm::StringRef HTTPSinkImpl::GetDescription( +llvm::StringRef MJPEGServerImpl::GetDescription( llvm::SmallVectorImpl& buf) const { return m_description; } -void HTTPSinkImpl::Stop() { +void MJPEGServerImpl::Stop() { m_active = false; // wake up server thread by shutting down the socket @@ -319,7 +321,7 @@ void HTTPSinkImpl::Stop() { } // Send HTTP response and a stream of JPG-frames -void HTTPSinkImpl::SendStream(wpi::raw_socket_ostream& os) { +void MJPEGServerImpl::SendStream(wpi::raw_socket_ostream& os) { os.SetUnbuffered(); llvm::SmallString<256> header; @@ -370,7 +372,7 @@ void HTTPSinkImpl::SendStream(wpi::raw_socket_ostream& os) { } // thread for clients that connected to this server -void HTTPSinkImpl::ConnThreadMain(wpi::NetworkStream* stream) { +void MJPEGServerImpl::ConnThreadMain(wpi::NetworkStream* stream) { wpi::raw_socket_istream is{*stream}; wpi::raw_socket_ostream os{*stream, true}; @@ -454,7 +456,7 @@ void HTTPSinkImpl::ConnThreadMain(wpi::NetworkStream* stream) { } // Main server thread -void HTTPSinkImpl::ServerThreadMain() { +void MJPEGServerImpl::ServerThreadMain() { if (m_acceptor->start() != 0) { m_active = false; return; @@ -471,7 +473,7 @@ void HTTPSinkImpl::ServerThreadMain() { DEBUG("server: client connection from " << stream->getPeerIP()); - m_connThreads.emplace_back(&HTTPSinkImpl::ConnThreadMain, this, + m_connThreads.emplace_back(&MJPEGServerImpl::ConnThreadMain, this, stream.get()); m_connStreams.emplace_back(std::move(stream)); } @@ -481,13 +483,13 @@ void HTTPSinkImpl::ServerThreadMain() { namespace cs { -CS_Sink CreateHTTPSink(llvm::StringRef name, llvm::StringRef listenAddress, - int port, CS_Status* status) { +CS_Sink CreateMJPEGServer(llvm::StringRef name, llvm::StringRef listenAddress, + int port, CS_Status* status) { llvm::SmallString<128> descBuf; llvm::raw_svector_ostream desc{descBuf}; desc << "HTTP Server on port " << port; llvm::SmallString<128> str{listenAddress}; - auto sink = std::make_shared( + auto sink = std::make_shared( name, desc.str(), std::unique_ptr( new wpi::TCPAcceptor(port, str.c_str(), Logger::GetInstance()))); @@ -498,9 +500,9 @@ CS_Sink CreateHTTPSink(llvm::StringRef name, llvm::StringRef listenAddress, extern "C" { -CS_Sink CS_CreateHTTPSink(const char* name, const char* listenAddress, int port, - CS_Status* status) { - return cs::CreateHTTPSink(name, listenAddress, port, status); +CS_Sink CS_CreateMJPEGServer(const char* name, const char* listenAddress, + int port, CS_Status* status) { + return cs::CreateMJPEGServer(name, listenAddress, port, status); } } // extern "C" diff --git a/src/HTTPSinkImpl.h b/src/MJPEGServerImpl.h similarity index 87% rename from src/HTTPSinkImpl.h rename to src/MJPEGServerImpl.h index 53509914e6..f51ee42b32 100644 --- a/src/HTTPSinkImpl.h +++ b/src/MJPEGServerImpl.h @@ -5,8 +5,8 @@ /* the project. */ /*----------------------------------------------------------------------------*/ -#ifndef CAMERASERVER_HTTPSINKIMPL_H_ -#define CAMERASERVER_HTTPSINKIMPL_H_ +#ifndef CAMERASERVER_MJPEGSERVERIMPL_H_ +#define CAMERASERVER_MJPEGSERVERIMPL_H_ #include #include @@ -29,11 +29,11 @@ namespace cs { class SourceImpl; -class HTTPSinkImpl : public SinkImpl { +class MJPEGServerImpl : public SinkImpl { public: - HTTPSinkImpl(llvm::StringRef name, llvm::StringRef description, - std::unique_ptr acceptor); - ~HTTPSinkImpl() override; + MJPEGServerImpl(llvm::StringRef name, llvm::StringRef description, + std::unique_ptr acceptor); + ~MJPEGServerImpl() override; llvm::StringRef GetDescription( llvm::SmallVectorImpl& buf) const override; @@ -72,4 +72,4 @@ class HTTPSinkImpl : public SinkImpl { } // namespace cs -#endif // CAMERASERVER_HTTPSINKIMPL_H_ +#endif // CAMERASERVER_MJPEGSERVERIMPL_H_