Add support for having different video output types selectable

This commit is contained in:
Lorenzooone
2025-04-30 21:45:15 +02:00
parent 8b7cdaf1e0
commit d5ec7b4d61
4 changed files with 16 additions and 12 deletions

View File

@@ -76,7 +76,7 @@ public:
void display_thread();
void end();
void after_thread_join();
void draw(double frame_time, VideoOutputData* out_buf);
void draw(double frame_time, VideoOutputData* out_buf, InputVideoDataType video_data_type);
void setup_connection_menu(std::vector<CaptureDevice> *devices_list, bool reset_data = true);
int check_connection_menu_result();
void end_connection_menu();
@@ -115,6 +115,7 @@ private:
bool divide_3d_par;
};
OutTextData own_out_text_data;
InputVideoDataType curr_video_data_type;
InputVideoDataType last_update_texture_data_type;
PossibleSoftwareConvTypes texture_software_based_conv;
bool created_proper_folder;
@@ -431,7 +432,7 @@ void get_par_size(float &width, float &height, float multiplier_factor, const PA
SecondScreen3DRelativePosition get_second_screen_pos(ScreenInfo* info, ScreenType stype);
void update_output(FrontendData* frontend_data, double frame_time = 0.0, VideoOutputData *out_buf = NULL);
void update_output(FrontendData* frontend_data, double frame_time = 0.0, VideoOutputData *out_buf = NULL, InputVideoDataType video_data_type = VIDEO_DATA_RGB);
void update_connected_3ds_ds(FrontendData* frontend_data, const CaptureDevice &old_cc_device, const CaptureDevice &new_cc_device);
void update_connected_specific_settings(FrontendData* frontend_data, const CaptureDevice &cc_device);

View File

@@ -271,7 +271,7 @@ void WindowScreen::after_thread_join() {
}
}
void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) {
void WindowScreen::draw(double frame_time, VideoOutputData* out_buf, InputVideoDataType video_data_type) {
FPSArrayInsertElement(&in_fps, frame_time);
if(!this->done_display)
return;
@@ -316,6 +316,7 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) {
memset(this->saved_buf, 0, sizeof(VideoOutputData));
this->was_last_frame_null = true;
}
this->curr_video_data_type = video_data_type;
loaded_info = m_info;
m_info.initial_pos_x = DEFAULT_NO_POS_WINDOW_VALUE;
m_info.initial_pos_y = DEFAULT_NO_POS_WINDOW_VALUE;
@@ -648,7 +649,7 @@ bool WindowScreen::single_update_texture(unsigned int m_texture, InputVideoDataT
}
void WindowScreen::execute_single_update_texture(bool &manually_converted, bool do_full, bool is_top, bool is_second) {
InputVideoDataType video_data_type = this->capture_status->device.video_data_type;
InputVideoDataType video_data_type = this->curr_video_data_type;
size_t top_width = TOP_WIDTH_3DS;
size_t top_height = HEIGHT_3DS;
size_t single_top_width = TOP_WIDTH_3DS;

View File

@@ -563,6 +563,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
else if(frontend_data.shared_data.input_data.fast_poll)
poll_timeout = LOW_POLL_DIVISOR;
VideoOutputData *chosen_buf = out_buf;
InputVideoDataType video_data_type = VIDEO_DATA_RGB;
bool blank_out = false;
bool is_connected = capture_data->status.connected;
if(is_connected != last_connected) {
@@ -586,6 +587,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
if(capture_data->status.cooldown_curr_in || (!capture_data->status.connected))
blank_out = true;
else {
video_data_type = data_buffer->buffer_video_data_type;
bool conversion_success = convertVideoToOutput(out_buf, endianness, data_buffer, &capture_data->status, frontend_data.display_data.interleaved_3d);
if(!conversion_success)
UpdateOutText(out_text_data, "", "Video conversion failed...", TEXT_KIND_NORMAL);
@@ -619,7 +621,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
if(frontend_data.shared_data.input_data.fast_poll)
poll_all_windows(&frontend_data, poll_everything, polled);
update_output(&frontend_data, last_frame_time, chosen_buf);
update_output(&frontend_data, last_frame_time, chosen_buf, video_data_type);
if(!frontend_data.shared_data.input_data.fast_poll)
poll_all_windows(&frontend_data, poll_everything, polled);

View File

@@ -1039,7 +1039,7 @@ JoystickAction get_joystick_action(uint32_t joystickId, uint32_t joy_button) {
return JOY_ACTION_NONE;
}
void update_output(FrontendData* frontend_data, double frame_time, VideoOutputData *out_buf) {
void update_output(FrontendData* frontend_data, double frame_time, VideoOutputData *out_buf, InputVideoDataType video_data_type) {
if(frontend_data->reload) {
frontend_data->top_screen->reload();
frontend_data->bot_screen->reload();
@@ -1048,17 +1048,17 @@ void update_output(FrontendData* frontend_data, double frame_time, VideoOutputDa
}
// Make sure the window is closed before showing split/non-split
if(!frontend_data->joint_screen->m_info.window_enabled)
frontend_data->joint_screen->draw(frame_time, out_buf);
frontend_data->joint_screen->draw(frame_time, out_buf, video_data_type);
if(!frontend_data->top_screen->m_info.window_enabled)
frontend_data->top_screen->draw(frame_time, out_buf);
frontend_data->top_screen->draw(frame_time, out_buf, video_data_type);
if(!frontend_data->bot_screen->m_info.window_enabled)
frontend_data->bot_screen->draw(frame_time, out_buf);
frontend_data->bot_screen->draw(frame_time, out_buf, video_data_type);
if(frontend_data->joint_screen->m_info.window_enabled)
frontend_data->joint_screen->draw(frame_time, out_buf);
frontend_data->joint_screen->draw(frame_time, out_buf, video_data_type);
if(frontend_data->top_screen->m_info.window_enabled)
frontend_data->top_screen->draw(frame_time, out_buf);
frontend_data->top_screen->draw(frame_time, out_buf, video_data_type);
if(frontend_data->bot_screen->m_info.window_enabled)
frontend_data->bot_screen->draw(frame_time, out_buf);
frontend_data->bot_screen->draw(frame_time, out_buf, video_data_type);
}
static bool are_cc_device_screens_same(const CaptureDevice &old_cc_device, const CaptureDevice &new_cc_device) {