[fix] fix render area cannot fit the resolution of the receiving video stream

This commit is contained in:
dijunkun
2024-09-06 17:38:09 +08:00
parent 890615e13a
commit 59c9ca8d53
3 changed files with 26 additions and 14 deletions

View File

@@ -568,29 +568,36 @@ int Render::Run() {
SDL_GetWindowSize(main_window_, &main_window_width_, SDL_GetWindowSize(main_window_, &main_window_width_,
&main_window_height_); &main_window_height_);
int video_width = main_window_width_; float video_ratio = (float)video_width_ / (float)video_height_;
int video_height = main_window_height_ - float video_ratio_reverse = (float)video_height_ / (float)video_width_;
int render_area_width = main_window_width_;
int render_area_height =
main_window_height_ -
(fullscreen_button_pressed_ ? 0 : title_bar_height_); (fullscreen_button_pressed_ ? 0 : title_bar_height_);
if (video_width * 9 < video_height * 16) { if (render_area_width < render_area_height * video_ratio) {
stream_render_rect_.x = 0; stream_render_rect_.x = 0;
stream_render_rect_.y = stream_render_rect_.y =
abs(video_height - video_width * 9 / 16) / 2 + abs(render_area_height -
render_area_width * video_ratio_reverse) /
2 +
(fullscreen_button_pressed_ ? 0 : title_bar_height_); (fullscreen_button_pressed_ ? 0 : title_bar_height_);
stream_render_rect_.w = video_width; stream_render_rect_.w = render_area_width;
stream_render_rect_.h = video_width * 9 / 16; stream_render_rect_.h = render_area_width * video_ratio_reverse;
} else if (video_width * 9 > video_height * 16) { } else if (render_area_width > render_area_height * video_ratio) {
stream_render_rect_.x = abs(video_width - video_height * 16 / 9) / 2; stream_render_rect_.x =
abs(render_area_width - render_area_height * video_ratio) / 2;
stream_render_rect_.y = stream_render_rect_.y =
fullscreen_button_pressed_ ? 0 : title_bar_height_; fullscreen_button_pressed_ ? 0 : title_bar_height_;
stream_render_rect_.w = video_height * 16 / 9; stream_render_rect_.w = render_area_height * video_ratio;
stream_render_rect_.h = video_height; stream_render_rect_.h = render_area_height;
} else { } else {
stream_render_rect_.x = 0; stream_render_rect_.x = 0;
stream_render_rect_.y = stream_render_rect_.y =
fullscreen_button_pressed_ ? 0 : title_bar_height_; fullscreen_button_pressed_ ? 0 : title_bar_height_;
stream_render_rect_.w = video_width; stream_render_rect_.w = render_area_width;
stream_render_rect_.h = video_height; stream_render_rect_.h = render_area_height;
} }
} else if (event.type == SDL_WINDOWEVENT && } else if (event.type == SDL_WINDOWEVENT &&
event.window.event == SDL_WINDOWEVENT_CLOSE) { event.window.event == SDL_WINDOWEVENT_CLOSE) {

View File

@@ -123,6 +123,11 @@ void Render::OnReceiveVideoBufferCb(const XVideoFrame *video_frame,
if (!render->dst_buffer_) { if (!render->dst_buffer_) {
render->dst_buffer_capacity_ = video_frame->size; render->dst_buffer_capacity_ = video_frame->size;
render->dst_buffer_ = new unsigned char[video_frame->size]; render->dst_buffer_ = new unsigned char[video_frame->size];
// Adapt stream_render_rect_ to the video resolution
SDL_Event event;
event.type = SDL_WINDOWEVENT;
event.window.event = SDL_WINDOWEVENT_SIZE_CHANGED;
SDL_PushEvent(&event);
} }
if (render->dst_buffer_capacity_ < video_frame->size) { if (render->dst_buffer_capacity_ < video_frame->size) {