GStreamer multimedia framework
Find a file
Víctor Manuel Jáquez Leal 9799875df4 vaapidecode: delayed src caps negotiation
Currently the src caps are set immediately after the sink caps are set, but in
that moment the pipeline might not fully constructed and the video sink has
not negotiated its supported caps and features. As a consequence, in many cases
of playback, the least optimized caps feature is forced. This is partially the
responsible of bug #744039.

Also, vaapidecode doesn't attend the reconfigure events from downstream,
which is a problem too, since the video sink can be changed with different
caps features.

This patch delays the src caps, setting them until the first frame arrives to
the decoder, assuming until that very moment the whole pipeline is already
negotiated. Particularly, it checks if the src pad needs to be reconfigured,
as a consequence of a reconfiguration event from downstream.

A key part of this patch is the new GstVaapiCapsFeature
GST_VAAPI_CAPS_FEATURE_NOT_NEGOTIATED, which is returned when the src pad
doesn't have a peer yet. Also, for a better report of the caps allowed
through the src pad and its peer, this patch uses gst_pad_get_allowed_caps()
instead of gst_pad_peer_query_caps() when looking for the preferred feature.

v3: move the input_state unref to close(), since videodecoder resets at
some events such as navigation.

v4: a) the state_changed() callback replaces the input_state if the media
changed, so this case is also handled.
    b) since the parameter ref_state in gst_vaapidecode_update_src_caps() is
always the input_state, the parameter were removed.
    c) there were a lot of repeated code handling the input_state, so I
refactored it with the function gst_vaapi_decode_input_state_replace().

https://bugzilla.gnome.org/show_bug.cgi?id=744618

Signed-off-by: Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
2015-02-26 12:24:55 +02:00
debian.upstream debian: fix packaging for new naming scheme. 2014-07-28 14:02:46 +02:00
docs surfaceproxy: add copy function. 2013-11-28 17:32:18 +01:00
ext codecparsers: update to gst-vaapi-branch commit d3b5c1b 2015-01-21 18:26:12 +02:00
gst vaapidecode: delayed src caps negotiation 2015-02-26 12:24:55 +02:00
gst-libs encoder: h264: add support for more than 2 views 2015-02-24 17:14:33 +02:00
patches h264parse: drop patches merged upstream. 2015-01-21 18:31:22 +02:00
pkgconfig build: fix pkgconfig file names (again). 2014-02-19 06:13:41 +01:00
tests egl: update tests. 2015-02-24 15:20:03 +01:00
.gitignore codecparsers: jpeg: use submodule sources. 2012-10-11 14:19:38 +02:00
.gitmodules vp8: use range decoder from libvpx. 2014-04-18 20:37:25 +02:00
AUTHORS AUTHORS: Updates 2015-02-03 13:08:53 +02:00
autogen.sh vp8: use range decoder from libvpx. 2014-04-18 20:37:25 +02:00
configure.ac plugins: add initial support for EGL. 2015-02-24 15:20:03 +01:00
COPYING.LIB Relicense gst-libs/ code to LGPL v2.1+. 2010-09-20 12:55:42 +02:00
Makefile.am plugins: add built-in video parsers as "vaapiparse" element. 2014-06-13 17:17:07 +02:00
NEWS NEWS: Updates 2015-02-03 10:00:23 +02:00
README README: updates. 2014-07-03 22:35:29 +02:00

  gstreamer-vaapi
  VA-API support to GStreamer

  Copyright (C) 2010-2011 Splitted-Desktop Systems
  Copyright (C) 2011-2014 Intel Corporation
  Copyright (C) 2011 Collabora Ltd.


License
-------

gstreamer-vaapi helper libraries and plugin elements are available
under the terms of the GNU Lesser General Public License v2.1+


Overview
--------

gstreamer-vaapi consists in a collection of VA-API based plugins for
GStreamer and helper libraries.

  * `vaapidecode' is used to decode JPEG, MPEG-2, MPEG-4:2, H.264 AVC,
    H.264 MVC, VP8, VC-1, WMV3 videos to VA surfaces, depending on the
    underlying hardware capabilities. This plugin is also able to
    implicitly download the decoded surface to raw YUV buffers.

  * `vaapiencode_<CODEC>' is used to encode into MPEG-2, H.264 AVC,
    H.264 MVC videos, depending on the actual value of <CODEC> (mpeg2,
    h264, etc.). By default, raw format bitstreams are generated, so
    the result may be piped to a muxer. e.g. qtmux for MP4 containers.

  * `vaapipostproc' is used to filter VA surfaces, for e.g. scaling,
    deinterlacing (bob, motion-adaptive, motion-compensated), noise
    reduction or sharpening. This plugin is also used to upload raw
    YUV pixels into VA surfaces.

  * `vaapisink' is used to render VA surfaces to an X11 or Wayland
    display. This plugin also features a "headless" mode (DRM) more
    suited to remote transcode scenarios, with faster throughput.


