diff options
author | Torsten Jager <t.jager@gmx.de> | 2013-09-19 13:59:05 +0200 |
---|---|---|
committer | Torsten Jager <t.jager@gmx.de> | 2013-09-19 13:59:05 +0200 |
commit | 31e23d119f16eec1ed718750c0c871bbfef2d0af (patch) | |
tree | be2974dbe11f89528f21af984260b587219c5e78 | |
parent | 660d5c95c3e99c223db08f2b5c5e45a3ccae9c7f (diff) | |
download | xine-lib-31e23d119f16eec1ed718750c0c871bbfef2d0af.tar.gz xine-lib-31e23d119f16eec1ed718750c0c871bbfef2d0af.tar.bz2 |
Fix snapshot size.
Follow ratio while staying near the user setting.
-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) { |