#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>

#include "sp_vio.h"

int main() {
    const int out_w = 1920;
    const int out_h = 1080;
    int widths[] = {out_w};
    int heights[] = {out_h};

    sp_sensors_parameters parms0;
    memset(&parms0, 0, sizeof(parms0));
    parms0.fps = -1;
    parms0.raw_width = 1920;
    parms0.raw_height = 1080;

    sp_sensors_parameters parms1;
    memset(&parms1, 0, sizeof(parms1));
    parms1.fps = -1;
    parms1.raw_width = 1920;
    parms1.raw_height = 1080;

    void *vio0 = sp_init_vio_module();
    void *vio1 = sp_init_vio_module();

    if (!vio0 || !vio1) {
        printf("[Error] sp_init_vio_module failed! vio0=%p vio1=%p\n", vio0, vio1);
        return -1;
    }

    // camera0: host0
    int ret0 = sp_open_camera_v2(vio0, 0, 0, 1, &parms0, widths, heights);
    printf("sp_open_camera_v2 cam0(host0) ret=%d\n", ret0);

    // camera1: host1
    int ret1 = sp_open_camera_v2(vio1, 0, 1, 1, &parms1, widths, heights);
    printf("sp_open_camera_v2 cam1(host1) ret=%d\n", ret1);

    if (ret0 != 0 || ret1 != 0) {
        printf("[Error] open failed: ret0=%d ret1=%d\n", ret0, ret1);
        if (vio0) {
            sp_vio_close(vio0);
            sp_release_vio_module(vio0);
        }
        if (vio1) {
            sp_vio_close(vio1);
            sp_release_vio_module(vio1);
        }
        return -2;
    }

    usleep(500 * 1000);  // 等半秒让底层稳定

    int frame_size = out_w * out_h * 3 / 2; // NV12
    char *buf0 = (char *)malloc(frame_size);
    char *buf1 = (char *)malloc(frame_size);
    if (!buf0 || !buf1) {
        printf("[Error] malloc failed!\n");
        sp_vio_close(vio0);
        sp_vio_close(vio1);
        sp_release_vio_module(vio0);
        sp_release_vio_module(vio1);
        return -3;
    }
    memset(buf0, 0, frame_size);
    memset(buf1, 0, frame_size);

    int g0 = sp_vio_get_frame(vio0, buf0, out_w, out_h, 2000);
    int g1 = sp_vio_get_frame(vio1, buf1, out_w, out_h, 2000);

    printf("sp_vio_get_frame cam0 ret=%d\n", g0);
    printf("sp_vio_get_frame cam1 ret=%d\n", g1);

    if (g0 == 0) {
        FILE *fp0 = fopen("cam0_1920x1080_nv12.yuv", "wb");
        if (fp0) {
            fwrite(buf0, 1, frame_size, fp0);
            fclose(fp0);
            printf("saved cam0_1920x1080_nv12.yuv\n");
        }
    }

    if (g1 == 0) {
        FILE *fp1 = fopen("cam1_1920x1080_nv12.yuv", "wb");
        if (fp1) {
            fwrite(buf1, 1, frame_size, fp1);
            fclose(fp1);
            printf("saved cam1_1920x1080_nv12.yuv\n");
        }
    }

    free(buf0);
    free(buf1);

    sp_vio_close(vio0);
    sp_vio_close(vio1);
    sp_release_vio_module(vio0);
    sp_release_vio_module(vio1);

    printf("done\n");
    return 0;
}
