From 3eff145bf3f1eeb158a87125352b341d0f6c4fe5 Mon Sep 17 00:00:00 2001 From: Robin Eklind Date: Wed, 9 Nov 2022 00:02:24 +0100 Subject: [PATCH] ffv1: remove pred{16,32}.go and use type parameterized deriveBorders Also, remove the now unused genhbd Perl script. --- ffv1/genhbd | 39 --------------------------------- ffv1/pred.go | 8 ++----- ffv1/pred16.go | 59 -------------------------------------------------- ffv1/pred32.go | 59 -------------------------------------------------- ffv1/slice.go | 4 ++-- go.mod | 2 +- 6 files changed, 5 insertions(+), 166 deletions(-) delete mode 100755 ffv1/genhbd delete mode 100644 ffv1/pred16.go delete mode 100644 ffv1/pred32.go diff --git a/ffv1/genhbd b/ffv1/genhbd deleted file mode 100755 index 53e9913..0000000 --- a/ffv1/genhbd +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env perl - -# Simple code gen tool to make a 16 and 32 bit person of deriveBorders. -# In theory, I could have just used an interface, but that's just -# ugly in a different way. - -use strict; -use warnings; - -my $bitdepth = shift; - -open(my $if, "<", "pred.go") || die("cannot open pred.go for reading"); -open(my $of, ">", "pred$bitdepth.go") || die("cannot open pred$bitdepth.go for writing"); - -print $of "package ffv1\n\n"; -print $of "// This file is automatically generated from pred.go using go generate\n"; -print $of "// Please DO NOT manually modify this file\n\n"; - -my $started = 0; -while (<$if>) { - if (/deriveBorders/) { - s/deriveBorders/deriveBorders$bitdepth/; - s/uint8/uint$bitdepth/; - print $of $_; - $started = 1; - next; - } - if ($started == 0) { - next; - } - if (/^}/) { - print $of $_; - last; - } - print $of $_; -} - -close($if); -close($of); diff --git a/ffv1/pred.go b/ffv1/pred.go index 6eb7a7f..7d9a75f 100644 --- a/ffv1/pred.go +++ b/ffv1/pred.go @@ -1,10 +1,6 @@ package ffv1 -// This file is used as a template for pred16.go (high bit depth median prediction) -// Please run 'go generate' if you modify the following function. -// -//go:generate ./genhbd 16 -//go:generate ./genhbd 32 +// This file implements 8, 16 and 32 bit depth median prediction. // Calculates all the neighbouring pixel values given: // @@ -36,7 +32,7 @@ package ffv1 // // See: * 3.1. Border // * 3.2. Samples -func deriveBorders(plane []uint8, x int, y int, width int, height int, stride int) (int, int, int, int, int, int) { +func deriveBorders[U interface{ uint8 | uint16 | uint32 }](plane []U, x int, y int, width int, height int, stride int) (int, int, int, int, int, int) { var T int var L int var t int diff --git a/ffv1/pred16.go b/ffv1/pred16.go deleted file mode 100644 index abb105e..0000000 --- a/ffv1/pred16.go +++ /dev/null @@ -1,59 +0,0 @@ -package ffv1 - -// This file is automatically generated from pred.go using go generate -// Please DO NOT manually modify this file - -func deriveBorders16(plane []uint16, x int, y int, width int, height int, stride int) (int, int, int, int, int, int) { - var T int - var L int - var t int - var l int - var tr int - var tl int - - pos := y*stride + x - - // This is really slow and stupid but matches the spec exactly. Each of the - // neighbouring values has been left entirely separate, and none skipped, - // even if they could be. - // - // Please never implement an actual decoder this way. - - // T - if y > 1 { - T = int(plane[pos-(2*stride)]) - } - - // L - if y > 0 && x == 1 { - L = int(plane[pos-stride-1]) - } else if x > 1 { - L = int(plane[pos-2]) - } - - // t - if y > 0 { - t = int(plane[pos-stride]) - } - - // l - if x > 0 { - l = int(plane[pos-1]) - } else if y > 0 { - l = int(plane[pos-stride]) - } - - // tl - if y > 1 && x == 0 { - tl = int(plane[pos-(2*stride)]) - } else if y > 0 && x > 0 { - tl = int(plane[pos-stride-1]) - } - - // tr - if y > 0 { - tr = int(plane[pos-stride+min(1, width-1-x)]) - } - - return T, L, t, l, tr, tl -} diff --git a/ffv1/pred32.go b/ffv1/pred32.go deleted file mode 100644 index 6290f16..0000000 --- a/ffv1/pred32.go +++ /dev/null @@ -1,59 +0,0 @@ -package ffv1 - -// This file is automatically generated from pred.go using go generate -// Please DO NOT manually modify this file - -func deriveBorders32(plane []uint32, x int, y int, width int, height int, stride int) (int, int, int, int, int, int) { - var T int - var L int - var t int - var l int - var tr int - var tl int - - pos := y*stride + x - - // This is really slow and stupid but matches the spec exactly. Each of the - // neighbouring values has been left entirely separate, and none skipped, - // even if they could be. - // - // Please never implement an actual decoder this way. - - // T - if y > 1 { - T = int(plane[pos-(2*stride)]) - } - - // L - if y > 0 && x == 1 { - L = int(plane[pos-stride-1]) - } else if x > 1 { - L = int(plane[pos-2]) - } - - // t - if y > 0 { - t = int(plane[pos-stride]) - } - - // l - if x > 0 { - l = int(plane[pos-1]) - } else if y > 0 { - l = int(plane[pos-stride]) - } - - // tl - if y > 1 && x == 0 { - tl = int(plane[pos-(2*stride)]) - } else if y > 0 && x > 0 { - tl = int(plane[pos-stride-1]) - } - - // tr - if y > 0 { - tr = int(plane[pos-stride+min(1, width-1-x)]) - } - - return T, L, t, l, tr, tl -} diff --git a/ffv1/slice.go b/ffv1/slice.go index 15f06d0..777da80 100644 --- a/ffv1/slice.go +++ b/ffv1/slice.go @@ -214,9 +214,9 @@ func (d *Decoder) decodeLine(c *rangecoder.Coder, gc *golomb.Coder, s *slice, fr if d.record.bits_per_raw_sample == 8 && d.record.colorspace_type != 1 { T, L, t, l, tr, tl = deriveBorders(buf, x, y, w, h, stride) } else if d.record.bits_per_raw_sample == 16 && d.record.colorspace_type == 1 { - T, L, t, l, tr, tl = deriveBorders32(buf32, x, y, w, h, stride) + T, L, t, l, tr, tl = deriveBorders(buf32, x, y, w, h, stride) } else { - T, L, t, l, tr, tl = deriveBorders16(buf16, x, y, w, h, stride) + T, L, t, l, tr, tl = deriveBorders(buf16, x, y, w, h, stride) } // See pred.go for details. diff --git a/go.mod b/go.mod index ab32dc6..e830370 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/dwbuiten/go-ffv1 -go 1.12 +go 1.18