2 * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 #ifndef I965_JPEG_TEST_DATA_H
26 #define I965_JPEG_TEST_DATA_H
36 typedef std::vector<uint8_t> ByteData;
38 static const VAProfile profile = VAProfileJPEGBaseline;
40 static inline const ByteData generateSolid(
41 const std::array<uint8_t, 3>& yuv, const std::array<size_t, 2>& dim)
43 size_t count(dim[0] * dim[1]);
44 ByteData data(count, yuv[0]);
45 data.insert(data.end(), count, yuv[1]);
46 data.insert(data.end(), count, yuv[2]);
53 typedef VAIQMatrixBufferJPEGBaseline IQMatrix;
54 typedef VAHuffmanTableBufferJPEGBaseline HuffmanTable;
55 typedef VAPictureParameterBufferJPEGBaseline PictureParameter;
56 typedef VASliceParameterBufferJPEGBaseline SliceParameter;
58 static const VAEntrypoint entrypoint = VAEntrypointVLD;
60 static const HuffmanTable defaultHuffmanTable = {
61 load_huffman_table: { 0x01, 0x01 },
65 0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,
69 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b
72 0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,
76 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,
77 0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
78 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,
79 0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
80 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,
81 0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
82 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,
83 0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
84 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,
85 0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
86 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,
87 0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
88 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,
89 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa
95 0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
99 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b
102 0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,
106 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,
107 0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
108 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,
109 0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
110 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,
111 0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
112 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,
113 0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
114 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,
115 0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
116 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
117 0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
118 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,
119 0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,
126 static const IQMatrix defaultIQMatrix = { /* Quality 100 */
127 load_quantiser_table: { 0x1,0x1,0x0,0x0 },
130 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
131 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
132 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
133 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
134 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
138 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
139 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
140 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
141 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
142 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
148 static const PictureParameter defaultPictureParameter = {
151 /* component_id, h_sampling_factor, v_sampling_factor, quantiser_table_selector */
152 components: {{1,1,1,0}, {2,1,1,1}, {3,1,1,1}},
156 static const SliceParameter defaultSliceParameter = {
158 slice_data_offset: 0,
159 slice_data_flag: VA_SLICE_DATA_FLAG_ALL,
160 slice_horizontal_position: 0,
161 slice_vertical_position: 0,
163 /* component_selector, dc_table_selector, ac_table_selector */
164 components: {{1,0,0},{2,1,1},{3,1,1}},
174 typedef std::shared_ptr<PictureData> Shared;
175 typedef std::shared_ptr<const PictureData> SharedConst;
177 template<const unsigned W, const unsigned H>
178 static SharedConst make(
179 const unsigned fourcc,
180 const ByteData& slice,
181 const SliceParameter& sparam = defaultSliceParameter,
182 const PictureParameter& pparam = defaultPictureParameter,
183 const HuffmanTable& huffman = defaultHuffmanTable,
184 const IQMatrix& iqmatrix = defaultIQMatrix)
186 return make(fourcc, slice, W, H, sparam, pparam, huffman, iqmatrix);
189 static SharedConst make(
190 const unsigned fourcc,
191 const ByteData& slice,
192 const unsigned w, const unsigned h,
193 const SliceParameter& sparam = defaultSliceParameter,
194 const PictureParameter& pparam = defaultPictureParameter,
195 const HuffmanTable& huffman = defaultHuffmanTable,
196 const IQMatrix& iqmatrix = defaultIQMatrix)
210 pd->sparam.slice_data_size = slice.size();
211 pd->pparam.picture_width = w;
212 pd->pparam.picture_height = h;
217 pd->format = VA_RT_FORMAT_YUV420;
218 pd->pparam.components[0].h_sampling_factor = 2;
219 pd->pparam.components[0].v_sampling_factor = 2;
222 pd->format = VA_RT_FORMAT_YUV422;
223 pd->pparam.components[0].h_sampling_factor = 2;
224 pd->pparam.components[0].v_sampling_factor = 1;
227 pd->format = VA_RT_FORMAT_YUV422;
228 pd->pparam.components[0].h_sampling_factor = 1;
229 pd->pparam.components[0].v_sampling_factor = 2;
232 pd->format = VA_RT_FORMAT_YUV411;
233 pd->pparam.components[0].h_sampling_factor = 4;
234 pd->pparam.components[0].v_sampling_factor = 1;
237 pd->format = VA_RT_FORMAT_YUV444;
238 pd->pparam.components[0].h_sampling_factor = 1;
239 pd->pparam.components[0].v_sampling_factor = 1;
242 pd->format = VA_RT_FORMAT_YUV400;
243 pd->pparam.components[0].h_sampling_factor = 1;
244 pd->pparam.components[0].h_sampling_factor = 1;
245 pd->pparam.num_components = 1;
246 pd->sparam.num_components = 1;
252 /* Calculate num_mcus */
253 int hfactor = pd->pparam.components[0].h_sampling_factor << 3;
254 int vfactor = pd->pparam.components[0].v_sampling_factor << 3;
255 int wmcu = (w + hfactor - 1) / hfactor;
256 int hmcu = (h + vfactor - 1) / vfactor;
257 pd->sparam.num_mcus = wmcu * hmcu;
262 const ByteData slice;
263 SliceParameter sparam;
264 PictureParameter pparam;
265 HuffmanTable huffman;
274 typedef std::shared_ptr<TestPattern> Shared;
275 typedef std::shared_ptr<const TestPattern> SharedConst;
277 virtual const ByteData& decoded() const = 0;
278 virtual PictureData::SharedConst encoded(unsigned) const = 0;
280 virtual void repr(std::ostream&) const = 0;
282 friend std::ostream& operator <<(std::ostream& os, const TestPattern& t)
289 template <const unsigned N>
290 class TestPatternData
294 typedef std::map<const unsigned, PictureData::SharedConst> EncodedMap;
295 typedef std::map<const unsigned, const ByteData> ByteDataMap;
298 const ByteData& decoded() const { return getDecoded(); }
300 PictureData::SharedConst encoded(const unsigned fourcc) const
302 const EncodedMap& em = getEncodedMap();
303 const EncodedMap::const_iterator match(em.find(fourcc));
304 if (match == em.end())
305 return PictureData::SharedConst();
306 return match->second;
309 void repr(std::ostream& os) const { os << N; }
311 template <const unsigned W, const unsigned H>
312 static bool initialize(ByteData d, const ByteDataMap& e)
314 getDecoded().swap(d);
316 EncodedMap& em = getEncodedMap();
318 for (auto const &b : e) {
319 auto pd(PictureData::make<W, H>(b.first, b.second));
320 auto pair = std::make_pair(b.first, pd);
321 result &= em.insert(pair).second;
327 static ByteData& getDecoded()
333 static EncodedMap& getEncodedMap()
335 static EncodedMap em;
339 static const bool m_valid;
341 } // namespace Decode
346 typedef VAQMatrixBufferJPEG IQMatrix;
347 typedef VAHuffmanTableBufferJPEGBaseline HuffmanTable;
348 typedef VAEncPictureParameterBufferJPEG PictureParameter;
349 typedef VAEncSliceParameterBufferJPEG SliceParameter;
351 static const VAEntrypoint entrypoint = VAEntrypointEncPicture;
353 static const IQMatrix defaultIQMatrix = { /* Quality 50 */
354 load_lum_quantiser_matrix: 1,
355 load_chroma_quantiser_matrix: 1,
356 lum_quantiser_matrix: {
357 0x10,0x0b,0x0c,0x0e,0x0c,0x0a,0x10,0x0e,
358 0x0d,0x0e,0x12,0x11,0x10,0x13,0x18,0x28,
359 0x1a,0x18,0x16,0x16,0x18,0x31,0x23,0x25,
360 0x1d,0x28,0x3a,0x33,0x3d,0x3c,0x39,0x33,
361 0x38,0x37,0x40,0x48,0x5c,0x4e,0x40,0x44,
362 0x57,0x45,0x37,0x38,0x50,0x6d,0x51,0x57,
363 0x5f,0x62,0x67,0x68,0x67,0x3e,0x4d,0x71,
364 0x79,0x70,0x64,0x78,0x5c,0x65,0x67,0x63,
366 chroma_quantiser_matrix: {
367 0x11,0x12,0x12,0x18,0x15,0x18,0x2f,0x1a,
368 0x1a,0x2f,0x63,0x42,0x38,0x42,0x63,0x63,
369 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
370 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
371 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
372 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
373 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
374 0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
378 static const HuffmanTable defaultHuffmanTable =
379 ::JPEG::Decode::defaultHuffmanTable;
381 static const PictureParameter defaultPictureParameter = {
382 reconstructed_picture: VA_INVALID_ID,
385 coded_buf: VA_INVALID_ID,
386 pic_flags: {value: 0x00100},
390 component_id: {0, 1, 2, 0},
391 quantiser_table_selector: {0, 1, 1, 0},
395 static const SliceParameter defaultSliceParameter = {
398 /* component_selector, dc_table_selector, ac_table_selector */
399 components: {{1,0,0},{2,1,1},{3,1,1}},
403 : public std::enable_shared_from_this<TestInput>
406 typedef std::shared_ptr<TestInput> Shared;
407 typedef std::shared_ptr<const TestInput> SharedConst;
409 static Shared create(const unsigned, const unsigned, const unsigned);
411 const unsigned width() const;
412 const unsigned height() const;
413 const uint8_t* plane(const size_t) const;
414 const SharedConst toOutputFourcc() const;
416 friend ::std::ostream& operator<<(::std::ostream&, const TestInput&);
417 friend ::std::ostream& operator<<(::std::ostream&, const Shared&);
418 friend ::std::ostream& operator<<(::std::ostream&, const SharedConst&);
421 PictureParameter picture;
423 HuffmanTable huffman;
424 SliceParameter slice;
426 unsigned fourcc_output;
429 std::array<size_t, 3> widths;
430 std::array<size_t, 3> heights;
431 std::array<size_t, 3> offsets;
432 std::array<size_t, 3> sizes;
437 /** get pointer to beginning of plane @param i **/
438 uint8_t* begin(const size_t i);
439 const uint8_t* begin(const size_t i) const;
441 /** get pointer to end of plane @param i **/
442 uint8_t* end(const size_t i);
443 const uint8_t* end(const size_t i) const;
446 class TestInputCreator
449 typedef std::shared_ptr<TestInputCreator> Shared;
450 typedef std::shared_ptr<const TestInputCreator> SharedConst;
452 TestInput::Shared create(const unsigned) const;
454 friend ::std::ostream& operator<<(
455 ::std::ostream&, const TestInputCreator&);
456 friend ::std::ostream& operator<<(
457 ::std::ostream&, const TestInputCreator::Shared&);
458 friend ::std::ostream& operator<<(
459 ::std::ostream&, const TestInputCreator::SharedConst&);
462 virtual std::array<unsigned, 2> getResolution() const = 0;
463 virtual void repr(::std::ostream& os) const = 0;
466 class RandomSizeCreator
467 : public TestInputCreator
470 std::array<unsigned, 2> getResolution() const;
471 void repr(::std::ostream&) const;
474 class FixedSizeCreator
475 : public TestInputCreator
478 FixedSizeCreator(const std::array<unsigned, 2>&);
481 std::array<unsigned, 2> getResolution() const;
482 void repr(::std::ostream& os) const;
485 const std::array<unsigned, 2> res;
488 typedef std::vector<TestInputCreator::SharedConst> InputCreators;
490 } // namespace Encode