diff --git a/wrappers/openni2/.gitignore b/wrappers/openni2/.gitignore new file mode 100755 index 0000000000..bdf2aebc93 --- /dev/null +++ b/wrappers/openni2/.gitignore @@ -0,0 +1,85 @@ +bin/ +lib/ + +ubuntu-xenial/ +ubuntu-xenial-hwe/ + +# CMake +build/ + +# XCode +.DS_Store +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.xcuserstate +librealsense.xc/build + +*~ +*.a +*.o +*.so +*.pyc +*.class + +local_ignore/ + +#Visual Studio Project +.vs/* + +#Clion Project +.idea/* + +# QTCreator Project +/.qmake.cache +/.qmake.stash +*.user +*.user.* +*.moc +moc_*.cpp +qrc_*.cpp +ui_*.h +Makefile* +*-build-* +librealsense-log.txt + +*.pyproj +*.orig +*.psess +*.vspx +*.vsp +*.bak +*.bin +*.suo +*.tlog +*.obj +*.ilk +*.pdb +*.exp +*.log +*.stamp +*.depend +*.vcxproj +*.exe +*.cache +*.lib +*.filters +*.db +*.opendb +*.rule +*.check_cache +*.dll +*.list +*.json +*.ini +*.cxx + diff --git a/wrappers/openni2/CMakeLists.txt b/wrappers/openni2/CMakeLists.txt new file mode 100755 index 0000000000..713ccbdda8 --- /dev/null +++ b/wrappers/openni2/CMakeLists.txt @@ -0,0 +1,54 @@ +cmake_minimum_required (VERSION 3.8.0) +project (rs2driver) + +# DEPS +set(OPENNI2_DIR "c:/Program Files/OpenNI2" CACHE FILEPATH "OpenNI2 SDK directory") +set(REALSENSE2_DIR "c:/Program Files (x86)/Intel RealSense SDK 2.0" CACHE FILEPATH "RealSense2 SDK directory") + +# INCLUDE DIR +include_directories (${OPENNI2_DIR}/Include) +include_directories (${REALSENSE2_DIR}/include) +include_directories (src) + +# LINK DIR +if (CMAKE_SIZEOF_VOID_P EQUAL 8) + link_directories (${REALSENSE2_DIR}/lib/x64) +elseif (CMAKE_SIZEOF_VOID_P EQUAL 4) + link_directories (${REALSENSE2_DIR}/lib/x86) +endif () + +# OUTPUT DIR +set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/_out) +set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/_out) +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/_out) + +# SOURCE FILES +set (INCLUDE_FILES + src/Rs2Base.h + src/Rs2Stream.h + src/Rs2Device.h + src/Rs2Driver.h + src/Profiler.h + src/Profiler.inl + src/D2S.h + src/S2D.h +) +set (SRC_FILES + src/Rs2Base.cpp + src/Rs2Stream.cpp + src/Rs2StreamProps.cpp + src/Rs2Device.cpp + src/Rs2DeviceProps.cpp + src/Rs2Driver.cpp +) + +# FLAGS +if(MSVC) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oi /Ot /GL /GF /MD /GS- /Gy /fp:fast /arch:AVX2") + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS") +endif() + +# LINK +add_library (rs2driver SHARED ${INCLUDE_FILES} ${SRC_FILES}) +target_link_libraries (rs2driver realsense2) diff --git a/wrappers/openni2/README.md b/wrappers/openni2/README.md new file mode 100755 index 0000000000..2d156e23e2 --- /dev/null +++ b/wrappers/openni2/README.md @@ -0,0 +1,48 @@ +# RealSense2 OpenNI2 driver + +![alt text](doc/img/demo.jpg) +_Picture:_ _An_ _example_ _of_ _OpenNI2_ _work_ _with_ _RealSense_ + +Allows to use RealSense2 hardware with OpenNI2 + +Current features: +* configure stream modes +* access live data (color/depth/IR) +* record and playback files +* depth to color mapping +* user tracking with NiTE2 +* no code changes required + +## Getting started + +Download [OpenNI2 SDK](https://structure.io/openni) + +Download [RealSense2 SDK](https://github.com/IntelRealSense/librealsense/releases) + +Run CMake on driver and configure SDK's: +* OPENNI2_DIR +* REALSENSE2_DIR + +Generate project files and compile driver + +Copy rs2driver.dll and realsense2.dll to OPENNI2_DIR/Samples/Bin/OpenNI2/Drivers/ + +Launch any OpenNI2 example (SimpleRead SimpleViewer NiViewer) located at OPENNI2_DIR/Samples/Bin/ + +## Examples + +![alt text](doc/img/oni_viewer.jpg) +_Picture:_ _Show_ _hotkeys_ + +![alt text](doc/img/oni_video_mode.jpg) +_Picture:_ _Configuring_ _streams_ + +![alt text](doc/img/oni_capture.jpg) +_Picture:_ _Configuring_ _capture_ + +![alt text](doc/img/oni_user.jpg) +_Picture:_ _An_ _example_ _of_ _NiTE2_ _user_ _tracking_ + +## License + +This project is licensed under the [Apache](https://github.com/IntelRealSense/librealsense/blob/master/LICENSE) License, Version 2.0. \ No newline at end of file diff --git a/wrappers/openni2/doc/img/demo.jpg b/wrappers/openni2/doc/img/demo.jpg new file mode 100755 index 0000000000..5704ef61ce Binary files /dev/null and b/wrappers/openni2/doc/img/demo.jpg differ diff --git a/wrappers/openni2/doc/img/oni_capture.jpg b/wrappers/openni2/doc/img/oni_capture.jpg new file mode 100755 index 0000000000..91ea7df127 Binary files /dev/null and b/wrappers/openni2/doc/img/oni_capture.jpg differ diff --git a/wrappers/openni2/doc/img/oni_user.jpg b/wrappers/openni2/doc/img/oni_user.jpg new file mode 100755 index 0000000000..e31c32cbbb Binary files /dev/null and b/wrappers/openni2/doc/img/oni_user.jpg differ diff --git a/wrappers/openni2/doc/img/oni_video_mode.jpg b/wrappers/openni2/doc/img/oni_video_mode.jpg new file mode 100755 index 0000000000..57e76cc055 Binary files /dev/null and b/wrappers/openni2/doc/img/oni_video_mode.jpg differ diff --git a/wrappers/openni2/doc/img/oni_viewer.jpg b/wrappers/openni2/doc/img/oni_viewer.jpg new file mode 100755 index 0000000000..ee1f605e9d Binary files /dev/null and b/wrappers/openni2/doc/img/oni_viewer.jpg differ diff --git a/wrappers/openni2/src/D2S.h b/wrappers/openni2/src/D2S.h new file mode 100755 index 0000000000..636d7bfa48 --- /dev/null +++ b/wrappers/openni2/src/D2S.h @@ -0,0 +1,1003 @@ +const unsigned short D2S[] = { +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 3, 7, 10, 13, 17, +20, 23, 27, 30, 33, 36, 40, 43, 46, 49, +52, 55, 59, 62, 65, 68, 71, 74, 77, 80, +83, 86, 88, 91, 94, 97, 100, 103, 106, 108, +111, 114, 117, 119, 122, 125, 128, 130, 133, 136, +138, 141, 143, 146, 149, 151, 154, 156, 159, 161, +164, 166, 169, 171, 174, 176, 178, 181, 183, 186, +188, 190, 193, 195, 197, 200, 202, 204, 206, 209, +211, 213, 215, 218, 220, 222, 224, 226, 229, 231, +233, 235, 237, 239, 241, 243, 245, 247, 249, 252, +254, 256, 258, 260, 262, 264, 266, 267, 269, 271, +273, 275, 277, 279, 281, 283, 285, 287, 288, 290, +292, 294, 296, 298, 299, 301, 303, 305, 307, 308, +310, 312, 314, 315, 317, 319, 321, 322, 324, 326, +327, 329, 331, 332, 334, 336, 337, 339, 341, 342, +344, 345, 347, 349, 350, 352, 353, 355, 357, 358, +360, 361, 363, 364, 366, 367, 369, 370, 372, 373, +375, 376, 378, 379, 381, 382, 383, 385, 386, 388, +389, 391, 392, 393, 395, 396, 398, 399, 400, 402, +403, 404, 406, 407, 409, 410, 411, 413, 414, 415, +416, 418, 419, 420, 422, 423, 424, 426, 427, 428, +429, 431, 432, 433, 434, 436, 437, 438, 439, 441, +442, 443, 444, 445, 447, 448, 449, 450, 451, 452, +454, 455, 456, 457, 458, 459, 461, 462, 463, 464, +465, 466, 467, 468, 470, 471, 472, 473, 474, 475, +476, 477, 478, 479, 480, 482, 483, 484, 485, 486, +487, 488, 489, 490, 491, 492, 493, 494, 495, 496, +497, 498, 499, 500, 501, 502, 503, 504, 505, 506, +507, 508, 509, 510, 511, 512, 513, 514, 515, 516, +517, 518, 519, 520, 521, 521, 522, 523, 524, 525, +526, 527, 528, 529, 530, 531, 532, 532, 533, 534, +535, 536, 537, 538, 539, 540, 540, 541, 542, 543, +544, 545, 546, 546, 547, 548, 549, 550, 551, 551, +552, 553, 554, 555, 556, 556, 557, 558, 559, 560, +561, 561, 562, 563, 564, 565, 565, 566, 567, 568, +568, 569, 570, 571, 572, 572, 573, 574, 575, 575, +576, 577, 578, 578, 579, 580, 581, 581, 582, 583, +584, 584, 585, 586, 587, 587, 588, 589, 590, 590, +591, 592, 592, 593, 594, 594, 595, 596, 597, 597, +598, 599, 599, 600, 601, 601, 602, 603, 604, 604, +605, 606, 606, 607, 608, 608, 609, 610, 610, 611, +612, 612, 613, 614, 614, 615, 615, 616, 617, 617, +618, 619, 619, 620, 621, 621, 622, 622, 623, 624, +624, 625, 626, 626, 627, 627, 628, 629, 629, 630, +631, 631, 632, 632, 633, 634, 634, 635, 635, 636, +636, 637, 638, 638, 639, 639, 640, 641, 641, 642, +642, 643, 643, 644, 645, 645, 646, 646, 647, 647, +648, 649, 649, 650, 650, 651, 651, 652, 652, 653, +654, 654, 655, 655, 656, 656, 657, 657, 658, 658, +659, 659, 660, 661, 661, 662, 662, 663, 663, 664, +664, 665, 665, 666, 666, 667, 667, 668, 668, 669, +669, 670, 670, 671, 671, 672, 672, 673, 673, 674, +674, 675, 675, 676, 676, 677, 677, 678, 678, 679, +679, 680, 680, 681, 681, 682, 682, 683, 683, 684, +684, 685, 685, 685, 686, 686, 687, 687, 688, 688, +689, 689, 690, 690, 691, 691, 691, 692, 692, 693, +693, 694, 694, 695, 695, 696, 696, 696, 697, 697, +698, 698, 699, 699, 699, 700, 700, 701, 701, 702, +702, 703, 703, 703, 704, 704, 705, 705, 706, 706, +706, 707, 707, 708, 708, 708, 709, 709, 710, 710, +711, 711, 711, 712, 712, 713, 713, 713, 714, 714, +715, 715, 715, 716, 716, 717, 717, 717, 718, 718, +719, 719, 719, 720, 720, 721, 721, 721, 722, 722, +723, 723, 723, 724, 724, 724, 725, 725, 726, 726, +726, 727, 727, 727, 728, 728, 729, 729, 729, 730, +730, 730, 731, 731, 732, 732, 732, 733, 733, 733, +734, 734, 734, 735, 735, 736, 736, 736, 737, 737, +737, 738, 738, 738, 739, 739, 739, 740, 740, 741, +741, 741, 742, 742, 742, 743, 743, 743, 744, 744, +744, 745, 745, 745, 746, 746, 746, 747, 747, 747, +748, 748, 748, 749, 749, 749, 750, 750, 750, 751, +751, 751, 752, 752, 752, 753, 753, 753, 754, 754, +754, 755, 755, 755, 756, 756, 756, 756, 757, 757, +757, 758, 758, 758, 759, 759, 759, 760, 760, 760, +761, 761, 761, 761, 762, 762, 762, 763, 763, 763, +764, 764, 764, 765, 765, 765, 765, 766, 766, 766, +767, 767, 767, 768, 768, 768, 768, 769, 769, 769, +770, 770, 770, 770, 771, 771, 771, 772, 772, 772, +773, 773, 773, 773, 774, 774, 774, 775, 775, 775, +775, 776, 776, 776, 776, 777, 777, 777, 778, 778, +778, 778, 779, 779, 779, 780, 780, 780, 780, 781, +781, 781, 781, 782, 782, 782, 783, 783, 783, 783, +784, 784, 784, 784, 785, 785, 785, 785, 786, 786, +786, 787, 787, 787, 787, 788, 788, 788, 788, 789, +789, 789, 789, 790, 790, 790, 790, 791, 791, 791, +791, 792, 792, 792, 792, 793, 793, 793, 793, 794, +794, 794, 794, 795, 795, 795, 795, 796, 796, 796, +796, 797, 797, 797, 797, 798, 798, 798, 798, 799, +799, 799, 799, 800, 800, 800, 800, 801, 801, 801, +801, 801, 802, 802, 802, 802, 803, 803, 803, 803, +804, 804, 804, 804, 805, 805, 805, 805, 805, 806, +806, 806, 806, 807, 807, 807, 807, 808, 808, 808, +808, 808, 809, 809, 809, 809, 810, 810, 810, 810, +810, 811, 811, 811, 811, 812, 812, 812, 812, 812, +813, 813, 813, 813, 813, 814, 814, 814, 814, 815, +815, 815, 815, 815, 816, 816, 816, 816, 817, 817, +817, 817, 817, 818, 818, 818, 818, 818, 819, 819, +819, 819, 819, 820, 820, 820, 820, 820, 821, 821, +821, 821, 822, 822, 822, 822, 822, 823, 823, 823, +823, 823, 824, 824, 824, 824, 824, 825, 825, 825, +825, 825, 826, 826, 826, 826, 826, 827, 827, 827, +827, 827, 828, 828, 828, 828, 828, 828, 829, 829, +829, 829, 829, 830, 830, 830, 830, 830, 831, 831, +831, 831, 831, 832, 832, 832, 832, 832, 832, 833, +833, 833, 833, 833, 834, 834, 834, 834, 834, 835, +835, 835, 835, 835, 835, 836, 836, 836, 836, 836, +837, 837, 837, 837, 837, 837, 838, 838, 838, 838, +838, 839, 839, 839, 839, 839, 839, 840, 840, 840, +840, 840, 841, 841, 841, 841, 841, 841, 842, 842, +842, 842, 842, 842, 843, 843, 843, 843, 843, 843, +844, 844, 844, 844, 844, 845, 845, 845, 845, 845, +845, 846, 846, 846, 846, 846, 846, 847, 847, 847, +847, 847, 847, 848, 848, 848, 848, 848, 848, 849, +849, 849, 849, 849, 849, 850, 850, 850, 850, 850, +850, 850, 851, 851, 851, 851, 851, 851, 852, 852, +852, 852, 852, 852, 853, 853, 853, 853, 853, 853, +854, 854, 854, 854, 854, 854, 854, 855, 855, 855, +855, 855, 855, 856, 856, 856, 856, 856, 856, 857, +857, 857, 857, 857, 857, 857, 858, 858, 858, 858, +858, 858, 858, 859, 859, 859, 859, 859, 859, 860, +860, 860, 860, 860, 860, 860, 861, 861, 861, 861, +861, 861, 861, 862, 862, 862, 862, 862, 862, 863, +863, 863, 863, 863, 863, 863, 864, 864, 864, 864, +864, 864, 864, 865, 865, 865, 865, 865, 865, 865, +866, 866, 866, 866, 866, 866, 866, 867, 867, 867, +867, 867, 867, 867, 868, 868, 868, 868, 868, 868, +868, 868, 869, 869, 869, 869, 869, 869, 869, 870, +870, 870, 870, 870, 870, 870, 871, 871, 871, 871, +871, 871, 871, 871, 872, 872, 872, 872, 872, 872, +872, 873, 873, 873, 873, 873, 873, 873, 873, 874, +874, 874, 874, 874, 874, 874, 875, 875, 875, 875, +875, 875, 875, 875, 876, 876, 876, 876, 876, 876, +876, 876, 877, 877, 877, 877, 877, 877, 877, 878, +878, 878, 878, 878, 878, 878, 878, 879, 879, 879, +879, 879, 879, 879, 879, 880, 880, 880, 880, 880, +880, 880, 880, 881, 881, 881, 881, 881, 881, 881, +881, 882, 882, 882, 882, 882, 882, 882, 882, 882, +883, 883, 883, 883, 883, 883, 883, 883, 884, 884, +884, 884, 884, 884, 884, 884, 885, 885, 885, 885, +885, 885, 885, 885, 885, 886, 886, 886, 886, 886, +886, 886, 886, 887, 887, 887, 887, 887, 887, 887, +887, 887, 888, 888, 888, 888, 888, 888, 888, 888, +888, 889, 889, 889, 889, 889, 889, 889, 889, 890, +890, 890, 890, 890, 890, 890, 890, 890, 891, 891, +891, 891, 891, 891, 891, 891, 891, 892, 892, 892, +892, 892, 892, 892, 892, 892, 893, 893, 893, 893, +893, 893, 893, 893, 893, 893, 894, 894, 894, 894, +894, 894, 894, 894, 894, 895, 895, 895, 895, 895, +895, 895, 895, 895, 896, 896, 896, 896, 896, 896, +896, 896, 896, 896, 897, 897, 897, 897, 897, 897, +897, 897, 897, 898, 898, 898, 898, 898, 898, 898, +898, 898, 898, 899, 899, 899, 899, 899, 899, 899, +899, 899, 899, 900, 900, 900, 900, 900, 900, 900, +900, 900, 900, 901, 901, 901, 901, 901, 901, 901, +901, 901, 901, 902, 902, 902, 902, 902, 902, 902, +902, 902, 902, 903, 903, 903, 903, 903, 903, 903, +903, 903, 903, 904, 904, 904, 904, 904, 904, 904, +904, 904, 904, 905, 905, 905, 905, 905, 905, 905, +905, 905, 905, 905, 906, 906, 906, 906, 906, 906, +906, 906, 906, 906, 907, 907, 907, 907, 907, 907, +907, 907, 907, 907, 907, 908, 908, 908, 908, 908, +908, 908, 908, 908, 908, 908, 909, 909, 909, 909, +909, 909, 909, 909, 909, 909, 910, 910, 910, 910, +910, 910, 910, 910, 910, 910, 910, 911, 911, 911, +911, 911, 911, 911, 911, 911, 911, 911, 911, 912, +912, 912, 912, 912, 912, 912, 912, 912, 912, 912, +913, 913, 913, 913, 913, 913, 913, 913, 913, 913, +913, 914, 914, 914, 914, 914, 914, 914, 914, 914, +914, 914, 914, 915, 915, 915, 915, 915, 915, 915, +915, 915, 915, 915, 915, 916, 916, 916, 916, 916, +916, 916, 916, 916, 916, 916, 917, 917, 917, 917, +917, 917, 917, 917, 917, 917, 917, 917, 918, 918, +918, 918, 918, 918, 918, 918, 918, 918, 918, 918, +919, 919, 919, 919, 919, 919, 919, 919, 919, 919, +919, 919, 919, 920, 920, 920, 920, 920, 920, 920, +920, 920, 920, 920, 920, 921, 921, 921, 921, 921, +921, 921, 921, 921, 921, 921, 921, 921, 922, 922, +922, 922, 922, 922, 922, 922, 922, 922, 922, 922, +923, 923, 923, 923, 923, 923, 923, 923, 923, 923, +923, 923, 923, 924, 924, 924, 924, 924, 924, 924, +924, 924, 924, 924, 924, 924, 925, 925, 925, 925, +925, 925, 925, 925, 925, 925, 925, 925, 925, 926, +926, 926, 926, 926, 926, 926, 926, 926, 926, 926, +926, 926, 926, 927, 927, 927, 927, 927, 927, 927, +927, 927, 927, 927, 927, 927, 928, 928, 928, 928, +928, 928, 928, 928, 928, 928, 928, 928, 928, 928, +929, 929, 929, 929, 929, 929, 929, 929, 929, 929, +929, 929, 929, 929, 930, 930, 930, 930, 930, 930, +930, 930, 930, 930, 930, 930, 930, 930, 931, 931, +931, 931, 931, 931, 931, 931, 931, 931, 931, 931, +931, 931, 932, 932, 932, 932, 932, 932, 932, 932, +932, 932, 932, 932, 932, 932, 933, 933, 933, 933, +933, 933, 933, 933, 933, 933, 933, 933, 933, 933, +933, 934, 934, 934, 934, 934, 934, 934, 934, 934, +934, 934, 934, 934, 934, 934, 935, 935, 935, 935, +935, 935, 935, 935, 935, 935, 935, 935, 935, 935, +935, 936, 936, 936, 936, 936, 936, 936, 936, 936, +936, 936, 936, 936, 936, 936, 937, 937, 937, 937, +937, 937, 937, 937, 937, 937, 937, 937, 937, 937, +937, 938, 938, 938, 938, 938, 938, 938, 938, 938, +938, 938, 938, 938, 938, 938, 938, 939, 939, 939, +939, 939, 939, 939, 939, 939, 939, 939, 939, 939, +939, 939, 939, 940, 940, 940, 940, 940, 940, 940, +940, 940, 940, 940, 940, 940, 940, 940, 940, 941, +941, 941, 941, 941, 941, 941, 941, 941, 941, 941, +941, 941, 941, 941, 941, 942, 942, 942, 942, 942, +942, 942, 942, 942, 942, 942, 942, 942, 942, 942, +942, 943, 943, 943, 943, 943, 943, 943, 943, 943, +943, 943, 943, 943, 943, 943, 943, 943, 944, 944, +944, 944, 944, 944, 944, 944, 944, 944, 944, 944, +944, 944, 944, 944, 944, 945, 945, 945, 945, 945, +945, 945, 945, 945, 945, 945, 945, 945, 945, 945, +945, 945, 946, 946, 946, 946, 946, 946, 946, 946, +946, 946, 946, 946, 946, 946, 946, 946, 946, 946, +947, 947, 947, 947, 947, 947, 947, 947, 947, 947, +947, 947, 947, 947, 947, 947, 947, 948, 948, 948, +948, 948, 948, 948, 948, 948, 948, 948, 948, 948, +948, 948, 948, 948, 948, 949, 949, 949, 949, 949, +949, 949, 949, 949, 949, 949, 949, 949, 949, 949, +949, 949, 949, 950, 950, 950, 950, 950, 950, 950, +950, 950, 950, 950, 950, 950, 950, 950, 950, 950, +950, 950, 951, 951, 951, 951, 951, 951, 951, 951, +951, 951, 951, 951, 951, 951, 951, 951, 951, 951, +951, 952, 952, 952, 952, 952, 952, 952, 952, 952, +952, 952, 952, 952, 952, 952, 952, 952, 952, 952, +953, 953, 953, 953, 953, 953, 953, 953, 953, 953, +953, 953, 953, 953, 953, 953, 953, 953, 953, 954, +954, 954, 954, 954, 954, 954, 954, 954, 954, 954, +954, 954, 954, 954, 954, 954, 954, 954, 955, 955, +955, 955, 955, 955, 955, 955, 955, 955, 955, 955, +955, 955, 955, 955, 955, 955, 955, 955, 956, 956, +956, 956, 956, 956, 956, 956, 956, 956, 956, 956, +956, 956, 956, 956, 956, 956, 956, 956, 956, 957, +957, 957, 957, 957, 957, 957, 957, 957, 957, 957, +957, 957, 957, 957, 957, 957, 957, 957, 957, 958, +958, 958, 958, 958, 958, 958, 958, 958, 958, 958, +958, 958, 958, 958, 958, 958, 958, 958, 958, 958, +959, 959, 959, 959, 959, 959, 959, 959, 959, 959, +959, 959, 959, 959, 959, 959, 959, 959, 959, 959, +959, 960, 960, 960, 960, 960, 960, 960, 960, 960, +960, 960, 960, 960, 960, 960, 960, 960, 960, 960, +960, 960, 960, 961, 961, 961, 961, 961, 961, 961, +961, 961, 961, 961, 961, 961, 961, 961, 961, 961, +961, 961, 961, 961, 962, 962, 962, 962, 962, 962, +962, 962, 962, 962, 962, 962, 962, 962, 962, 962, +962, 962, 962, 962, 962, 962, 962, 963, 963, 963, +963, 963, 963, 963, 963, 963, 963, 963, 963, 963, +963, 963, 963, 963, 963, 963, 963, 963, 963, 964, +964, 964, 964, 964, 964, 964, 964, 964, 964, 964, +964, 964, 964, 964, 964, 964, 964, 964, 964, 964, +964, 964, 965, 965, 965, 965, 965, 965, 965, 965, +965, 965, 965, 965, 965, 965, 965, 965, 965, 965, +965, 965, 965, 965, 965, 966, 966, 966, 966, 966, +966, 966, 966, 966, 966, 966, 966, 966, 966, 966, +966, 966, 966, 966, 966, 966, 966, 966, 966, 967, +967, 967, 967, 967, 967, 967, 967, 967, 967, 967, +967, 967, 967, 967, 967, 967, 967, 967, 967, 967, +967, 967, 967, 968, 968, 968, 968, 968, 968, 968, +968, 968, 968, 968, 968, 968, 968, 968, 968, 968, +968, 968, 968, 968, 968, 968, 968, 968, 969, 969, +969, 969, 969, 969, 969, 969, 969, 969, 969, 969, +969, 969, 969, 969, 969, 969, 969, 969, 969, 969, +969, 969, 969, 970, 970, 970, 970, 970, 970, 970, +970, 970, 970, 970, 970, 970, 970, 970, 970, 970, +970, 970, 970, 970, 970, 970, 970, 970, 971, 971, +971, 971, 971, 971, 971, 971, 971, 971, 971, 971, +971, 971, 971, 971, 971, 971, 971, 971, 971, 971, +971, 971, 971, 971, 972, 972, 972, 972, 972, 972, +972, 972, 972, 972, 972, 972, 972, 972, 972, 972, +972, 972, 972, 972, 972, 972, 972, 972, 972, 972, +973, 973, 973, 973, 973, 973, 973, 973, 973, 973, +973, 973, 973, 973, 973, 973, 973, 973, 973, 973, +973, 973, 973, 973, 973, 973, 973, 974, 974, 974, +974, 974, 974, 974, 974, 974, 974, 974, 974, 974, +974, 974, 974, 974, 974, 974, 974, 974, 974, 974, +974, 974, 974, 974, 975, 975, 975, 975, 975, 975, +975, 975, 975, 975, 975, 975, 975, 975, 975, 975, +975, 975, 975, 975, 975, 975, 975, 975, 975, 975, +975, 975, 976, 976, 976, 976, 976, 976, 976, 976, +976, 976, 976, 976, 976, 976, 976, 976, 976, 976, +976, 976, 976, 976, 976, 976, 976, 976, 976, 976, +977, 977, 977, 977, 977, 977, 977, 977, 977, 977, +977, 977, 977, 977, 977, 977, 977, 977, 977, 977, +977, 977, 977, 977, 977, 977, 977, 977, 977, 978, +978, 978, 978, 978, 978, 978, 978, 978, 978, 978, +978, 978, 978, 978, 978, 978, 978, 978, 978, 978, +978, 978, 978, 978, 978, 978, 978, 978, 979, 979, +979, 979, 979, 979, 979, 979, 979, 979, 979, 979, +979, 979, 979, 979, 979, 979, 979, 979, 979, 979, +979, 979, 979, 979, 979, 979, 979, 979, 980, 980, +980, 980, 980, 980, 980, 980, 980, 980, 980, 980, +980, 980, 980, 980, 980, 980, 980, 980, 980, 980, +980, 980, 980, 980, 980, 980, 980, 980, 981, 981, +981, 981, 981, 981, 981, 981, 981, 981, 981, 981, +981, 981, 981, 981, 981, 981, 981, 981, 981, 981, +981, 981, 981, 981, 981, 981, 981, 981, 981, 982, +982, 982, 982, 982, 982, 982, 982, 982, 982, 982, +982, 982, 982, 982, 982, 982, 982, 982, 982, 982, +982, 982, 982, 982, 982, 982, 982, 982, 982, 982, +983, 983, 983, 983, 983, 983, 983, 983, 983, 983, +983, 983, 983, 983, 983, 983, 983, 983, 983, 983, +983, 983, 983, 983, 983, 983, 983, 983, 983, 983, +983, 983, 983, 984, 984, 984, 984, 984, 984, 984, +984, 984, 984, 984, 984, 984, 984, 984, 984, 984, +984, 984, 984, 984, 984, 984, 984, 984, 984, 984, +984, 984, 984, 984, 984, 985, 985, 985, 985, 985, +985, 985, 985, 985, 985, 985, 985, 985, 985, 985, +985, 985, 985, 985, 985, 985, 985, 985, 985, 985, +985, 985, 985, 985, 985, 985, 985, 985, 985, 986, +986, 986, 986, 986, 986, 986, 986, 986, 986, 986, +986, 986, 986, 986, 986, 986, 986, 986, 986, 986, +986, 986, 986, 986, 986, 986, 986, 986, 986, 986, +986, 986, 986, 987, 987, 987, 987, 987, 987, 987, +987, 987, 987, 987, 987, 987, 987, 987, 987, 987, +987, 987, 987, 987, 987, 987, 987, 987, 987, 987, +987, 987, 987, 987, 987, 987, 987, 987, 988, 988, +988, 988, 988, 988, 988, 988, 988, 988, 988, 988, +988, 988, 988, 988, 988, 988, 988, 988, 988, 988, +988, 988, 988, 988, 988, 988, 988, 988, 988, 988, +988, 988, 988, 989, 989, 989, 989, 989, 989, 989, +989, 989, 989, 989, 989, 989, 989, 989, 989, 989, +989, 989, 989, 989, 989, 989, 989, 989, 989, 989, +989, 989, 989, 989, 989, 989, 989, 989, 989, 990, +990, 990, 990, 990, 990, 990, 990, 990, 990, 990, +990, 990, 990, 990, 990, 990, 990, 990, 990, 990, +990, 990, 990, 990, 990, 990, 990, 990, 990, 990, +990, 990, 990, 990, 990, 990, 991, 991, 991, 991, +991, 991, 991, 991, 991, 991, 991, 991, 991, 991, +991, 991, 991, 991, 991, 991, 991, 991, 991, 991, +991, 991, 991, 991, 991, 991, 991, 991, 991, 991, +991, 991, 991, 991, 992, 992, 992, 992, 992, 992, +992, 992, 992, 992, 992, 992, 992, 992, 992, 992, +992, 992, 992, 992, 992, 992, 992, 992, 992, 992, +992, 992, 992, 992, 992, 992, 992, 992, 992, 992, +992, 992, 992, 993, 993, 993, 993, 993, 993, 993, +993, 993, 993, 993, 993, 993, 993, 993, 993, 993, +993, 993, 993, 993, 993, 993, 993, 993, 993, 993, +993, 993, 993, 993, 993, 993, 993, 993, 993, 993, +993, 993, 994, 994, 994, 994, 994, 994, 994, 994, +994, 994, 994, 994, 994, 994, 994, 994, 994, 994, +994, 994, 994, 994, 994, 994, 994, 994, 994, 994, +994, 994, 994, 994, 994, 994, 994, 994, 994, 994, +994, 994, 995, 995, 995, 995, 995, 995, 995, 995, +995, 995, 995, 995, 995, 995, 995, 995, 995, 995, +995, 995, 995, 995, 995, 995, 995, 995, 995, 995, +995, 995, 995, 995, 995, 995, 995, 995, 995, 995, +995, 995, 995, 995, 996, 996, 996, 996, 996, 996, +996, 996, 996, 996, 996, 996, 996, 996, 996, 996, +996, 996, 996, 996, 996, 996, 996, 996, 996, 996, +996, 996, 996, 996, 996, 996, 996, 996, 996, 996, +996, 996, 996, 996, 996, 996, 997, 997, 997, 997, +997, 997, 997, 997, 997, 997, 997, 997, 997, 997, +997, 997, 997, 997, 997, 997, 997, 997, 997, 997, +997, 997, 997, 997, 997, 997, 997, 997, 997, 997, +997, 997, 997, 997, 997, 997, 997, 997, 997, 998, +998, 998, 998, 998, 998, 998, 998, 998, 998, 998, +998, 998, 998, 998, 998, 998, 998, 998, 998, 998, +998, 998, 998, 998, 998, 998, 998, 998, 998, 998, +998, 998, 998, 998, 998, 998, 998, 998, 998, 998, +998, 998, 998, 999, 999, 999, 999, 999, 999, 999, +999, 999, 999, 999, 999, 999, 999, 999, 999, 999, +999, 999, 999, 999, 999, 999, 999, 999, 999, 999, +999, 999, 999, 999, 999, 999, 999, 999, 999, 999, +999, 999, 999, 999, 999, 999, 999, 999, 1000, 1000, +1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, +1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, +1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, +1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, +1000, 1000, 1000, 1000, 1001, 1001, 1001, 1001, 1001, 1001, +1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, +1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, +1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, +1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, +1001, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, +1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, +1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, +1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, +1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1003, +1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, +1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, +1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, +1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, +1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1004, +1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, +1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, +1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, +1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, +1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, +1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, +1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, +1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, +1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, +1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, +1005, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, +1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, +1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, +1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, +1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, +1006, 1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, +1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, +1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, +1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, +1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, +1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1008, +1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, +1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, +1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, +1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, +1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, +1008, 1008, 1008, 1008, 1008, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, +1009, 1009, 1009, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, +1010, 1010, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, +1011, 1011, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, +1012, 1012, 1012, 1012, 1012, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, +1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, +1014, 1014, 1014, 1014, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, +1015, 1015, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, +1016, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, +1017, 1017, 1017, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, +1018, 1018, 1018, 1018, 1018, 1018, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, +1019, 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, +1021, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, +1022, 1022, 1022, 1022, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, +1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, +1026, 1026, 1026, 1026, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, +1027, 1027, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, +1028, 1028, 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, +1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, +1030, 1030, 1030, 1030, 1030, 1030, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, +1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, +1032, 1032, 1032, 1032, 1032, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, +1033, 1033, 1033, 1033, 1033, 1033, 1033, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, +1034, 1034, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, +1035, 1035, 1035, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, +1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, +1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, +1039, 1039, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, +1040, 1040, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, +1042, 1042, 1042, 1042, 1042, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, +1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, +1044, 1044, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, +1045, 1045, 1045, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, +1046, 1046, 1046, 1046, 1046, 1046, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, +1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, +1048, 1048, 1048, 1048, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, +1049, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, +1050, 1050, 1050, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, +1052}; + diff --git a/wrappers/openni2/src/Profiler.h b/wrappers/openni2/src/Profiler.h new file mode 100755 index 0000000000..86a3b9f4a2 --- /dev/null +++ b/wrappers/openni2/src/Profiler.h @@ -0,0 +1,169 @@ +#pragma once + +#if defined(PROF_ENABLED) + +#define PROF_OPTION_QPC +#define PROF_OPTION_THREADSAFE + +#define INIT_PROFILER for(;;) { HiresTimer::Init(); Profiler::InitInstance(); break; } +#define SHUT_PROFILER for(;;) { Profiler::GetInstance()->LogSummary(); Profiler::DestroyInstance(); break; } +#define NAMED_PROFILER(name) ScopedProfiler named_profiler(PROF_TEXT(name), PROF_TEXT(PROF_UNIQ_NAME)) +#define SCOPED_PROFILER ScopedProfiler scoped_profiler(PROF_TEXT(__FUNCTION__), PROF_TEXT(PROF_UNIQ_NAME)) + +#if defined(_WIN32) || defined(_WIN64) + #define PROF_PLATFORM_WINDOWS +#endif + +#include +#include + +#if !defined(PROF_PLATFORM_WINDOWS) + #include + #include +#endif + +#if !defined(PROF_CHAR) + #define PROF_CHAR char +#endif + +#if !defined(PROF_TEXT) + #define PROF_TEXT(str) str +#endif + +#if !defined(PROF_LOG) + #define PROF_LOG printf +#endif + +#if !defined(PROF_MAP_IMPL) + #define PROF_MAP_IMPL std::unordered_map + #include +#endif + +#if defined(PROF_OPTION_THREADSAFE) + #if !defined(PROF_MUTEX_IMPL) + #include + #define PROF_MUTEX_IMPL std::mutex + #define PROF_SCOPED_MUTEX_IMPL std::lock_guard + #endif + #define PROF_MUTEX_DECL PROF_MUTEX_IMPL m_mutex + #define PROF_LOCK PROF_SCOPED_MUTEX_IMPL _scoped(m_mutex) +#else + #define PROF_MUTEX_DECL + #define PROF_LOCK +#endif + +#define PROF_STRINGIZE1(x) PROF_STRINGIZE2(x) +#define PROF_STRINGIZE2(x) #x +#define PROF_UNIQ_NAME __FILE__ "_" PROF_STRINGIZE1(__LINE__) + +#define PROF_SAFE_DELETE(ptr) { if (ptr) { delete ptr; ptr = nullptr; } } + +#define PROF_NO_COPY(type_)\ + private:\ + type_(const type_&); \ + void operator=(const type_&) + +// HiresTimer + +class HiresTimer +{ +public: + static int Init(); + static double GetTicks(); +}; + +// ProfilerSection + +class ProfilerSection +{ + PROF_NO_COPY(ProfilerSection); + + friend class Profiler; + friend class ScopedProfiler; + +private: + + inline ProfilerSection(const PROF_CHAR* name, const PROF_CHAR* uniq) : + m_name(name), m_uniq(uniq), m_sum(0), m_count(0) {} + + inline void Update(double delta) { m_sum += delta, m_count += 1; } + inline void ResetCounters() { m_sum = 0, m_count = 0; } + + inline const PROF_CHAR* GetName() const { return m_name; } + inline const PROF_CHAR* GetUniq() const { return m_uniq; } + inline double GetSum() const { return m_sum; } + inline unsigned int GetCount() const { return m_count; } + inline double GetAvg() const { return (m_count > 0 ? (m_sum / (double)m_count) : 0); } + +private: + + const PROF_CHAR* m_name; + const PROF_CHAR* m_uniq; + double m_sum; + unsigned int m_count; +}; + +// Profiler + +class Profiler +{ + PROF_NO_COPY(Profiler); + +public: + + enum SortMode + { + SORT_SUM = 0, + SORT_AVG + }; + + static void InitInstance(); + static void DestroyInstance(); + static Profiler* GetInstance(); + + Profiler() {} + ~Profiler() { Release(); } + + ProfilerSection* BeginSection(const PROF_CHAR* name, const PROF_CHAR* uniq); + void EndSection(ProfilerSection* section, double delta); + void ResetCounters(); + + void LogSummary(SortMode sortMode = SORT_SUM); + void Release(); + +private: + + PROF_MUTEX_DECL; + + typedef PROF_MAP_IMPL SectionMap; + SectionMap m_sections; +}; + +// ScopedProfiler + +class ScopedProfiler +{ + PROF_NO_COPY(ScopedProfiler); + +public: + + inline ScopedProfiler(const PROF_CHAR* name, const PROF_CHAR* uniq) + { + m_section = Profiler::GetInstance()->BeginSection(name, uniq); + m_ticks = HiresTimer::GetTicks(); + } + + inline ~ScopedProfiler() + { + const double ticks = HiresTimer::GetTicks(); + const double delta = (ticks - m_ticks); + Profiler::GetInstance()->EndSection(m_section, delta); + } + +private: + + ProfilerSection* m_section; + double m_ticks; +}; + +#endif // PROF_ENABLED diff --git a/wrappers/openni2/src/Profiler.inl b/wrappers/openni2/src/Profiler.inl new file mode 100755 index 0000000000..02b6bdad25 --- /dev/null +++ b/wrappers/openni2/src/Profiler.inl @@ -0,0 +1,169 @@ +#if defined(PROF_ENABLED) + +static Profiler* _profiler = NULL; + +void Profiler::InitInstance() +{ + PROF_SAFE_DELETE(_profiler); + _profiler = new Profiler(); +} + +void Profiler::DestroyInstance() +{ + PROF_SAFE_DELETE(_profiler); +} + +Profiler* Profiler::GetInstance() +{ + return _profiler; +} + +ProfilerSection* Profiler::BeginSection(const PROF_CHAR* name, const PROF_CHAR* uniq) +{ + PROF_LOCK; + + ProfilerSection* section; + SectionMap::iterator iter = m_sections.find(uniq); + if (iter != m_sections.end()) + { + section = iter->second; + } + else + { + section = new ProfilerSection(name, uniq); + m_sections.insert(std::pair(uniq, section)); + } + + return section; +} + +void Profiler::EndSection(ProfilerSection* section, double delta) +{ + PROF_LOCK; + + section->Update(delta); +} + +void Profiler::ResetCounters() +{ + PROF_LOCK; + + for (SectionMap::iterator iter = m_sections.begin(); iter != m_sections.end(); ++iter) + { + iter->second->ResetCounters(); + } +} + +void Profiler::LogSummary(SortMode sortMode) +{ + std::vector sections; + + { + PROF_LOCK; + + if (m_sections.empty()) + { + return; + } + + sections.reserve(m_sections.size()); + + for (SectionMap::iterator iter = m_sections.begin(); iter != m_sections.end(); ++iter) + { + sections.push_back(iter->second); + } + } + + struct SectionComparatorSum + { + inline bool operator() (const ProfilerSection* a, const ProfilerSection* b) const { return a->GetSum() > b->GetSum(); } + }; + + struct SectionComparatorAvg + { + inline bool operator() (const ProfilerSection* a, const ProfilerSection* b) const { return a->GetAvg() > b->GetAvg(); } + }; + + if (sortMode == SORT_AVG) + std::sort(sections.begin(), sections.end(), SectionComparatorAvg()); + else + std::sort(sections.begin(), sections.end(), SectionComparatorSum()); + + PROF_LOG(PROF_TEXT("\n")); + PROF_LOG(PROF_TEXT("%10s %15s %10s %10s %-20s\n"), PROF_TEXT(""), PROF_TEXT(""), PROF_TEXT(""), PROF_TEXT(""), PROF_TEXT("")); + std::vector::iterator isec; + for (isec = sections.begin(); isec != sections.end(); ++isec) + { + ProfilerSection* section = *isec; + PROF_LOG(PROF_TEXT("%10.3f %15.3f %10u %10.3f %-20s\n"), + (section->GetSum() * 0.001), section->GetSum(), section->GetCount(), section->GetAvg(), + section->GetName()); //, section->GetUniq()); + } + PROF_LOG(PROF_TEXT("\n")); +} + +void Profiler::Release() +{ + PROF_LOCK; + + for (SectionMap::iterator iter = m_sections.begin(); iter != m_sections.end(); ++iter) + { + delete iter->second; + } + + m_sections.clear(); +} + +#if defined(PROF_PLATFORM_WINDOWS) + +#if defined(PROF_OPTION_QPC) + static double _perfFreqMsecInv = 0; +#else + #pragma comment(lib, "Winmm.lib") +#endif + +int HiresTimer::Init() +{ + #ifdef PROF_OPTION_QPC + LARGE_INTEGER perfFreq; + const BOOL rc = QueryPerformanceFrequency(&perfFreq); + if (!rc || !perfFreq.QuadPart) + { + return -1; + } + + _perfFreqMsecInv = 1.0 / ((double)perfFreq.QuadPart * 0.001); + #endif + + return 0; +} + +double HiresTimer::GetTicks() +{ + #ifdef PROF_OPTION_QPC + LARGE_INTEGER counter; + QueryPerformanceCounter(&counter); + return (counter.QuadPart * _perfFreqMsecInv); + #else + DWORD t = timeGetTime(); + return (double)t; + #endif +} + +#else // not PROF_PLATFORM_WINDOWS + +int HiresTimer::Init() +{ + return 0; +} + +double HiresTimer::GetTicks() +{ + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ((ts.tv_sec * 1000.0) + (ts.tv_nsec * 0.000001)); +} + +#endif + +#endif // PROF_ENABLED diff --git a/wrappers/openni2/src/Rs2Base.cpp b/wrappers/openni2/src/Rs2Base.cpp new file mode 100755 index 0000000000..3ac0a6461b --- /dev/null +++ b/wrappers/openni2/src/Rs2Base.cpp @@ -0,0 +1,106 @@ +#include "Rs2Base.h" + +namespace oni { namespace driver { + +// StreamType + +bool isSupportedStreamType(rs2_stream type) +{ + switch (type) + { + case RS2_STREAM_DEPTH: + case RS2_STREAM_COLOR: + case RS2_STREAM_INFRARED: + return true; + } + return false; +} + +OniSensorType convertStreamType(rs2_stream type) +{ + switch (type) + { + case RS2_STREAM_DEPTH: return ONI_SENSOR_DEPTH; + case RS2_STREAM_COLOR: return ONI_SENSOR_COLOR; + case RS2_STREAM_INFRARED: return ONI_SENSOR_IR; + } + rsTraceError("Invalid rs2_stream=%d", (int)type); + RS2_ASSERT(false); + return (OniSensorType)0; +} + +rs2_stream convertStreamType(OniSensorType type) +{ + switch (type) + { + case ONI_SENSOR_DEPTH: return RS2_STREAM_DEPTH; + case ONI_SENSOR_COLOR: return RS2_STREAM_COLOR; + case ONI_SENSOR_IR: return RS2_STREAM_INFRARED; + } + rsTraceError("Invalid OniSensorType=%d", (int)type); + RS2_ASSERT(false); + return (rs2_stream)0; +} + +// PixelFormat + +bool isSupportedPixelFormat(rs2_format type) +{ + switch (type) + { + case RS2_FORMAT_Z16: + case RS2_FORMAT_YUYV: + case RS2_FORMAT_RGB8: + case RS2_FORMAT_Y8: + case RS2_FORMAT_Y16: + return true; + } + return false; +} + +int getPixelFormatBytes(rs2_format type) +{ + switch (type) + { + case RS2_FORMAT_Z16: return 2; + case RS2_FORMAT_YUYV: return 2; + case RS2_FORMAT_RGB8: return 3; + case RS2_FORMAT_Y8: return 1; + case RS2_FORMAT_Y16: return 2; + } + rsTraceError("Invalid rs2_format=%d", (int)type); + RS2_ASSERT(false); + return 0; +} + +OniPixelFormat convertPixelFormat(rs2_format type) +{ + switch (type) + { + case RS2_FORMAT_Z16: return ONI_PIXEL_FORMAT_DEPTH_1_MM; + case RS2_FORMAT_YUYV: return ONI_PIXEL_FORMAT_YUYV; + case RS2_FORMAT_RGB8: return ONI_PIXEL_FORMAT_RGB888; + case RS2_FORMAT_Y8: return ONI_PIXEL_FORMAT_GRAY8; + case RS2_FORMAT_Y16: return ONI_PIXEL_FORMAT_GRAY16; + } + rsTraceError("Invalid rs2_format=%d", (int)type); + RS2_ASSERT(false); + return (OniPixelFormat)0; +} + +rs2_format convertPixelFormat(OniPixelFormat type) +{ + switch (type) + { + case ONI_PIXEL_FORMAT_DEPTH_1_MM: return RS2_FORMAT_Z16; + case ONI_PIXEL_FORMAT_YUYV: return RS2_FORMAT_YUYV; + case ONI_PIXEL_FORMAT_RGB888: return RS2_FORMAT_RGB8; + case ONI_PIXEL_FORMAT_GRAY8: return RS2_FORMAT_Y8; + case ONI_PIXEL_FORMAT_GRAY16: return RS2_FORMAT_Y16; + } + rsTraceError("Invalid OniPixelFormat=%d", (int)type); + RS2_ASSERT(false); + return (rs2_format)0; +} + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Base.h b/wrappers/openni2/src/Rs2Base.h new file mode 100755 index 0000000000..16edd545a3 --- /dev/null +++ b/wrappers/openni2/src/Rs2Base.h @@ -0,0 +1,77 @@ +#pragma once + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#pragma warning(disable:4100) // unreferenced formal parameter +#pragma warning(disable:4505) // unreferenced local function has been removed + +#define ONI_MAX_DEPTH 10000 +#define RS2_EMULATE_PRIMESENSE_HARDWARE // HACK: NiTE only runs on PrimeSense SoC +//#define RS2_TRACE_NOT_SUPPORTED_PROPS + +#if 0 + // DEV MODE + #define PROF_ENABLED + #define PROF_MUTEX_IMPL oni::driver::Rs2Mutex + #define PROF_SCOPED_MUTEX_IMPL oni::driver::Rs2ScopedMutex +#else + #define INIT_PROFILER + #define SHUT_PROFILER + #define NAMED_PROFILER(name) + #define SCOPED_PROFILER +#endif + +#if defined(NDEBUG) + #define RS2_ASSERT(cond) +#else + #define RS2_ASSERT assert +#endif + +#define rsTraceError(format, ...) printf("[RS2] ERROR at FILE %s LINE %d FUNC %s\n\t" format "\n", __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__) +#define rsTraceFunc(format, ...) printf("[RS2] " __FUNCTION__ " " format "\n", __VA_ARGS__) +#define rsLogDebug(format, ...) printf("[RS2] " format "\n", __VA_ARGS__) + +namespace oni { namespace driver { + +typedef std::mutex Rs2Mutex; +typedef std::lock_guard Rs2ScopedMutex; + +class Rs2Error +{ +public: + inline Rs2Error() : m_error(nullptr) {} + inline ~Rs2Error() { release(); } + inline void release() { if (m_error) { rs2_free_error(m_error); m_error = nullptr; } } + inline rs2_error** operator&() { release(); return &m_error; } + + inline bool success() const { return m_error ? false : true; } + inline const char* get_message() const { return rs2_get_error_message(m_error); } + inline rs2_exception_type get_type() const { return rs2_get_librealsense_exception_type(m_error); } + +private: + rs2_error* m_error; +}; + +bool isSupportedStreamType(rs2_stream type); +OniSensorType convertStreamType(rs2_stream type); +rs2_stream convertStreamType(OniSensorType type); + +bool isSupportedPixelFormat(rs2_format type); +int getPixelFormatBytes(rs2_format type); +OniPixelFormat convertPixelFormat(rs2_format type); +rs2_format convertPixelFormat(OniPixelFormat type); + +}} // namespace + +#if defined(PROF_ENABLED) +#include "Profiler.h" +#endif diff --git a/wrappers/openni2/src/Rs2Device.cpp b/wrappers/openni2/src/Rs2Device.cpp new file mode 100755 index 0000000000..7d709b8003 --- /dev/null +++ b/wrappers/openni2/src/Rs2Device.cpp @@ -0,0 +1,858 @@ +#include "Rs2Driver.h" + +#define WORKER_THREAD_IDLE_MS 500 +#define WORKER_THREAD_STOP_TIMEOUT_MS 5000 +#define WAIT_FRAMESET_TIMEOUT_MS 2000 +#define WAIT_ALIGNED_DEPTH_TIMEOUT_MS 100 + +namespace oni { namespace driver { + +Rs2Device::Rs2Device(Rs2Driver* driver, rs2_device* device) +: + m_driver(driver), + m_device(device), + m_registrationMode(ONI_IMAGE_REGISTRATION_OFF), + m_config(nullptr), + m_pipeline(nullptr), + m_pipelineProfile(nullptr), + m_alignQueue(nullptr), + m_alignProcessor(nullptr), + m_runFlag(false), + m_configId(0), + m_framesetId(0) +{ + rsLogDebug("+Rs2Device"); +} + +Rs2Device::~Rs2Device() +{ + rsLogDebug("~Rs2Device"); + + shutdown(); +} + +OniStatus Rs2Device::initialize() +{ + rsTraceFunc(""); + + for (;;) + { + Rs2ScopedMutex lock(m_stateMx); + + if (m_thread.get()) + { + rsTraceError("Already initialized"); + break; + } + + if (queryDeviceInfo(m_device, &m_info) != ONI_STATUS_OK) + { + rsTraceError("queryDeviceInfo failed"); + break; + } + + { + Rs2ScopedMutex streamLock(m_streamsMx); + + if (initializeStreams() != ONI_STATUS_OK) + { + rsTraceError("initializeStreams failed"); + break; + } + } + + m_configId = 0; + m_runFlag = true; + + try { + m_thread.reset(new std::thread(&Rs2Device::mainLoop, this)); + } + catch (std::exception& ex) { + rsTraceError("std::thread failed: %s", ex.what()); + break; + } + + return ONI_STATUS_OK; + } + + shutdown(); + return ONI_STATUS_ERROR; +} + +void Rs2Device::shutdown() +{ + if (m_device) { rsTraceFunc(""); } + + Rs2ScopedMutex lock(m_stateMx); + + m_runFlag = false; + if (m_thread) + { + m_thread->join(); + m_thread = nullptr; + } + + { + Rs2ScopedMutex streamLock(m_streamsMx); + + for (auto iter = m_createdStreams.begin(); iter != m_createdStreams.end(); ++iter) { delete(*iter); } + m_createdStreams.clear(); + + for (auto iter = m_streams.begin(); iter != m_streams.end(); ++iter) { delete(*iter); } + m_streams.clear(); + } + + for (auto iter = m_sensorInfo.begin(); iter != m_sensorInfo.end(); ++iter) { delete[](iter->pSupportedVideoModes); } + m_sensorInfo.clear(); + m_profiles.clear(); + + if (m_device) + { + rs2_delete_device(m_device); + m_device = nullptr; + } +} + +OniStatus Rs2Device::queryDeviceInfo(rs2_device* device, OniDeviceInfo* deviceInfo) +{ + rsTraceFunc(""); + + Rs2Error e; + const char* serial = rs2_get_device_info(device, RS2_CAMERA_INFO_SERIAL_NUMBER, &e); + if (!e.success()) return ONI_STATUS_ERROR; + + const char* name = rs2_get_device_info(device, RS2_CAMERA_INFO_NAME, &e); + if (!e.success()) return ONI_STATUS_ERROR; + + strncpy(deviceInfo->uri, serial, sizeof(deviceInfo->uri) - 1); + + #ifdef RS2_EMULATE_PRIMESENSE_HARDWARE + strncpy(deviceInfo->name, "PS1080", sizeof(deviceInfo->name) - 1); + strncpy(deviceInfo->vendor, "PrimeSense", sizeof(deviceInfo->vendor) - 1); + deviceInfo->usbVendorId = 7463; + deviceInfo->usbProductId = 1537; + #else + strncpy(deviceInfo->name, name, sizeof(deviceInfo->name) - 1); + strncpy(deviceInfo->vendor, "", sizeof(deviceInfo->vendor) - 1); + deviceInfo->usbVendorId = 0; + deviceInfo->usbProductId = 0; + #endif + + rsLogDebug("DEVICE serial=%s name=%s", serial, name); + + return ONI_STATUS_OK; +} + +//============================================================================= +// DeviceBase overrides +//============================================================================= + +OniStatus Rs2Device::getSensorInfoList(OniSensorInfo** sensors, int* numSensors) +{ + rsTraceFunc(""); + + Rs2ScopedMutex lock(m_stateMx); + + *numSensors = (int)m_sensorInfo.size(); + *sensors = ((*numSensors > 0) ? &m_sensorInfo[0] : nullptr); + + return ONI_STATUS_OK; +} + +StreamBase* Rs2Device::createStream(OniSensorType sensorType) +{ + rsTraceFunc("sensorType=%d", (int)sensorType); + + Rs2ScopedMutex lock(m_streamsMx); + + for (auto iter = m_streams.begin(); iter != m_streams.end(); ++iter) + { + Rs2Stream* streamObj = *iter; + if (streamObj->getOniType() == sensorType) + { + m_createdStreams.push_back(streamObj); + m_streams.remove(streamObj); + return streamObj; + } + } + + return nullptr; +} + +void Rs2Device::destroyStream(StreamBase* streamBase) +{ + rsTraceFunc("ptr=%p", streamBase); + + if (streamBase) + { + Rs2ScopedMutex lock(m_streamsMx); + + Rs2Stream* streamObj = (Rs2Stream*)streamBase; + streamObj->stop(); + + m_streams.push_back(streamObj); + m_createdStreams.remove(streamObj); + } +} + +OniStatus Rs2Device::invoke(int commandId, void* data, int dataSize) +{ + return ONI_STATUS_NOT_SUPPORTED; +} + +OniBool Rs2Device::isCommandSupported(int commandId) +{ + return false; +} + +OniStatus Rs2Device::tryManualTrigger() +{ + return ONI_STATUS_OK; +} + +OniBool Rs2Device::isImageRegistrationModeSupported(OniImageRegistrationMode mode) +{ + return true; +} + +//============================================================================= +// Start/Stop +//============================================================================= + +OniStatus Rs2Device::startPipeline() +{ + rsTraceFunc(""); + + for (;;) + { + if (m_pipeline) + { + rsTraceError("Already started"); + break; + } + + Rs2Error e; + + rsLogDebug("rs2_create_config"); + m_config = rs2_create_config(&e); + if (!e.success()) + { + rsTraceError("rs2_create_config failed: %s", e.get_message()); + break; + } + + rs2_config_disable_all_streams(m_config, &e); + + { + Rs2ScopedMutex lock(m_streamsMx); + + for (auto iter = m_createdStreams.begin(); iter != m_createdStreams.end(); ++iter) + { + Rs2Stream* stream = *iter; + if (stream->isEnabled()) + { + const OniVideoMode& mode = stream->getVideoMode(); + + rsLogDebug("ENABLE STREAM type=%d sensorId=%d streamId=%d %dx%d @%d", + (int)stream->getRsType(), stream->getSensorId(), stream->getStreamId(), mode.resolutionX, mode.resolutionY, mode.fps); + + rs2_config_enable_stream( + m_config, stream->getRsType(), stream->getStreamId(), + mode.resolutionX, mode.resolutionY, convertPixelFormat(mode.pixelFormat), mode.fps, &e + ); + if (!e.success()) + { + rsTraceError("rs2_config_enable_stream failed: %s", e.get_message()); + } + } + } + } + + // pipeline + + rs2_context* context = getDriver()->getRsContext(); + rsLogDebug("rs2_create_pipeline"); + m_pipeline = rs2_create_pipeline(context, &e); + if (!e.success()) + { + rsTraceError("rs2_create_pipeline failed: %s", e.get_message()); + break; + } + + rsLogDebug("rs2_pipeline_start_with_config"); + m_pipelineProfile = rs2_pipeline_start_with_config(m_pipeline, m_config, &e); + if (!e.success()) + { + rsTraceError("rs2_pipeline_start_with_config failed: %s", e.get_message()); + break; + } + + { + Rs2ScopedMutex lock(m_streamsMx); + + for (auto iter = m_createdStreams.begin(); iter != m_createdStreams.end(); ++iter) + { + Rs2Stream* stream = *iter; + if (stream->isEnabled()) + { + stream->onPipelineStarted(); + } + } + } + + // depth to color aligner + + m_alignQueue = rs2_create_frame_queue(1, &e); + if (!e.success()) + { + rsTraceError("rs2_create_frame_queue failed: %s", e.get_message()); + break; + } + + m_alignProcessor = rs2_create_align(RS2_STREAM_COLOR, &e); + if (!e.success()) + { + rsTraceError("rs2_create_align failed: %s", e.get_message()); + break; + } + + rs2_start_processing_queue(m_alignProcessor, m_alignQueue, &e); + if (!e.success()) + { + rsTraceError("rs2_start_processing_queue failed: %s", e.get_message()); + break; + } + + rsLogDebug("STARTED"); + return ONI_STATUS_OK; + } + + stopPipeline(); + return ONI_STATUS_ERROR; +} + +void Rs2Device::stopPipeline() +{ + if (m_pipeline) { rsTraceFunc(""); } + + if (m_pipeline) + { + Rs2Error e; + rsLogDebug("rs2_pipeline_stop"); + rs2_pipeline_stop(m_pipeline, &e); + } + if (m_alignProcessor) + { + rs2_delete_processing_block(m_alignProcessor); + m_alignProcessor = nullptr; + } + if (m_alignQueue) + { + rs2_delete_frame_queue(m_alignQueue); + m_alignQueue = nullptr; + } + if (m_pipelineProfile) + { + rsLogDebug("rs2_delete_pipeline_profile"); + rs2_delete_pipeline_profile(m_pipelineProfile); + m_pipelineProfile = nullptr; + } + if (m_config) + { + rsLogDebug("rs2_delete_config"); + rs2_delete_config(m_config); + m_config = nullptr; + } + if (m_pipeline) + { + rsLogDebug("rs2_delete_pipeline"); + rs2_delete_pipeline(m_pipeline); + m_pipeline = nullptr; + rsLogDebug("STOPPED"); + } +} + +void Rs2Device::restartPipeline() +{ + rsTraceFunc(""); + + stopPipeline(); + + bool hasStreams; + { + Rs2ScopedMutex lock(m_streamsMx); + hasStreams = hasEnabledStreams(); + } + + if (hasStreams && m_runFlag) + { + startPipeline(); + } +} + +//============================================================================= +// MainLoop +//============================================================================= + +void Rs2Device::mainLoop() +{ + rsTraceFunc(""); + + try + { + int configId = 0; + while (m_runFlag) + { + const int curConfigId = m_configId; + if (configId != curConfigId) // configuration changed since last tick + { + configId = curConfigId; + restartPipeline(); + } + + if (m_pipelineProfile) + { + waitForFrames(); + } + else + { + std::this_thread::sleep_for(std::chrono::milliseconds(WORKER_THREAD_IDLE_MS)); + } + } + } + catch (...) + { + rsTraceError("Unhandled exception"); + } + + stopPipeline(); +} + +void Rs2Device::updateConfiguration() +{ + rsTraceFunc(""); + + m_configId++; +} + +void Rs2Device::waitForFrames() +{ + SCOPED_PROFILER; + + Rs2Error e; + rs2_frame* frameset; + { + NAMED_PROFILER("rs2_pipeline_wait_for_frames"); + frameset = rs2_pipeline_wait_for_frames(m_pipeline, WAIT_FRAMESET_TIMEOUT_MS, &e); + } + if (!e.success()) + { + rsTraceError("rs2_pipeline_wait_for_frames failed: %s", e.get_message()); + return; + } + + const int nframes = rs2_embedded_frames_count(frameset, &e); + //rsLogDebug("frameset %llu (%d)", m_framesetId, nframes); + + if (m_registrationMode == ONI_IMAGE_REGISTRATION_DEPTH_TO_COLOR) + { + rs2_frame_add_ref(frameset, &e); + { + NAMED_PROFILER("rs2_process_frame"); + rs2_process_frame(m_alignProcessor, frameset, &e); + if (!e.success()) + { + rsTraceError("rs2_process_frame failed: %s", e.get_message()); + } + } + } + + for (int i = 0; i < nframes; ++i) + { + rs2_frame* frame = rs2_extract_frame(frameset, i, &e); + if (frame) + { + processFrame(frame); + releaseFrame(frame); + } + } + + releaseFrame(frameset); + ++m_framesetId; + + if (m_registrationMode == ONI_IMAGE_REGISTRATION_DEPTH_TO_COLOR) + { + waitAlignedDepth(); + } +} + +void Rs2Device::processFrame(rs2_frame* frame) +{ + SCOPED_PROFILER; + + Rs2StreamProfileInfo spi; + Rs2Stream* stream = getFrameStream(frame, &spi); + if (stream) + { + if (m_registrationMode == ONI_IMAGE_REGISTRATION_OFF || spi.streamType != RS2_STREAM_DEPTH) + { + OniFrame* oniFrame = createOniFrame(frame, stream, &spi); + if (oniFrame) + { + submitOniFrame(oniFrame, stream); + } + } + } +} + +void Rs2Device::waitAlignedDepth() +{ + SCOPED_PROFILER; + + Rs2Error e; + rs2_frame* frameset; + { + NAMED_PROFILER("rs2_wait_for_frame"); + frameset = rs2_wait_for_frame(m_alignQueue, WAIT_ALIGNED_DEPTH_TIMEOUT_MS, &e); + } + if (!e.success()) + { + rsTraceError("rs2_wait_for_frame failed: %s", e.get_message()); + return; + } + + const int nframes = rs2_embedded_frames_count(frameset, &e); + for (int i = 0; i < nframes; ++i) + { + rs2_frame* frame = rs2_extract_frame(frameset, i, &e); + if (frame) + { + Rs2StreamProfileInfo spi; + Rs2Stream* stream = getFrameStream(frame, &spi); + if (stream && spi.streamType == RS2_STREAM_DEPTH) + { + OniFrame* oniFrame = createOniFrame(frame, stream, &spi); + if (oniFrame) + { + submitOniFrame(oniFrame, stream); + } + } + releaseFrame(frame); + } + } + + releaseFrame(frameset); +} + +OniFrame* Rs2Device::createOniFrame(rs2_frame* frame, Rs2Stream* stream, Rs2StreamProfileInfo* spi) +{ + SCOPED_PROFILER; + + if (!frame || !stream || !stream->isEnabled() || !spi) + { + return nullptr; + } + + Rs2Error e; + OniFrame* oniFrame; + { + NAMED_PROFILER("StreamServices::acquireFrame"); + oniFrame = stream->getServices().acquireFrame(); + if (!oniFrame) + { + rsTraceError("acquireFrame failed"); + return nullptr; + } + } + + oniFrame->sensorType = stream->getOniType(); + oniFrame->timestamp = (uint64_t)(rs2_get_frame_timestamp(frame, &e) * 1000.0); // millisecond to microsecond + oniFrame->frameIndex = (int)rs2_get_frame_number(frame, &e); + + oniFrame->width = rs2_get_frame_width(frame, &e); + oniFrame->height = rs2_get_frame_height(frame, &e); + oniFrame->stride = rs2_get_frame_stride_in_bytes(frame, &e); + const size_t frameSize = oniFrame->stride * oniFrame->height; + + OniVideoMode mode; + mode.pixelFormat = convertPixelFormat(spi->format); + mode.resolutionX = oniFrame->width; + mode.resolutionY = oniFrame->height; + mode.fps = spi->framerate; + + oniFrame->videoMode = mode; + oniFrame->croppingEnabled = false; + oniFrame->cropOriginX = 0; + oniFrame->cropOriginY = 0; + + if (frameSize != oniFrame->dataSize) + { + rsTraceError("invalid frame: rsSize=%u oniSize=%u", (unsigned int)frameSize, (unsigned int)oniFrame->dataSize); + stream->getServices().releaseFrame(oniFrame); + return nullptr; + } + + const void* frameData = rs2_get_frame_data(frame, &e); + if (!e.success()) + { + rsTraceError("rs2_get_frame_data failed: %s", e.get_message()); + stream->getServices().releaseFrame(oniFrame); + return nullptr; + } + + { + NAMED_PROFILER("_copyFrameData"); + memcpy(oniFrame->data, frameData, frameSize); + } + + return oniFrame; +} + +void Rs2Device::submitOniFrame(OniFrame* oniFrame, Rs2Stream* stream) +{ + SCOPED_PROFILER; + + if (stream->getOniType() == ONI_SENSOR_DEPTH) // HACK: clamp depth to OpenNI hardcoded max value + { + NAMED_PROFILER("_clampDepth"); + uint16_t* depth = (uint16_t*)oniFrame->data; + for (int i = 0; i < oniFrame->width * oniFrame->height; ++i) + { + if (*depth >= ONI_MAX_DEPTH) { *depth = ONI_MAX_DEPTH - 1; } + ++depth; + } + } + { + NAMED_PROFILER("StreamServices::raiseNewFrame"); + stream->raiseNewFrame(oniFrame); + } + { + NAMED_PROFILER("StreamServices::releaseFrame"); + stream->getServices().releaseFrame(oniFrame); + } +} + +Rs2Stream* Rs2Device::getFrameStream(rs2_frame* frame, Rs2StreamProfileInfo* spi) +{ + SCOPED_PROFILER; + + Rs2Error e; + const rs2_stream_profile* profile = rs2_get_frame_stream_profile(frame, &e); + if (e.success()) + { + memset(spi, 0, sizeof(Rs2StreamProfileInfo)); + rs2_get_stream_profile_data(profile, &spi->streamType, &spi->format, &spi->streamId, &spi->profileId, &spi->framerate, &e); + if (e.success()) + { + OniSensorType sensorType = convertStreamType(spi->streamType); + { + Rs2ScopedMutex lock(m_streamsMx); + return findStream(sensorType, spi->streamId); + } + } + } + return nullptr; +} + +void Rs2Device::releaseFrame(rs2_frame* frame) +{ + NAMED_PROFILER("rs2_release_frame"); + rs2_release_frame(frame); +} + +//============================================================================= +// Stream initialization +//============================================================================= + +OniStatus Rs2Device::initializeStreams() +{ + rsTraceFunc(""); + + std::map sensorStreams; + + Rs2Error e; + rs2_sensor_list* sensorList = rs2_query_sensors(m_device, &e); + if (sensorList) + { + const int nsensors = rs2_get_sensors_count(sensorList, &e); + for (int sensorId = 0; sensorId < nsensors; sensorId++) + { + rsLogDebug("SENSOR %d", sensorId); + + rs2_sensor* sensor = rs2_create_sensor(sensorList, sensorId, &e); + if (sensor) + { + sensorStreams.clear(); + + rs2_stream_profile_list* profileList = rs2_get_stream_profiles(sensor, &e); + if (profileList) + { + const int nprofiles = rs2_get_stream_profiles_count(profileList, &e); + for (int profileId = 0; profileId < nprofiles; profileId++) + { + const rs2_stream_profile* profile = rs2_get_stream_profile(profileList, profileId, &e); + if (profile) + { + Rs2StreamProfileInfo spi; + spi.profile = profile; + spi.sensorId = sensorId; + rs2_get_stream_profile_data(profile, &spi.streamType, &spi.format, &spi.streamId, &spi.profileId, &spi.framerate, &e); + + if (e.success() && isSupportedStreamType(spi.streamType) && isSupportedPixelFormat(spi.format)) + { + rs2_get_video_stream_resolution(profile, &spi.width, &spi.height, &e); + if (e.success()) + { + #if 1 + rsLogDebug("\ttype=%d sensorId=%d streamId=%d profileId=%d format=%d width=%d height=%d framerate=%d", + (int)spi.streamType, (int)spi.sensorId, (int)spi.streamId, (int)spi.profileId, (int)spi.format, (int)spi.width, (int)spi.height, (int)spi.framerate); + #endif + + m_profiles.push_back(spi); + sensorStreams[spi.streamId] = spi.streamType; + } + } + } + } + rs2_delete_stream_profiles_list(profileList); + } + + for (auto iter = sensorStreams.begin(); iter != sensorStreams.end(); ++iter) + { + rsLogDebug("UNIQ streamId (%d) -> type (%d)", iter->first, (int)iter->second); + } + + for (auto iter = sensorStreams.begin(); iter != sensorStreams.end(); ++iter) + { + const OniSensorType oniType = convertStreamType(iter->second); + + std::vector profiles; + findStreamProfiles(&profiles, oniType, iter->first); + + if (addStream(sensor, oniType, sensorId, iter->first, &profiles) == ONI_STATUS_OK) + { + sensor = nullptr; + } + } + + if (sensor) { rs2_delete_sensor(sensor); } + } + } + rs2_delete_sensor_list(sensorList); + } + + rsLogDebug("FILL OniSensorInfo"); + for (auto iter = m_streams.begin(); iter != m_streams.end(); ++iter) + { + Rs2Stream* stream = *iter; + #if 1 + rsLogDebug("STREAM type=%d sensorId=%d streamId=%d", (int)stream->getRsType(), stream->getSensorId(), stream->getStreamId()); + #endif + + std::vector profiles; + findStreamProfiles(&profiles, stream->getOniType(), stream->getStreamId()); + + OniSensorInfo info; + info.sensorType = stream->getOniType(); + info.numSupportedVideoModes = (int)profiles.size(); + info.pSupportedVideoModes = nullptr; + + if (info.numSupportedVideoModes > 0) + { + info.pSupportedVideoModes = new OniVideoMode[info.numSupportedVideoModes]; + int modeId = 0; + + for (auto p = profiles.begin(); p != profiles.end(); ++p) + { + OniVideoMode& mode = info.pSupportedVideoModes[modeId]; + mode.pixelFormat = convertPixelFormat(p->format); + mode.resolutionX = p->width; + mode.resolutionY = p->height; + mode.fps = p->framerate; + modeId++; + + #if 1 + rsLogDebug("\ttype=%d sensorId=%d streamId=%d profileId=%d format=%d width=%d height=%d framerate=%d", + (int)p->streamType, (int)p->sensorId, (int)p->streamId, (int)p->profileId, (int)p->format, (int)p->width, (int)p->height, (int)p->framerate); + #endif + } + + m_sensorInfo.push_back(info); + } + } + + return ONI_STATUS_OK; +} + +OniStatus Rs2Device::addStream(rs2_sensor* sensor, OniSensorType sensorType, int sensorId, int streamId, std::vector* profiles) +{ + rsTraceFunc("type=%d sensorId=%d streamId=%d", (int)convertStreamType(sensorType), sensorId, streamId); + + Rs2Stream* streamObj = nullptr; + switch (sensorType) + { + case ONI_SENSOR_IR: streamObj = new Rs2InfraredStream(); break; + case ONI_SENSOR_COLOR: streamObj = new Rs2ColorStream(); break; + case ONI_SENSOR_DEPTH: streamObj = new Rs2DepthStream(); break; + + default: + { + rsTraceError("Invalid type=%d", (int)sensorType); + return ONI_STATUS_ERROR; + } + } + + if (streamObj->initialize(this, sensor, sensorId, streamId, profiles) != ONI_STATUS_OK) + { + rsTraceError("Rs2Stream::initialize failed"); + delete(streamObj); + return ONI_STATUS_ERROR; + } + + m_streams.push_back(streamObj); + return ONI_STATUS_OK; +} + +void Rs2Device::findStreamProfiles(std::vector* dst, OniSensorType sensorType, int streamId) +{ + const rs2_stream rsType = convertStreamType(sensorType); + + for (auto iter = m_profiles.begin(); iter != m_profiles.end(); ++iter) + { + Rs2StreamProfileInfo& p = *iter; + if (p.streamType == rsType && p.streamId == streamId) + { + dst->push_back(p); + } + } +} + +Rs2Stream* Rs2Device::findStream(OniSensorType sensorType, int streamId) +{ + for (auto iter = m_createdStreams.begin(); iter != m_createdStreams.end(); ++iter) + { + Rs2Stream* stream = *iter; + if (stream->getOniType() == sensorType && stream->getStreamId() == streamId) + { + return stream; + } + } + + return nullptr; +} + +bool Rs2Device::hasEnabledStreams() +{ + for (auto iter = m_createdStreams.begin(); iter != m_createdStreams.end(); ++iter) + { + Rs2Stream* stream = *iter; + if (stream->isEnabled()) + { + return true; + } + } + + return false; +} + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Device.h b/wrappers/openni2/src/Rs2Device.h new file mode 100755 index 0000000000..ace6926806 --- /dev/null +++ b/wrappers/openni2/src/Rs2Device.h @@ -0,0 +1,96 @@ +#pragma once + +#include "Rs2Stream.h" + +namespace oni { namespace driver { + +class Rs2Device : public DeviceBase +{ + friend class Rs2Driver; + +public: + + Rs2Device(class Rs2Driver* driver, rs2_device* device); + virtual ~Rs2Device(); + + virtual OniStatus getSensorInfoList(OniSensorInfo** sensors, int* numSensors); + virtual StreamBase* createStream(OniSensorType sensorType); + virtual void destroyStream(StreamBase* streamBase); + + virtual OniStatus setProperty(int propertyId, const void* data, int dataSize); + virtual OniStatus getProperty(int propertyId, void* data, int* dataSize); + virtual OniBool isPropertySupported(int propertyId); + + virtual OniStatus invoke(int commandId, void* data, int dataSize); + virtual OniBool isCommandSupported(int commandId); + virtual OniStatus tryManualTrigger(); + + virtual OniBool isImageRegistrationModeSupported(OniImageRegistrationMode mode); + + inline class Rs2Driver* getDriver() { return m_driver; } + inline rs2_device* getRsDevice() { return m_device; } + inline OniDeviceInfo* getInfo() { return &m_info; } + inline OniImageRegistrationMode getRegistrationMode() const { return m_registrationMode; } + + void updateConfiguration(); + +protected: + + Rs2Device(const Rs2Device&); + void operator=(const Rs2Device&); + + OniStatus initialize(); + void shutdown(); + + static OniStatus queryDeviceInfo(rs2_device* device, OniDeviceInfo* deviceInfo); + + OniStatus initializeStreams(); + OniStatus addStream(rs2_sensor* sensor, OniSensorType sensorType, int sensorId, int streamId, std::vector* profiles); + void findStreamProfiles(std::vector* dst, OniSensorType sensorType, int streamId); + Rs2Stream* findStream(OniSensorType sensorType, int streamId); + bool hasEnabledStreams(); + + OniStatus startPipeline(); + void stopPipeline(); + void restartPipeline(); + + void mainLoop(); + void waitForFrames(); + void processFrame(rs2_frame* frame); + void waitAlignedDepth(); + + OniFrame* createOniFrame(rs2_frame* frame, Rs2Stream* stream, Rs2StreamProfileInfo* spi); + void submitOniFrame(OniFrame* oniFrame, Rs2Stream* stream); + + Rs2Stream* getFrameStream(rs2_frame* frame, Rs2StreamProfileInfo* spi); + void releaseFrame(rs2_frame* frame); + +protected: + + Rs2Mutex m_stateMx; + Rs2Mutex m_streamsMx; + + class Rs2Driver* m_driver; + rs2_device* m_device; + OniImageRegistrationMode m_registrationMode; + + rs2_config* m_config; + rs2_pipeline* m_pipeline; + rs2_pipeline_profile* m_pipelineProfile; + + rs2_frame_queue* m_alignQueue; + rs2_processing_block* m_alignProcessor; + + std::unique_ptr m_thread; + volatile int m_runFlag; + volatile int m_configId; + uint64_t m_framesetId; + + OniDeviceInfo m_info; + std::vector m_profiles; + std::vector m_sensorInfo; + std::list m_streams; + std::list m_createdStreams; +}; + +}} // namespace diff --git a/wrappers/openni2/src/Rs2DeviceProps.cpp b/wrappers/openni2/src/Rs2DeviceProps.cpp new file mode 100755 index 0000000000..5e23a88222 --- /dev/null +++ b/wrappers/openni2/src/Rs2DeviceProps.cpp @@ -0,0 +1,110 @@ +#include "Rs2Driver.h" +#include "PS1080.h" + +namespace oni { namespace driver { + +OniStatus Rs2Device::setProperty(int propertyId, const void* data, int dataSize) +{ + SCOPED_PROFILER; + + rsTraceFunc("propertyId=%d dataSize=%d", propertyId, dataSize); + + switch (propertyId) + { + case ONI_DEVICE_PROPERTY_IMAGE_REGISTRATION: + { + if (data && (dataSize == sizeof(OniImageRegistrationMode))) + { + m_registrationMode = *((OniImageRegistrationMode*)data); + rsLogDebug("registrationMode=%d", (int)m_registrationMode); + //updateConfiguration(); + return ONI_STATUS_OK; + } + break; + } + + default: + { + #if defined(RS2_TRACE_NOT_SUPPORTED_PROPS) + rsTraceError("Not supported: propertyId=%d", propertyId); + #endif + return ONI_STATUS_NOT_SUPPORTED; + } + } + + rsTraceError("propertyId=%d dataSize=%d", propertyId, dataSize); + return ONI_STATUS_ERROR; +} + +OniStatus Rs2Device::getProperty(int propertyId, void* data, int* dataSize) +{ + SCOPED_PROFILER; + + switch (propertyId) + { + case ONI_DEVICE_PROPERTY_SERIAL_NUMBER: + { + if (data && dataSize && *dataSize > 0) + { + Rs2Error e; + const char* info = rs2_get_device_info(m_device, RS2_CAMERA_INFO_SERIAL_NUMBER, &e); + if (e.success()) + { + int n = snprintf((char*)data, *dataSize - 1, "%s", info); + *dataSize = n + 1; + return ONI_STATUS_OK; + } + } + break; + } + + case ONI_DEVICE_PROPERTY_IMAGE_REGISTRATION: + { + if (data && dataSize && *dataSize == sizeof(OniImageRegistrationMode)) + { + *((OniImageRegistrationMode*)data) = m_registrationMode; + return ONI_STATUS_OK; + } + break; + } + + #ifdef RS2_EMULATE_PRIMESENSE_HARDWARE + case XN_MODULE_PROPERTY_AHB: + { + if (data && dataSize && *dataSize == 12) + { + unsigned char hack[] = {0x40, 0x0, 0x0, 0x28, 0x6A, 0x26, 0x54, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF}; + memcpy(data, hack, sizeof(hack)); + return ONI_STATUS_OK; + } + break; + } + #endif + + default: + { + #if defined(RS2_TRACE_NOT_SUPPORTED_PROPS) + rsTraceError("Not supported: propertyId=%d", propertyId); + #endif + return ONI_STATUS_NOT_SUPPORTED; + } + } + + rsTraceError("propertyId=%d dataSize=%d", propertyId, *dataSize); + return ONI_STATUS_ERROR; +} + +OniBool Rs2Device::isPropertySupported(int propertyId) +{ + switch (propertyId) + { + case ONI_DEVICE_PROPERTY_SERIAL_NUMBER: + case ONI_DEVICE_PROPERTY_IMAGE_REGISTRATION: + return true; + + default: + return false; + } +} + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Driver.cpp b/wrappers/openni2/src/Rs2Driver.cpp new file mode 100755 index 0000000000..99727c2725 --- /dev/null +++ b/wrappers/openni2/src/Rs2Driver.cpp @@ -0,0 +1,278 @@ +#include "Rs2Driver.h" + +#if defined(PROF_ENABLED) +#include "Profiler.inl" +#endif + +namespace oni { namespace driver { + +Rs2Driver::Rs2Driver(OniDriverServices* driverServices) +: + DriverBase(driverServices), + m_context(nullptr) +{ + rsLogDebug("+Rs2Driver"); + INIT_PROFILER; +} + +Rs2Driver::~Rs2Driver() +{ + rsLogDebug("~Rs2Driver"); + shutdown(); + SHUT_PROFILER; +} + +OniStatus Rs2Driver::initialize( + DeviceConnectedCallback connectedCallback, + DeviceDisconnectedCallback disconnectedCallback, + DeviceStateChangedCallback deviceStateChangedCallback, + void* cookie) +{ + rsTraceFunc(""); + + for (;;) + { + Rs2ScopedMutex lock(m_stateMx); + + if (m_context) + { + rsTraceError("Already initialized"); + break; + } + + if (DriverBase::initialize(connectedCallback, disconnectedCallback, deviceStateChangedCallback, cookie) != ONI_STATUS_OK) + { + rsTraceError("DriverBase::initialize failed"); + break; + } + + Rs2Error e; + m_context = rs2_create_context(RS2_API_VERSION, &e); + if (!e.success()) + { + rsTraceError("rs2_create_context failed: %s", e.get_message()); + break; + } + + enumerateDevices(); + + rs2_set_devices_changed_callback(m_context, devicesChangedCallback, this, &e); + if (!e.success()) + { + rsTraceError("rs2_set_devices_changed_callback failed: %s", e.get_message()); + break; + } + + rsLogDebug("Rs2Driver INITIALIZED"); + return ONI_STATUS_OK; + } + + shutdown(); + return ONI_STATUS_ERROR; +} + +void Rs2Driver::shutdown() +{ + if (m_context) { rsTraceFunc(""); } + + Rs2ScopedMutex lock(m_stateMx); + + { + Rs2ScopedMutex devLock(m_devicesMx); + for (auto iter = m_devices.begin(); iter != m_devices.end(); ++iter) { delete(iter->second); } + m_devices.clear(); + } + + if (m_context) + { + rs2_delete_context(m_context); + m_context = nullptr; + } +} + +void Rs2Driver::enumerateDevices() +{ + rsTraceFunc(""); + + Rs2Error e; + rs2_device_list* deviceList = rs2_query_devices(m_context, &e); + if (!e.success()) + { + rsTraceError("rs2_query_devices failed: %s", e.get_message()); + } + else + { + devicesChanged(nullptr, deviceList); + rs2_delete_device_list(deviceList); + } +} + +void Rs2Driver::devicesChangedCallback(rs2_device_list* removed, rs2_device_list* added, void* param) +{ + ((Rs2Driver*)param)->devicesChanged(removed, added); +} + +void Rs2Driver::devicesChanged(rs2_device_list* removed, rs2_device_list* added) +{ + rsTraceFunc("removed=%p added=%p", removed, added); + + Rs2ScopedMutex lock(m_devicesMx); + Rs2Error e; + + if (removed) + { + std::list removedList; + + for (auto iter = m_devices.begin(); iter != m_devices.end(); ++iter) + { + if (rs2_device_list_contains(removed, iter->second->getRsDevice(), &e)) + { + removedList.push_back(iter->second); + } + } + + for (auto iter = removedList.begin(); iter != removedList.end(); ++iter) + { + rsLogDebug("deviceDisconnected"); + deviceDisconnected((*iter)->getInfo()); + } + } + + if (added) + { + const int count = rs2_get_device_count(added, &e); + for (int i = 0; i < count; i++) + { + rs2_device* device = rs2_create_device(added, i, &e); + if (!e.success()) + { + rsTraceError("rs2_create_device failed: %s", e.get_message()); + } + else + { + rsLogDebug("deviceConnected"); + OniDeviceInfo info; + Rs2Device::queryDeviceInfo(device, &info); + deviceConnected(&info); + rs2_delete_device(device); + } + } + } +} + +DeviceBase* Rs2Driver::deviceOpen(const char* uri, const char* mode) +{ + rsTraceFunc("uri=%s", uri); + + rs2_device_list* deviceList = nullptr; + rs2_device* device = nullptr; + Rs2Device* deviceObj = nullptr; + + for (;;) + { + Rs2ScopedMutex lock(m_devicesMx); + + if (m_devices.find(uri) != m_devices.end()) + { + rsTraceError("Already opened"); + break; + } + + Rs2Error e; + deviceList = rs2_query_devices(m_context, &e); + if (!e.success()) + { + rsTraceError("rs2_query_devices failed: %s", e.get_message()); + break; + } + + const int count = rs2_get_device_count(deviceList, &e); + for (int i = 0; i < count; i++) + { + if (device) { rs2_delete_device(device); } + + device = rs2_create_device(deviceList, i, &e); + if (!e.success()) + { + rsTraceError("rs2_create_device failed: %s", e.get_message()); + break; + } + + const char* serial = rs2_get_device_info(device, RS2_CAMERA_INFO_SERIAL_NUMBER, &e); + if (!e.success()) + { + rsTraceError("rs2_get_device_info failed: %s", e.get_message()); + break; + } + + if (strcmp(uri, serial) == 0) + { + deviceObj = new Rs2Device(this, device); + if (deviceObj->initialize() != ONI_STATUS_OK) + { + rsTraceError("Rs2Device::initialize failed"); + delete(deviceObj); + deviceObj = nullptr; + } + else + { + m_devices[serial] = deviceObj; + device = nullptr; // don't release device handle + } + break; + } + } + + break; + } + + if (device) { rs2_delete_device(device); } + if (deviceList) { rs2_delete_device_list(deviceList); } + + return deviceObj; +} + +void Rs2Driver::deviceClose(DeviceBase* deviceBase) +{ + rsTraceFunc("ptr=%p", deviceBase); + + if (deviceBase) + { + Rs2ScopedMutex lock(m_devicesMx); + + Rs2Device* deviceObj = (Rs2Device*)deviceBase; + m_devices.erase(deviceObj->getInfo()->uri); + delete(deviceObj); + } +} + +OniStatus Rs2Driver::tryDevice(const char* uri) +{ + rsTraceFunc("uri=%s", uri); + + return ONI_STATUS_ERROR; +} + +void* Rs2Driver::enableFrameSync(StreamBase** streams, int streamCount) +{ + rsTraceError("FrameSync not supported"); + + return nullptr; +} + +void Rs2Driver::disableFrameSync(void* frameSyncGroup) +{ + rsTraceError("FrameSync not supported"); +} + +#if !defined(XN_NEW) +#define XN_NEW(type, arg) new type(arg) +#endif + +#if !defined(XN_DELETE) +#define XN_DELETE(arg) delete arg +#endif + +ONI_EXPORT_DRIVER(Rs2Driver); + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Driver.h b/wrappers/openni2/src/Rs2Driver.h new file mode 100755 index 0000000000..c7efece3d0 --- /dev/null +++ b/wrappers/openni2/src/Rs2Driver.h @@ -0,0 +1,49 @@ +#pragma once + +#include "Rs2Device.h" + +namespace oni { namespace driver { + +class Rs2Driver : public DriverBase +{ +public: + + Rs2Driver(OniDriverServices* driverServices); + virtual ~Rs2Driver(); + + virtual OniStatus initialize( + DeviceConnectedCallback connectedCallback, + DeviceDisconnectedCallback disconnectedCallback, + DeviceStateChangedCallback deviceStateChangedCallback, + void* cookie); + + virtual void shutdown(); + + static void devicesChangedCallback(rs2_device_list* removed, rs2_device_list* added, void* param); + virtual void devicesChanged(rs2_device_list* removed, rs2_device_list* added); + + virtual DeviceBase* deviceOpen(const char* uri, const char* mode); + virtual void deviceClose(DeviceBase* deviceBase); + virtual OniStatus tryDevice(const char* uri); + + virtual void* enableFrameSync(StreamBase** streams, int streamCount); + virtual void disableFrameSync(void* frameSyncGroup); + + inline rs2_context* getRsContext() { return m_context; } + +protected: + + Rs2Driver(const Rs2Driver&); + void operator=(const Rs2Driver&); + + void enumerateDevices(); + +protected: + + Rs2Mutex m_stateMx; + Rs2Mutex m_devicesMx; + rs2_context* m_context; + std::map m_devices; +}; + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Stream.cpp b/wrappers/openni2/src/Rs2Stream.cpp new file mode 100755 index 0000000000..036239ea2a --- /dev/null +++ b/wrappers/openni2/src/Rs2Stream.cpp @@ -0,0 +1,212 @@ +#include "Rs2Driver.h" +#include + +namespace oni { namespace driver { + +Rs2Stream::Rs2Stream(OniSensorType sensorType) +: + m_rsType(convertStreamType(sensorType)), + m_oniType(sensorType), + m_device(nullptr), + m_sensor(nullptr), + m_sensorId(-1), + m_streamId(-1), + m_enabled(false), + m_depthScale(0), + m_fovX(0), + m_fovY(0) +{ + rsLogDebug("+Rs2Stream type=%d", (int)m_rsType); +} + +Rs2Stream::~Rs2Stream() +{ + rsLogDebug("~Rs2Stream type=%d", (int)m_rsType); + + shutdown(); +} + +OniStatus Rs2Stream::initialize(class Rs2Device* device, rs2_sensor* sensor, int sensorId, int streamId, std::vector* profiles) +{ + rsTraceFunc("type=%d sensorId=%d streamId=%d", (int)m_rsType, sensorId, streamId); + + m_device = device; + m_sensor = sensor; + m_sensorId = sensorId; + m_streamId = streamId; + m_profiles = *profiles; + + memset(&m_videoMode, 0, sizeof(m_videoMode)); + memset(&m_intrinsics, 0, sizeof(m_intrinsics)); + + if (m_oniType == ONI_SENSOR_DEPTH) m_videoMode.pixelFormat = ONI_PIXEL_FORMAT_DEPTH_1_MM; + else if (m_oniType == ONI_SENSOR_COLOR) m_videoMode.pixelFormat = ONI_PIXEL_FORMAT_RGB888; + else m_videoMode.pixelFormat = ONI_PIXEL_FORMAT_GRAY8; + + m_videoMode.resolutionX = 640; + m_videoMode.resolutionY = 480; + m_videoMode.fps = 30; + + return ONI_STATUS_OK; +} + +void Rs2Stream::shutdown() +{ + if (m_sensor) { rsTraceFunc("type=%d sensorId=%d streamId=%d", (int)m_rsType, m_sensorId, m_streamId); } + + stop(); + + if (m_sensor) + { + rs2_delete_sensor(m_sensor); + m_sensor = nullptr; + } +} + +//============================================================================= +// StreamBase overrides +//============================================================================= + +OniStatus Rs2Stream::start() +{ + if(!m_enabled) + { + rsTraceFunc("type=%d sensorId=%d streamId=%d", (int)m_rsType, m_sensorId, m_streamId); + m_enabled = true; + getDevice()->updateConfiguration(); + } + + return ONI_STATUS_OK; +} + +void Rs2Stream::stop() +{ + if (m_enabled) + { + rsTraceFunc("type=%d sensorId=%d streamId=%d", (int)m_rsType, m_sensorId, m_streamId); + m_enabled = false; + getDevice()->updateConfiguration(); + } +} + +OniStatus Rs2Stream::invoke(int commandId, void* data, int dataSize) +{ + return ONI_STATUS_NOT_SUPPORTED; +} + +OniBool Rs2Stream::isCommandSupported(int commandId) +{ + return false; +} + +OniStatus Rs2Stream::convertDepthToColorCoordinates(StreamBase* colorStream, int depthX, int depthY, OniDepthPixel depthZ, int* pColorX, int* pColorY) +{ + SCOPED_PROFILER; + + if (m_oniType != ONI_SENSOR_DEPTH) + { + rsTraceError("Invalid oniType=%d", (int)m_oniType); + return ONI_STATUS_ERROR; + } + + if (!colorStream || ((Rs2Stream*)colorStream)->getOniType() != ONI_SENSOR_COLOR) + { + rsTraceError("Invalid colorStream"); + return ONI_STATUS_ERROR; + } + + if (getDevice()->getRegistrationMode() == ONI_IMAGE_REGISTRATION_DEPTH_TO_COLOR) + { + *pColorX = depthX; + *pColorY = depthY; + } + else + { + // TODO: not sure this works correctly :D + float point[3] = {0, 0, 0}; + float pixel[2]; + pixel[0] = (float)depthX; + pixel[1] = (float)depthY; + + rs2_deproject_pixel_to_point(point, &m_intrinsics, pixel, depthZ * m_depthScale); + rs2_project_point_to_pixel(pixel, &((Rs2Stream*)colorStream)->m_intrinsics, point); + + *pColorX = (int)pixel[0]; + *pColorY = (int)pixel[1]; + } + + //rsLogDebug("depth %d %d (%d) -> color %d %d", depthX, depthY, depthZ, *pColorX, *pColorY); + + return ONI_STATUS_OK; +} + +//============================================================================= +// Internals +//============================================================================= + +void Rs2Stream::onPipelineStarted() +{ + Rs2StreamProfileInfo* spi = getCurrentProfile(); + rs2_get_video_stream_intrinsics(spi->profile, &m_intrinsics, nullptr); + rs2_fov(&m_intrinsics, &m_fovX); + + if (m_oniType == ONI_SENSOR_DEPTH) + { + m_depthScale = rs2_get_option((const rs2_options*)m_sensor, RS2_OPTION_DEPTH_UNITS, nullptr); + } + else + { + m_depthScale = 0; + } + + rsLogDebug("type=%d sensorId=%d streamId=%d fovX=%f fovY=%f depthScale=%f", + (int)m_rsType, m_sensorId, m_streamId, m_fovX, m_fovY, m_depthScale); +} + +Rs2StreamProfileInfo* Rs2Stream::getCurrentProfile() +{ + SCOPED_PROFILER; + + rs2_format pixelFormat = convertPixelFormat(m_videoMode.pixelFormat); + + for (auto iter = m_profiles.begin(); iter != m_profiles.end(); ++iter) + { + Rs2StreamProfileInfo& sp = *iter; + + if (sp.streamType == m_rsType + && sp.format == pixelFormat + && sp.width == m_videoMode.resolutionX + && sp.height == m_videoMode.resolutionY + && sp.framerate == m_videoMode.fps) + { + return &sp; + } + } + + return nullptr; +} + +bool Rs2Stream::isVideoModeSupported(OniVideoMode* reqMode) +{ + SCOPED_PROFILER; + + rs2_format pixelFormat = convertPixelFormat(reqMode->pixelFormat); + + for (auto iter = m_profiles.begin(); iter != m_profiles.end(); ++iter) + { + const Rs2StreamProfileInfo& sp = *iter; + + if (sp.streamType == m_rsType + && sp.format == pixelFormat + && sp.width == reqMode->resolutionX + && sp.height == reqMode->resolutionY + && sp.framerate == reqMode->fps) + { + return true; + } + } + + return false; +} + +}} // namespace diff --git a/wrappers/openni2/src/Rs2Stream.h b/wrappers/openni2/src/Rs2Stream.h new file mode 100755 index 0000000000..47d5eff5ce --- /dev/null +++ b/wrappers/openni2/src/Rs2Stream.h @@ -0,0 +1,99 @@ +#pragma once + +#include "Rs2Base.h" + +namespace oni { namespace driver { + +struct Rs2StreamProfileInfo +{ + const rs2_stream_profile* profile; + int sensorId; + int profileId; + int streamId; + rs2_stream streamType; + rs2_format format; + int stride; + int width; + int height; + int framerate; +}; + +class Rs2Stream : public StreamBase +{ + friend class Rs2Device; + +public: + + Rs2Stream(OniSensorType sensorType); + virtual ~Rs2Stream(); + + virtual OniStatus setProperty(int propertyId, const void* data, int dataSize); + virtual OniStatus getProperty(int propertyId, void* data, int* dataSize); + virtual OniBool isPropertySupported(int propertyId); + + virtual OniStatus invoke(int commandId, void* data, int dataSize); + virtual OniBool isCommandSupported(int commandId); + + virtual OniStatus start(); + virtual void stop(); + + virtual OniStatus convertDepthToColorCoordinates(StreamBase* colorStream, int depthX, int depthY, OniDepthPixel depthZ, int* pColorX, int* pColorY); + + inline class Rs2Device* getDevice() { return m_device; } + inline rs2_stream getRsType() const { return m_rsType; } + inline OniSensorType getOniType() const { return m_oniType; } + inline int getSensorId() const { return m_sensorId; } + inline int getStreamId() const { return m_streamId; } + inline const OniVideoMode& getVideoMode() const { return m_videoMode; } + inline bool isEnabled() const { return m_enabled; } + +protected: + + Rs2Stream(const Rs2Stream&); + void operator=(const Rs2Stream&); + + OniStatus initialize(class Rs2Device* device, rs2_sensor* sensor, int sensorId, int streamId, std::vector* profiles); + void shutdown(); + + void onPipelineStarted(); + Rs2StreamProfileInfo* getCurrentProfile(); + bool isVideoModeSupported(OniVideoMode* reqMode); + +protected: + + rs2_stream m_rsType; + OniSensorType m_oniType; + + class Rs2Device* m_device; + rs2_sensor* m_sensor; + int m_sensorId; + int m_streamId; + bool m_enabled; + + std::vector m_profiles; + OniVideoMode m_videoMode; + rs2_intrinsics m_intrinsics; + float m_depthScale; + float m_fovX; + float m_fovY; +}; + +class Rs2DepthStream : public Rs2Stream +{ +public: + Rs2DepthStream() : Rs2Stream(ONI_SENSOR_DEPTH) {} +}; + +class Rs2ColorStream : public Rs2Stream +{ +public: + Rs2ColorStream() : Rs2Stream(ONI_SENSOR_COLOR) {} +}; + +class Rs2InfraredStream : public Rs2Stream +{ +public: + Rs2InfraredStream() : Rs2Stream(ONI_SENSOR_IR) {} +}; + +}} // namespace diff --git a/wrappers/openni2/src/Rs2StreamProps.cpp b/wrappers/openni2/src/Rs2StreamProps.cpp new file mode 100755 index 0000000000..b60ef9e947 --- /dev/null +++ b/wrappers/openni2/src/Rs2StreamProps.cpp @@ -0,0 +1,411 @@ +#include "Rs2Driver.h" +#include "PS1080.h" +#include "D2S.h" +#include "S2D.h" + +static const unsigned long long GAIN_VAL = 42; +static const unsigned long long CONST_SHIFT_VAL = 200; +static const unsigned long long MAX_SHIFT_VAL = 2047; +static const unsigned long long PARAM_COEFF_VAL = 4; +static const unsigned long long SHIFT_SCALE_VAL = 10; +static const unsigned long long ZERO_PLANE_DISTANCE_VAL = 120; +static const double ZERO_PLANE_PIXEL_SIZE_VAL = 0.10520000010728836; +static const double EMITTER_DCMOS_DISTANCE_VAL = 7.5; + +namespace oni { namespace driver { + +OniStatus Rs2Stream::setProperty(int propertyId, const void* data, int dataSize) +{ + SCOPED_PROFILER; + + rsTraceFunc("propertyId=%d dataSize=%d", propertyId, dataSize); + + switch (propertyId) + { + case ONI_STREAM_PROPERTY_VIDEO_MODE: + { + if (data && (dataSize == sizeof(OniVideoMode))) + { + OniVideoMode* mode = (OniVideoMode*)data; + rsLogDebug("set video mode: %dx%d @%d format=%d", + (int)mode->resolutionX, (int)mode->resolutionY, (int)mode->fps, (int)mode->pixelFormat); + + if (isVideoModeSupported(mode)) + { + m_videoMode = *mode; + return ONI_STATUS_OK; + } + } + break; + } + + case ONI_STREAM_PROPERTY_AUTO_WHITE_BALANCE: + { + if (data && dataSize == sizeof(OniBool) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = (float)*((OniBool*)data); + rs2_set_option((const rs2_options*)m_sensor, RS2_OPTION_ENABLE_AUTO_WHITE_BALANCE, value, &e); + if (e.success()) return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_AUTO_EXPOSURE: + { + if (data && dataSize == sizeof(OniBool) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = (float)*((OniBool*)data); + rs2_set_option((const rs2_options*)m_sensor, RS2_OPTION_ENABLE_AUTO_EXPOSURE, value, &e); + if (e.success()) return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_EXPOSURE: + { + if (data && dataSize == sizeof(int) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = (float)*((int*)data); + rs2_set_option((const rs2_options*)m_sensor, RS2_OPTION_EXPOSURE, value, &e); + if (e.success()) return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_GAIN: + { + if (data && dataSize == sizeof(int) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = (float)*((int*)data); + rs2_set_option((const rs2_options*)m_sensor, RS2_OPTION_GAIN, value, &e); + if (e.success()) return ONI_STATUS_OK; + } + break; + } + + default: + { + #if defined(RS2_TRACE_NOT_SUPPORTED_PROPS) + rsTraceError("Not supported: propertyId=%d", propertyId); + #endif + return ONI_STATUS_NOT_SUPPORTED; + } + } + + rsTraceError("propertyId=%d dataSize=%d", propertyId, dataSize); + return ONI_STATUS_ERROR; +} + +OniStatus Rs2Stream::getProperty(int propertyId, void* data, int* dataSize) +{ + SCOPED_PROFILER; + + switch (propertyId) + { + case ONI_STREAM_PROPERTY_CROPPING: + { + if (data && dataSize && *dataSize == sizeof(OniCropping)) + { + OniCropping value; + value.enabled = false; + value.originX = 0; + value.originY = 0; + value.width = m_videoMode.resolutionX; + value.height = m_videoMode.resolutionY; + *((OniCropping*)data) = value; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_HORIZONTAL_FOV: + { + if (data && dataSize && *dataSize == sizeof(float)) + { + *((float*)data) = m_fovX * 0.01745329251994329576923690768489f; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_VERTICAL_FOV: + { + if (data && dataSize && *dataSize == sizeof(float)) + { + *((float*)data) = m_fovY * 0.01745329251994329576923690768489f; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_VIDEO_MODE: + { + if (data && dataSize && *dataSize == sizeof(OniVideoMode)) + { + *((OniVideoMode*)data) = m_videoMode; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_MAX_VALUE: + { + if (data && dataSize && *dataSize == sizeof(int) && m_oniType == ONI_SENSOR_DEPTH) + { + *((int*)data) = ONI_MAX_DEPTH; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_MIN_VALUE: + { + if (data && dataSize && *dataSize == sizeof(int) && m_oniType == ONI_SENSOR_DEPTH) + { + *((int*)data) = 0; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_STRIDE: + { + if (data && dataSize && *dataSize == sizeof(int)) + { + *((int*)data) = m_videoMode.resolutionX * getPixelFormatBytes(convertPixelFormat(m_videoMode.pixelFormat)); + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_MIRRORING: + { + if (data && dataSize && *dataSize == sizeof(OniBool)) + { + *((OniBool*)data) = false; + return ONI_STATUS_OK; + } + break; + } + + case ONI_STREAM_PROPERTY_AUTO_WHITE_BALANCE: + { + if (data && dataSize && *dataSize == sizeof(OniBool) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = rs2_get_option((const rs2_options*)m_sensor, RS2_OPTION_ENABLE_AUTO_WHITE_BALANCE, &e); + if (e.success()) + { + *((OniBool*)data) = (int)value ? true : false; + return ONI_STATUS_OK; + } + } + break; + } + + case ONI_STREAM_PROPERTY_AUTO_EXPOSURE: + { + if (data && dataSize && *dataSize == sizeof(OniBool) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = rs2_get_option((const rs2_options*)m_sensor, RS2_OPTION_ENABLE_AUTO_EXPOSURE, &e); + if (e.success()) + { + *((OniBool*)data) = (int)value ? true : false; + return ONI_STATUS_OK; + } + } + break; + } + + case ONI_STREAM_PROPERTY_EXPOSURE: + { + if (data && dataSize && *dataSize == sizeof(int) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = rs2_get_option((const rs2_options*)m_sensor, RS2_OPTION_EXPOSURE, &e); + if (e.success()) + { + *((int*)data) = (int)value; + return ONI_STATUS_OK; + } + } + break; + } + + case ONI_STREAM_PROPERTY_GAIN: + { + if (data && dataSize && *dataSize == sizeof(int) && m_oniType == ONI_SENSOR_COLOR) + { + Rs2Error e; + float value = rs2_get_option((const rs2_options*)m_sensor, RS2_OPTION_GAIN, &e); + if (e.success()) + { + *((int*)data) = (int)value; + return ONI_STATUS_OK; + } + } + break; + } + + case XN_STREAM_PROPERTY_GAIN: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = GAIN_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_CONST_SHIFT: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = CONST_SHIFT_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_MAX_SHIFT: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = MAX_SHIFT_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_PARAM_COEFF: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = PARAM_COEFF_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_SHIFT_SCALE: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = SHIFT_SCALE_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE: + { + if (data && dataSize && *dataSize == sizeof(unsigned long long) && m_oniType == ONI_SENSOR_DEPTH) + { + *((unsigned long long*)data) = ZERO_PLANE_DISTANCE_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_ZERO_PLANE_PIXEL_SIZE: + { + if (data && dataSize && *dataSize == sizeof(double) && m_oniType == ONI_SENSOR_DEPTH) + { + *((double*)data) = ZERO_PLANE_PIXEL_SIZE_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE: + { + if (data && dataSize && *dataSize == sizeof(double) && m_oniType == ONI_SENSOR_DEPTH) + { + *((double*)data) = EMITTER_DCMOS_DISTANCE_VAL; + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_S2D_TABLE: + { + if (data && dataSize && *dataSize >= sizeof(S2D) && m_oniType == ONI_SENSOR_DEPTH) + { + memcpy(data, S2D, sizeof(S2D)); + *dataSize = sizeof(S2D); + return ONI_STATUS_OK; + } + break; + } + + case XN_STREAM_PROPERTY_D2S_TABLE: + { + if (data && dataSize && *dataSize >= sizeof(D2S) && m_oniType == ONI_SENSOR_DEPTH) + { + memcpy(data, D2S, sizeof(D2S)); + *dataSize = sizeof(D2S); + return ONI_STATUS_OK; + } + break; + } + + default: + { + #if defined(RS2_TRACE_NOT_SUPPORTED_PROPS) + rsTraceError("Not supported: propertyId=%d", propertyId); + #endif + return ONI_STATUS_NOT_SUPPORTED; + } + } + + rsTraceError("propertyId=%d dataSize=%d", propertyId, *dataSize); + return ONI_STATUS_ERROR; +} + +OniBool Rs2Stream::isPropertySupported(int propertyId) +{ + switch (propertyId) + { + case ONI_STREAM_PROPERTY_CROPPING: // OniCropping* + case ONI_STREAM_PROPERTY_HORIZONTAL_FOV: // float: radians + case ONI_STREAM_PROPERTY_VERTICAL_FOV: // float: radians + case ONI_STREAM_PROPERTY_VIDEO_MODE: // OniVideoMode* + case ONI_STREAM_PROPERTY_MAX_VALUE: // int + case ONI_STREAM_PROPERTY_MIN_VALUE: // int + case ONI_STREAM_PROPERTY_STRIDE: // int + case ONI_STREAM_PROPERTY_MIRRORING: // OniBool + return true; + + + case ONI_STREAM_PROPERTY_NUMBER_OF_FRAMES: // int + return false; + + case ONI_STREAM_PROPERTY_AUTO_WHITE_BALANCE: // OniBool + case ONI_STREAM_PROPERTY_AUTO_EXPOSURE: // OniBool + case ONI_STREAM_PROPERTY_EXPOSURE: // int + case ONI_STREAM_PROPERTY_GAIN: // int + return true; + + case XN_STREAM_PROPERTY_GAIN: + case XN_STREAM_PROPERTY_CONST_SHIFT: + case XN_STREAM_PROPERTY_MAX_SHIFT: + case XN_STREAM_PROPERTY_PARAM_COEFF: + case XN_STREAM_PROPERTY_SHIFT_SCALE: + case XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE: + case XN_STREAM_PROPERTY_ZERO_PLANE_PIXEL_SIZE: + case XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE: + case XN_STREAM_PROPERTY_S2D_TABLE: + case XN_STREAM_PROPERTY_D2S_TABLE: + return true; + + default: + return false; + } +} + +}} // namespace diff --git a/wrappers/openni2/src/S2D.h b/wrappers/openni2/src/S2D.h new file mode 100755 index 0000000000..ab90f3a173 --- /dev/null +++ b/wrappers/openni2/src/S2D.h @@ -0,0 +1,207 @@ +const uint16_t S2D[] = { +0, 315, 315, 315, 316, 316, 316, 316, 317, 317, +317, 318, 318, 318, 319, 319, 319, 319, 320, 320, +320, 321, 321, 321, 322, 322, 322, 322, 323, 323, +323, 324, 324, 324, 325, 325, 325, 326, 326, 326, +326, 327, 327, 327, 328, 328, 328, 329, 329, 329, +330, 330, 330, 331, 331, 331, 332, 332, 332, 332, +333, 333, 333, 334, 334, 334, 335, 335, 335, 336, +336, 336, 337, 337, 337, 338, 338, 338, 339, 339, +339, 340, 340, 340, 341, 341, 341, 342, 342, 343, +343, 343, 344, 344, 344, 345, 345, 345, 346, 346, +346, 347, 347, 347, 348, 348, 348, 349, 349, 350, +350, 350, 351, 351, 351, 352, 352, 352, 353, 353, +354, 354, 354, 355, 355, 355, 356, 356, 356, 357, +357, 358, 358, 358, 359, 359, 359, 360, 360, 361, +361, 361, 362, 362, 363, 363, 363, 364, 364, 364, +365, 365, 366, 366, 366, 367, 367, 368, 368, 368, +369, 369, 370, 370, 370, 371, 371, 372, 372, 372, +373, 373, 374, 374, 374, 375, 375, 376, 376, 377, +377, 377, 378, 378, 379, 379, 379, 380, 380, 381, +381, 382, 382, 382, 383, 383, 384, 384, 385, 385, +385, 386, 386, 387, 387, 388, 388, 389, 389, 389, +390, 390, 391, 391, 392, 392, 393, 393, 393, 394, +394, 395, 395, 396, 396, 397, 397, 398, 398, 398, +399, 399, 400, 400, 401, 401, 402, 402, 403, 403, +404, 404, 405, 405, 406, 406, 407, 407, 408, 408, +409, 409, 409, 410, 410, 411, 411, 412, 412, 413, +413, 414, 414, 415, 415, 416, 416, 417, 418, 418, +419, 419, 420, 420, 421, 421, 422, 422, 423, 423, +424, 424, 425, 425, 426, 426, 427, 427, 428, 429, +429, 430, 430, 431, 431, 432, 432, 433, 433, 434, +435, 435, 436, 436, 437, 437, 438, 438, 439, 440, +440, 441, 441, 442, 442, 443, 444, 444, 445, 445, +446, 446, 447, 448, 448, 449, 449, 450, 451, 451, +452, 452, 453, 454, 454, 455, 455, 456, 457, 457, +458, 458, 459, 460, 460, 461, 462, 462, 463, 463, +464, 465, 465, 466, 467, 467, 468, 468, 469, 470, +470, 471, 472, 472, 473, 474, 474, 475, 476, 476, +477, 478, 478, 479, 480, 480, 481, 482, 482, 483, +484, 484, 485, 486, 487, 487, 488, 489, 489, 490, +491, 491, 492, 493, 494, 494, 495, 496, 496, 497, +498, 499, 499, 500, 501, 502, 502, 503, 504, 504, +505, 506, 507, 507, 508, 509, 510, 511, 511, 512, +513, 514, 514, 515, 516, 517, 517, 518, 519, 520, +521, 521, 522, 523, 524, 525, 525, 526, 527, 528, +529, 529, 530, 531, 532, 533, 534, 534, 535, 536, +537, 538, 539, 540, 540, 541, 542, 543, 544, 545, +546, 546, 547, 548, 549, 550, 551, 552, 553, 554, +554, 555, 556, 557, 558, 559, 560, 561, 562, 563, +564, 565, 565, 566, 567, 568, 569, 570, 571, 572, +573, 574, 575, 576, 577, 578, 579, 580, 581, 582, +583, 584, 585, 586, 587, 588, 589, 590, 591, 592, +593, 594, 595, 596, 597, 598, 599, 600, 601, 602, +603, 604, 606, 607, 608, 609, 610, 611, 612, 613, +614, 615, 616, 618, 619, 620, 621, 622, 623, 624, +625, 627, 628, 629, 630, 631, 632, 634, 635, 636, +637, 638, 640, 641, 642, 643, 644, 646, 647, 648, +649, 650, 652, 653, 654, 655, 657, 658, 659, 661, +662, 663, 664, 666, 667, 668, 670, 671, 672, 674, +675, 676, 678, 679, 680, 682, 683, 684, 686, 687, +688, 690, 691, 693, 694, 696, 697, 698, 700, 701, +703, 704, 706, 707, 708, 710, 711, 713, 714, 716, +717, 719, 720, 722, 723, 725, 727, 728, 730, 731, +733, 734, 736, 738, 739, 741, 742, 744, 746, 747, +749, 750, 752, 754, 755, 757, 759, 761, 762, 764, +766, 767, 769, 771, 773, 774, 776, 778, 780, 781, +783, 785, 787, 789, 790, 792, 794, 796, 798, 800, +802, 803, 805, 807, 809, 811, 813, 815, 817, 819, +821, 823, 825, 827, 829, 831, 833, 835, 837, 839, +841, 843, 845, 847, 849, 851, 854, 856, 858, 860, +862, 864, 867, 869, 871, 873, 875, 878, 880, 882, +885, 887, 889, 891, 894, 896, 898, 901, 903, 906, +908, 910, 913, 915, 918, 920, 923, 925, 928, 930, +933, 935, 938, 940, 943, 946, 948, 951, 954, 956, +959, 962, 964, 967, 970, 973, 975, 978, 981, 984, +987, 989, 992, 995, 998, 1001, 1004, 1007, 1010, 1013, +1016, 1019, 1022, 1025, 1028, 1031, 1034, 1038, 1041, 1044, +1047, 1050, 1054, 1057, 1060, 1063, 1067, 1070, 1073, 1077, +1080, 1084, 1087, 1090, 1094, 1097, 1101, 1105, 1108, 1112, +1115, 1119, 1123, 1126, 1130, 1134, 1138, 1141, 1145, 1149, +1153, 1157, 1161, 1165, 1169, 1173, 1177, 1181, 1185, 1189, +1193, 1197, 1202, 1206, 1210, 1214, 1219, 1223, 1227, 1232, +1236, 1241, 1245, 1250, 1255, 1259, 1264, 1268, 1273, 1278, +1283, 1288, 1292, 1297, 1302, 1307, 1312, 1317, 1322, 1328, +1333, 1338, 1343, 1349, 1354, 1359, 1365, 1370, 1376, 1381, +1387, 1392, 1398, 1404, 1410, 1415, 1421, 1427, 1433, 1439, +1445, 1452, 1458, 1464, 1470, 1477, 1483, 1489, 1496, 1503, +1509, 1516, 1523, 1529, 1536, 1543, 1550, 1557, 1564, 1572, +1579, 1586, 1594, 1601, 1609, 1616, 1624, 1632, 1639, 1647, +1655, 1663, 1671, 1680, 1688, 1696, 1705, 1713, 1722, 1731, +1739, 1748, 1757, 1766, 1776, 1785, 1794, 1804, 1813, 1823, +1833, 1843, 1853, 1863, 1873, 1883, 1894, 1904, 1915, 1926, +1936, 1947, 1959, 1970, 1981, 1993, 2005, 2016, 2028, 2040, +2053, 2065, 2078, 2090, 2103, 2116, 2129, 2143, 2156, 2170, +2184, 2198, 2212, 2226, 2241, 2256, 2271, 2286, 2301, 2317, +2333, 2349, 2365, 2381, 2398, 2415, 2432, 2450, 2467, 2485, +2503, 2522, 2541, 2560, 2579, 2598, 2618, 2639, 2659, 2680, +2701, 2723, 2744, 2767, 2789, 2812, 2835, 2859, 2883, 2908, +2933, 2958, 2984, 3010, 3037, 3064, 3092, 3120, 3149, 3178, +3208, 3238, 3269, 3300, 3333, 3365, 3399, 3433, 3468, 3503, +3539, 3576, 3614, 3653, 3692, 3732, 3774, 3816, 3859, 3903, +3948, 3994, 4041, 4089, 4139, 4190, 4241, 4295, 4349, 4405, +4463, 4522, 4582, 4645, 4708, 4774, 4842, 4911, 4983, 5056, +5132, 5210, 5291, 5374, 5460, 5548, 5640, 5734, 5832, 5933, +6038, 6146, 6259, 6375, 6497, 6622, 6753, 6889, 7030, 7178, +7332, 7492, 7660, 7835, 8019, 8212, 8413, 8626, 8849, 9084, +9331, 9593, 9870, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0}; +