mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-15 03:08:36 +12:00
cellCamera: move camera handler interaction to seperate functions
This commit is contained in:
parent
d1ac92fd99
commit
214c1ccc7e
2 changed files with 137 additions and 115 deletions
|
@ -555,25 +555,7 @@ error_code cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
|
||||||
|
|
||||||
std::tie(info->width, info->height) = get_video_resolution(*info);
|
std::tie(info->width, info->height) = get_video_resolution(*info);
|
||||||
|
|
||||||
error_code error = CELL_OK;
|
if (error_code error = g_camera.open_camera())
|
||||||
atomic_t<bool> wake_up = false;
|
|
||||||
|
|
||||||
Emu.CallAfter([&wake_up, &error, &g_camera]()
|
|
||||||
{
|
|
||||||
g_camera.handler.reset();
|
|
||||||
g_camera.handler = Emu.GetCallbacks().get_camera_handler();
|
|
||||||
g_camera.handler->open_camera();
|
|
||||||
error = g_camera.on_handler_state(g_camera.handler->get_state());
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error != CELL_OK)
|
|
||||||
{
|
{
|
||||||
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
@ -624,23 +606,7 @@ error_code cellCameraClose(s32 dev_num)
|
||||||
|
|
||||||
vm::dealloc(g_camera.info.buffer.addr(), vm::main);
|
vm::dealloc(g_camera.info.buffer.addr(), vm::main);
|
||||||
|
|
||||||
if (g_camera.handler)
|
g_camera.close_camera();
|
||||||
{
|
|
||||||
atomic_t<bool> wake_up = false;
|
|
||||||
|
|
||||||
Emu.CallAfter([&wake_up, handler = g_camera.handler]()
|
|
||||||
{
|
|
||||||
handler->close_camera();
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_camera.is_open = false;
|
g_camera.is_open = false;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
|
@ -1229,36 +1195,13 @@ error_code cellCameraStart(s32 dev_num)
|
||||||
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Yet another CELL_CAMERA_ERROR_TIMEOUT
|
if (error_code error = g_camera.start_camera())
|
||||||
|
|
||||||
if (g_camera.handler)
|
|
||||||
{
|
{
|
||||||
g_camera.handler->set_mirrored(!!g_camera.attr[CELL_CAMERA_MIRRORFLAG].v1);
|
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
||||||
g_camera.handler->set_frame_rate(g_camera.info.framerate);
|
|
||||||
g_camera.handler->set_resolution(g_camera.info.width, g_camera.info.height);
|
|
||||||
|
|
||||||
error_code error = CELL_OK;
|
|
||||||
atomic_t<bool> wake_up = false;
|
|
||||||
|
|
||||||
Emu.CallAfter([&wake_up, &error, &g_camera]()
|
|
||||||
{
|
|
||||||
g_camera.handler->start_camera();
|
|
||||||
error = g_camera.on_handler_state(g_camera.handler->get_state());
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error != CELL_OK)
|
|
||||||
{
|
|
||||||
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Yet another CELL_CAMERA_ERROR_TIMEOUT
|
||||||
|
|
||||||
g_camera.start_timestamp = get_guest_system_time();
|
g_camera.start_timestamp = get_guest_system_time();
|
||||||
g_camera.is_streaming = true;
|
g_camera.is_streaming = true;
|
||||||
|
|
||||||
|
@ -1354,23 +1297,7 @@ error_code cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
|
||||||
u64 frame_number{};
|
u64 frame_number{};
|
||||||
u64 bytes_read{};
|
u64 bytes_read{};
|
||||||
|
|
||||||
atomic_t<bool> wake_up = false;
|
if (error_code error = g_camera.get_camera_frame(g_camera.info.buffer.get_ptr(), width, height, frame_number, bytes_read))
|
||||||
error_code error = CELL_OK;
|
|
||||||
|
|
||||||
Emu.CallAfter([&]()
|
|
||||||
{
|
|
||||||
camera_handler_base::camera_handler_state result = g_camera.handler->get_image(g_camera.info.buffer.get_ptr(), g_camera.info.bytesize, width, height, frame_number, bytes_read);
|
|
||||||
error = g_camera.on_handler_state(result);
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error != CELL_OK)
|
|
||||||
{
|
{
|
||||||
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
@ -1444,23 +1371,7 @@ error_code cellCameraStop(s32 dev_num)
|
||||||
return CELL_CAMERA_ERROR_NOT_STARTED;
|
return CELL_CAMERA_ERROR_NOT_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_camera.handler)
|
g_camera.stop_camera();
|
||||||
{
|
|
||||||
atomic_t<bool> wake_up = false;
|
|
||||||
|
|
||||||
Emu.CallAfter([&wake_up, handler = g_camera.handler]()
|
|
||||||
{
|
|
||||||
handler->stop_camera();
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_camera.is_streaming = false;
|
g_camera.is_streaming = false;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
|
@ -1647,25 +1558,13 @@ void camera_context::operator()()
|
||||||
|
|
||||||
if (handler && send_frame_update_event)
|
if (handler && send_frame_update_event)
|
||||||
{
|
{
|
||||||
atomic_t<bool> wake_up = false;
|
u32 width{};
|
||||||
camera_handler_base::camera_handler_state result = camera_handler_base::camera_handler_state::not_available;
|
u32 height{};
|
||||||
|
u64 frame_number{};
|
||||||
|
u64 bytes_read{};
|
||||||
|
|
||||||
Emu.CallAfter([&]()
|
error_code error = get_camera_frame(info.pbuf[pbuf_write_index].get_ptr(), width, height, frame_number, bytes_read);
|
||||||
{
|
send_frame_update_event = error == CELL_OK;
|
||||||
u32 width{};
|
|
||||||
u32 height{};
|
|
||||||
u64 frame_number{};
|
|
||||||
u64 bytes_read{};
|
|
||||||
result = handler->get_image(info.pbuf[pbuf_write_index].get_ptr(), info.bytesize, width, height, frame_number, bytes_read);
|
|
||||||
send_frame_update_event = on_handler_state(result) = CELL_OK;
|
|
||||||
wake_up = true;
|
|
||||||
wake_up.notify_one();
|
|
||||||
});
|
|
||||||
|
|
||||||
while (!wake_up && !Emu.IsStopped())
|
|
||||||
{
|
|
||||||
thread_ctrl::wait_on(wake_up, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (send_frame_update_event)
|
if (send_frame_update_event)
|
||||||
{
|
{
|
||||||
|
@ -1747,6 +1646,124 @@ void camera_context::operator()()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error_code camera_context::open_camera()
|
||||||
|
{
|
||||||
|
error_code error = CELL_OK;
|
||||||
|
atomic_t<bool> wake_up = false;
|
||||||
|
|
||||||
|
Emu.CallAfter([&wake_up, &error, this]()
|
||||||
|
{
|
||||||
|
handler.reset();
|
||||||
|
handler = Emu.GetCallbacks().get_camera_handler();
|
||||||
|
handler->open_camera();
|
||||||
|
error = on_handler_state(handler->get_state());
|
||||||
|
wake_up = true;
|
||||||
|
wake_up.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!wake_up && !Emu.IsStopped())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait_on(wake_up, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_code camera_context::start_camera()
|
||||||
|
{
|
||||||
|
error_code error = CELL_OK;
|
||||||
|
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
handler->set_mirrored(!!attr[CELL_CAMERA_MIRRORFLAG].v1);
|
||||||
|
handler->set_frame_rate(info.framerate);
|
||||||
|
handler->set_resolution(info.width, info.height);
|
||||||
|
|
||||||
|
atomic_t<bool> wake_up = false;
|
||||||
|
|
||||||
|
Emu.CallAfter([&wake_up, &error, this]()
|
||||||
|
{
|
||||||
|
handler->start_camera();
|
||||||
|
error = on_handler_state(handler->get_state());
|
||||||
|
wake_up = true;
|
||||||
|
wake_up.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!wake_up && !Emu.IsStopped())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait_on(wake_up, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_code camera_context::get_camera_frame(u8* dst, u32& width, u32& height, u64& frame_number, u64& bytes_read)
|
||||||
|
{
|
||||||
|
error_code error = CELL_OK;
|
||||||
|
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
atomic_t<bool> wake_up = false;
|
||||||
|
error_code error = CELL_OK;
|
||||||
|
|
||||||
|
Emu.CallAfter([&]()
|
||||||
|
{
|
||||||
|
camera_handler_base::camera_handler_state result = handler->get_image(dst, info.bytesize, width, height, frame_number, bytes_read);
|
||||||
|
error = on_handler_state(result);
|
||||||
|
wake_up = true;
|
||||||
|
wake_up.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!wake_up && !Emu.IsStopped())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait_on(wake_up, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_context::stop_camera()
|
||||||
|
{
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
atomic_t<bool> wake_up = false;
|
||||||
|
|
||||||
|
Emu.CallAfter([&wake_up, this]()
|
||||||
|
{
|
||||||
|
handler->stop_camera();
|
||||||
|
wake_up = true;
|
||||||
|
wake_up.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!wake_up && !Emu.IsStopped())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait_on(wake_up, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_context::close_camera()
|
||||||
|
{
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
atomic_t<bool> wake_up = false;
|
||||||
|
|
||||||
|
Emu.CallAfter([&wake_up, this]()
|
||||||
|
{
|
||||||
|
handler->close_camera();
|
||||||
|
wake_up = true;
|
||||||
|
wake_up.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!wake_up && !Emu.IsStopped())
|
||||||
|
{
|
||||||
|
thread_ctrl::wait_on(wake_up, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void camera_context::reset_state()
|
void camera_context::reset_state()
|
||||||
{
|
{
|
||||||
read_mode = CELL_CAMERA_READ_FUNCCALL;
|
read_mode = CELL_CAMERA_READ_FUNCCALL;
|
||||||
|
|
|
@ -442,6 +442,11 @@ public:
|
||||||
static constexpr auto thread_name = "Camera Thread"sv;
|
static constexpr auto thread_name = "Camera Thread"sv;
|
||||||
|
|
||||||
std::shared_ptr<camera_handler_base> handler;
|
std::shared_ptr<camera_handler_base> handler;
|
||||||
|
error_code open_camera();
|
||||||
|
error_code start_camera();
|
||||||
|
error_code get_camera_frame(u8* dst, u32& width, u32& height, u64& frame_number, u64& bytes_read);
|
||||||
|
void stop_camera();
|
||||||
|
void close_camera();
|
||||||
error_code on_handler_state(camera_handler_base::camera_handler_state state);
|
error_code on_handler_state(camera_handler_base::camera_handler_state state);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue