Jan Schmidt Sydney, Australia / 18 January 2007

Similar documents
CE Linux 2007 GStreamer Tutorial

Embedded Streaming Media with GStreamer and BeagleBoard. Presented by Todd Fischer todd.fischer (at) ridgerun.com

Building GStreamer into your app

The GStreamer Multimedia Architecture. What is GStreamer. What is GStreamer. Why create GStreamer

Simple Plugin API. Wim Taymans Principal Software Engineer October 10, Pinos Wim Taymans

gst-launch-0 - Linux Command

by Klaus Lüthje and Filip Šuba

GStreamer 1.0. FOSDEM, Brussels 4 February Tim-Philipp Müller

GStreamer Daemon - Building a media server under 30min. Michael Grüner - David Soto -

Gravitational Waves with GStreamer Workshop

Oxidising GStreamer. Rust out your multimedia! GStreamer Conference October 2017, Prague. Sebastian 'slomo' Dröge < >

Guile-GNOME: GStreamer

GStreamer Application Development Manual (1.4.5) Wim Taymans Steve Baker Andy Wingo Ronald S. Bultje Stefan Kost

Writing Audio Applications using GStreamer

Synchronised multi-device media playback with GStreamer

GStreamer Application Development Manual ( ) Wim Taymans Steve Baker Andy Wingo Ronald S. Bultje

GStreamer Application Development Manual. Wim Taymans Steve Baker Andy Wingo

MCN Streaming. An Adaptive Video Streaming Platform. Qin Chen Advisor: Prof. Dapeng Oliver Wu

Using OpenMAX Integration Layer with GStreamer - WHITE PAPER -

A Linux multimedia platform for SH-Mobile processors

GStreamer Status Report: The Road Ahead. GStreamer Conference August 2012 San Diego. Tim-Philipp Müller

Synchronised multi-room media playback and distributed live media processing and mixing

Debugging race condition problems in GStreamer

Media Source Extensions

Evaluating the performance gains of specialization in a stream handler architecture. Master Thesis. Kjell Andreas Solberg

GStreamer Plugin Writer s Guide ( ) Richard John Boulton Erik Walthinsen Steve Baker Leif Johnson Ronald S. Bultje Stefan Kost

Taking GStreamer to the Next Level. Tim-Philipp Müller

What's new in GStreamer

Using Gstreamer for building Automated Webcasting Systems

GStreamer Element States How do they work in detail?

Christophe Massiot (FOSDEM 2016) What makes Upipe great for video processing

FOSDEM 3 February 2018, Brussels. Tim-Philipp Müller < >

Porting Tizen-IVI 3.0 to an ARM based SoC Platform. Damian Hobson-Garcia, IGEL Co., Ltd.

Porting Tizen-IVI 3.0 to an ARM based SoC Platform

Programming with MPI

GStreamer Conference 2013, Edinburgh 22 October Sebastian Dröge Centricular Ltd

ACCELERATED GSTREAMER USER GUIDE

Silberschatz and Galvin Chapter 12

Shown below is a diagram of a very simple playback graph.

AM57x Sitara Processors Multimedia and Graphics

Elecard GStreamer Codec SDK v.2.0. Reference Manual

Here you will find guides on how to use different features of the SDL Core application.

GStreamer Application Development Manual ( ) Wim Taymans Steve Baker Andy Wingo Ronald S. Bultje Stefan Kost

GstShark profiling: a real-life example. Michael Grüner - David Soto -

What's new in GStreamer Land The last 2 years and the future

Chapter 13: I/O Systems

Preliminary design and validation of a modular framework for predictable composition of medical imaging applications

Time and Synchronization for dummies Edward Hervey

Thomas Vander Stichele thomas (at) fluendo (dot) com. LCA 2007, Sydney / January 19 th 2007

Module 12: I/O Systems

A program execution is memory safe so long as memory access errors never occur:

Using GStreamer for Seamless Off- Loading Audio Processing to a DSP ELC 2013, San Francisco Ruud Derwig

