static void on_frame(
    camera_handle_t camera,
    camera_buffer_t* frame,
    void* arg)
{
    (void)camera;
    (void)arg;

    switch (frame->frametype) {
    case CAMERA_FRAMETYPE_YCBYCR:
        convert_ycbycr(frame);
        break;

    case CAMERA_FRAMETYPE_CBYCRY:
        convert_cbycry(frame);
        break;

    case CAMERA_FRAMETYPE_RGB8888:
        convert_rgb8888(frame);
        break;

    case CAMERA_FRAMETYPE_BGR8888:
        convert_bgr8888(frame);
        break;

    default:
        return;
    }

    apply_mosaic(g_app.width, g_app.height);

    int dirty[4] = { 0, 0, (int)g_app.width, (int)g_app.height };
    screen_post_window(g_app.window, g_app.buffer, 1, dirty, 0);
}
