add recipes for GStreamer release 1.6.0 core + plugins
[opendreambox.git] / meta-opendreambox / recipes-multimedia / gstreamer / gstreamer1.0-plugins-bad / dvdspu-forced-mode-property.patch
1 diff -u a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c
2 --- a/gst/dvdspu/gstdvdspu.c    2015-09-28 16:35:11.004443667 +0200
3 +++ b/gst/dvdspu/gstdvdspu.c    2015-09-28 16:43:39.976693443 +0200
4 @@ -55,6 +55,29 @@
5    /* FILL ME */
6    LAST_SIGNAL
7  };
8 +enum
9 +{
10 +  ARG_0,
11 +  ARG_FORCED_MODE
12 +};
13 +
14 +GType gst_dvd_spu_forced_mode_get_type (void)
15 +{
16 +  static volatile gsize forced_mode_type = 0;
17 +  static const GEnumValue forced_mode[] = {
18 +    {GST_DVD_SPU_FORCED_MODE_SHOW_NONE,        "GST_DVD_SPU_FORCED_MODE_SHOW_NONE",        "none"},
19 +    {GST_DVD_SPU_FORCED_MODE_SHOW_FORCED_ONLY, "GST_DVD_SPU_FORCED_MODE_SHOW_FORCED_ONLY", "forcedonly"},
20 +    {GST_DVD_SPU_FORCED_MODE_SHOW_ALL,         "GST_DVD_SPU_FORCED_MODE_SHOW_ALL",         "all"},
21 +    {0, NULL, NULL},
22 +};
23 +
24 +  if (g_once_init_enter (&forced_mode_type)) {
25 +    GType tmp = g_enum_register_static ("GstDVDSpuForcedMode", forced_mode);
26 +    g_once_init_leave (&forced_mode_type, tmp);
27 +  }
28 +  return (GType) forced_mode_type;
29 +}
30 +#define DEFAULT_FORCED_MODE GST_DVD_SPU_FORCED_MODE_SHOW_FORCED_ONLY
31  
32  #define VIDEO_FORMATS GST_VIDEO_OVERLAY_COMPOSITION_BLEND_FORMATS
33  
34 @@ -92,6 +115,11 @@
35  static GstStateChangeReturn gst_dvd_spu_change_state (GstElement * element,
36      GstStateChange transition);
37  
38 +static void gst_dvd_spu_set_property (GObject * object, guint prop_id,
39 +    const GValue * value, GParamSpec * pspec);
40 +static void gst_dvd_spu_get_property (GObject * object, guint prop_id,
41 +    GValue * value, GParamSpec * pspec);
42 +
43  static gboolean gst_dvd_spu_src_event (GstPad * pad, GstObject * parent,
44      GstEvent * event);
45  static gboolean gst_dvd_spu_src_query (GstPad * pad, GstObject * parent,
46 @@ -138,6 +166,9 @@
47    gobject_class = (GObjectClass *) klass;
48    gstelement_class = (GstElementClass *) klass;
49  
50 +  gobject_class->set_property = gst_dvd_spu_set_property;
51 +  gobject_class->get_property = gst_dvd_spu_get_property;
52 +
53    gobject_class->dispose = (GObjectFinalizeFunc) gst_dvd_spu_dispose;
54    gobject_class->finalize = (GObjectFinalizeFunc) gst_dvd_spu_finalize;
55  
56 @@ -150,6 +181,12 @@
57    gst_element_class_add_pad_template (gstelement_class,
58        gst_static_pad_template_get (&subpic_sink_factory));
59  
60 +  g_object_class_install_property (gobject_class, ARG_FORCED_MODE,
61 +    g_param_spec_enum ("forced-mode", "Forced Mode",
62 +      "How to handle subtitles in forced subtitle streams",
63 +      GST_TYPE_DVD_SPU_FORCED_MODE, DEFAULT_FORCED_MODE,
64 +      G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
65 +
66    gst_element_class_set_static_metadata (gstelement_class,
67        "Sub-picture Overlay", "Mixer/Video/Overlay/SubPicture/DVD/Bluray",
68        "Parses Sub-Picture command streams and renders the SPU overlay "
69 @@ -569,6 +606,44 @@
70    return caps;
71  }
72  
73 +static void
74 +gst_dvd_spu_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
75 +{
76 +  GstDVDSpu *dvdspu = (GstDVDSpu *) object;
77 +
78 +  switch (prop_id) {
79 +    case ARG_FORCED_MODE:
80 +    {
81 +      GstDVDSpuForcedMode mode = g_value_get_enum (value);
82 +      GEnumValue *val = g_enum_get_value (G_ENUM_CLASS (g_type_class_ref (GST_TYPE_DVD_SPU_FORCED_MODE)), mode);
83 +      if (val)
84 +      {
85 +        GST_DEBUG_OBJECT (dvdspu, "successfully set forced mode to %s (%i)", val->value_nick, mode);
86 +      }
87 +      dvdspu->forced_mode = g_value_get_enum (value);
88 +      break;
89 +    }
90 +    default:
91 +      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
92 +      break;
93 +  }
94 +}
95 +
96 +static void
97 +gst_dvd_spu_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
98 +{
99 +  GstDVDSpu *dvdspu = (GstDVDSpu *) object;
100 +
101 +  switch (prop_id) {
102 +    case ARG_FORCED_MODE:
103 +      g_value_set_enum (value, dvdspu->forced_mode);
104 +      break;
105 +    default:
106 +      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
107 +      break;
108 +  }
109 +}
110 +
111  /* With SPU lock held */
112  static void
113  update_video_to_position (GstDVDSpu * dvdspu, GstClockTime new_pos)
114 @@ -1662,6 +1737,11 @@
115         * video might still continue, though */
116        gst_event_unref (event);
117        goto done;
118 +    case GST_EVENT_STREAM_START:
119 +      gst_event_parse_stream_flags (event, &dvdspu->stream_flags);
120 +      GST_INFO_OBJECT (dvdspu, "GST_EVENT_STREAM_START %" GST_PTR_FORMAT " stream_flags: %02X", event, dvdspu->stream_flags);
121 +      res = gst_pad_event_default (pad, parent, event);
122 +      goto done;
123      default:
124        res = gst_pad_event_default (pad, parent, event);
125        break;
126 diff -u a/gst/dvdspu/gstdvdspu.h b/gst/dvdspu/gstdvdspu.h
127 --- a/gst/dvdspu/gstdvdspu.h    2015-09-28 16:32:19.551442789 +0200
128 +++ b/gst/dvdspu/gstdvdspu.h    2015-09-28 16:43:39.976693443 +0200
129 @@ -65,6 +65,14 @@
130  
131  #define SPU_STATE_FLAGS_MASK (0xff)
132  
133 +typedef enum _gst_dvd_spu_forced_modes {
134 +  GST_DVD_SPU_FORCED_MODE_SHOW_NONE = 0,
135 +  GST_DVD_SPU_FORCED_MODE_SHOW_FORCED_ONLY,
136 +  GST_DVD_SPU_FORCED_MODE_SHOW_ALL
137 +} GstDVDSpuForcedMode;
138 +
139 +#define GST_TYPE_DVD_SPU_FORCED_MODE (gst_dvd_spu_forced_mode_get_type ())
140 +
141  struct SpuState {
142    GstClockTime next_ts; /* Next event TS in running time */
143    SpuStateFlags flags;
144 @@ -117,6 +125,9 @@
145    /* Overlay composition */
146    gboolean attach_compo_to_buffer;
147    GstVideoOverlayComposition *composition;
148 +
149 +  GstDVDSpuForcedMode forced_mode;
150 +  GstStreamFlags stream_flags;
151  };
152  
153  struct _GstDVDSpuClass {
154 @@ -124,6 +135,7 @@
155  };
156  
157  GType gst_dvd_spu_get_type (void);
158 +GType gst_dvd_spu_forced_mode_get_type (void);
159  
160  typedef enum {
161    GST_DVD_SPU_DEBUG_RENDER_RECTANGLE = (1 << 0),
162 diff -u a/gst/dvdspu/gstspu-pgs.c b/gst/dvdspu/gstspu-pgs.c
163 --- a/gst/dvdspu/gstspu-pgs.c   2015-09-28 16:30:56.646658928 +0200
164 +++ b/gst/dvdspu/gstspu-pgs.c   2015-09-28 16:43:39.976693443 +0200
165 @@ -621,7 +621,16 @@
166  
167    obj = pgs_presentation_segment_find_object (&(pgs_state->pres_seg), obj_id);
168  
169 -  PGS_DUMP ("Object ID %d ver %u flags 0x%02x\n", obj_id, obj_ver, flags);
170 +  PGS_DUMP ("Object ID %d ver %u flags 0x%02x obj->id %d obj->flags 0x%02x\n",
171 +      obj_id, obj_ver, flags, obj->id, obj->flags);
172 +
173 +  if (dvdspu->stream_flags & GST_STREAM_FLAG_FORCED &&
174 +      (dvdspu->forced_mode == GST_DVD_SPU_FORCED_MODE_SHOW_NONE ||
175 +       (dvdspu->forced_mode == GST_DVD_SPU_FORCED_MODE_SHOW_FORCED_ONLY &&
176 +        !(obj->flags & PGS_COMPOSITION_OBJECT_FLAG_FORCED)))) {
177 +    PGS_DUMP ("discard because forced_mode=%i\n", dvdspu->forced_mode);
178 +    return 0;
179 +  }
180  
181    if (flags & PGS_OBJECT_UPDATE_FLAG_START_RLE) {
182      obj->rle_data_ver = obj_ver;