Writing cairo ImageSurfaces to a video file with opencv?

Hello ! I'm completely new to this whole video thing and I'm sure I'm making some really dumb mistake.
I'm using those two crates :

cairo-rs = { version = "0.14.9", features = ["png"] }
opencv = "0.58.0"

I create my ImageSurfaces this way

        let surface = ImageSurface::create(
            Format::ARgb32,
            self.render_settings.width,
            self.render_settings.height
        ).expect("Could not create a surface to draw the frame on");

And render as such

    pub fn render_mp4(&mut self) {
        let mut writer = VideoWriter::new(
            "./output.mp4",
            VideoWriter::fourcc(b'M' as i8, b'P' as i8, b'4' as i8, b'V' as i8).unwrap(),
            self.fps,
            Size::new(self.render_settings.width, self.render_settings.height),
            true
        ).unwrap();

        while !self.has_ended() {
            let mut rendered = self.render_frame();
            let data = rendered.data().unwrap();
            let vec = data.to_vec();
            writer.write(&VectorOfu8::from(vec)).unwrap();
        }
    }

Where self.render_frame() returns an ImageSurface

It does create a file and write stuff to it, but when I try to open it it doesn't play. I'm sure I'm just messing up some encoding somewhere, and I'd really appreciate if someone pointed out what exactly am I messing up.

EDIT:

    while !self.has_ended() {
            let mut rendered = self.render_frame();
            let data = rendered.data().unwrap();
            let vec = data.to_vec();

            let mut vec = VectorOfu8::from(vec);
            let mut ovec = VectorOfu8::from(vec![0; (self.render_settings.width * self.render_settings.height * 3) as usize]);

            cvt_color(&vec, &mut ovec, COLOR_RGBA2BGR, 0).unwrap();
            
            writer.write(&ovec).unwrap();
        }

Here's where I'm at currently and I get this error :

Error { code: -215, message: "OpenCV(4.5.4) /build/opencv/src/opencv-4.5.4/modules/core/src/matrix_wrap.cpp:1393: error: (-215:Assertion failed) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function 'create'\n" }

Problem solved : using mats is required

        while !self.has_ended() {
            let mut rendered = self.render_frame();
            let data = rendered.data().unwrap();
            let mut vec = data.to_vec();
            let mat = unsafe { Mat::new_size_with_data(
                img_size,
                CV_8UC4,
                vec.as_mut_ptr() as *mut c_void,
                Mat_AUTO_STEP
            ) }.unwrap();
            let mut omat = unsafe { Mat::new_size(img_size, CV_8UC3) }.unwrap();
            cvt_color(&mat, &mut omat, COLOR_RGBA2BGR, 0).unwrap();
            writer.write(&omat).unwrap();
        }

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.