Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tkanakamalla/gst-plugins-rs
  • gstreamer/gst-plugins-rs
  • slomo/gst-plugins-rs
  • tvermeir/gst-plugin-rs
  • alatiera/gst-plugins-rs
  • redongjun/gst-plugin-rs
  • fengalin/gst-plugins-rs
  • bkchr/gst-plugins-rs
  • LighthouseJ/gst-plugins-rs
  • JimmyOhn/gst-plugins-rs
  • philn/gst-plugins-rs
  • meh/gst-plugins-rs
  • ahamedsajeer.15/gst-plugins-rs
  • kindlychung/gst-plugins-rs
  • gdesmott/gst-plugins-rs
  • arun/gst-plugins-rs
  • loganek/gst-plugins-rs
  • nhunter1093/gst-plugins-rs
  • charles/gst-plugins-rs
  • rubenrua/gst-plugins-rs
  • raytiley/gst-plugins-rs
  • rgonzalez/gst-plugins-rs
  • chturne/gst-plugins-rs
  • heftig/gst-plugins-rs
  • Devdutt/gst-plugins-rs
  • tony-jinwoo-ahn/gst-plugins-rs
  • bilboed/gst-plugins-rs
  • tmorell/gst-plugins-rs
  • xclaesse/gst-plugins-rs
  • hanseac/gst-plugins-rs
  • neithanmo/gst-plugins-rs
  • blaxar.waldarax/gst-plugins-rs
  • ebnerm/gst-plugins-rs
  • dabrain34/gst-plugins-rs
  • paulyc/gst-plugins-rs
  • ndufresne/gst-plugins-rs
  • bgonz/gst-plugins-rs
  • lucab/gst-plugins-rs
  • yan3nian/gst-plugins-rs
  • jessica2020martin/gst-plugins-rs
  • ystreet/gst-plugins-rs
  • vivia/gst-plugins-rs
  • yselkowitz1/gst-plugins-rs
  • elmarco/gst-plugins-rs
  • thaytan/gst-plugins-rs
  • seungha.yang/gst-plugins-rs
  • avantgardnerio/gst-plugins-rs
  • wonchul/gst-plugins-rs
  • abdulrehman/gst-plugins-rs
  • nkyriazis/gst-plugins-rs
  • francisv/gst-plugins-rs
  • MarijnS95/gst-plugins-rs
  • zeenix/gst-plugins-rs
  • SanchayanMaity/gst-plugins-rs
  • gstreamer-backport-bot/gst-plugins-rs
  • cadubentzen/gst-plugins-rs
  • ocrete/gst-plugins-rs
  • bilelmoussaoui/gst-plugins-rs
  • karlri/gst-plugins-rs
  • rafaelcaricio/gst-plugins-rs
  • ferjmoreno/gst-plugins-rs
  • xhaakon/gst-plugins-rs
  • theHamsta/gst-plugins-rs
  • taynantz/gst-plugins-rs
  • chrko/gst-plugins-rs
  • humb3rtoguti3rr3z/gst-plugins-rs
  • micolous/gst-plugins-rs
  • linkmauve/gst-plugins-rs
  • jsparber/gst-plugins-rs
  • tpm/gst-plugins-rs
  • SeaDve/gst-plugins-rs
  • andreiltd/gst-plugins-rs
  • marksweeneyster/gst-plugins-rs
  • thiblahute/gst-plugins-rs
  • jh-hsd/gst-plugins-rs
  • burakyigit442005/gst-plugins-rs
  • kapsa.wojtek/gst-plugins-rs
  • vivienne/gst-plugins-rs
  • aeikum/gst-plugins-rs
  • yatinmaan/gst-plugins-rs
  • ranfdev/gst-plugins-rs
  • 7r3nzy/gst-plugins-rs
  • K.J.Russcher/gst-plugins-rs
  • Be/gst-plugins-rs
  • rajneeshksoni/gst-plugins-rs
  • 0m-ax/gst-plugins-rs
  • VanMacGiGi/gst-plugins-rs
  • nirbheek/gst-plugins-rs
  • leio/gst-plugins-rs
  • mildsunrise/gst-plugins-rs
  • dwlsalmeida/gst-plugins-rs
  • neodesys/gst-plugins-rs
  • MichaelOultram-pexip/gst-plugins-rs
  • zhao-gang/gst-plugins-rs
  • raffael_santi/gst-plugins-rs
  • mkonstapel/gst-plugins-rs
  • johan-bjareholt/gst-plugins-rs
  • cwtchan3388/gst-plugins-rs
  • Skyfarmer/gst-plugins-rs
  • mattfeury/gst-plugins-rs
  • mmenzyns/gst-plugins-rs
  • averred/gst-plugins-rs
  • jobafr/gst-plugins-rs
  • thejoeejoee/gst-plugins-rs
  • lilyinstarlight/gst-plugins-rs
  • MrBlenny/gst-plugins-rs
  • Hejsil/gst-plugins-rs
  • marcbull/gst-plugins-rs
  • kingosticks/gst-plugins-rs
  • beaverking/gst-plugins-rs
  • chhofi/gst-plugins-rs
  • jaysonsantos/gst-plugins-rs
  • ylatuya/gst-plugins-rs
  • ozan/gst-plugins-rs
  • happylinks/gst-plugins-rs
  • vpalmisano/gst-plugins-rs
  • rodrigovb96/gst-plugins-rs
  • JanGernert/gst-plugins-rs
  • amyspark/gst-plugins-rs
  • rayrapetyan/gst-plugins-rs
  • YaLTeR/gst-plugins-rs
  • eva/gst-plugins-rs
  • danburkert/gst-plugins-rs
  • GRVYDEV/gst-plugins-rs
  • Sean-Der/gst-plugins-rs
  • max-khm/gst-plugins-rs
  • thewildtree/gst-plugins-rs
  • lieven.paulissen2/gst-plugins-rs
  • lieven.paulissen/gst-plugins-rs
  • eddo/gst-plugins-rs
  • nagisa/gst-plugins-rs
  • jyelloz/gst-plugins-rs
  • rmader/gst-plugins-rs
  • PLavigne/gst-plugins-rs
  • AntoninRousset/gst-plugins-rs
  • mjimeno/gst-plugins-rs
  • benjamin.gaignard1/gst-plugins-rs
  • m.tretter/gst-plugins-rs
  • diegonieto/gst-plugins-rs
  • zecakeh/gst-plugins-rs
  • jhennebe/gst-plugins-rs
  • gawmanarnar/gst-plugins-rs
  • levaitamas/gst-plugins-rs
  • cdelguercio/gst-plugins-rs
  • btgoodwin/gst-plugins-rs
  • ljwall/gst-plugins-rs
  • vixalien/gst-plugins-rs
  • ekwange/gst-plugins-rs
  • SteveMcFarlin/gst-plugins-rs
  • leonardosalvatore/gst-plugins-rs
  • artemmartus/gst-plugins-rs
  • leo.park/gst-plugins-rs
  • muiznieks.reinis/gst-plugins-rs
  • topmux/gst-plugins-rs
  • davydog187/gst-plugins-rs
  • kevmo314/gst-plugins-rs
  • markandre/gst-plugins-rs
  • jbcolle/gst-plugins-rs
  • me5/gst-plugins-rs
  • ntrrgc/gst-plugins-rs
  • jewe37/gst-plugins-rs
  • emielvanseveren/gst-plugins-rs
  • daniel.pendse/gst-plugins-rs
  • cocoa/gst-plugins-rs
  • oscar/gst-plugins-rs
  • chrisb/gst-plugins-rs
  • Mohan_J/gst-plugins-rs
  • alberts/gst-plugins-rs
  • bradh/gst-plugins-rs
  • eipachte/gst-plugins-rs
  • romain/gst-plugins-rs
  • dyshimizu/gst-plugins-rs
  • antoniok/gst-plugins-rs
  • tomaszmi/gst-plugins-rs
  • jtojnar/gst-plugins-rs
  • dougnazar/gst-plugins-rs
  • robertoviola/gst-plugins-rs
  • estigma88/gst-plugins-rs
  • npapapietro/gst-plugins-rs
