Notify end-of-stream via callback
Do not send a SDL event directly, to make stream independent of SDL.
This commit is contained in:
parent
1e64f0f931
commit
83116fc199
3 changed files with 32 additions and 13 deletions
|
@ -241,6 +241,16 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) {
|
||||||
free(local_fmt);
|
free(local_fmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stream_on_eos(struct stream *stream, void *userdata) {
|
||||||
|
(void) stream;
|
||||||
|
(void) userdata;
|
||||||
|
|
||||||
|
SDL_Event stop_event;
|
||||||
|
stop_event.type = EVENT_STREAM_STOPPED;
|
||||||
|
SDL_PushEvent(&stop_event);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
scrcpy(const struct scrcpy_options *options) {
|
scrcpy(const struct scrcpy_options *options) {
|
||||||
if (!server_init(&server)) {
|
if (!server_init(&server)) {
|
||||||
|
@ -343,7 +353,10 @@ scrcpy(const struct scrcpy_options *options) {
|
||||||
|
|
||||||
av_log_set_callback(av_log_callback);
|
av_log_set_callback(av_log_callback);
|
||||||
|
|
||||||
stream_init(&stream, server.video_socket);
|
const struct stream_callbacks stream_cbs = {
|
||||||
|
.on_eos = stream_on_eos,
|
||||||
|
};
|
||||||
|
stream_init(&stream, server.video_socket, &stream_cbs, NULL);
|
||||||
|
|
||||||
if (dec) {
|
if (dec) {
|
||||||
stream_add_sink(&stream, &dec->packet_sink);
|
stream_add_sink(&stream, &dec->packet_sink);
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
#include <libavutil/time.h>
|
#include <libavutil/time.h>
|
||||||
#include <SDL2/SDL_events.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "decoder.h"
|
#include "decoder.h"
|
||||||
|
@ -58,13 +57,6 @@ stream_recv_packet(struct stream *stream, AVPacket *packet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
notify_stopped(void) {
|
|
||||||
SDL_Event stop_event;
|
|
||||||
stop_event.type = EVENT_STREAM_STOPPED;
|
|
||||||
SDL_PushEvent(&stop_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
push_packet_to_sinks(struct stream *stream, const AVPacket *packet) {
|
push_packet_to_sinks(struct stream *stream, const AVPacket *packet) {
|
||||||
for (unsigned i = 0; i < stream->sink_count; ++i) {
|
for (unsigned i = 0; i < stream->sink_count; ++i) {
|
||||||
|
@ -251,15 +243,22 @@ finally_close_sinks:
|
||||||
finally_free_codec_ctx:
|
finally_free_codec_ctx:
|
||||||
avcodec_free_context(&stream->codec_ctx);
|
avcodec_free_context(&stream->codec_ctx);
|
||||||
end:
|
end:
|
||||||
notify_stopped();
|
stream->cbs->on_eos(stream, stream->cbs_userdata);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
stream_init(struct stream *stream, socket_t socket) {
|
stream_init(struct stream *stream, socket_t socket,
|
||||||
|
const struct stream_callbacks *cbs, void *cbs_userdata) {
|
||||||
stream->socket = socket;
|
stream->socket = socket;
|
||||||
stream->has_pending = false;
|
stream->has_pending = false;
|
||||||
stream->sink_count = 0;
|
stream->sink_count = 0;
|
||||||
|
|
||||||
|
assert(cbs && cbs->on_eos);
|
||||||
|
|
||||||
|
stream->cbs = cbs;
|
||||||
|
stream->cbs_userdata = cbs_userdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
#include <SDL2/SDL_atomic.h>
|
|
||||||
|
|
||||||
#include "trait/packet_sink.h"
|
#include "trait/packet_sink.h"
|
||||||
#include "util/net.h"
|
#include "util/net.h"
|
||||||
|
@ -27,10 +26,18 @@ struct stream {
|
||||||
// packet is available
|
// packet is available
|
||||||
bool has_pending;
|
bool has_pending;
|
||||||
AVPacket pending;
|
AVPacket pending;
|
||||||
|
|
||||||
|
const struct stream_callbacks *cbs;
|
||||||
|
void *cbs_userdata;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stream_callbacks {
|
||||||
|
void (*on_eos)(struct stream *stream, void *userdata);
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
stream_init(struct stream *stream, socket_t socket);
|
stream_init(struct stream *stream, socket_t socket,
|
||||||
|
const struct stream_callbacks *cbs, void *cbs_userdata);
|
||||||
|
|
||||||
void
|
void
|
||||||
stream_add_sink(struct stream *stream, struct sc_packet_sink *sink);
|
stream_add_sink(struct stream *stream, struct sc_packet_sink *sink);
|
||||||
|
|
Loading…
Reference in a new issue