diff --git a/src/video/movie.cpp b/src/video/movie.cpp
index 047169de5..bf89def97 100644
--- a/src/video/movie.cpp
+++ b/src/video/movie.cpp
@@ -448,15 +448,31 @@ static void RenderToSurface(SDL_Surface *surface, SDL_Texture *yuv_overlay, SDL_
 	theora_decode_YUVout(&data->tstate, yuv);
 	SDL_UpdateYUVTexture(yuv_overlay, NULL, yuv->y, yuv->y_stride, yuv->u, yuv->uv_stride, yuv->v, yuv->uv_stride);
 	SDL_RenderClear(TheRenderer);
-	int w, h;
-	SDL_RenderGetLogicalSize(TheRenderer, &w, &h);
-	SDL_RenderSetLogicalSize(TheRenderer, 0, 0);
-	SDL_RenderCopy(TheRenderer, yuv_overlay, NULL, rect);
-	if (SDL_RenderReadPixels(TheRenderer, rect, surface->format->format, surface->pixels, surface->pitch)) {
+
+	// since SDL will render us at logical size, and SDL_RenderReadPixels will read the at
+	// output size, we need to adapt the rectangles to read and write from dynamically
+	int rw, rh, ww, wh;
+	SDL_GetWindowSize(TheWindow, &ww, &wh);
+	SDL_RenderGetLogicalSize(TheRenderer, &rw, &rh);
+	SDL_Rect render_rect;
+	render_rect.x = 0;
+	render_rect.y = 0;
+	double scaleX = (double)ww / rw;
+	double scaleY = (double)wh / rh;
+	double scale = std::min(scaleX, scaleY);
+	render_rect.w = rect->w / scale;
+	render_rect.h = rect->h / scale;
+
+	SDL_Rect read_rect;
+	read_rect.w = rect->w;
+	read_rect.h = rect->h;
+	read_rect.x = (ww - (rw * scale)) / 2;
+	read_rect.y = (wh - (rh * scale)) / 2;
+	SDL_RenderCopy(TheRenderer, yuv_overlay, NULL, &render_rect);
+	if (SDL_RenderReadPixels(TheRenderer, &read_rect, surface->format->format, surface->pixels, surface->pitch)) {
 		fprintf(stderr, "Reading from renderer not supported\n");
 		SDL_FillRect(surface, NULL, 0); // completely transparent
 	}
-	SDL_RenderSetLogicalSize(TheRenderer, w, h);
 	free(yuv);
 }