diff --git a/app/src/decoder.c b/app/src/decoder.c index 23f9ce9d..cfb8df26 100644 --- a/app/src/decoder.c +++ b/app/src/decoder.c @@ -2,7 +2,6 @@ #include #include -#include #include #include "events.h" @@ -18,18 +17,22 @@ push_frame(struct decoder *decoder) { video_buffer_offer_decoded_frame(decoder->video_buffer, &previous_frame_skipped); if (previous_frame_skipped) { - // the previous EVENT_NEW_FRAME will consume this frame + // the previous callback will consume this frame return; } - static SDL_Event new_frame_event = { - .type = EVENT_NEW_FRAME, - }; - SDL_PushEvent(&new_frame_event); + + decoder->cbs->on_new_frame(decoder, decoder->cbs_userdata); } void -decoder_init(struct decoder *decoder, struct video_buffer *vb) { +decoder_init(struct decoder *decoder, struct video_buffer *vb, + const struct decoder_callbacks *cbs, void *cbs_userdata) { decoder->video_buffer = vb; + + assert(cbs); + assert(cbs->on_new_frame); + decoder->cbs = cbs; + decoder->cbs_userdata = cbs_userdata; } bool diff --git a/app/src/decoder.h b/app/src/decoder.h index 27afcd8e..c0e2adf1 100644 --- a/app/src/decoder.h +++ b/app/src/decoder.h @@ -11,10 +11,20 @@ struct video_buffer; struct decoder { struct video_buffer *video_buffer; AVCodecContext *codec_ctx; + + const struct decoder_callbacks *cbs; + void *cbs_userdata; +}; + +struct decoder_callbacks { + // Called when a new frame can be consumed by + // video_buffer_take_rendering_frame(decoder->video_buffer). + void (*on_new_frame)(struct decoder *decoder, void *userdata); }; void -decoder_init(struct decoder *decoder, struct video_buffer *vb); +decoder_init(struct decoder *decoder, struct video_buffer *vb, + const struct decoder_callbacks *cbs, void *cbs_userdata); bool decoder_open(struct decoder *decoder, const AVCodec *codec); diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index d24bba2c..ea8002b8 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -266,6 +266,17 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) { free(local_fmt); } +static void +decoder_on_new_frame(struct decoder *decoder, void *userdata) { + (void) decoder; + (void) userdata; + + static SDL_Event new_frame_event = { + .type = EVENT_NEW_FRAME, + }; + SDL_PushEvent(&new_frame_event); +} + bool scrcpy(const struct scrcpy_options *options) { if (!server_init(&server)) { @@ -346,7 +357,11 @@ scrcpy(const struct scrcpy_options *options) { file_handler_initialized = true; } - decoder_init(&decoder, &video_buffer); + static const struct decoder_callbacks decoder_cbs = { + .on_new_frame = decoder_on_new_frame, + }; + + decoder_init(&decoder, &video_buffer, &decoder_cbs, NULL); dec = &decoder; }