gstreamer/subprojects/gst-plugins-bad/gst/dvdspu/gstspu-pgs.h
Arnaud Vrac b0ce390d50 dvdspu: render to AYUV overlay
Instead of only supporting writing SPU data directly to YUV frames,
render the SPU data to an intermediate AYUV overlay buffer. The overlay
data is then blended to the video frame.

For the PGS format, the overlay buffer size is set to the size of the
Composition Window, and its position in the overlay composition is set
to the window position. The objects to render are now cropped when the
cropping flag is set.

For the Vobsub format, the overlay buffer size is set to the size of the
Display Area.

Once rendered, the overlay composition rectangle is now moved and scaled
to fit the video output size, to avoid clipping.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5827>
2024-01-02 14:13:03 +00:00

109 lines
3 KiB
C

/* 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 *window);
gboolean gstspu_pgs_handle_dvd_event (GstDVDSpu *dvdspu, GstEvent *event);
void gstspu_pgs_get_render_geometry (GstDVDSpu *dvdspu,
gint *display_width, gint *display_height,
GstVideoRectangle *window_rect);
void gstspu_pgs_flush (GstDVDSpu *dvdspu);
#endif