| /* GStreamer Sub-Picture Unit - PGS 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_PGS_H__ |
| #define __GSTSPU_PGS_H__ |
| |
| #include "gstspu-common.h" |
| |
| typedef struct SpuPgsState SpuPgsState; |
| typedef enum PgsCompositionObjectFlags PgsCompositionObjectFlags; |
| typedef enum PgsPresentationSegmentFlags PgsPresentationSegmentFlags; |
| typedef enum PgsObjectUpdateFlags PgsObjectUpdateFlags; |
| |
| typedef struct PgsPresentationSegment PgsPresentationSegment; |
| typedef struct PgsCompositionObject PgsCompositionObject; |
| |
| enum PgsPresentationSegmentFlags |
| { |
| PGS_PRES_SEGMENT_FLAG_UPDATE_PALETTE = 0x80 |
| }; |
| |
| enum PgsCompositionObjectFlags |
| { |
| PGS_COMPOSITION_OBJECT_FLAG_CROPPED = 0x80, |
| PGS_COMPOSITION_OBJECT_FLAG_FORCED = 0x40 |
| }; |
| |
| enum PgsObjectUpdateFlags |
| { |
| /* Set in an object_update if this is the beginning of new RLE data. |
| * If not set, the data is a continuation to be appended */ |
| PGS_OBJECT_UPDATE_FLAG_START_RLE = 0x80, |
| PGS_OBJECT_UPDATE_FLAG_END_RLE = 0x40 /* This one is a guess */ |
| }; |
| |
| struct PgsPresentationSegment |
| { |
| guint16 composition_no; |
| guint8 composition_state; |
| |
| PgsPresentationSegmentFlags flags; |
| |
| guint8 palette_id; |
| |
| guint16 vid_w, vid_h; |
| guint8 vid_fps_code; |
| |
| GArray *objects; |
| }; |
| |
| struct PgsCompositionObject |
| { |
| guint16 id; |
| guint8 version; |
| PgsCompositionObjectFlags flags; |
| |
| guint8 win_id; |
| |
| guint8 rle_data_ver; |
| guint8 *rle_data; |
| guint32 rle_data_size; |
| guint32 rle_data_used; |
| |
| /* Top left corner of this object */ |
| guint16 x, y; |
| |
| /* Only valid if PGS_COMPOSITION_OBJECT_FLAG_CROPPED is set */ |
| guint16 crop_x, crop_y, crop_w, crop_h; |
| }; |
| |
| struct SpuPgsState { |
| GstBuffer *pending_cmd; |
| |
| gboolean in_presentation_segment; |
| gboolean have_presentation_segment; |
| |
| PgsPresentationSegment pres_seg; |
| |
| SpuColour palette[256]; |
| |
| guint16 win_x, win_y, win_w, win_h; |
| }; |
| |
| void gstspu_pgs_handle_new_buf (GstDVDSpu * dvdspu, GstClockTime event_ts, GstBuffer *buf); |
| gboolean gstspu_pgs_execute_event (GstDVDSpu *dvdspu); |
| void gstspu_pgs_render (GstDVDSpu *dvdspu, GstVideoFrame *frame); |
| gboolean gstspu_pgs_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event); |
| void gstspu_pgs_flush (GstDVDSpu *dvdspu); |
| |
| #endif |