bevy_video 0.9.1

Decode and render h264 video in Bevy
Documentation
use bevy::{prelude::*, render::render_resource::Extent3d};

use crate::components::{VideoDecoder, VideoFrame};

pub fn apply_decode(
    mut commands: Commands,
    mut images: ResMut<Assets<Image>>,
    decoders: Query<(Entity, &VideoDecoder)>,
) {
    for (entity, decoder) in decoders.iter() {
        let frame = decoder.take_frame_rgb8();
        if let Some(frame) = frame {
            let VideoFrame {
                buffer,
                width,
                height,
            } = frame;

            let image_handle = decoder.get_render_target();
            let image = match images.get_mut(&image_handle) {
                Some(image) => image,
                None => {
                    info!(
                        "Image gone. Removing video decoder from {:?} and stopping decode thread",
                        entity
                    );
                    commands.entity(entity).remove::<VideoDecoder>();
                    continue;
                }
            };

            if image.texture_descriptor.size.width != width as u32
                || image.texture_descriptor.size.height != height as u32
            {
                image.resize(Extent3d {
                    width: width as u32,
                    height: height as u32,
                    ..default()
                });
            }

            for (dest, src) in image.data.chunks_exact_mut(4).zip(buffer.chunks_exact(3)) {
                dest.copy_from_slice(&[src[2], src[1], src[0], 255]);
            }
        }
    }
}