use async_trait::async_trait;
use bytes::Bytes;
use gstreamer as gst;
use std::any::Any;
use crate::error::{Result, StreamError};
use crate::frame::FrameData;
#[derive(Clone)]
pub struct GstFrameData {
pub(super) buffer: gst::Buffer,
#[allow(dead_code)]
pub(super) caps: gst::Caps,
}
impl GstFrameData {
pub fn new(buffer: gst::Buffer, caps: gst::Caps) -> Self {
Self { buffer, caps }
}
}
#[async_trait]
impl FrameData for GstFrameData {
async fn to_bytes(&self) -> Result<Bytes> {
let map = self.buffer.map_readable().map_err(|_| StreamError::Pipeline {
message: "failed to map GstBuffer for reading".into(),
})?;
Ok(Bytes::copy_from_slice(map.as_slice()))
}
fn as_any(&self) -> &dyn Any {
self
}
}