/* GStreamer * Copyright (C) 2008 Jan Schmidt <thaytan@noraisin.net> * * 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., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __RESINDVDSRC_H__ #define __RESINDVDSRC_H__ #include <gst/gst.h> #include <gst/base/gstbasesrc.h> #ifdef HAVE_STDINT_H #include <stdint.h> #endif #include <dvdnav/dvdnav.h> #include <dvdread/ifo_read.h> #include <dvdread/nav_read.h> G_BEGIN_DECLS #define RESIN_TYPE_DVDSRC (rsn_dvdsrc_get_type()) #define RESINDVDSRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),RESIN_TYPE_DVDSRC,resinDvdSrc)) #define RESINDVDSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),RESIN_TYPE_DVDSRC,resinDvdSrcClass)) #define IS_RESINDVDSRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),RESIN_TYPE_DVDSRC)) #define IS_RESINDVDSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),RESIN_TYPE_DVDSRC)) typedef struct _resinDvdSrc resinDvdSrc; typedef struct _resinDvdSrcClass resinDvdSrcClass; struct _resinDvdSrc { GstBaseSrc parent; gboolean faststart; GMutex dvd_lock; GCond still_cond; GMutex branch_lock; gboolean branching; gchar *device; dvdnav_t *dvdnav; gchar *disc_name; /* dvd_reader instance is used to load and cache VTS/VMG ifo info */ dvd_reader_t *dvdread; /* vmgi_mat_t from the VMG ifo: */ vmgi_mat_t vmgm_attr; /* VMGM domain info */ /* Array of cached vtsi_mat_t strctures from each IFO: */ GArray *vts_attrs; ifo_handle_t *vmg_file; ifo_handle_t *vts_file; /* Current playback location: VTS 0 = VMG, plus in_menu or not */ gint vts_n; gboolean in_menu; gint title_n; /* Title num */ gint part_n; /* Part num */ gint n_angles; /* number of angles */ gint cur_angle; /* current angle */ gboolean running; gboolean discont; gboolean first_seek; gboolean flushing_seek; gboolean need_segment; gboolean need_tag_update; gboolean active_highlight; gboolean in_still_state; gboolean in_playing; gboolean was_mouse_over; /* Remaining time to wait in a timed still: */ GstClockTime still_time_remaining; GstBuffer *alloc_buf; GstBuffer *next_buf; /* TRUE if the next_buf is a nav block that needs enqueueing */ gboolean next_is_nav_block; /* PTS for activating the pending nav block in next_buf */ GstClockTime next_nav_ts; /* Track accumulated segment position, cleared by flushing */ GstSegment src_segment; /* Start timestamp of the previous NAV block */ GstClockTime cur_start_ts; /* End timestamp of the previous NAV block */ GstClockTime cur_end_ts; /* base ts is cur_start_ts - cell_time for each VOBU */ GstClockTime cur_vobu_base_ts; /* Position info of the previous NAV block */ GstClockTime cur_position; /* Duration of the current PGC */ GstClockTime pgc_duration; gint active_button; dvdnav_highlight_area_t area; /* Pending events to output */ GstEvent *streams_event; GstEvent *clut_event; GstEvent *spu_select_event; GstEvent *audio_select_event; GstEvent *highlight_event; gboolean angles_changed; gboolean commands_changed; /* GList of NAV packets awaiting activation, and the * running times to activate them. */ GSList *pending_nav_blocks; GSList *pending_nav_blocks_end; GstClockID nav_clock_id; gboolean have_pci; pci_t cur_pci; /* Current state tracking */ gint8 cur_audio_phys_stream; gint8 cur_spu_phys_stream; gboolean cur_spu_forced_only; guint32 cur_clut[16]; guint32 cur_btn_mask; }; struct _resinDvdSrcClass { GstBaseSrcClass parent_class; }; GType rsn_dvdsrc_get_type (void); G_END_DECLS #endif /* __RESINDVDSRC_H__ */