/* GStreamer Sub-Picture Unit - VobSub/DVD handling * Copyright (C) 2009 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 __GSTSPU_VOBSUB_H__ #define __GSTSPU_VOBSUB_H__ #include "gstspu-common.h" typedef struct SpuVobsubState SpuVobsubState; typedef struct SpuVobsubPixCtrlI SpuVobsubPixCtrlI; typedef struct SpuVobsubLineCtrlI SpuVobsubLineCtrlI; /* Pixel Control Info from a Change Color Contrast command */ struct SpuVobsubPixCtrlI { gint16 left; guint32 palette; /* Pre-multiplied palette values, updated as * needed */ SpuColour pal_cache[4]; }; struct SpuVobsubLineCtrlI { guint8 n_changes; /* 1 to 8 */ SpuVobsubPixCtrlI pix_ctrl_i[8]; gint16 top; gint16 bottom; }; struct SpuVobsubState { GstClockTime base_ts; /* base TS for cmd blk delays in running time */ GstBuffer *buf; /* Current SPU packet we're executing commands from */ guint16 cur_cmd_blk; /* Offset into the buf for the current cmd block */ /* Top + Bottom field offsets in the buffer. 0 = not set */ guint16 pix_data[2]; GstBuffer *pix_buf; /* Current SPU packet the pix_data references */ GstMapInfo pix_buf_map; /* Mapped buffer info */ SpuRect disp_rect; SpuRect clip_rect; SpuRect hl_rect; guint32 current_clut[16]; /* Colour lookup table from incoming events */ guint8 main_idx[4]; /* Indices for current main palette */ guint8 main_alpha[4]; /* Alpha values for main palette */ guint8 hl_idx[4]; /* Indices for current highlight palette */ guint8 hl_alpha[4]; /* Alpha values for highlight palette */ /* Pre-multiplied colour palette for the main palette */ SpuColour main_pal[4]; gboolean main_pal_dirty; /* Line control info for rendering the highlight palette */ SpuVobsubLineCtrlI hl_ctrl_i; gboolean hl_pal_dirty; /* Indicates that the HL palette info needs refreshing */ /* LineCtrlI Info from a Change Color & Contrast command */ SpuVobsubLineCtrlI *line_ctrl_i; gint16 n_line_ctrl_i; gboolean line_ctrl_i_pal_dirty; /* Indicates that the palettes for the line_ctrl_i * need recalculating */ /* Rendering state vars below */ gint16 comp_last_x[2]; /* Maximum X values we rendered into the comp buffer (odd & even) */ gint16 *comp_last_x_ptr; /* Ptr to the current comp_last_x value to be updated by the render */ /* Current Y Position */ gint16 cur_Y; /* Current offset in nibbles into the pix_data */ guint16 cur_offsets[2]; guint16 max_offset; /* current ChgColCon Line Info */ SpuVobsubLineCtrlI *cur_chg_col; SpuVobsubLineCtrlI *cur_chg_col_end; /* Output position tracking */ guint8 *out_Y; guint32 *out_U; guint32 *out_V; guint32 *out_A; }; void gstspu_vobsub_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf); gboolean gstspu_vobsub_execute_event (GstDVDSpu *dvdspu); void gstspu_vobsub_render (GstDVDSpu *dvdspu, GstVideoFrame *frame); gboolean gstspu_vobsub_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event); void gstspu_vobsub_flush (GstDVDSpu *dvdspu); #endif