Features
--------

  * VA-API support from 0.29 to 0.35
  * JPEG, MPEG-2, MPEG-4, H.264 AVC, H.264 MVC, VP8 and VC-1 ad-hoc decoders
  * MPEG-2, H.264 AVC and H.264 MVC ad-hoc encoders
  * OpenGL rendering through VA/GLX or GLX texture-from-pixmap + FBO
  * Support for the Wayland display server
  * Support for headless decode pipelines with VA/DRM
  * Support for major HW video decoding solutions on Linux (AMD, Intel, NVIDIA)
  * Support for HW video encoding on Intel HD Graphics hardware
  * Support for VA Video Processing APIs (VA/VPP)
    - Scaling and color conversion
    - Image enhancement filters: Sharpening, Noise Reduction
    - Advanced deinterlacing: Motion-Adaptive, Motion-Compensated


Requirements
------------

Software requirements

  * GStreamer 0.10.x [DEPRECATED]:
      libglib2.0-dev (>= 2.28)
      libgstreamer0.10-dev (>= 0.10.36)
        or with GstBaseSink::query()
      libgstreamer-plugins-base0.10-dev (>= 0.10.36)
      libgstreamer-plugins-bad0.10-dev (>= 0.10.22.1)
        or with GstVideoContext, GstSurfaceBuffer, codecparsers

    Note: support for GStreamer 0.10 APIs is deprecated and will be
    removed in a future release.

  * GStreamer 1.0.x (up to including GStreamer 1.4):
      libglib2.0-dev (>= 2.28)
      libgstreamer1.0-dev (>= 1.0.0)
      libgstreamer-plugins-base1.0-dev (>= 1.0.0)
      libgstreamer-plugins-bad1.0-dev (>= 1.0.0)

  * Renderers:
      DRM: libva-dev (>= 1.1.0), libdrm-dev, libudev-dev
      X11: libva-dev (>= 1.0.1)
      GLX: libva-dev (>= 1.0.3)
      Wayland: libva-dev (>= 1.1.0), libwayland-dev (>= 0.95.0)

Hardware requirements

  * AMD platforms with UVD2 (XvBA supported)
  * Intel Eaglelake (G45)
  * Intel Ironlake, Sandybridge, Ivybridge and Haswell (HD Graphics)
  * Intel Poulsbo (US15W)
  * Intel Medfield or Cedar Trail
  * NVIDIA platforms with PureVideo (VDPAU supported)


Usage
-----

  VA elements are automatically plugged into GStreamer pipelines. So,
  using playbin (or playbin2 with GStreamer 0.10) should work as is.
  However, here are a few alternate pipelines that could be manually
  constructed.

  * Play an H.264 video with an MP4 container in fullscreen mode
  $ gst-launch-1.0 -v filesrc location=/path/to/video.mp4 ! \
      qtdemux ! vaapidecode ! vaapisink fullscreen=true

  * Play a raw MPEG-2 interlaced stream
  $ gst-launch-1.0 -v filesrc location=/path/to/mpeg2.bits ! \
      mpegvideoparse ! vaapidecode ! vaapipostproc ! vaapisink

  * Convert from one pixel format to another, while also downscaling
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=yuy2 width=1280 height=720 ! \
      vaapipostproc format=nv12 height=480 ! vaapisink

  * Encode a 1080p stream in raw I420 format into H.264
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=i420 width=1920 height=1080 framerate=30/1 ! \
      vaapiencode_h264 rate-control=cbr tune=high-compression ! \
      qtmux ! filesink location=/path/to/encoded_video.mp4


Sources
-------

  gstreamer-vaapi is Open Source software, so updates to this
  framework are really easy to get.

  Stable source code releases can be found at:
  <http://www.freedesktop.org/software/vaapi/releases/gstreamer-vaapi/>

  Git repository for work-in-progress changes is available at:
  <http://gitorious.org/vaapi/gstreamer-vaapi>


Reporting Bugs
--------------

  Bugs can be reported in the GNOME Bugzilla system at:
  <https://bugzilla.gnome.org/enter_bug.cgi?product=gstreamer-vaapi>

  From the main page, new bugs can be reported through New -> Other ->
  gstreamer-vaapi product.