diff --git a/.github/workflows/cd_main.yml b/.github/workflows/cd_main.yml index 71a5eb0..4cf3f5c 100644 --- a/.github/workflows/cd_main.yml +++ b/.github/workflows/cd_main.yml @@ -59,7 +59,7 @@ jobs: - name: Configure if: runner.os != 'Linux' shell: bash - run: cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install ${{matrix.platform.flags}} ${{matrix.config.flags}} + run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install ${{matrix.platform.flags}} ${{matrix.config.flags}} - name: Build Linux if: runner.os == 'Linux' diff --git a/CMakeLists.txt b/CMakeLists.txt index 65ba750..1ecbe1b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -492,7 +492,6 @@ if(USE_FTD2XX_FOR_NEW_DS_LOOPY) endif() set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - # search headers and libraries in the target environment set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) @@ -505,10 +504,10 @@ set(OUTPUT_NAME cc3dsfs) if(MSVC) set_source_files_properties(source/conversions.cpp PROPERTIES COMPILE_OPTIONS "$<$:/O2>") else() - set_source_files_properties(source/conversions.cpp PROPERTIES COMPILE_OPTIONS "$<$:-O3>") + set_source_files_properties(source/conversions.cpp PROPERTIES COMPILE_OPTIONS "$<$:-O3;-funroll-loops>") endif() -add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/WindowScreen_Menu.cpp source/devicecapture.cpp source/conversions.cpp source/ExtraButtons.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.cpp source/Menus/StatusMenu.cpp source/Menus/LicenseMenu.cpp source/WindowCommands.cpp source/Menus/ShortcutMenu.cpp source/Menus/ActionSelectionMenu.cpp source/Menus/ScalingRatioMenu.cpp source/Menus/ISNitroMenu.cpp source/Menus/VideoEffectsMenu.cpp source/CaptureDataBuffers.cpp source/Menus/InputMenu.cpp source/Menus/AudioDeviceMenu.cpp source/Menus/SeparatorMenu.cpp source/Menus/ColorCorrectionMenu.cpp source/Menus/Main3DMenu.cpp source/Menus/SecondScreen3DRelativePositionMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp ${TOOLS_DATA_DIR}/shaders_list.cpp ${SOURCE_CPP_EXTRA_FILES}) +add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/WindowScreen_Menu.cpp source/devicecapture.cpp source/conversions.cpp source/ExtraButtons.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.cpp source/Menus/StatusMenu.cpp source/Menus/LicenseMenu.cpp source/WindowCommands.cpp source/Menus/ShortcutMenu.cpp source/Menus/ActionSelectionMenu.cpp source/Menus/ScalingRatioMenu.cpp source/Menus/ISNitroMenu.cpp source/Menus/VideoEffectsMenu.cpp source/CaptureDataBuffers.cpp source/Menus/InputMenu.cpp source/Menus/AudioDeviceMenu.cpp source/Menus/SeparatorMenu.cpp source/Menus/ColorCorrectionMenu.cpp source/Menus/Main3DMenu.cpp source/Menus/SecondScreen3DRelativePositionMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp ${TOOLS_DATA_DIR}/shaders_list.cpp ${SOURCE_CPP_EXTRA_FILES}) if(NOT ("${EXTRA_DEPENDENCIES}" STREQUAL "")) add_dependencies(${OUTPUT_NAME} ${EXTRA_DEPENDENCIES}) diff --git a/README.md b/README.md index 0ad591f..3309cab 100755 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ On Windows, you may need to install the Visual C++ Redistributable set of librar To compile the program, assuming CMake, git and g++ are installed on the system, this is the command which should be launched: ``` -cmake -B build ; cmake --build build --config Release +cmake -B build -DCMAKE_BUILD_TYPE=Release ; cmake --build build --config Release ``` This will download FTD3XX, FTD2XX, libusb and SFML, which may take a while during the first execution of the command. Later runs should be much faster. @@ -69,7 +69,7 @@ On MacOS, you may also be prompted to install the Apple Command Line Developer T When compiling on a Raspberry Pi, to enable usage of GPIO, use: ``` -cmake -B build -DRASPBERRY_PI_COMPILATION=TRUE ; cmake --build build --config Release +cmake -B build -DCMAKE_BUILD_TYPE=Release -DRASPBERRY_PI_COMPILATION=TRUE ; cmake --build build --config Release ``` ### Docker Compilation diff --git a/docker-scripts/docker_build_base b/docker-scripts/docker_build_base index d39e9e3..3769574 100644 --- a/docker-scripts/docker_build_base +++ b/docker-scripts/docker_build_base @@ -1,7 +1,7 @@ #!/bin/sh export LANG=C.UTF-8 -cmake -S . -B $1 $2 +cmake -S . -B $1 -DCMAKE_BUILD_TYPE=Release $2 cmake --build $1 --config Release -j cd $1 cpack -G ZIP diff --git a/source/conversions.cpp b/source/conversions.cpp index 17be0ce..473a0a8 100755 --- a/source/conversions.cpp +++ b/source/conversions.cpp @@ -9,83 +9,39 @@ #define OPTIMIZE_AUDIO_BUFFER_MAX_SIZE 0x200 +#define INTERLEAVED_RGB565_PIXEL_NUM 4 +#define INTERLEAVED_RGB565_PIXEL_SIZE 2 +#define INTERLEAVED_RGB565_DATA_SIZE sizeof(uint16_t) +#define INTERLEAVED_RGB565_TOTAL_SIZE (INTERLEAVED_RGB565_PIXEL_SIZE * INTERLEAVED_RGB565_PIXEL_NUM / INTERLEAVED_RGB565_DATA_SIZE) + +#define INTERLEAVED_RGB888_PIXEL_NUM 4 +#define INTERLEAVED_RGB888_PIXEL_SIZE 3 +#define INTERLEAVED_RGB888_DATA_SIZE sizeof(uint16_t) +#define INTERLEAVED_RGB888_TOTAL_SIZE (INTERLEAVED_RGB888_PIXEL_SIZE * INTERLEAVED_RGB888_PIXEL_NUM / INTERLEAVED_RGB888_DATA_SIZE) + struct interleaved_rgb565_pixels { - uint16_t bottom_first; - uint16_t top_first; - uint16_t bottom_second; - uint16_t top_second; - uint16_t bottom_third; - uint16_t top_third; - uint16_t bottom_fourth; - uint16_t top_fourth; + uint16_t pixels[INTERLEAVED_RGB565_TOTAL_SIZE][2]; }; -struct ALIGNED(8) interleaved_3d_rgb565_pixels { - uint16_t bottom_first; - uint16_t top_l_first; - uint16_t top_r_first; - uint16_t bottom_second; - uint16_t top_l_second; - uint16_t top_r_second; - uint16_t bottom_third; - uint16_t top_l_third; - uint16_t top_r_third; - uint16_t bottom_fourth; - uint16_t top_l_fourth; - uint16_t top_r_fourth; +struct ALIGNED(INTERLEAVED_RGB565_PIXEL_NUM * INTERLEAVED_RGB565_PIXEL_SIZE) interleaved_3d_rgb565_pixels { + uint16_t pixels[INTERLEAVED_RGB565_TOTAL_SIZE][3]; }; struct deinterleaved_rgb565_pixels { - uint64_t first : 16; - uint64_t second : 16; - uint64_t third : 16; - uint64_t fourth : 16; + uint16_t pixels[INTERLEAVED_RGB565_TOTAL_SIZE]; }; -struct ALIGNED(8) interleaved_rgb888_u16_pixels { - uint16_t bottom_first; - uint16_t top_first; - uint16_t bottom_second; - uint16_t top_second; - uint16_t bottom_third; - uint16_t top_third; - uint16_t bottom_fourth; - uint16_t top_fourth; - uint16_t bottom_fifth; - uint16_t top_fifth; - uint16_t bottom_sixth; - uint16_t top_sixth; +struct ALIGNED(INTERLEAVED_RGB888_PIXEL_NUM * 2) interleaved_rgb888_u16_pixels { + uint16_t pixels[INTERLEAVED_RGB888_TOTAL_SIZE][2]; }; -struct ALIGNED(4) interleaved_3d_rgb888_u16_pixels { - uint16_t bottom_first; - uint16_t top_l_first; - uint16_t top_r_first; - uint16_t bottom_second; - uint16_t top_l_second; - uint16_t top_r_second; - uint16_t bottom_third; - uint16_t top_l_third; - uint16_t top_r_third; - uint16_t bottom_fourth; - uint16_t top_l_fourth; - uint16_t top_r_fourth; - uint16_t bottom_fifth; - uint16_t top_l_fifth; - uint16_t top_r_fifth; - uint16_t bottom_sixth; - uint16_t top_l_sixth; - uint16_t top_r_sixth; +struct ALIGNED(INTERLEAVED_RGB888_PIXEL_NUM) interleaved_3d_rgb888_u16_pixels { + uint16_t pixels[INTERLEAVED_RGB888_TOTAL_SIZE][3]; }; -struct ALIGNED(4) deinterleaved_rgb888_u16_pixels { +struct ALIGNED(INTERLEAVED_RGB888_PIXEL_NUM) deinterleaved_rgb888_u16_pixels { // 4 pixels - uint16_t first; - uint16_t second; - uint16_t third; - uint16_t fourth; - uint16_t fifth; - uint16_t sixth; + uint16_t pixels[INTERLEAVED_RGB888_TOTAL_SIZE]; }; struct twl_16bit_pixels { @@ -124,311 +80,265 @@ static inline uint16_t _reverse_endianness(uint16_t data) { static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptLE(deinterleaved_rgb565_pixels* out_ptr_top, deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_top[output_halfline_pixel].first = in_ptr[input_halfline_pixel].top_first; - out_ptr_top[output_halfline_pixel].second = in_ptr[input_halfline_pixel].top_second; - out_ptr_top[output_halfline_pixel].third = in_ptr[input_halfline_pixel].top_third; - out_ptr_top[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].top_fourth; + const int bottom_pos = 0; + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_pos]; } } static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptLEMonoTop(deinterleaved_rgb565_pixels* out_ptr_top, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_top[output_halfline_pixel].first = in_ptr[input_halfline_pixel].top_first; - out_ptr_top[output_halfline_pixel].second = in_ptr[input_halfline_pixel].top_second; - out_ptr_top[output_halfline_pixel].third = in_ptr[input_halfline_pixel].top_third; - out_ptr_top[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].top_fourth; + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_pos]; } } static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptLEMonoBottom(deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].bottom_fourth; + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptLE(deinterleaved_rgb565_pixels* out_ptr_top_l, deinterleaved_rgb565_pixels* out_ptr_top_r, deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { //de-interleave pixels - const size_t output_halfline_pos = output_halfline * num_iters; - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; + const int bottom_pos = 0; + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_bottom = output_halfline_pos + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_bottom[output_halfline_pixel_bottom].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel_bottom].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel_bottom].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel_bottom].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_top_l[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_l_first; - out_ptr_top_l[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_l_second; - out_ptr_top_l[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_l_third; - out_ptr_top_l[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_l_fourth; - out_ptr_top_r[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_r_first; - out_ptr_top_r[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_r_second; - out_ptr_top_r[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_r_third; - out_ptr_top_r[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_r_fourth; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel_bottom].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_l_pos]; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_r_pos]; } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptLEMonoTop(deinterleaved_rgb565_pixels* out_ptr_top_l, deinterleaved_rgb565_pixels* out_ptr_top_r, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { //de-interleave pixels - const size_t output_halfline_pos = output_halfline * num_iters; - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_top_l[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_l_first; - out_ptr_top_l[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_l_second; - out_ptr_top_l[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_l_third; - out_ptr_top_l[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_l_fourth; - out_ptr_top_r[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_r_first; - out_ptr_top_r[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_r_second; - out_ptr_top_r[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_r_third; - out_ptr_top_r[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_r_fourth; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_l_pos]; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_r_pos]; } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptLEMonoBottom(deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].bottom_fourth; + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = output_halfline_pos + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; } } static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptBE(deinterleaved_rgb565_pixels* out_ptr_top, deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_first); - out_ptr_bottom[output_halfline_pixel].second = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_second); - out_ptr_bottom[output_halfline_pixel].third = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_third); - out_ptr_bottom[output_halfline_pixel].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_fourth); - out_ptr_top[output_halfline_pixel].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_first); - out_ptr_top[output_halfline_pixel].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_second); - out_ptr_top[output_halfline_pixel].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_third); - out_ptr_top[output_halfline_pixel].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_fourth); + const int bottom_pos = 0; + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_pos]); } } static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptBEMonoTop(deinterleaved_rgb565_pixels* out_ptr_top, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_top[output_halfline_pixel].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_first); - out_ptr_top[output_halfline_pixel].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_second); - out_ptr_top[output_halfline_pixel].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_third); - out_ptr_top[output_halfline_pixel].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_fourth); + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_pos]); } } -static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptBEMonoBottom(deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, const int num_screens = 2) { +static inline void usb_rgb565convertInterleaveVideoToOutputDirectOptBEMonoBottom(deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; - size_t output_halfline_pixel = (output_halfline * num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_first); - out_ptr_bottom[output_halfline_pixel].second = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_second); - out_ptr_bottom[output_halfline_pixel].third = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_third); - out_ptr_bottom[output_halfline_pixel].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_fourth); + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; + size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptBE(deinterleaved_rgb565_pixels* out_ptr_top_l, deinterleaved_rgb565_pixels* out_ptr_top_r, deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { //de-interleave pixels - const size_t output_halfline_pos = output_halfline * num_iters; - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; + const int bottom_pos = 0; + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_bottom = output_halfline_pos + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_bottom[output_halfline_pixel_bottom].first = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_first); - out_ptr_bottom[output_halfline_pixel_bottom].second = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_second); - out_ptr_bottom[output_halfline_pixel_bottom].third = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_third); - out_ptr_bottom[output_halfline_pixel_bottom].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_fourth); - out_ptr_top_l[output_halfline_pixel_top].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_first); - out_ptr_top_l[output_halfline_pixel_top].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_second); - out_ptr_top_l[output_halfline_pixel_top].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_third); - out_ptr_top_l[output_halfline_pixel_top].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_fourth); - out_ptr_top_r[output_halfline_pixel_top].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_first); - out_ptr_top_r[output_halfline_pixel_top].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_second); - out_ptr_top_r[output_halfline_pixel_top].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_third); - out_ptr_top_r[output_halfline_pixel_top].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_fourth); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel_bottom].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_l_pos]); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_r_pos]); } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptBEMonoTop(deinterleaved_rgb565_pixels* out_ptr_top_l, deinterleaved_rgb565_pixels* out_ptr_top_r, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { //de-interleave pixels - const size_t output_halfline_pos = output_halfline * num_iters; - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_top_l[output_halfline_pixel_top].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_first); - out_ptr_top_l[output_halfline_pixel_top].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_second); - out_ptr_top_l[output_halfline_pixel_top].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_third); - out_ptr_top_l[output_halfline_pixel_top].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_l_fourth); - out_ptr_top_r[output_halfline_pixel_top].first = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_first); - out_ptr_top_r[output_halfline_pixel_top].second = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_second); - out_ptr_top_r[output_halfline_pixel_top].third = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_third); - out_ptr_top_r[output_halfline_pixel_top].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].top_r_fourth); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_l_pos]); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_r_pos]); } } static inline void usb_rgb565convertInterleave3DVideoToOutputDirectOptBEMonoBottom(deinterleaved_rgb565_pixels* out_ptr_bottom, interleaved_3d_rgb565_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { - const size_t output_halfline_pos = output_halfline * num_iters; - for(size_t i = 0; i < num_iters; i++) { - size_t input_halfline_pixel = (input_halfline * num_iters) + i; + //de-interleave pixels + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB565_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; + for(size_t i = 0; i < real_num_iters; i++) { + size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_bottom = output_halfline_pos + i; - out_ptr_bottom[output_halfline_pixel_bottom].first = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_first); - out_ptr_bottom[output_halfline_pixel_bottom].second = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_second); - out_ptr_bottom[output_halfline_pixel_bottom].third = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_third); - out_ptr_bottom[output_halfline_pixel_bottom].fourth = _reverse_endianness(in_ptr[input_halfline_pixel].bottom_fourth); + for(int j = 0; j < INTERLEAVED_RGB565_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel_bottom].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); } } static inline void usb_rgb888convertInterleaveU16VideoToOutputDirectOpt(deinterleaved_rgb888_u16_pixels* out_ptr_top, deinterleaved_rgb888_u16_pixels* out_ptr_bottom, interleaved_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; + const int bottom_pos = 0; + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_bottom[output_halfline_pixel].fifth = in_ptr[input_halfline_pixel].bottom_fifth; - out_ptr_bottom[output_halfline_pixel].sixth = in_ptr[input_halfline_pixel].bottom_sixth; - out_ptr_top[output_halfline_pixel].first = in_ptr[input_halfline_pixel].top_first; - out_ptr_top[output_halfline_pixel].second = in_ptr[input_halfline_pixel].top_second; - out_ptr_top[output_halfline_pixel].third = in_ptr[input_halfline_pixel].top_third; - out_ptr_top[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].top_fourth; - out_ptr_top[output_halfline_pixel].fifth = in_ptr[input_halfline_pixel].top_fifth; - out_ptr_top[output_halfline_pixel].sixth = in_ptr[input_halfline_pixel].top_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_pos]); } } static inline void usb_rgb888convertInterleaveU16VideoToOutputDirectOptMonoTop(deinterleaved_rgb888_u16_pixels* out_ptr_top, interleaved_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; + const int top_pos = 1; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; - out_ptr_top[output_halfline_pixel].first = in_ptr[input_halfline_pixel].top_first; - out_ptr_top[output_halfline_pixel].second = in_ptr[input_halfline_pixel].top_second; - out_ptr_top[output_halfline_pixel].third = in_ptr[input_halfline_pixel].top_third; - out_ptr_top[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].top_fourth; - out_ptr_top[output_halfline_pixel].fifth = in_ptr[input_halfline_pixel].top_fifth; - out_ptr_top[output_halfline_pixel].sixth = in_ptr[input_halfline_pixel].top_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][top_pos]); } } static inline void usb_rgb888convertInterleaveU16VideoToOutputDirectOptMonoBottom(deinterleaved_rgb888_u16_pixels* out_ptr_bottom, interleaved_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { //de-interleave pixels - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel = (output_halfline * real_num_iters) + i; - out_ptr_bottom[output_halfline_pixel].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_bottom[output_halfline_pixel].fifth = in_ptr[input_halfline_pixel].bottom_fifth; - out_ptr_bottom[output_halfline_pixel].sixth = in_ptr[input_halfline_pixel].bottom_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel].pixels[j] = _reverse_endianness(in_ptr[input_halfline_pixel].pixels[j][bottom_pos]); } } static inline void usb_rgb888convertInterleaveU163DVideoToOutputDirectOpt(deinterleaved_rgb888_u16_pixels* out_ptr_top_l, deinterleaved_rgb888_u16_pixels* out_ptr_top_r, deinterleaved_rgb888_u16_pixels* out_ptr_bottom, interleaved_3d_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { //de-interleave pixels - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; - const size_t output_halfline_pos = output_halfline * num_iters; + const int bottom_pos = 0; + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_bottom = output_halfline_pos + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_bottom[output_halfline_pixel_bottom].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel_bottom].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel_bottom].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel_bottom].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_bottom[output_halfline_pixel_bottom].fifth = in_ptr[input_halfline_pixel].bottom_fifth; - out_ptr_bottom[output_halfline_pixel_bottom].sixth = in_ptr[input_halfline_pixel].bottom_sixth; - out_ptr_top_l[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_l_first; - out_ptr_top_l[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_l_second; - out_ptr_top_l[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_l_third; - out_ptr_top_l[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_l_fourth; - out_ptr_top_l[output_halfline_pixel_top].fifth = in_ptr[input_halfline_pixel].top_l_fifth; - out_ptr_top_l[output_halfline_pixel_top].sixth = in_ptr[input_halfline_pixel].top_l_sixth; - out_ptr_top_r[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_r_first; - out_ptr_top_r[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_r_second; - out_ptr_top_r[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_r_third; - out_ptr_top_r[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_r_fourth; - out_ptr_top_r[output_halfline_pixel_top].fifth = in_ptr[input_halfline_pixel].top_r_fifth; - out_ptr_top_r[output_halfline_pixel_top].sixth = in_ptr[input_halfline_pixel].top_r_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel_bottom].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_l_pos]; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_r_pos]; } } static inline void usb_rgb888convertInterleaveU163DVideoToOutputDirectOptMonoTop(deinterleaved_rgb888_u16_pixels* out_ptr_top_l, deinterleaved_rgb888_u16_pixels* out_ptr_top_r, interleaved_3d_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline, int multiplier_top) { - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; - const size_t output_halfline_pos = output_halfline * num_iters; + //de-interleave pixels + const int top_l_pos = 1; + const int top_r_pos = 2; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_top = (output_halfline_pos * multiplier_top) + i; - out_ptr_top_l[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_l_first; - out_ptr_top_l[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_l_second; - out_ptr_top_l[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_l_third; - out_ptr_top_l[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_l_fourth; - out_ptr_top_l[output_halfline_pixel_top].fifth = in_ptr[input_halfline_pixel].top_l_fifth; - out_ptr_top_l[output_halfline_pixel_top].sixth = in_ptr[input_halfline_pixel].top_l_sixth; - out_ptr_top_r[output_halfline_pixel_top].first = in_ptr[input_halfline_pixel].top_r_first; - out_ptr_top_r[output_halfline_pixel_top].second = in_ptr[input_halfline_pixel].top_r_second; - out_ptr_top_r[output_halfline_pixel_top].third = in_ptr[input_halfline_pixel].top_r_third; - out_ptr_top_r[output_halfline_pixel_top].fourth = in_ptr[input_halfline_pixel].top_r_fourth; - out_ptr_top_r[output_halfline_pixel_top].fifth = in_ptr[input_halfline_pixel].top_r_fifth; - out_ptr_top_r[output_halfline_pixel_top].sixth = in_ptr[input_halfline_pixel].top_r_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top_l[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_l_pos]; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_top_r[output_halfline_pixel_top].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][top_r_pos]; } } static inline void usb_rgb888convertInterleaveU163DVideoToOutputDirectOptMonoBottom(deinterleaved_rgb888_u16_pixels* out_ptr_bottom, interleaved_3d_rgb888_u16_pixels* in_ptr, uint32_t num_iters, int input_halfline, int output_halfline) { - const int pixel_size = 3; - const int num_pixels_processed = sizeof(deinterleaved_rgb888_u16_pixels) / pixel_size; - const size_t real_num_iters = num_iters / num_pixels_processed; - const size_t output_halfline_pos = output_halfline * num_iters; + //de-interleave pixels + const int bottom_pos = 0; + const size_t real_num_iters = num_iters / INTERLEAVED_RGB888_PIXEL_NUM; + const size_t output_halfline_pos = output_halfline * real_num_iters; for(size_t i = 0; i < real_num_iters; i++) { size_t input_halfline_pixel = (input_halfline * real_num_iters) + i; size_t output_halfline_pixel_bottom = output_halfline_pos + i; - out_ptr_bottom[output_halfline_pixel_bottom].first = in_ptr[input_halfline_pixel].bottom_first; - out_ptr_bottom[output_halfline_pixel_bottom].second = in_ptr[input_halfline_pixel].bottom_second; - out_ptr_bottom[output_halfline_pixel_bottom].third = in_ptr[input_halfline_pixel].bottom_third; - out_ptr_bottom[output_halfline_pixel_bottom].fourth = in_ptr[input_halfline_pixel].bottom_fourth; - out_ptr_bottom[output_halfline_pixel_bottom].fifth = in_ptr[input_halfline_pixel].bottom_fifth; - out_ptr_bottom[output_halfline_pixel_bottom].sixth = in_ptr[input_halfline_pixel].bottom_sixth; + for(int j = 0; j < INTERLEAVED_RGB888_TOTAL_SIZE; j++) + out_ptr_bottom[output_halfline_pixel_bottom].pixels[j] = in_ptr[input_halfline_pixel].pixels[j][bottom_pos]; } } @@ -508,11 +418,10 @@ static inline void usb_oldDSconvertVideoToOutputHalfLineDirectOptLE(USBOldDSCapt const int num_screens = 2; const int num_halflines = 2; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_top = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_bottom = out_ptr_top + ((WIDTH_DS * HEIGHT_DS * pixels_size) / ptr_out_size); interleaved_rgb565_pixels* in_ptr = (interleaved_rgb565_pixels*)p_in->video_in.screen_data; - const uint32_t halfline_iters = (WIDTH_DS * num_screens * pixels_size) / (ptr_in_size * num_halflines); + const uint32_t halfline_iters = WIDTH_DS / num_halflines; usb_rgb565convertInterleaveVideoToOutputDirectOptLE(out_ptr_top, out_ptr_bottom, in_ptr, halfline_iters, input_halfline, output_halfline); } @@ -522,11 +431,10 @@ static inline void usb_oldDSconvertVideoToOutputHalfLineDirectOptBE(USBOldDSCapt const int num_screens = 2; const int num_halflines = 2; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_top = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_bottom = out_ptr_top + ((WIDTH_DS * HEIGHT_DS * pixels_size) / ptr_out_size); interleaved_rgb565_pixels* in_ptr = (interleaved_rgb565_pixels*)p_in->video_in.screen_data; - const uint32_t halfline_iters = (WIDTH_DS * num_screens * pixels_size) / (ptr_in_size * num_halflines); + const uint32_t halfline_iters = WIDTH_DS / num_halflines; usb_rgb565convertInterleaveVideoToOutputDirectOptBE(out_ptr_top, out_ptr_bottom, in_ptr, halfline_iters, input_halfline, output_halfline); } @@ -538,13 +446,12 @@ static inline void usb_new3DS565OptimizeconvertVideoToOutputLineDirectOptLE(USB5 const size_t column_pre_last_bot_pos = (SCREEN_WIDTH_FIRST_PIXEL_BOTTOM_3DS * 2); const size_t column_last_bot_pos = TOP_WIDTH_3DS; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_bottom = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_top = out_ptr_bottom + ((BOT_SIZE_3DS * pixels_size) / ptr_out_size); interleaved_rgb565_pixels* in_ptr = (interleaved_rgb565_pixels*)p_in->bottom_only_column; if(column < column_last_bot_pos) in_ptr = (interleaved_rgb565_pixels*)p_in->columns_data[column].pixel; - const uint32_t num_iters = (HEIGHT_3DS * pixels_size * num_screens) / ptr_in_size; + const uint32_t num_iters = HEIGHT_3DS; if(column == column_last_bot_pos) usb_rgb565convertInterleaveVideoToOutputDirectOptLEMonoBottom(out_ptr_bottom, in_ptr, num_iters, 0, BOT_WIDTH_3DS - 1); else if(column == column_pre_last_bot_pos) { @@ -567,13 +474,12 @@ static inline void usb_new3DS565OptimizeconvertVideoToOutputLineDirectOptBE(USB5 const size_t column_pre_last_bot_pos = (SCREEN_WIDTH_FIRST_PIXEL_BOTTOM_3DS * 2); const size_t column_last_bot_pos = TOP_WIDTH_3DS; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_bottom = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_top = out_ptr_bottom + ((BOT_SIZE_3DS * pixels_size) / ptr_out_size); interleaved_rgb565_pixels* in_ptr = (interleaved_rgb565_pixels*)p_in->bottom_only_column; if(column < column_last_bot_pos) in_ptr = (interleaved_rgb565_pixels*)p_in->columns_data[column].pixel; - const uint32_t num_iters = (HEIGHT_3DS * pixels_size * num_screens) / ptr_in_size; + const uint32_t num_iters = HEIGHT_3DS; if(column == column_last_bot_pos) usb_rgb565convertInterleaveVideoToOutputDirectOptBEMonoBottom(out_ptr_bottom, in_ptr, num_iters, 0, BOT_WIDTH_3DS - 1); else if(column == column_pre_last_bot_pos) { @@ -596,7 +502,6 @@ static inline void usb_new3DS565Optimizeconvert3DVideoToOutputLineDirectOptLE(US const size_t column_pre_last_bot_pos = (SCREEN_WIDTH_FIRST_PIXEL_BOTTOM_3DS * 2); const size_t column_last_bot_pos = TOP_WIDTH_3DS; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_3d_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_bottom = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_top_l = out_ptr_bottom + ((BOT_SIZE_3DS * pixels_size) / ptr_out_size); deinterleaved_rgb565_pixels* out_ptr_top_r = out_ptr_bottom + (((TOP_SIZE_3DS + BOT_SIZE_3DS) * pixels_size) / ptr_out_size); @@ -608,7 +513,7 @@ static inline void usb_new3DS565Optimizeconvert3DVideoToOutputLineDirectOptLE(US multiplier_top = 2; out_ptr_top_r = out_ptr_top_l + ((HEIGHT_3DS * pixels_size) / ptr_out_size); } - const uint32_t num_iters = (HEIGHT_3DS * pixels_size * num_screens) / ptr_in_size; + const uint32_t num_iters = HEIGHT_3DS; if(column == column_last_bot_pos) usb_rgb565convertInterleave3DVideoToOutputDirectOptLEMonoBottom(out_ptr_bottom, in_ptr, num_iters, 0, BOT_WIDTH_3DS - 1); else if(column == column_pre_last_bot_pos) { @@ -632,7 +537,6 @@ static inline void usb_new3DS565Optimizeconvert3DVideoToOutputLineDirectOptBE(US const size_t column_pre_last_bot_pos = (SCREEN_WIDTH_FIRST_PIXEL_BOTTOM_3DS * 2); const size_t column_last_bot_pos = TOP_WIDTH_3DS; const size_t ptr_out_size = sizeof(deinterleaved_rgb565_pixels); - const size_t ptr_in_size = sizeof(interleaved_3d_rgb565_pixels); deinterleaved_rgb565_pixels* out_ptr_bottom = (deinterleaved_rgb565_pixels*)p_out->screen_data; deinterleaved_rgb565_pixels* out_ptr_top_l = out_ptr_bottom + ((BOT_SIZE_3DS * pixels_size) / ptr_out_size); deinterleaved_rgb565_pixels* out_ptr_top_r = out_ptr_bottom + (((TOP_SIZE_3DS + BOT_SIZE_3DS) * pixels_size) / ptr_out_size); @@ -644,7 +548,7 @@ static inline void usb_new3DS565Optimizeconvert3DVideoToOutputLineDirectOptBE(US multiplier_top = 2; out_ptr_top_r = out_ptr_top_l + ((HEIGHT_3DS * pixels_size) / ptr_out_size); } - const uint32_t num_iters = (HEIGHT_3DS * pixels_size * num_screens) / ptr_in_size; + const uint32_t num_iters = HEIGHT_3DS; if(column == column_last_bot_pos) usb_rgb565convertInterleave3DVideoToOutputDirectOptBEMonoBottom(out_ptr_bottom, in_ptr, num_iters, 0, BOT_WIDTH_3DS - 1); else if(column == column_pre_last_bot_pos) {