update iced to 0.13, v0.4

This commit is contained in:
jazzfool 2024-09-21 13:20:43 +10:00
parent 65f9cc5a5d
commit 61b083929e
6 changed files with 1151 additions and 256 deletions

1349
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,7 @@ repository = "https://github.com/jazzfool/iced_video_player"
readme = "README.md" readme = "README.md"
keywords = ["gui", "iced", "video"] keywords = ["gui", "iced", "video"]
categories = ["gui", "multimedia"] categories = ["gui", "multimedia"]
version = "0.3.0" version = "0.4.0"
authors = ["jazzfool"] authors = ["jazzfool"]
edition = "2021" edition = "2021"
resolver = "2" resolver = "2"
@ -16,9 +16,9 @@ exclude = [
] ]
[dependencies] [dependencies]
iced = { version = "0.12", features = ["image", "advanced", "wgpu"] } iced = { version = "0.13", features = ["image", "advanced", "wgpu"] }
iced_native = "0.10" iced_native = "0.10"
iced_wgpu = "0.12" iced_wgpu = "0.13"
gstreamer = "0.22" gstreamer = "0.22"
gstreamer-app = "0.22" # appsink gstreamer-app = "0.22" # appsink
gstreamer-base = "0.22" # basesrc gstreamer-base = "0.22" # basesrc

View file

