## Link to GitHub Issue or related Pull Request, if one exists fixes #875 ## Description of change Adds `-apistream`, an optional HTTP video stream of the mirrored screen. It listens on the API port +2. Two endpoints, sharing the same `screen`, `fps` and `q` parameters: /stream.mjpg JPEG frames, for clients with no container support /stream.h264 H.264 annex-b, for an app driving MediaCodec or VideoToolbox itself One encoder per connection, fed by a per-screen pump that always hands over the newest frame, so a slow reader drops frames instead of building a backlog. `capture.get_jpg` behaviour is unchanged. Additional documentation for developers: https://github.com/spice2x/spice2x.github.io/wiki/Video-Stream ## Testing
39 lines
1.1 KiB
C++
39 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "capture_pump.h"
|
|
|
|
namespace api {
|
|
|
|
// writes bytes to the client; false once the connection is gone
|
|
using StreamSend = std::function<bool(const void *, size_t)>;
|
|
|
|
// one wire format, instantiated per connection so it can keep encoder state across frames
|
|
class StreamWriter {
|
|
public:
|
|
virtual ~StreamWriter() = default;
|
|
|
|
StreamWriter(const StreamWriter &) = delete;
|
|
StreamWriter &operator=(const StreamWriter &) = delete;
|
|
|
|
// value for the HTTP Content-Type response header
|
|
virtual std::string content_type() const = 0;
|
|
|
|
// for formats that open with an init segment; runs once before any frame
|
|
virtual bool begin(const StreamSend &send) { return true; }
|
|
|
|
virtual bool write(const StreamSend &send, const capture_pump::Frame &frame) = 0;
|
|
|
|
protected:
|
|
StreamWriter() = default;
|
|
};
|
|
|
|
// null when the path does not name a format this build supports
|
|
std::unique_ptr<StreamWriter> make_stream_writer(
|
|
const std::string &path, int quality, int fps);
|
|
}
|