179 results
Show changes
Commits on Source (41)
Showing
with 196 additions and 226 deletions
...@@ -26,9 +26,9 @@ script: ...@@ -26,9 +26,9 @@ script:
before_install: before_install:
- curl -L https://people.freedesktop.org/~slomo/gstreamer.tar.gz | tar xz - curl -L https://people.freedesktop.org/~slomo/gstreamer.tar.gz | tar xz
- sed -i "s;prefix=/root/gstreamer;prefix=$PWD/gstreamer;g" $PWD/gstreamer/lib/pkgconfig/*.pc - sed -i "s;prefix=/root/gstreamer;prefix=$PWD/gstreamer;g" $PWD/gstreamer/lib/x86_64-linux-gnu/pkgconfig/*.pc
- export PKG_CONFIG_PATH=$PWD/gstreamer/lib/pkgconfig - export PKG_CONFIG_PATH=$PWD/gstreamer/lib/x86_64-linux-gnu/pkgconfig
- export GST_PLUGIN_SYSTEM_PATH=$PWD/gstreamer/lib/gstreamer-1.0 - export GST_PLUGIN_SYSTEM_PATH=$PWD/gstreamer/lib/x86_64-linux-gnu/gstreamer-1.0
- export GST_PLUGIN_SCANNER=$PWD/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner - export GST_PLUGIN_SCANNER=$PWD/gstreamer/libexec/gstreamer-1.0/gst-plugin-scanner
- export PATH=$PATH:$PWD/gstreamer/bin - export PATH=$PATH:$PWD/gstreamer/bin
- export LD_LIBRARY_PATH=$PWD/gstreamer/lib:$LD_LIBRARY_PATH - export LD_LIBRARY_PATH=$PWD/gstreamer/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
[package] [package]
name = "gst-plugin-audiofx" name = "gst-plugin-audiofx"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
repository = "https://github.com/sdroege/gst-plugin-rs" repository = "https://github.com/sdroege/gst-plugin-rs"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
[dependencies] [dependencies]
gst-plugin = { path="../gst-plugin" } gobject-subclass = "0.2"
glib = { git = "https://github.com/gtk-rs/glib" } gst-plugin = { version = "0.3", path="../gst-plugin" }
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } glib = "0.6"
gstreamer-base = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
gstreamer-audio = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer-base = "0.12"
byte-slice-cast = "0.1" gstreamer-audio = "0.12"
byte-slice-cast = "0.2"
num-traits = "0.2" num-traits = "0.2"
[lib] [lib]
......
...@@ -11,18 +11,18 @@ use gst; ...@@ -11,18 +11,18 @@ use gst;
use gst::prelude::*; use gst::prelude::*;
use gst_audio; use gst_audio;
use gst_plugin::properties::*;
use gst_plugin::object::*;
use gst_plugin::element::*;
use gst_plugin::base_transform::*; use gst_plugin::base_transform::*;
use gst_plugin::element::*;
use gobject_subclass::object::*;
use std::{cmp, iter, i32, u64};
use std::sync::Mutex; use std::sync::Mutex;
use std::{cmp, i32, iter, u64};
use byte_slice_cast::*; use byte_slice_cast::*;
use num_traits::float::Float;
use num_traits::cast::{FromPrimitive, ToPrimitive}; use num_traits::cast::{FromPrimitive, ToPrimitive};
use num_traits::float::Float;
const DEFAULT_MAX_DELAY: u64 = gst::SECOND_VAL; const DEFAULT_MAX_DELAY: u64 = gst::SECOND_VAL;
const DEFAULT_DELAY: u64 = 500 * gst::MSECOND_VAL; const DEFAULT_DELAY: u64 = 500 * gst::MSECOND_VAL;
...@@ -161,7 +161,8 @@ impl AudioEcho { ...@@ -161,7 +161,8 @@ impl AudioEcho {
state: &mut State, state: &mut State,
settings: &Settings, settings: &Settings,
) { ) {
let delay_frames = (settings.delay as usize) * (state.info.channels() as usize) let delay_frames = (settings.delay as usize)
* (state.info.channels() as usize)
* (state.info.rate() as usize) / (gst::SECOND_VAL as usize); * (state.info.rate() as usize) / (gst::SECOND_VAL as usize);
for (i, (o, e)) in data.iter_mut().zip(state.buffer.iter(delay_frames)) { for (i, (o, e)) in data.iter_mut().zip(state.buffer.iter(delay_frames)) {
...@@ -245,11 +246,11 @@ impl BaseTransformImpl<BaseTransform> for AudioEcho { ...@@ -245,11 +246,11 @@ impl BaseTransformImpl<BaseTransform> for AudioEcho {
match state.info.format() { match state.info.format() {
gst_audio::AUDIO_FORMAT_F64 => { gst_audio::AUDIO_FORMAT_F64 => {
let data = map.as_mut_slice().as_mut_slice_of::<f64>().unwrap(); let data = map.as_mut_slice_of::<f64>().unwrap();
Self::process(data, state, &settings); Self::process(data, state, &settings);
} }
gst_audio::AUDIO_FORMAT_F32 => { gst_audio::AUDIO_FORMAT_F32 => {
let data = map.as_mut_slice().as_mut_slice_of::<f32>().unwrap(); let data = map.as_mut_slice_of::<f32>().unwrap();
Self::process(data, state, &settings); Self::process(data, state, &settings);
} }
_ => return gst::FlowReturn::NotNegotiated, _ => return gst::FlowReturn::NotNegotiated,
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
extern crate byte_slice_cast; extern crate byte_slice_cast;
extern crate glib; extern crate glib;
extern crate gobject_subclass;
#[macro_use] #[macro_use]
extern crate gst_plugin; extern crate gst_plugin;
#[macro_use] #[macro_use]
......
[package] [package]
name = "gst-plugin-file" name = "gst-plugin-file"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
repository = "https://github.com/sdroege/gst-plugin-rs" repository = "https://github.com/sdroege/gst-plugin-rs"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
[dependencies] [dependencies]
url = "1.1" url = "1.1"
gst-plugin = { path="../gst-plugin" } gst-plugin = { version = "0.3", path="../gst-plugin" }
gst-plugin-simple = { path="../gst-plugin-simple" } gst-plugin-simple = { version = "0.3", path="../gst-plugin-simple" }
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
[lib] [lib]
name = "gstrsfile" name = "gstrsfile"
......
...@@ -12,6 +12,7 @@ use url::Url; ...@@ -12,6 +12,7 @@ use url::Url;
use std::io::Write; use std::io::Write;
use gst_plugin::error::*;
use gst_plugin_simple::error::*; use gst_plugin_simple::error::*;
use gst_plugin_simple::sink::*; use gst_plugin_simple::sink::*;
use gst_plugin_simple::UriValidator; use gst_plugin_simple::UriValidator;
...@@ -93,7 +94,7 @@ impl SinkImpl for FileSink { ...@@ -93,7 +94,7 @@ impl SinkImpl for FileSink {
[ [
"Could not open file for writing '{}': {}", "Could not open file for writing '{}': {}",
location.to_str().unwrap_or("Non-UTF8 path"), location.to_str().unwrap_or("Non-UTF8 path"),
err.to_string() err.to_string(),
] ]
)) ))
})); }));
......
...@@ -6,11 +6,12 @@ ...@@ -6,11 +6,12 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::u64;
use std::io::{Read, Seek, SeekFrom};
use std::fs::File; use std::fs::File;
use std::io::{Read, Seek, SeekFrom};
use std::u64;
use url::Url; use url::Url;
use gst_plugin::error::*;
use gst_plugin_simple::error::*; use gst_plugin_simple::error::*;
use gst_plugin_simple::source::*; use gst_plugin_simple::source::*;
use gst_plugin_simple::UriValidator; use gst_plugin_simple::UriValidator;
...@@ -104,7 +105,7 @@ impl SourceImpl for FileSrc { ...@@ -104,7 +105,7 @@ impl SourceImpl for FileSrc {
[ [
"Could not open file for reading '{}': {}", "Could not open file for reading '{}': {}",
location.to_str().unwrap_or("Non-UTF8 path"), location.to_str().unwrap_or("Non-UTF8 path"),
err.to_string() err.to_string(),
] ]
)) ))
})); }));
......
...@@ -15,14 +15,14 @@ extern crate gst_plugin_simple; ...@@ -15,14 +15,14 @@ extern crate gst_plugin_simple;
extern crate gstreamer as gst; extern crate gstreamer as gst;
extern crate url; extern crate url;
use gst_plugin_simple::source::*;
use gst_plugin_simple::sink::*; use gst_plugin_simple::sink::*;
use gst_plugin_simple::source::*;
mod filesrc;
mod filesink; mod filesink;
mod filesrc;
use filesrc::FileSrc;
use filesink::FileSink; use filesink::FileSink;
use filesrc::FileSrc;
fn plugin_init(plugin: &gst::Plugin) -> bool { fn plugin_init(plugin: &gst::Plugin) -> bool {
source_register( source_register(
......
[package] [package]
name = "gst-plugin-flv" name = "gst-plugin-flv"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
repository = "https://github.com/sdroege/gst-plugin-rs" repository = "https://github.com/sdroege/gst-plugin-rs"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
[dependencies] [dependencies]
url = "1.1" url = "1.1"
gst-plugin = { path="../gst-plugin" } gst-plugin = { version = "0.3", path="../gst-plugin" }
gst-plugin-simple = { path="../gst-plugin-simple" } gst-plugin-simple = { version = "0.3", path="../gst-plugin-simple" }
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
num-rational = { version = "0.1", default-features = false, features = [] } num-rational = { version = "0.2", default-features = false, features = [] }
nom = "3.0" nom = "3.0"
flavors = {git = "https://github.com/rust-av/flavors.git"} flavors = {git = "https://github.com/rust-av/flavors.git"}
muldiv = "0.1" muldiv = "0.2"
[lib] [lib]
name = "gstrsflv" name = "gstrsflv"
......
...@@ -17,8 +17,8 @@ use flavors::parser as flavors; ...@@ -17,8 +17,8 @@ use flavors::parser as flavors;
use gst_plugin::adapter::*; use gst_plugin::adapter::*;
use gst_plugin::bytes::*; use gst_plugin::bytes::*;
use gst_plugin::element::*; use gst_plugin::element::*;
use gst_plugin::error::*;
use gst_plugin_simple::demuxer::*; use gst_plugin_simple::demuxer::*;
use gst_plugin_simple::error::*;
use gst; use gst;
...@@ -83,7 +83,9 @@ struct AudioFormat { ...@@ -83,7 +83,9 @@ struct AudioFormat {
// Ignores bitrate // Ignores bitrate
impl PartialEq for AudioFormat { impl PartialEq for AudioFormat {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self.format.eq(&other.format) && self.rate.eq(&other.rate) && self.width.eq(&other.width) self.format.eq(&other.format)
&& self.rate.eq(&other.rate)
&& self.width.eq(&other.width)
&& self.channels.eq(&other.channels) && self.channels.eq(&other.channels)
&& self.aac_sequence_header.eq(&other.aac_sequence_header) && self.aac_sequence_header.eq(&other.aac_sequence_header)
} }
...@@ -346,12 +348,10 @@ impl VideoFormat { ...@@ -346,12 +348,10 @@ impl VideoFormat {
if let Some(par) = self.pixel_aspect_ratio { if let Some(par) = self.pixel_aspect_ratio {
if *par.numer() != 0 && par.numer() != par.denom() { if *par.numer() != 0 && par.numer() != par.denom() {
caps.as_mut().map(|c| { caps.as_mut().map(|c| {
c.get_mut().unwrap().set_simple(&[ c.get_mut().unwrap().set_simple(&[(
( "pixel-aspect-ratio",
"pixel-aspect-ratio", &gst::Fraction::new(*par.numer(), *par.denom()),
&gst::Fraction::new(*par.numer(), *par.denom()), )])
),
])
}); });
} }
} }
...@@ -359,9 +359,10 @@ impl VideoFormat { ...@@ -359,9 +359,10 @@ impl VideoFormat {
if let Some(fps) = self.framerate { if let Some(fps) = self.framerate {
if *fps.numer() != 0 { if *fps.numer() != 0 {
caps.as_mut().map(|c| { caps.as_mut().map(|c| {
c.get_mut().unwrap().set_simple(&[ c.get_mut().unwrap().set_simple(&[(
("framerate", &gst::Fraction::new(*fps.numer(), *fps.denom())), "framerate",
]) &gst::Fraction::new(*fps.numer(), *fps.denom()),
)])
}); });
} }
} }
...@@ -373,7 +374,8 @@ impl VideoFormat { ...@@ -373,7 +374,8 @@ impl VideoFormat {
// Ignores bitrate // Ignores bitrate
impl PartialEq for VideoFormat { impl PartialEq for VideoFormat {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self.format.eq(&other.format) && self.width.eq(&other.width) self.format.eq(&other.format)
&& self.width.eq(&other.width)
&& self.height.eq(&other.height) && self.height.eq(&other.height)
&& self.pixel_aspect_ratio.eq(&other.pixel_aspect_ratio) && self.pixel_aspect_ratio.eq(&other.pixel_aspect_ratio)
&& self.framerate.eq(&other.framerate) && self.framerate.eq(&other.framerate)
...@@ -516,7 +518,8 @@ impl FlvDemux { ...@@ -516,7 +518,8 @@ impl FlvDemux {
self.adapter.flush(15).unwrap(); self.adapter.flush(15).unwrap();
let buffer = self.adapter let buffer = self
.adapter
.get_buffer(tag_header.data_size as usize) .get_buffer(tag_header.data_size as usize)
.unwrap(); .unwrap();
let map = buffer.map_readable().unwrap(); let map = buffer.map_readable().unwrap();
...@@ -670,7 +673,8 @@ impl FlvDemux { ...@@ -670,7 +673,8 @@ impl FlvDemux {
match header.packet_type { match header.packet_type {
flavors::AACPacketType::SequenceHeader => { flavors::AACPacketType::SequenceHeader => {
self.adapter.flush(15 + 1 + 1).unwrap(); self.adapter.flush(15 + 1 + 1).unwrap();
let buffer = self.adapter let buffer = self
.adapter
.get_buffer((tag_header.data_size - 1 - 1) as usize) .get_buffer((tag_header.data_size - 1 - 1) as usize)
.unwrap(); .unwrap();
gst_debug!( gst_debug!(
...@@ -725,7 +729,8 @@ impl FlvDemux { ...@@ -725,7 +729,8 @@ impl FlvDemux {
self.adapter.flush(offset as usize).unwrap(); self.adapter.flush(offset as usize).unwrap();
} }
let mut buffer = self.adapter let mut buffer = self
.adapter
.get_buffer((tag_header.data_size - 1 - offset) as usize) .get_buffer((tag_header.data_size - 1 - offset) as usize)
.unwrap(); .unwrap();
...@@ -846,7 +851,8 @@ impl FlvDemux { ...@@ -846,7 +851,8 @@ impl FlvDemux {
match header.packet_type { match header.packet_type {
flavors::AVCPacketType::SequenceHeader => { flavors::AVCPacketType::SequenceHeader => {
self.adapter.flush(15 + 1 + 4).unwrap(); self.adapter.flush(15 + 1 + 4).unwrap();
let buffer = self.adapter let buffer = self
.adapter
.get_buffer((tag_header.data_size - 1 - 4) as usize) .get_buffer((tag_header.data_size - 1 - 4) as usize)
.unwrap(); .unwrap();
gst_debug!( gst_debug!(
...@@ -911,7 +917,8 @@ impl FlvDemux { ...@@ -911,7 +917,8 @@ impl FlvDemux {
self.adapter.flush(offset as usize).unwrap(); self.adapter.flush(offset as usize).unwrap();
} }
let mut buffer = self.adapter let mut buffer = self
.adapter
.get_buffer((tag_header.data_size - 1 - offset) as usize) .get_buffer((tag_header.data_size - 1 - offset) as usize)
.unwrap(); .unwrap();
......
[package] [package]
name = "gst-plugin-http" name = "gst-plugin-http"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
repository = "https://github.com/sdroege/gst-plugin-rs" repository = "https://github.com/sdroege/gst-plugin-rs"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
[dependencies] [dependencies]
url = "1.1" url = "1.1"
gst-plugin = { path="../gst-plugin" } gst-plugin = { version = "0.3", path="../gst-plugin" }
gst-plugin-simple = { path="../gst-plugin-simple" } gst-plugin-simple = { version = "0.3", path="../gst-plugin-simple" }
reqwest = "0.8" reqwest = "0.8"
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
[lib] [lib]
name = "gstrshttp" name = "gstrshttp"
......
...@@ -6,12 +6,15 @@ ...@@ -6,12 +6,15 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
use std::u64; use reqwest::header::{
AcceptRanges, ByteRangeSpec, ContentLength, ContentRange, ContentRangeSpec, Range, RangeUnit,
};
use reqwest::{Client, Response};
use std::io::Read; use std::io::Read;
use std::u64;
use url::Url; use url::Url;
use reqwest::{Client, Response};
use reqwest::header::{AcceptRanges, ByteRangeSpec, ContentLength, ContentRange, ContentRangeSpec, use gst_plugin::error::*;
Range, RangeUnit};
use gst_plugin_simple::error::*; use gst_plugin_simple::error::*;
use gst_plugin_simple::source::*; use gst_plugin_simple::source::*;
......
[package] [package]
name = "gst-plugin-simple" name = "gst-plugin-simple"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
repository = "https://github.com/sdroege/gst-plugin-rs" repository = "https://github.com/sdroege/gst-plugin-rs"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
[dependencies] [dependencies]
url = "1.1" url = "1.1"
glib = { git = "https://github.com/gtk-rs/glib" } glib = "0.6"
gst-plugin = { path="../gst-plugin" } gobject-subclass = "0.2"
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } gst-plugin = { version = "0.3", path="../gst-plugin" }
gstreamer-base = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
gstreamer-base = "0.12"
[lib] [lib]
name = "gst_plugin_simple" name = "gst_plugin_simple"
......
...@@ -8,14 +8,13 @@ ...@@ -8,14 +8,13 @@
use std::sync::Mutex; use std::sync::Mutex;
use std::collections::BTreeMap;
use std::u32; use std::u32;
use std::u64; use std::u64;
use std::collections::BTreeMap;
use gst_plugin::object::*; use gobject_subclass::object::*;
use gst_plugin::element::*; use gst_plugin::element::*;
use gst_plugin::error::*;
use error::*;
use gst; use gst;
use gst::prelude::*; use gst::prelude::*;
...@@ -339,12 +338,7 @@ impl Demuxer { ...@@ -339,12 +338,7 @@ impl Demuxer {
mode: gst::PadMode, mode: gst::PadMode,
active: bool, active: bool,
) -> bool { ) -> bool {
let element = parent let element = parent.as_ref().unwrap().downcast_ref::<Element>().unwrap();
.as_ref()
.cloned()
.unwrap()
.downcast::<Element>()
.unwrap();
let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap(); let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap();
if active { if active {
...@@ -353,7 +347,7 @@ impl Demuxer { ...@@ -353,7 +347,7 @@ impl Demuxer {
.peer_query_duration::<gst::format::Bytes>() .peer_query_duration::<gst::format::Bytes>()
.and_then(|v| v.0); .and_then(|v| v.0);
if !demuxer.start(&element, upstream_size, mode == gst::PadMode::Pull) { if !demuxer.start(element, upstream_size, mode == gst::PadMode::Pull) {
return false; return false;
} }
...@@ -368,7 +362,7 @@ impl Demuxer { ...@@ -368,7 +362,7 @@ impl Demuxer {
let _ = demuxer.sinkpad.stop_task(); let _ = demuxer.sinkpad.stop_task();
} }
demuxer.stop(&element) demuxer.stop(element)
} }
} }
...@@ -377,25 +371,20 @@ impl Demuxer { ...@@ -377,25 +371,20 @@ impl Demuxer {
parent: &Option<gst::Object>, parent: &Option<gst::Object>,
buffer: gst::Buffer, buffer: gst::Buffer,
) -> gst::FlowReturn { ) -> gst::FlowReturn {
let element = parent let element = parent.as_ref().unwrap().downcast_ref::<Element>().unwrap();
.as_ref()
.cloned()
.unwrap()
.downcast::<Element>()
.unwrap();
let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap(); let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap();
let mut res = { let mut res = {
let demuxer_impl = &mut demuxer.imp.lock().unwrap(); let demuxer_impl = &mut demuxer.imp.lock().unwrap();
gst_trace!(demuxer.cat, obj: &element, "Handling buffer {:?}", buffer); gst_trace!(demuxer.cat, obj: element, "Handling buffer {:?}", buffer);
match demuxer_impl.handle_buffer(&element, Some(buffer)) { match demuxer_impl.handle_buffer(element, Some(buffer)) {
Ok(res) => res, Ok(res) => res,
Err(flow_error) => { Err(flow_error) => {
gst_error!( gst_error!(
demuxer.cat, demuxer.cat,
obj: &element, obj: element,
"Failed handling buffer: {:?}", "Failed handling buffer: {:?}",
flow_error flow_error
); );
...@@ -412,33 +401,33 @@ impl Demuxer { ...@@ -412,33 +401,33 @@ impl Demuxer {
// Loop until AllEos, NeedMoreData or error when pushing downstream // Loop until AllEos, NeedMoreData or error when pushing downstream
loop { loop {
gst_trace!(demuxer.cat, obj: &element, "Handled {:?}", res); gst_trace!(demuxer.cat, obj: element, "Handled {:?}", res);
match res { match res {
HandleBufferResult::NeedMoreData => { HandleBufferResult::NeedMoreData => {
return gst::FlowReturn::Ok; return gst::FlowReturn::Ok;
} }
HandleBufferResult::StreamAdded(stream) => { HandleBufferResult::StreamAdded(stream) => {
demuxer.add_stream(&element, stream.index, stream.caps, &stream.stream_id); demuxer.add_stream(element, stream.index, stream.caps, &stream.stream_id);
} }
HandleBufferResult::HaveAllStreams => { HandleBufferResult::HaveAllStreams => {
demuxer.added_all_streams(&element); demuxer.added_all_streams(element);
} }
HandleBufferResult::StreamChanged(stream) => { HandleBufferResult::StreamChanged(stream) => {
demuxer.stream_format_changed(&element, stream.index, stream.caps); demuxer.stream_format_changed(element, stream.index, stream.caps);
} }
HandleBufferResult::StreamsChanged(streams) => for stream in streams { HandleBufferResult::StreamsChanged(streams) => for stream in streams {
demuxer.stream_format_changed(&element, stream.index, stream.caps); demuxer.stream_format_changed(element, stream.index, stream.caps);
}, },
HandleBufferResult::BufferForStream(index, buffer) => { HandleBufferResult::BufferForStream(index, buffer) => {
let flow_ret = demuxer.stream_push_buffer(&element, index, buffer); let flow_ret = demuxer.stream_push_buffer(element, index, buffer);
if flow_ret != gst::FlowReturn::Ok { if flow_ret != gst::FlowReturn::Ok {
return flow_ret; return flow_ret;
} }
} }
HandleBufferResult::Eos(index) => { HandleBufferResult::Eos(index) => {
demuxer.stream_eos(&element, index); demuxer.stream_eos(element, index);
return gst::FlowReturn::Eos; return gst::FlowReturn::Eos;
} }
HandleBufferResult::Again => { HandleBufferResult::Again => {
...@@ -446,16 +435,16 @@ impl Demuxer { ...@@ -446,16 +435,16 @@ impl Demuxer {
} }
}; };
gst_trace!(demuxer.cat, obj: &element, "Calling again"); gst_trace!(demuxer.cat, obj: element, "Calling again");
res = { res = {
let demuxer_impl = &mut demuxer.imp.lock().unwrap(); let demuxer_impl = &mut demuxer.imp.lock().unwrap();
match demuxer_impl.handle_buffer(&element, None) { match demuxer_impl.handle_buffer(element, None) {
Ok(res) => res, Ok(res) => res,
Err(flow_error) => { Err(flow_error) => {
gst_error!( gst_error!(
demuxer.cat, demuxer.cat,
obj: &element, obj: element,
"Failed calling again: {:?}", "Failed calling again: {:?}",
flow_error flow_error
); );
...@@ -475,28 +464,18 @@ impl Demuxer { ...@@ -475,28 +464,18 @@ impl Demuxer {
fn sink_event(pad: &gst::Pad, parent: &Option<gst::Object>, event: gst::Event) -> bool { fn sink_event(pad: &gst::Pad, parent: &Option<gst::Object>, event: gst::Event) -> bool {
use gst::EventView; use gst::EventView;
let element = parent let element = parent.as_ref().unwrap().downcast_ref::<Element>().unwrap();
.as_ref()
.cloned()
.unwrap()
.downcast::<Element>()
.unwrap();
let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap(); let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap();
match event.view() { match event.view() {
EventView::Eos(..) => { EventView::Eos(..) => {
let demuxer_impl = &mut demuxer.imp.lock().unwrap(); let demuxer_impl = &mut demuxer.imp.lock().unwrap();
gst_debug!(demuxer.cat, obj: &element, "End of stream"); gst_debug!(demuxer.cat, obj: element, "End of stream");
match demuxer_impl.end_of_stream(&element) { match demuxer_impl.end_of_stream(element) {
Ok(_) => (), Ok(_) => (),
Err(ref msg) => { Err(ref msg) => {
gst_error!( gst_error!(demuxer.cat, obj: element, "Failed end of stream: {:?}", msg);
demuxer.cat,
obj: &element,
"Failed end of stream: {:?}",
msg
);
element.post_error_message(msg); element.post_error_message(msg);
} }
} }
...@@ -510,12 +489,7 @@ impl Demuxer { ...@@ -510,12 +489,7 @@ impl Demuxer {
fn src_query(pad: &gst::Pad, parent: &Option<gst::Object>, query: &mut gst::QueryRef) -> bool { fn src_query(pad: &gst::Pad, parent: &Option<gst::Object>, query: &mut gst::QueryRef) -> bool {
use gst::QueryView; use gst::QueryView;
let element = parent let element = parent.as_ref().unwrap().downcast_ref::<Element>().unwrap();
.as_ref()
.cloned()
.unwrap()
.downcast::<Element>()
.unwrap();
let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap(); let demuxer = element.get_impl().downcast_ref::<Demuxer>().unwrap();
match query.view_mut() { match query.view_mut() {
...@@ -527,7 +501,7 @@ impl Demuxer { ...@@ -527,7 +501,7 @@ impl Demuxer {
let position = demuxer_impl.get_position(&element); let position = demuxer_impl.get_position(&element);
gst_trace!( gst_trace!(
demuxer.cat, demuxer.cat,
obj: &element, obj: element,
"Returning position {:?}", "Returning position {:?}",
position position
); );
...@@ -551,7 +525,7 @@ impl Demuxer { ...@@ -551,7 +525,7 @@ impl Demuxer {
let duration = demuxer_impl.get_duration(&element); let duration = demuxer_impl.get_duration(&element);
gst_trace!( gst_trace!(
demuxer.cat, demuxer.cat,
obj: &element, obj: element,
"Returning duration {:?}", "Returning duration {:?}",
duration duration
); );
......
...@@ -7,60 +7,12 @@ ...@@ -7,60 +7,12 @@
// except according to those terms. // except according to those terms.
use std::error::Error; use std::error::Error;
use std::fmt::{Display, Formatter};
use std::fmt::Error as FmtError; use std::fmt::Error as FmtError;
use std::fmt::{Display, Formatter};
use glib; use glib;
use gst; use gst;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum FlowError {
Flushing,
Eos,
NotNegotiated(gst::ErrorMessage),
Error(gst::ErrorMessage),
}
impl Into<gst::FlowReturn> for FlowError {
fn into(self) -> gst::FlowReturn {
(&self).into()
}
}
impl<'a> Into<gst::FlowReturn> for &'a FlowError {
fn into(self) -> gst::FlowReturn {
match *self {
FlowError::Flushing => gst::FlowReturn::Flushing,
FlowError::Eos => gst::FlowReturn::Eos,
FlowError::NotNegotiated(..) => gst::FlowReturn::NotNegotiated,
FlowError::Error(..) => gst::FlowReturn::Error,
}
}
}
impl Display for FlowError {
fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
match *self {
FlowError::Flushing | FlowError::Eos => f.write_str(self.description()),
FlowError::NotNegotiated(ref m) => {
f.write_fmt(format_args!("{}: {}", self.description(), m))
}
FlowError::Error(ref m) => f.write_fmt(format_args!("{}: {}", self.description(), m)),
}
}
}
impl Error for FlowError {
fn description(&self) -> &str {
match *self {
FlowError::Flushing => "Flushing",
FlowError::Eos => "Eos",
FlowError::NotNegotiated(..) => "Not Negotiated",
FlowError::Error(..) => "Error",
}
}
}
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub struct UriError { pub struct UriError {
error: gst::URIError, error: gst::URIError,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
// except according to those terms. // except according to those terms.
extern crate glib; extern crate glib;
extern crate gobject_subclass;
extern crate gst_plugin; extern crate gst_plugin;
#[macro_use] #[macro_use]
extern crate gstreamer as gst; extern crate gstreamer as gst;
...@@ -14,9 +15,9 @@ extern crate gstreamer_base as gst_base; ...@@ -14,9 +15,9 @@ extern crate gstreamer_base as gst_base;
extern crate url; extern crate url;
pub mod source;
pub mod sink;
pub mod demuxer; pub mod demuxer;
pub mod error; pub mod error;
pub mod sink;
pub mod source;
pub type UriValidator = Fn(&url::Url) -> Result<(), error::UriError> + Send + Sync + 'static; pub type UriValidator = Fn(&url::Url) -> Result<(), error::UriError> + Send + Sync + 'static;
...@@ -15,15 +15,17 @@ use gst; ...@@ -15,15 +15,17 @@ use gst;
use gst::prelude::*; use gst::prelude::*;
use gst_base::prelude::*; use gst_base::prelude::*;
use gst_plugin::object::*; use gobject_subclass::object::*;
use gst_plugin::properties::*;
use gst_plugin::element::*;
use gst_plugin::base_sink::*; use gst_plugin::base_sink::*;
use gst_plugin::element::*;
use gst_plugin::error::*;
use gst_plugin::uri_handler::*; use gst_plugin::uri_handler::*;
use error::*;
pub use gst_plugin::base_sink::BaseSink; pub use gst_plugin::base_sink::BaseSink;
use error::*;
use UriValidator; use UriValidator;
pub trait SinkImpl: Send + 'static { pub trait SinkImpl: Send + 'static {
...@@ -41,15 +43,13 @@ struct Sink { ...@@ -41,15 +43,13 @@ struct Sink {
imp: Mutex<Box<SinkImpl>>, imp: Mutex<Box<SinkImpl>>,
} }
static PROPERTIES: [Property; 1] = [ static PROPERTIES: [Property; 1] = [Property::String(
Property::String( "uri",
"uri", "URI",
"URI", "URI to read from",
"URI to read from", None,
None, PropertyMutability::ReadWrite,
PropertyMutability::ReadWrite, )];
),
];
impl Sink { impl Sink {
fn new(sink: &BaseSink, sink_info: &SinkInfo) -> Self { fn new(sink: &BaseSink, sink_info: &SinkInfo) -> Self {
......
...@@ -17,15 +17,17 @@ use gst; ...@@ -17,15 +17,17 @@ use gst;
use gst::prelude::*; use gst::prelude::*;
use gst_base::prelude::*; use gst_base::prelude::*;
use gst_plugin::object::*; use gobject_subclass::object::*;
use gst_plugin::properties::*;
use gst_plugin::element::*;
use gst_plugin::base_src::*; use gst_plugin::base_src::*;
use gst_plugin::element::*;
use gst_plugin::error::*;
use gst_plugin::uri_handler::*; use gst_plugin::uri_handler::*;
use error::*;
pub use gst_plugin::base_src::BaseSrc; pub use gst_plugin::base_src::BaseSrc;
use error::*;
use UriValidator; use UriValidator;
pub trait SourceImpl: Send + 'static { pub trait SourceImpl: Send + 'static {
...@@ -59,15 +61,13 @@ struct Source { ...@@ -59,15 +61,13 @@ struct Source {
push_only: bool, push_only: bool,
} }
static PROPERTIES: [Property; 1] = [ static PROPERTIES: [Property; 1] = [Property::String(
Property::String( "uri",
"uri", "URI",
"URI", "URI to read from",
"URI to read from", None,
None, PropertyMutability::ReadWrite,
PropertyMutability::ReadWrite, )];
),
];
impl Source { impl Source {
fn new(source: &BaseSrc, source_info: &SourceInfo) -> Self { fn new(source: &BaseSrc, source_info: &SourceInfo) -> Self {
......
[package] [package]
name = "gst-plugin-togglerecord" name = "gst-plugin-togglerecord"
version = "0.1.0" version = "0.3.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"] authors = ["Sebastian Dröge <sebastian@centricular.com>"]
license = "LGPL-2.1+" license = "LGPL-2.1+"
[dependencies] [dependencies]
glib = { git = "https://github.com/gtk-rs/glib" } glib = "0.6"
gstreamer = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer = "0.12"
gstreamer-video = { git = "https://github.com/sdroege/gstreamer-rs" } gstreamer-video = "0.12"
gst-plugin = { path = "../gst-plugin" } gobject-subclass = "0.2"
gtk = { git = "https://github.com/gtk-rs/gtk", features = ["v3_6"], optional = true } gst-plugin = { version = "0.3", path = "../gst-plugin" }
gio = { git = "https://github.com/gtk-rs/gio", optional = true } gtk = { version = "0.5", features = ["v3_6"], optional = true }
send-cell = { version = "0.1", optional = true } gio = { version = "0.5", optional = true }
[dev-dependencies] [dev-dependencies]
either = "1.0" either = "1.0"
...@@ -24,5 +24,5 @@ path = "src/lib.rs" ...@@ -24,5 +24,5 @@ path = "src/lib.rs"
[[example]] [[example]]
name = "gtk-recording" name = "gtk-recording"
path = "examples/gtk_recording.rs" path = "examples/gtk_recording.rs"
required-features = ["gtk", "gio", "send-cell"] required-features = ["gtk", "gio"]
...@@ -26,9 +26,7 @@ use gst::prelude::*; ...@@ -26,9 +26,7 @@ use gst::prelude::*;
extern crate gtk; extern crate gtk;
use gtk::prelude::*; use gtk::prelude::*;
extern crate send_cell; use std::cell::RefCell;
use send_cell::SendCell;
use std::env; use std::env;
fn create_pipeline() -> ( fn create_pipeline() -> (
...@@ -219,11 +217,18 @@ fn create_ui(app: &gtk::Application) { ...@@ -219,11 +217,18 @@ fn create_ui(app: &gtk::Application) {
app.add_window(&window); app.add_window(&window);
let video_sink_clone = video_sink.clone(); let video_sink_weak = video_sink.downgrade();
let togglerecord_clone = togglerecord.clone(); let togglerecord_weak = togglerecord.downgrade();
gtk::timeout_add(100, move || { let timeout_id = gtk::timeout_add(100, move || {
let video_sink = &video_sink_clone; let video_sink = match video_sink_weak.upgrade() {
let togglerecord = &togglerecord_clone; Some(video_sink) => video_sink,
None => return glib::Continue(true),
};
let togglerecord = match togglerecord_weak.upgrade() {
Some(togglerecord) => togglerecord,
None => return glib::Continue(true),
};
let position = video_sink let position = video_sink
.query_position::<gst::ClockTime>() .query_position::<gst::ClockTime>()
...@@ -240,9 +245,12 @@ fn create_ui(app: &gtk::Application) { ...@@ -240,9 +245,12 @@ fn create_ui(app: &gtk::Application) {
glib::Continue(true) glib::Continue(true)
}); });
let togglerecord_clone = togglerecord.clone(); let togglerecord_weak = togglerecord.downgrade();
record_button.connect_clicked(move |button| { record_button.connect_clicked(move |button| {
let togglerecord = &togglerecord_clone; let togglerecord = match togglerecord_weak.upgrade() {
Some(togglerecord) => togglerecord,
None => return,
};
let recording = !togglerecord let recording = !togglerecord
.get_property("record") .get_property("record")
...@@ -254,9 +262,13 @@ fn create_ui(app: &gtk::Application) { ...@@ -254,9 +262,13 @@ fn create_ui(app: &gtk::Application) {
button.set_label(if recording { "Stop" } else { "Record" }); button.set_label(if recording { "Stop" } else { "Record" });
}); });
let record_button_clone = record_button.clone(); let record_button_weak = record_button.downgrade();
finish_button.connect_clicked(move |button| { finish_button.connect_clicked(move |button| {
let record_button = &record_button_clone; let record_button = match record_button_weak.upgrade() {
Some(record_button) => record_button,
None => return,
};
record_button.set_sensitive(false); record_button.set_sensitive(false);
button.set_sensitive(false); button.set_sensitive(false);
...@@ -264,19 +276,27 @@ fn create_ui(app: &gtk::Application) { ...@@ -264,19 +276,27 @@ fn create_ui(app: &gtk::Application) {
audio_pad.send_event(gst::Event::new_eos().build()); audio_pad.send_event(gst::Event::new_eos().build());
}); });
let app_clone = app.clone(); let app_weak = app.downgrade();
window.connect_delete_event(move |_, _| { window.connect_delete_event(move |_, _| {
let app = &app_clone; let app = match app_weak.upgrade() {
Some(app) => app,
None => return Inhibit(false),
};
app.quit(); app.quit();
Inhibit(false) Inhibit(false)
}); });
let bus = pipeline.get_bus().unwrap(); let bus = pipeline.get_bus().unwrap();
let app_clone = SendCell::new(app.clone()); let app_weak = glib::SendWeakRef::from(app.downgrade());
bus.add_watch(move |_, msg| { bus.add_watch(move |_, msg| {
use gst::MessageView; use gst::MessageView;
let app = app_clone.borrow(); let app = match app_weak.upgrade() {
Some(app) => app,
None => return glib::Continue(false),
};
match msg.view() { match msg.view() {
MessageView::Eos(..) => app.quit(), MessageView::Eos(..) => app.quit(),
MessageView::Error(err) => { MessageView::Error(err) => {
...@@ -294,15 +314,22 @@ fn create_ui(app: &gtk::Application) { ...@@ -294,15 +314,22 @@ fn create_ui(app: &gtk::Application) {
glib::Continue(true) glib::Continue(true)
}); });
let pipeline_clone = pipeline.clone(); let ret = pipeline.set_state(gst::State::Playing);
assert_ne!(ret, gst::StateChangeReturn::Failure);
// Pipeline reference is owned by the closure below, so will be
// destroyed once the app is destroyed
let timeout_id = RefCell::new(Some(timeout_id));
app.connect_shutdown(move |_| { app.connect_shutdown(move |_| {
let pipeline = &pipeline_clone;
let ret = pipeline.set_state(gst::State::Null); let ret = pipeline.set_state(gst::State::Null);
assert_ne!(ret, gst::StateChangeReturn::Failure); assert_ne!(ret, gst::StateChangeReturn::Failure);
});
let ret = pipeline.set_state(gst::State::Playing); bus.remove_watch();
assert_ne!(ret, gst::StateChangeReturn::Failure);
if let Some(timeout_id) = timeout_id.borrow_mut().take() {
glib::source_remove(timeout_id);
}
});
} }
fn main() { fn main() {
......