#![allow(unsafe_code)]
#![allow(
clippy::redundant_pub_crate,
unreachable_pub,
reason = "pub(crate) graph for VA-API modules; not part of the public crate API"
)]
mod codec;
mod dmabuf;
mod gop;
mod hevc;
mod hevc_gop;
mod video;
mod vp9;
mod vp9_gop;
use crate::{EncodeError, VideoEncoder, VideoEncoderConfig};
use mediaway_common::{CodecKind, Packet, StreamInfo, VideoFrame};
use hevc::VaapiHevcVideoEncoder;
use video::VaapiH264Encoder;
use vp9::VaapiVp9Encoder;
pub(crate) enum VaapiVideoEncoder {
H264(VaapiH264Encoder),
Hevc(VaapiHevcVideoEncoder),
Vp9(VaapiVp9Encoder),
}
impl VaapiVideoEncoder {
pub(crate) fn open(config: &VideoEncoderConfig) -> Result<Self, EncodeError> {
if !codec::is_supported_video_codec(config.codec) {
return Err(EncodeError::Unsupported);
}
match config.codec {
CodecKind::H264 => Ok(Self::H264(VaapiH264Encoder::open(config)?)),
CodecKind::Hevc => Ok(Self::Hevc(VaapiHevcVideoEncoder::open(config)?)),
CodecKind::Vp9 => Ok(Self::Vp9(VaapiVp9Encoder::open(config)?)),
_ => Err(EncodeError::Unsupported),
}
}
}
impl VideoEncoder for VaapiVideoEncoder {
fn stream_info(&self) -> &StreamInfo {
match self {
Self::H264(e) => e.stream_info(),
Self::Hevc(e) => e.stream_info(),
Self::Vp9(e) => e.stream_info(),
}
}
fn push_frame(&mut self, frame: &VideoFrame) -> Result<(), EncodeError> {
match self {
Self::H264(e) => e.push_frame(frame),
Self::Hevc(e) => e.push_frame(frame),
Self::Vp9(e) => e.push_frame(frame),
}
}
fn poll_packet(&mut self) -> Result<Option<Packet>, EncodeError> {
match self {
Self::H264(e) => e.poll_packet(),
Self::Hevc(e) => e.poll_packet(),
Self::Vp9(e) => e.poll_packet(),
}
}
fn flush(&mut self) -> Result<(), EncodeError> {
match self {
Self::H264(e) => e.flush(),
Self::Hevc(e) => e.flush(),
Self::Vp9(e) => e.flush(),
}
}
}