mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 04:00:37 +00:00
5ed137a270
Original commit message from CVS: * gst/playback/gstdecodebin.c: (dynamic_create), (dynamic_free), (close_pad_link), (dynamic_remove), (no_more_pads), (new_caps), (find_dynamic), (unlinked), (close_link): Implement delayed caps linking needed for element with a lot of different caps on the src pads that get fixed at runtime. Improve management of dynamic elements. * gst/playback/gstplaybasebin.c: (gst_play_base_bin_init), (group_destroy), (group_commit), (check_queue), (queue_overrun), (gen_preroll_element), (remove_groups), (unknown_type), (add_element_stream), (no_more_pads_full), (no_more_pads), (sub_no_more_pads), (source_no_more_pads), (preroll_unlinked), (new_decoded_pad), (setup_subtitle), (array_has_value), (gen_source_element), (source_new_pad), (has_all_raw_caps), (analyse_source), (remove_decoders), (make_decoder), (remove_source), (setup_source), (finish_source), (prepare_output), (gst_play_base_bin_change_state): * gst/playback/gstplaybasebin.h: Use more _CAST instead of full type checking casts. Small cleanups, plug some leaks. Handle dynamic sources. Add some helper functions to create lists of strings used for blacklisting and other stuff. Refactor some code dealing with analysing the source. Re-enable sources without pads (like cd:// or other selfcontained elements).
116 lines
4.2 KiB
C
116 lines
4.2 KiB
C
/* GStreamer
|
|
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#ifndef __GST_PLAYBASEBIN_H__
|
|
#define __GST_PLAYBASEBIN_H__
|
|
|
|
#include <gst/gst.h>
|
|
#include "gststreaminfo.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define GST_TYPE_PLAY_BASE_BIN (gst_play_base_bin_get_type())
|
|
#define GST_PLAY_BASE_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAY_BASE_BIN,GstPlayBaseBin))
|
|
#define GST_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAY_BASE_BIN,GstPlayBaseBinClass))
|
|
#define GST_IS_PLAY_BASE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAY_BASE_BIN))
|
|
#define GST_IS_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAY_BASE_BIN))
|
|
#define GST_PLAY_BASE_BIN_GET_CLASS(obj) \
|
|
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAY_BASE_BIN, \
|
|
GstPlayBaseBinClass))
|
|
|
|
typedef struct _GstPlayBaseBin GstPlayBaseBin;
|
|
typedef struct _GstPlayBaseBinClass GstPlayBaseBinClass;
|
|
|
|
/* a GstPlayBaseGroup is a group of pads and streaminfo that together
|
|
* make up a playable stream. A new group is created from the current
|
|
* set of pads that are alive when the preroll elements are filled or
|
|
* when the no-more-pads signal is fired.
|
|
*
|
|
* We have to queue the groups as they can be created while the preroll
|
|
* queues are still playing the old group. We monitor the EOS signals
|
|
* on the preroll queues and when all the streams in the current group
|
|
* have EOSed, we switch to the next queued group.
|
|
*/
|
|
typedef struct
|
|
{
|
|
GstPlayBaseBin *bin; /* ref to the owner */
|
|
|
|
gint nstreams;
|
|
GList *streaminfo;
|
|
GValueArray *streaminfo_value_array;
|
|
|
|
/* contained decoded elementary streams */
|
|
struct {
|
|
gint npads;
|
|
GstBin *bin;
|
|
GstElement *preroll;
|
|
GstElement *selector;
|
|
gboolean done;
|
|
#define NUM_TYPES 3
|
|
} type[NUM_TYPES]; /* AUDIO, VIDEO, TEXT */
|
|
} GstPlayBaseGroup;
|
|
|
|
struct _GstPlayBaseBin {
|
|
GstPipeline pipeline;
|
|
|
|
/* properties */
|
|
guint64 queue_size;
|
|
guint64 queue_threshold;
|
|
guint64 queue_min_threshold;
|
|
|
|
/* currently loaded media */
|
|
gint current[NUM_TYPES];
|
|
gchar *uri, *suburi;
|
|
gboolean is_stream;
|
|
GstElement *source;
|
|
GSList *decoders;
|
|
GstElement *subtitle; /* additional filesrc ! subparse bin */
|
|
gboolean subtitle_done;
|
|
gboolean need_rebuild;
|
|
|
|
GSList *subtitle_elements; /* subtitle elements that have 'subtitle-encoding' property */
|
|
gchar *subencoding; /* encoding to propagate to the above subtitle elements */
|
|
GMutex *sub_lock; /* protecting subtitle_elements and subencoding members */
|
|
|
|
/* group management - using own lock */
|
|
GMutex *group_lock; /* lock and mutex to signal availability of new group */
|
|
GCond *group_cond;
|
|
GstPlayBaseGroup *building_group; /* the group that we are constructing */
|
|
GList *queued_groups; /* the constructed groups, head is the active one */
|
|
|
|
/* for dynamic sources */
|
|
guint src_np_sig_id; /* new-pad signal id */
|
|
guint src_nmp_sig_id; /* no-more-pads signal id */
|
|
gint pending;
|
|
};
|
|
|
|
struct _GstPlayBaseBinClass {
|
|
GstPipelineClass parent_class;
|
|
|
|
/* virtual fuctions */
|
|
gboolean (*setup_output_pads) (GstPlayBaseBin *play_base_bin,
|
|
GstPlayBaseGroup *group);
|
|
};
|
|
|
|
GType gst_play_base_bin_get_type (void);
|
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GST_PLAYBASEBIN_H__ */
|
|
|