dfbvideosink: port to 1.0

including the following supports and fixes:

* Create DirectFB surfaces from GstBufferPool
* Add NV12 pixel format support
* Don't use the cursor in the exclusive mode
  - EnableCusor() can be only used when the administrative mode is set
    in DirectFB 1.6.0 and later.
* Support multiple plane rendering for planar color formats
  - This accommodates the chroma plane offsets of the framebuffer
    in planar formats.
* Invoke SetConfiguration regardless of video mode setting in setcaps()
  - SetConfiguration() method should be invoked regardless of
    the result of gst_dfbvideosink_get_best_vmode(), since the two are
    unrelated.
* Disable DirectFB signal handler
  - "--dfb:no-sighandler" option is passed to DirectFBInit().
    This prevents DirectFB from trying to kill the process and allows
    GStreamer's termination sequence to proceed normally.

https://bugzilla.gnome.org/show_bug.cgi?id=703520
This commit is contained in:
Kazunori Kobayashi 2013-06-26 11:07:14 +09:00 committed by Tim-Philipp Müller
parent 5a82dc9028
commit 90020e21df
3 changed files with 710 additions and 648 deletions

View file

@ -344,7 +344,7 @@ GST_PLUGINS_NONPORTED=" cdxaparse \
sdi stereo tta \
videomeasure videosignal vmnc \
linsys vcd \
apexsink cdaudio dc1394 directfb \
apexsink cdaudio dc1394 \
gsettings \
musepack nas sdl sndfile timidity \
directdraw acm wininet \

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
/* GStreamer DirectFB plugin
* Copyright (C) 2005 Julien MOUTTE <julien@moutte.net>
* Copyright (C) 2013 Kazunori Kobayashi <kkobayas@igel.co.jp>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@ -23,6 +24,14 @@
#include <gst/video/gstvideosink.h>
#include <directfb.h>
#include <directfb_version.h>
#define GST_DFBVIDEOSINK_VER(a,b,c) (((a) << 16) | ((b) << 8) | (c))
#define DIRECTFB_VER GST_DFBVIDEOSINK_VER(DIRECTFB_MAJOR_VERSION,DIRECTFB_MINOR_VERSION,DIRECTFB_MICRO_VERSION)
#define LAYER_MODE_INVALID -1
#define LAYER_MODE_EXCLUSIVE DLSCL_EXCLUSIVE
#define LAYER_MODE_ADMINISTRATIVE DLSCL_ADMINISTRATIVE
G_BEGIN_DECLS
@ -37,10 +46,13 @@ typedef struct _GstDfbVideoSinkClass GstDfbVideoSinkClass;
typedef struct _GstMetaDfbSurface GstMetaDfbSurface;
GType gst_meta_dfbsurface_api_get_type (void);
const GstMetaInfo * gst_meta_dfbsurface_get_info (void);
#define GST_META_DFBSURFACE_GET(buf) ((GstMetaDfbSurface *)gst_buffer_get_meta(buf,gst_meta_dfbsurface_get_info()))
#define GST_TYPE_DFB_BUFFER_POOL (gst_dfb_buffer_pool_get_type())
#define GST_META_DFBSURFACE_GET(buf) ((GstMetaDfbSurface *)gst_buffer_get_meta(buf,gst_meta_dfbsurface_api_get_type()))
#define GST_META_DFBSURFACE_ADD(buf) ((GstMetaDfbSurface *)gst_buffer_add_meta(buf,gst_meta_dfbsurface_get_info(),NULL))
#define GST_DFB_BUFFER_POOL_CAST(obj) ((GstDfbBufferPool*)(obj))
struct _GstMetaDfbSurface {
GstMeta meta;
@ -57,6 +69,24 @@ struct _GstMetaDfbSurface {
GstDfbVideoSink *dfbvideosink;
};
typedef struct _GstDfbBufferPool GstDfbBufferPool;
struct _GstDfbBufferPool
{
GstBufferPool bufferpool;
GstDfbVideoSink *dfbvideosink;
GstCaps *caps;
};
typedef struct _GstDfbBufferPoolClass GstDfbBufferPoolClass;
struct _GstDfbBufferPoolClass
{
GstBufferPoolClass parent_class;
};
typedef struct _GstDfbVMode GstDfbVMode;
struct _GstDfbVMode {
@ -72,11 +102,10 @@ struct _GstDfbVMode {
*/
struct _GstDfbVideoSink {
GstVideoSink videosink;
/* < private > */
GMutex *pool_lock;
GSList *buffer_pool;
/* for buffer pool */
GstBufferPool *pool;
/* Framerate numerator and denominator */
gint fps_n;
gint fps_d;
@ -116,6 +145,8 @@ struct _GstDfbVideoSink {
/* object-set pixel aspect ratio */
GValue *par;
gint layer_mode;
};
struct _GstDfbVideoSinkClass {
@ -123,6 +154,7 @@ struct _GstDfbVideoSinkClass {
};
GType gst_dfbvideosink_get_type (void);
GType gst_dfb_buffer_pool_get_type (void);
G_END_DECLS