What s new in GStreamer. GUADEC, Strasbourg 26 July Tim-Philipp Müller Sebastian Dröge

RIS shading Series #2 Meet The Plugins

MPI: A Message-Passing Interface Standard

Completing the Multimedia Architecture

I/O Buffering and Streaming

FOSDEM Open Media Devroom. 02 February 2019, Brussels. Tim-Philipp Müller < >

OPEN SOURCE SOFTWARE A Tool for Digital Transformation in the Broadcasting Industry

Efficient Video Processing on Embedded GPU

Microthread. An Object Behavioral Pattern for Managing Object Execution. 1.0 Intent. 2.0 Also Known As. 3.0 Classification. 4.0 Motivation/Example

Guides SDL Core Documentation Document current as of 04/03/ :20 PM.

Hands-On Workshop: Freescale Audio Solution Framework, Part 2

Android Native Audio Music

Chapter. Out of order Execution

Short Notes of CS201

Avpy Documentation. Release sydh

Device-Functionality Progression

Chapter 12: I/O Systems. I/O Hardware

GStreamer in the living room and in outer space

P2: Collaborations. CSE 335, Spring 2009

What s cooking in GStreamer. FOSDEM, Brussels 1 February Tim-Philipp Müller Sebastian Dröge

Track Three Building a Rich UI Based Dual Display Video Player with the Freescale i.mx53 using LinuxLink

Module 12: I/O Systems

CS201 - Introduction to Programming Glossary By

Dotstack Porting Guide.

Extensibility, Safety, and Performance in the Spin Operating System

MicroBlaze TFTP Server User Guide

Distributed Systems Exam 1 Review Paul Krzyzanowski. Rutgers University. Fall 2016

NI-XNET Python API Documentation

Barrelfish Project ETH Zurich. Message Notifications

GStreamer Plugin Writer s Guide (1.10.1)

Chapter 13: I/O Systems

UNIT V. Computer Networks [10MCA32] 1

Efficient Data Transfers

Process Concepts. CSC400 - Operating Systems. 3. Process Concepts. J. Sumey

Tracing User Guide. Release 1.0. Bruce Mitchener, Jr.

EEG Application Note CCPlay for Caption File Playout to SDI Applies to Products: HD490/491/492 Last Revised: Sept 2017

I/O AND DEVICE HANDLING Operating Systems Design Euiseong Seo

Kodi v18 features and improvements. Martijn Kaijser

Wowza ndvr. User's Guide

Copyright Khronos Group Page 1

A Case Study of Mobile Application Development. Wei Dong Samsung Electronics

4K Video Processing and Streaming Platform on TX1

CS533 Concepts of Operating Systems. Jonathan Walpole

CHAPTER 3 - PROCESS CONCEPT

MMAPI (Mobile Media API) Multimedia Framework for Mobile Devices

Donn Morrison Department of Computer Science. TDT4255 ILP and speculation

OpenShift Roadmap Enterprise Kubernetes for Developers. Clayton Coleman, Architect, OpenShift

CS 152 Computer Architecture and Engineering. Lecture 13 - Out-of-Order Issue and Register Renaming

Transcription:

LCA 2007 GStreamer Tutorial Jan Schmidt (jan@fluendo.com) Sydney, Australia / 18 January 2007 Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Introduction Who am I? Jan Schmidt - jan@fluendo.com I work for Fluendo SL in Barcelona A release manager, and coder for Gstreamer Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Introduction Fluendo Primarily existing GStreamer contributors Open Source plus some closed plugins Opened the web shop this week Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Introduction GStreamer Been around a long time 0.0.1 10th June 1999 0.3.0 12th Dec 2001 0.4.0 5th July 2002 0.6.0 1st Feb 2003 0.8.0 16th March 2004 0.10.0-5th Dec 2005 The problems GStreamer was started to address What you have is what you get media players GStreamer is extensible Functionality provided by plugins Binary codec support was always a goal Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Introduction GStreamer Every project with its own MP3 decoder GStreamer is a library Applications just link to it to get functionality LGPL license allows proprietary apps Used to be a bigger problem than now (xine vs mplayer, vlc) Inconsistent APIs ALSA, OSS, X11 etc Has never been 'just playback' GStreamer reaps the benefits of abstraction Elements + pads == arbitrary flow graph Decoding, encoding, delivery, slicing and dicing. Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Introduction GStreamer The parts: Elements Bins Pads Caps Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Basic parts of GStreamer Elements The basic units of functionality filesrc sink alsasink mad