@ -1,12 +1,12 @@
use iced::{ use iced::{
widget::{Button, Column, Row, Slider, Text}, widget::{Button, Column, Row, Slider, Text},
Element, Sandbox, Element,
}; };
use iced_video_player::{Video, VideoPlayer}; use iced_video_player::{Video, VideoPlayer};
use std::time::Duration; use std::time::Duration;
fn main() { fn main() -> iced::Result {
App::run(Default::default()).unwrap(); iced::run("Iced Video Player", App::update, App::view)
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -25,10 +25,8 @@ struct App {
dragging: bool, dragging: bool,
} }
impl Sandbox for App { impl Default for App {
type Message = Message; fn default() -> Self {
fn new() -> Self {
let video = Video::new( let video = Video::new(
&url::Url::from_file_path( &url::Url::from_file_path(
std::path::PathBuf::from(file!()) std::path::PathBuf::from(file!())
@ -47,11 +45,9 @@ impl Sandbox for App {
dragging: false, dragging: false,
} }
} }
}
fn title(&self) -> String { impl App {
String::from("Video Player")
}
fn update(&mut self, message: Message) { fn update(&mut self, message: Message) {
match message { match message {
Message::TogglePause => { Message::TogglePause => {
@ -93,6 +89,8 @@ impl Sandbox for App {
.push( .push(
Row::new() Row::new()
.spacing(5) .spacing(5)
.align_y(iced::alignment::Vertical::Center)
.padding(iced::Padding::new(5.0))
.push( .push(
Button::new(Text::new(if self.video.paused() { Button::new(Text::new(if self.video.paused() {
"Play" "Play"

View file

@ -1,4 +1,4 @@
use iced_wgpu::primitive::pipeline::Primitive; use iced_wgpu::primitive::Primitive;
use iced_wgpu::wgpu; use iced_wgpu::wgpu;
use std::{ use std::{
collections::BTreeMap, collections::BTreeMap,
@ -204,7 +204,7 @@ impl VideoPipeline {
); );
} }
fn prepare(&mut self, queue: &wgpu::Queue, video_id: u64, bounds: iced::Rectangle) { fn prepare(&mut self, queue: &wgpu::Queue, video_id: u64, bounds: &iced::Rectangle) {
if let Some((_, buffer, _)) = self.textures.get(&video_id) { if let Some((_, buffer, _)) = self.textures.get(&video_id) {
let uniforms = Uniforms { let uniforms = Uniforms {
rect: [ rect: [
@ -227,7 +227,7 @@ impl VideoPipeline {
&self, &self,
target: &wgpu::TextureView, target: &wgpu::TextureView,
encoder: &mut wgpu::CommandEncoder, encoder: &mut wgpu::CommandEncoder,
viewport: iced::Rectangle<u32>, viewport: &iced::Rectangle<u32>,
video_id: u64, video_id: u64,
) { ) {
if let Some((_, _, bind_group)) = self.textures.get(&video_id) { if let Some((_, _, bind_group)) = self.textures.get(&video_id) {
@ -288,13 +288,12 @@ impl VideoPrimitive {
impl Primitive for VideoPrimitive { impl Primitive for VideoPrimitive {
fn prepare( fn prepare(
&self, &self,
format: wgpu::TextureFormat,
device: &wgpu::Device, device: &wgpu::Device,
queue: &wgpu::Queue, queue: &wgpu::Queue,
bounds: iced::Rectangle, format: wgpu::TextureFormat,
_target_size: iced::Size<u32>, storage: &mut iced_wgpu::primitive::Storage,
_scale_factor: f32, bounds: &iced::Rectangle,
storage: &mut iced_wgpu::primitive::pipeline::Storage, _viewport: &iced_wgpu::graphics::Viewport,
) { ) {
if !storage.has::<VideoPipeline>() { if !storage.has::<VideoPipeline>() {
storage.store(VideoPipeline::new(device, format)); storage.store(VideoPipeline::new(device, format));
@ -317,13 +316,12 @@ impl Primitive for VideoPrimitive {
fn render( fn render(
&self, &self,
storage: &iced_wgpu::primitive::pipeline::Storage,
target: &wgpu::TextureView,
_target_size: iced::Size<u32>,
viewport: iced::Rectangle<u32>,
encoder: &mut wgpu::CommandEncoder, encoder: &mut wgpu::CommandEncoder,
storage: &iced_wgpu::primitive::Storage,
target: &wgpu::TextureView,
clip_bounds: &iced::Rectangle<u32>,
) { ) {
let pipeline = storage.get::<VideoPipeline>().unwrap(); let pipeline = storage.get::<VideoPipeline>().unwrap();
pipeline.draw(target, encoder, viewport, self.video_id); pipeline.draw(target, encoder, clip_bounds, self.video_id);
} }
} }

View file

@ -353,7 +353,7 @@ impl Video {
// maybe in a small window between seek and wait the old frame comes in? // maybe in a small window between seek and wait the old frame comes in?
inner.wait.recv().map_err(|_| Error::Sync)?; inner.wait.recv().map_err(|_| Error::Sync)?;
inner.wait.recv().map_err(|_| Error::Sync)?; inner.wait.recv().map_err(|_| Error::Sync)?;
Ok(img::Handle::from_pixels( Ok(img::Handle::from_rgba(
inner.width as _, inner.width as _,
inner.height as _, inner.height as _,
self.0 self.0

View file

@ -4,7 +4,7 @@ use iced::{
advanced::{self, graphics::core::event::Status, layout, widget, Widget}, advanced::{self, graphics::core::event::Status, layout, widget, Widget},
Element, Element,
}; };
use iced_wgpu::primitive::pipeline::Renderer as PrimitiveRenderer; use iced_wgpu::primitive::Renderer as PrimitiveRenderer;
use log::error; use log::error;
use std::{marker::PhantomData, sync::atomic::Ordering}; use std::{marker::PhantomData, sync::atomic::Ordering};
use std::{sync::Arc, time::Duration}; use std::{sync::Arc, time::Duration};
@ -111,7 +111,7 @@ where
_viewport: &iced::Rectangle, _viewport: &iced::Rectangle,
) { ) {
let inner = self.video.0.borrow(); let inner = self.video.0.borrow();
renderer.draw_pipeline_primitive( renderer.draw_primitive(
layout.bounds(), layout.bounds(),
VideoPrimitive::new( VideoPrimitive::new(
inner.id, inner.id,
@ -135,7 +135,7 @@ where
) -> Status { ) -> Status {
let mut inner = self.video.0.borrow_mut(); let mut inner = self.video.0.borrow_mut();
if let iced::Event::Window(_, iced::window::Event::RedrawRequested(now)) = event { if let iced::Event::Window(iced::window::Event::RedrawRequested(now)) = event {
if inner.restart_stream || (!inner.is_eos && !inner.paused) { if inner.restart_stream || (!inner.is_eos && !inner.paused) {
let mut restart_stream = false; let mut restart_stream = false;
if inner.restart_stream { if inner.restart_stream {