Files
esp32cam-rtsp/lib/rtsp_server/rtsp_server.cpp
2022-09-13 01:32:41 +02:00

51 lines
1.4 KiB
C++

#include "rtsp_server.h"
#include <esp32-hal-log.h>
#include <OV2640Streamer.h>
// URI: e.g. rtsp://192.168.178.27:554/mjpeg/1
rtsp_server::rtsp_server(OV2640 &cam, unsigned long interval, int port /*= 554*/)
: WiFiServer(port), cam_(cam)
{
log_i("Starting RTSP server");
WiFiServer::begin();
timer_.every(interval, client_handler, this);
}
size_t rtsp_server::num_connected()
{
return clients_.size();
}
void rtsp_server::doLoop()
{
timer_.tick();
}
rtsp_server::rtsp_client::rtsp_client(const WiFiClient &client, OV2640 &cam)
{
wifi_client = client;
streamer = std::shared_ptr<OV2640Streamer>(new OV2640Streamer(&wifi_client, cam));
session = std::shared_ptr<CRtspSession>(new CRtspSession(&wifi_client, streamer.get()));
}
bool rtsp_server::client_handler(void *arg)
{
auto self = static_cast<rtsp_server *>(arg);
// Check if a client wants to connect
auto new_client = self->accept();
if (new_client)
self->clients_.push_back(std::unique_ptr<rtsp_client>(new rtsp_client(new_client, self->cam_)));
auto now = millis();
for (const auto &client : self->clients_)
{
// Handle requests
client->session->handleRequests(0);
// Send the frame. For now return the uptime as time marker, currMs
client->session->broadcastCurrentFrame(now);
}
self->clients_.remove_if([](std::unique_ptr<rtsp_client> const &c)
{ return c->session->m_stopped; });
return true;
}