Bins Basic parts of GStreamer Elements that contain other elements Allow multiple elements to be treated as one entity The top-level bin is a 'pipeline' filesrc sink alsasink bin mad

Basic parts of GStreamer Pads Connection points between elements Name originally comes from soldering and electronics src sink filesrc sink src alsasink bin mad

Basic parts of GStreamer Source pads produce data Sink pads consume data src sink filesrc sink src alsasink bin mad

More terminology A sink element has only sink pads sink alsasink Likewise for source (src) elements src filesrc

The registry GStreamer keeps a list of what plugins are available, and what features they provide Plugins are loaded as-needed (See gst-inspect) Automatically regenerated when new plugins are installed.

Data types: Caps Media type + set of properties Text representation: audio/x-raw-int, rate=(int)44100, channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16 video/x-raw-yuv, format=(fourcc)i420, width=(int)[1, 2147483647], height=(int)[1, 2147483647], framerate=(fraction)[0/1, 2147483647/1]

Autoplugging Plugins can provide typefinders for specific formats. GStreamer provides an element that uses the provided typefinders to detect the type of a stream. The possible caps of pads are stored in the registry. Once we know the type of a stream, we can use the registry to find which element to use.

Data passing: Buffers Contents: A pointer to the actual data being passed A reference to a caps structure Timestamp, offset, some other metadata Reference-counted Subbuffers

Events Messages passed in both directions up and down the pipeline Can be in-band or out-of-band Examples: Seeking Flush Segments

Data passing: Events Used to find out about the pipeline. Examples: Position Duration Seeking

Controlling data flow gst_element_set_state (element, state) NULL All resources deallocated, devices released READY Devices opened PAUSED Buffers begin to flow, blocked in the sinks PLAYING All systems flow

Threads Tell an element to go to PLAYING, and something starts happening behind the scenes... Data flow happens in separate threads States change asynchronously GStreamer is thread-safe when using API functions.

The bus Receives messages from elements End-Of-Stream, error, warning, tags (title, track, etc.), state changes... Marshals the messages to the main thread Apps can, for the most part, ignore the existence of threads

Memory management Most objects you might deal with are refcounted. With few exceptions, most functions that give you an object give you a new reference Special case for objects that can be parented: floating references

The Debug System Elements are instrumented with debug output using macros. Debug statements are directed to a specific category, and debug level. The output is only produced if the category and level are enabled. Preferably elements also supply the GstObject outputting the message makes the output more useful.

The Debug System cont. Plugins can register their own debug categories. See the list of available categories: gst-inspect gst-debug-help 5 levels available: ERROR, WARN, INFO, DEBUG and LOG To turn all categories on set the GST_DEBUG env var to the level: GST_DEBUG=5 gst-launch...

The Debug System cont. Turn on specific debug categories: GST_DEBUG=filesrc:5,GST_PA DS:3 gst-launch... Can use wildcards: GST_DEBUG=*src:5 gstlaunch... Works with all apps of course, (not just gst-launch) The overhead is fairly low for disabled categories, but the whole thing can be compiled out.

Using GStreamer Example 1 Play an mp3 from the command line gst-launch filesrc location=file.mp3! mad! audioconvert! alsasink

Using GStreamer Example 2 Can do the same pipeline in code using gst_parse_launch src sink src filesrc sink src audioconvert mad sink bin mad alsasink

Using GStreamer Example 3 Build the elements manually and connect them

Using GStreamer Example 4 Only plays for 5 seconds need to listen on the bus for messages

Using GStreamer Example 5 Playing Audio + Video together Dynamic pads Creating elements on the fly

