From a76ed4828f193505fdf8318cd4bb83a60cd7ea77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=BCns?= Date: Thu, 25 May 2017 02:28:36 +0200 Subject: [PATCH] Make sure last received frame is passed on after some delay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The needle matching might work on outdated frames if the last changes where below the threshold. Implement a leaky bucket scheme for the threshold so all frames but exact repetitions are candidates for updates. For the video, the error might even have had accumulated, e.g. by a series of frames with a similarity more than 50. Fix for poo#19302 Signed-off-by: Stefan BrĂ¼ns --- backend/baseclass.pm | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/baseclass.pm b/backend/baseclass.pm index 507b8cff528..542d7d5b4d7 100644 --- a/backend/baseclass.pm +++ b/backend/baseclass.pm @@ -52,11 +52,13 @@ __PACKAGE__->mk_accessors( sub new { my $class = shift; my $self = bless({class => $class}, $class); - $self->{started} = 0; - $self->{serialfile} = "serial0"; - $self->{serial_offset} = 0; - $self->{video_frame_data} = []; - $self->{video_frame_number} = 0; + $self->{started} = 0; + $self->{serialfile} = "serial0"; + $self->{serial_offset} = 0; + $self->{video_frame_data} = []; + $self->{video_frame_number} = 0; + $self->{min_image_similarity} = 10000; + $self->{min_video_similarity} = 10000; return $self; } @@ -367,15 +369,21 @@ sub enqueue_screenshot { $sim = $lastscreenshot->similarity($image) if $lastscreenshot; $watch->lap("similarity"); + $self->{min_image_similarity} -= 1; + $self->{min_image_similarity} = $sim if $sim < $self->{min_image_similarity}; + $self->{min_video_similarity} -= 1; + $self->{min_video_similarity} = $sim if $sim < $self->{min_video_similarity}; + # we have two different similarity levels - one (slightly higher value, based # t/data/user-settings-*) to determine if it's worth it to recheck needles # and one (slightly lower as less significant) determining if we write the frame # into the video - if ($sim <= 54) { + if ($self->{min_image_similarity} <= 54) { $self->last_image($image); + $self->{min_image_similarity} = 10000; } - if ($sim > 50) { # we ignore smaller differences + if ($self->{min_video_similarity} > 50) { # we ignore smaller differences push(@{$self->{video_frame_data}}, "R\n"); } else { @@ -383,6 +391,7 @@ sub enqueue_screenshot { $watch->lap("convert ppm data"); push(@{$self->{video_frame_data}}, 'E ' . length($imgdata) . "\n"); push(@{$self->{video_frame_data}}, $imgdata); + $self->{min_video_similarity} = 10000; } $self->{select}->add($self->{encoder_pipe}); $self->{video_frame_number} += 1;