diff options
-rw-r--r-- | src/xine-engine/video_out.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c index d2b1ff8cd..8f6791fa8 100644 --- a/src/xine-engine/video_out.c +++ b/src/xine-engine/video_out.c @@ -516,11 +516,28 @@ static int vo_grab_grab_video_frame (xine_grab_video_frame_t *frame_gen) { } } + /* get pixel aspect ratio */ + double sar = 1.0; + { + int sarw = vo_frame->width - vo_frame->crop_left - vo_frame->crop_right; + int sarh = vo_frame->height - vo_frame->crop_top - vo_frame->crop_bottom; + if ((vo_frame->ratio > 0.0) && (sarw > 0) && (sarh > 0)) + sar = vo_frame->ratio * sarh / sarw; + } + /* if caller does not specify frame size we return the actual size of grabbed frame */ - if (frame->grab_frame.width <= 0) - frame->grab_frame.width = width; - if (frame->grab_frame.height <= 0) - frame->grab_frame.height = height; + if ((frame->grab_frame.width <= 0) && (frame->grab_frame.height <= 0)) { + if (sar > 1.0) { + frame->grab_frame.width = sar * width + 0.5; + frame->grab_frame.height = height; + } else { + frame->grab_frame.width = width; + frame->grab_frame.height = (double)height / sar + 0.5; + } + } else if (frame->grab_frame.width <= 0) + frame->grab_frame.width = frame->grab_frame.height * width * sar / height + 0.5; + else if (frame->grab_frame.height <= 0) + frame->grab_frame.height = (frame->grab_frame.width * height) / (sar * width) + 0.5; /* allocate grab frame image buffer */ if (frame->grab_frame.width != frame->grab_width || frame->grab_frame.height != frame->grab_height) { |