diff --git a/sunshine/stream.cpp b/sunshine/stream.cpp index 9fe35927..ac434352 100644 --- a/sunshine/stream.cpp +++ b/sunshine/stream.cpp @@ -190,7 +190,7 @@ struct session_t { struct { int lowseq; udp::endpoint peer; - safe::mail_raw_t::event_t idr_events; + safe::mail_raw_t::event_t idr_events; } video; struct { @@ -456,7 +456,7 @@ void controlBroadcastThread(control_server_t *server) { << "firstFrame [" << firstFrame << ']' << std::endl << "lastFrame [" << lastFrame << ']'; - session->video.idr_events->raise(std::make_pair(firstFrame, lastFrame)); + session->video.idr_events->raise(true); }); server->map(packetTypes[IDX_INPUT_DATA], [&](session_t *session, const std::string_view &payload) { @@ -1023,7 +1023,7 @@ std::shared_ptr alloc(config_t &config, crypto::aes_t &gcm_key, crypt session->gcm_key = gcm_key; session->iv = iv; - session->video.idr_events = mail->event(mail::idr); + session->video.idr_events = mail->event(mail::idr); session->video.lowseq = 0; session->audio.sequenceNumber = 0; diff --git a/sunshine/video.cpp b/sunshine/video.cpp index 655c4775..b7c2fd2b 100644 --- a/sunshine/video.cpp +++ b/sunshine/video.cpp @@ -353,12 +353,11 @@ struct sync_session_ctx_t { safe::signal_t *join_event; safe::mail_raw_t::event_t shutdown_event; safe::mail_raw_t::queue_t packets; - safe::mail_raw_t::event_t idr_events; + safe::mail_raw_t::event_t idr_events; safe::mail_raw_t::event_t touch_port_events; config_t config; int frame_nr; - int key_frame_nr; void *channel_data; }; @@ -986,7 +985,7 @@ std::optional make_session(const encoder_t &encoder, const config_t & } void encode_run( - int &frame_nr, int &key_frame_nr, // Store progress of the frame number + int &frame_nr, // Store progress of the frame number safe::mail_t mail, img_event_t images, config_t config, @@ -1009,7 +1008,7 @@ void encode_run( auto shutdown_event = mail->event(mail::shutdown); auto packets = mail::man->queue(mail::video_packets); - auto idr_events = mail->event(mail::idr); + auto idr_events = mail->event(mail::idr); while(true) { if(shutdown_event->peek() || reinit_event.peek() || !images->running()) { @@ -1020,12 +1019,7 @@ void encode_run( frame->pict_type = AV_PICTURE_TYPE_I; frame->key_frame = 1; - auto event = idr_events->pop(); - if(!event) { - return; - } - - key_frame_nr = frame_nr; + idr_events->pop(); } std::this_thread::sleep_until(next_frame); @@ -1201,15 +1195,7 @@ encode_e encode_run_sync(std::vector> &synce frame->pict_type = AV_PICTURE_TYPE_I; frame->key_frame = 1; - auto event = ctx->idr_events->pop(); - auto end = event->second; - - ctx->frame_nr = end; - ctx->key_frame_nr = end + ctx->config.framerate; - } - else if(ctx->frame_nr == ctx->key_frame_nr) { - frame->pict_type = AV_PICTURE_TYPE_I; - frame->key_frame = 1; + ctx->idr_events->pop(); } if(img_tmp) { @@ -1306,8 +1292,7 @@ void capture_async( return; } - int frame_nr = 1; - int key_frame_nr = 1; + int frame_nr = 1; auto touch_port_event = mail->event(mail::touch_port); @@ -1345,7 +1330,7 @@ void capture_async( touch_port_event->raise(make_port(display.get(), config)); encode_run( - frame_nr, key_frame_nr, + frame_nr, mail, images, config, display->width, display->height, hwdevice.get(), @@ -1359,9 +1344,9 @@ void capture( config_t config, void *channel_data) { - auto idr_events = mail->event(mail::idr); + auto idr_events = mail->event(mail::idr); - idr_events->raise(std::make_pair(0, 1)); + idr_events->raise(true); if(encoders.front().flags & SYSTEM_MEMORY) { capture_async(std::move(mail), config, channel_data); } @@ -1376,7 +1361,6 @@ void capture( mail->event(mail::touch_port), config, 1, - 1, channel_data, }); diff --git a/sunshine/video.h b/sunshine/video.h index 1c142147..9f90c55a 100644 --- a/sunshine/video.h +++ b/sunshine/video.h @@ -57,7 +57,6 @@ struct packet_raw_t : public AVPacket { }; using packet_t = std::unique_ptr; -using idr_t = std::pair; struct config_t { int width;