Using GStreamer Example 5 (cont) Video Bin Filesrc Demuxer Ghostpads Audio Bin

Using GStreamer Example 5 (cont) Video Bin queue Decoder Colourspace Videosink Ghostpad ghosts sinkpad of decoder

Using GStreamer Example 6 Using Decodebin to save effort decodebin will give you a raw stream if it can, and a decent error if it can't.

Using GStreamer Example 6 (cont) Video Bin Filesrc Decodebin Ghostpads Audio Bin

Using GStreamer Example 6 (cont) Video Bin queue Colourspace Videosink Ghostpad ghosts sinkpad of decoder

Using GStreamer In many cases, to just do playback, can just use playbin

Dataflow Step 1: Getting to «READY» Step 2: Starting data flowing Pre-roll Segments Buffers src sink src filesrc sink src audioconvert mad sink bin mad alsasink

Dataflow Segments The New-Segment event rate, applied_rate format, start, stop position update flag

Dataflow Step 3: Playing Clocks What GStreamer uses clocks for Playback synchronisation Capture timestamping master and slave clocks Clock selection in a pipeline Prefer clocks closer to sources Overriding clock selection When is a clock advancing PLAYING vs. PAUSED, basetime

Dataflow Synchronisation Leads to:

Different types of GStreamer elements Decoders Sinks Converters Demuxers Sources Encoders Muxers Filters Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Decoders Usually the simplest the output format is dictated by the input and output. Receive some buffers, decode some data if possible Should always use buffer-alloc Flushing events Querying Talk about New-Segment Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Sinks Provide buffers upstream Usually derive from BaseSink to get the clock synchronisation, QoS and event handling for free Format (caps) negotiation can be complex Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Converters Often basetransform based so they get event handling, pullmode, QoS and reverse negotiation for free Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Demuxers Usually the most complicated elements, as they're often the ones driving the pipeline Multiple source pads Need queues after to decouple Seek handling is the most complex Format negotiation isn't usually a problem Need to remove pads on format changes/new streams/paused- >READY transitions Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Sources Generate data Format negotiation can be complex, but not usually Using BaseSrc makes sense: Event handling for free Pull mode operation Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Encoders, Muxers, Filters Content creation half of the equation Encoders mirror decoders, generally pretty simple Muxers are more complicated because they need to deal with re-ordering multiple input streams Filters based on BaseTransform, like Convertors Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Writing an Element Plugin vs Element Creating a plugin Deriving a new element Pad templates Creating the pads Processing data Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Creating a plugin GST_PLUGIN_DEFINE: /* PACKAGE Normally defined by AS_VERSION in configure.ac see gst template */ #define PACKAGE "Example plugin" #define PACKAGE_NAME "LCA Example Element" #define PACKAGE_ORIGIN "http://lca2007.linux.org.au" GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "effectv example", "Example effect plugin from the effectv project", plugin_init, "0.1.0", "LGPL", PACKAGE_NAME, PACKAGE_ORIGIN); Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

plugin_init: Creating a plugin static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "warptv-ex", GST_RANK_NONE, gst_warptv_get_type ())) return FALSE; return TRUE; } Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Deriving a new Element GObject derivation (ie, painful) GST_BOILERPLATE macro available to help a little. class_init, base_init, _init () Set up vfunc handlers We'll use GstVideoFilter as a parent. Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Pad Templates Added to the object class Defines the data types that an element might accept at runtime. Used to create pads on the object instances Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Initialising the instance Initialise instance data Create pad instances (from the templates) set the pad handler functions chain, getcaps, setcaps, event handlers. We're using videofilter, which does this for us. Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Processing data Caps get set during data flow Handling new-segment buffer-alloc _chain method handling other events (seeking, flushing) Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN

Buffer alloc Provides for hardware allocated buffers Provides upstream negotiation Incoming buffer (chain function) Buffer alloc Format change Processing Buffer push Fluendo S.L. - World Trade Center Edificio Norte 6 Pl. - Moll de Barcelona, 08039 BARCELONA SPAIN