1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
BOOST_AUTO_TEST_CASE (aligned_image_test)
{
SimpleImage* s = new SimpleImage (PIX_FMT_RGB24, libdcp::Size (50, 50), true);
BOOST_CHECK_EQUAL (s->components(), 1);
/* 160 is 150 aligned to the nearest 32 bytes */
BOOST_CHECK_EQUAL (s->stride()[0], 160);
BOOST_CHECK_EQUAL (s->line_size()[0], 150);
BOOST_CHECK (s->data()[0]);
BOOST_CHECK (!s->data()[1]);
BOOST_CHECK (!s->data()[2]);
BOOST_CHECK (!s->data()[3]);
/* copy constructor */
SimpleImage* t = new SimpleImage (*s);
BOOST_CHECK_EQUAL (t->components(), 1);
BOOST_CHECK_EQUAL (t->stride()[0], 160);
BOOST_CHECK_EQUAL (t->line_size()[0], 150);
BOOST_CHECK (t->data()[0]);
BOOST_CHECK (!t->data()[1]);
BOOST_CHECK (!t->data()[2]);
BOOST_CHECK (!t->data()[3]);
BOOST_CHECK (t->data() != s->data());
BOOST_CHECK (t->data()[0] != s->data()[0]);
BOOST_CHECK (t->line_size() != s->line_size());
BOOST_CHECK (t->line_size()[0] == s->line_size()[0]);
BOOST_CHECK (t->stride() != s->stride());
BOOST_CHECK (t->stride()[0] == s->stride()[0]);
/* assignment operator */
SimpleImage* u = new SimpleImage (PIX_FMT_YUV422P, libdcp::Size (150, 150), false);
*u = *s;
BOOST_CHECK_EQUAL (u->components(), 1);
BOOST_CHECK_EQUAL (u->stride()[0], 160);
BOOST_CHECK_EQUAL (u->line_size()[0], 150);
BOOST_CHECK (u->data()[0]);
BOOST_CHECK (!u->data()[1]);
BOOST_CHECK (!u->data()[2]);
BOOST_CHECK (!u->data()[3]);
BOOST_CHECK (u->data() != s->data());
BOOST_CHECK (u->data()[0] != s->data()[0]);
BOOST_CHECK (u->line_size() != s->line_size());
BOOST_CHECK (u->line_size()[0] == s->line_size()[0]);
BOOST_CHECK (u->stride() != s->stride());
BOOST_CHECK (u->stride()[0] == s->stride()[0]);
delete s;
delete t;
delete u;
}
BOOST_AUTO_TEST_CASE (compact_image_test)
{
SimpleImage* s = new SimpleImage (PIX_FMT_RGB24, libdcp::Size (50, 50), false);
BOOST_CHECK_EQUAL (s->components(), 1);
BOOST_CHECK_EQUAL (s->stride()[0], 50 * 3);
BOOST_CHECK_EQUAL (s->line_size()[0], 50 * 3);
BOOST_CHECK (s->data()[0]);
BOOST_CHECK (!s->data()[1]);
BOOST_CHECK (!s->data()[2]);
BOOST_CHECK (!s->data()[3]);
/* copy constructor */
SimpleImage* t = new SimpleImage (*s);
BOOST_CHECK_EQUAL (t->components(), 1);
BOOST_CHECK_EQUAL (t->stride()[0], 50 * 3);
BOOST_CHECK_EQUAL (t->line_size()[0], 50 * 3);
BOOST_CHECK (t->data()[0]);
BOOST_CHECK (!t->data()[1]);
BOOST_CHECK (!t->data()[2]);
BOOST_CHECK (!t->data()[3]);
BOOST_CHECK (t->data() != s->data());
BOOST_CHECK (t->data()[0] != s->data()[0]);
BOOST_CHECK (t->line_size() != s->line_size());
BOOST_CHECK (t->line_size()[0] == s->line_size()[0]);
BOOST_CHECK (t->stride() != s->stride());
BOOST_CHECK (t->stride()[0] == s->stride()[0]);
/* assignment operator */
SimpleImage* u = new SimpleImage (PIX_FMT_YUV422P, libdcp::Size (150, 150), true);
*u = *s;
BOOST_CHECK_EQUAL (u->components(), 1);
BOOST_CHECK_EQUAL (u->stride()[0], 50 * 3);
BOOST_CHECK_EQUAL (u->line_size()[0], 50 * 3);
BOOST_CHECK (u->data()[0]);
BOOST_CHECK (!u->data()[1]);
BOOST_CHECK (!u->data()[2]);
BOOST_CHECK (!u->data()[3]);
BOOST_CHECK (u->data() != s->data());
BOOST_CHECK (u->data()[0] != s->data()[0]);
BOOST_CHECK (u->line_size() != s->line_size());
BOOST_CHECK (u->line_size()[0] == s->line_size()[0]);
BOOST_CHECK (u->stride() != s->stride());
BOOST_CHECK (u->stride()[0] == s->stride()[0]);
delete s;
delete t;
delete u;
}
BOOST_AUTO_TEST_CASE (crop_image_test)
{
/* This was to check out a bug with valgrind, and is probably not very useful */
shared_ptr<SimpleImage> image (new SimpleImage (PIX_FMT_YUV420P, libdcp::Size (16, 16), true));
image->make_black ();
Crop crop;
crop.top = 3;
image->crop (crop, false);
}
/* Test cropping of a YUV 4:2:0 image by 1 pixel, which used to fail because
the U/V copying was not rounded up to the next sample.
*/
BOOST_AUTO_TEST_CASE (crop_image_test2)
{
/* Here's a 1998 x 1080 image which is black */
shared_ptr<Image> image (new SimpleImage (PIX_FMT_YUV420P, libdcp::Size (1998, 1080), true));
image->make_black ();
/* Crop it by 1 pixel */
Crop crop;
crop.left = 1;
image = image->crop (crop, true);
/* Convert it back to RGB to make comparison to black easier */
image = image->scale_and_convert_to_rgb (image->size(), Scaler::from_id ("bicubic"), true);
/* Check that its still black after the crop */
uint8_t* p = image->data()[0];
for (int y = 0; y < image->size().height; ++y) {
uint8_t* q = p;
for (int x = 0; x < image->size().width; ++x) {
BOOST_CHECK_EQUAL (*q++, 0);
BOOST_CHECK_EQUAL (*q++, 0);
BOOST_CHECK_EQUAL (*q++, 0);
}
p += image->stride()[0];
}
}
|