RP219 CPU pattern
This commit is contained in:
@@ -116,10 +116,81 @@ func TestCPUMovingPatternUsesOwnBaseColor(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestCPUSMPTEIsNotFakedByAnotherPattern(t *testing.T) {
|
||||
_, err := NewCPUPatternGenerator(1920, 1080, "smpte")
|
||||
if err == nil || !strings.Contains(err.Error(), "not implemented") {
|
||||
t.Fatalf("error = %v, want not implemented error", err)
|
||||
func TestCPURP219Pattern(t *testing.T) {
|
||||
const width, height = 1920, 1080
|
||||
g, err := NewCPUPatternGenerator(width, height, "smpte")
|
||||
if err != nil {
|
||||
t.Fatalf("NewCPUPatternGenerator: %v", err)
|
||||
}
|
||||
frame := make([]byte, width*height*8/3)
|
||||
if err := g.GenerateFrame(frame, 0); err != nil {
|
||||
t.Fatalf("GenerateFrame: %v", err)
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
x, y int
|
||||
wantY, wantCb, wantCr uint32
|
||||
}{
|
||||
{"top left gray flank", 100, 100, 414, 512, 512},
|
||||
{"top white bar", 300, 100, 721, 512, 512},
|
||||
{"top green bar", 960, 100, 534, 253, 207},
|
||||
{"top right gray flank", 1800, 100, 414, 512, 512},
|
||||
{"section 2 cyan flank", 100, 650, 754, 615, 64},
|
||||
{"section 2 minus I", 300, 650, 244, 612, 395},
|
||||
{"section 2 white", 600, 650, 721, 512, 512},
|
||||
{"section 2 blue flank", 1800, 650, 127, 960, 471},
|
||||
{"section 3 yellow flank", 100, 750, 877, 64, 553},
|
||||
{"section 3 plus Q", 300, 750, 141, 697, 606},
|
||||
{"section 3 red flank", 1800, 750, 250, 409, 960},
|
||||
{"bottom gray flank", 100, 900, 195, 512, 512},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
y, cb, cr := sampleV210(frame, width, tc.x, tc.y)
|
||||
if y != tc.wantY || cb != tc.wantCb || cr != tc.wantCr {
|
||||
t.Fatalf("pixel (%d,%d): got %d/%d/%d, want %d/%d/%d",
|
||||
tc.x, tc.y, y, cb, cr, tc.wantY, tc.wantCb, tc.wantCr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCPURP219MovingSquare(t *testing.T) {
|
||||
const width, height = 1920, 1080
|
||||
g, err := NewCPUPatternGenerator(width, height, "smpte-move")
|
||||
if err != nil {
|
||||
t.Fatalf("NewCPUPatternGenerator: %v", err)
|
||||
}
|
||||
frame := make([]byte, width*height*8/3)
|
||||
if err := g.GenerateFrame(frame, 0); err != nil {
|
||||
t.Fatalf("GenerateFrame(0): %v", err)
|
||||
}
|
||||
if y, cb, cr := sampleV210(frame, width, 960, 540); y != 470 || cb != 771 || cr != 817 {
|
||||
t.Fatalf("tick 0 center = %d/%d/%d, want inverted green 470/771/817", y, cb, cr)
|
||||
}
|
||||
if err := g.GenerateFrame(frame, 79); err != nil {
|
||||
t.Fatalf("GenerateFrame(79): %v", err)
|
||||
}
|
||||
if y, cb, cr := sampleV210(frame, width, 1840, 540); y != 590 || cb != 512 || cr != 512 {
|
||||
t.Fatalf("tick 79 shifted square = %d/%d/%d, want inverted gray 590/512/512", y, cb, cr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCPURP219RejectsInvalidGeometry(t *testing.T) {
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
width, height uint
|
||||
}{
|
||||
{name: "height too small", width: 1920, height: 11},
|
||||
{name: "canvas too narrow", width: 600, height: 1080},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
_, err := NewCPUPatternGenerator(tc.width, tc.height, "smpte")
|
||||
if err == nil || !strings.Contains(err.Error(), "RP 219") {
|
||||
t.Fatalf("error = %v, want RP 219 geometry error", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user