Source code for gnes.preprocessor.video.video_encoder

from ..base import BaseVideoPreprocessor
from ..io_utils import video, gif, webp
from ...proto import gnes_pb2, blob2array


[docs]class VideoEncoderPreprocessor(BaseVideoPreprocessor): def __init__(self, frame_rate: int = 10, pix_fmt: str = 'rgb24', video_format: str = "mp4", *args, **kwargs): super().__init__(*args, **kwargs) self.pix_fmt = pix_fmt self.frame_rate = frame_rate self.video_format = video_format if self.video_format not in ['mp4', 'gif', 'webp']: raise ValueError("%s encoder has not been supported!" % (self.video_format)) def _encode(self, images: 'np.ndarray'): encoder = None if self.video_format == 'mp4': encoder = video elif self.video_format == 'gif': encoder = gif elif self.video_format == 'webp': encoder = webp return encoder.encode_video(images, pix_fmt=self.pix_fmt, frame_rate=self.frame_rate)
[docs] def apply(self, doc: 'gnes_pb2.Document') -> None: super().apply(doc) if len(doc.chunks) > 0: for chunk in doc.chunks: images = blob2array(chunk.blob) chunk.raw = self._encode(images) elif doc.WhichOneof('raw_data'): raw_type = type(getattr(doc, doc.WhichOneof('raw_data'))) if raw_type == gnes_pb2.NdArray: images = blob2array(doc.raw_video) doc.raw_bytes = self._encode(images) else: self.logger.error('bad document: "doc.raw_video" is empty!') else: self.logger.error( 'bad document: "doc.chunks" and "doc.raw_video" is empty!')