summaryrefslogtreecommitdiff
path: root/src/libspudec/spu.h
blob: 8b62301e339feb29a12d094f7f4bafd5474b918f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * Copyright (C) 2000-2001 the xine project
 *
 * Copyright (C) James Courtier-Dutton James@superbug.demon.co.uk - July 2001
 *
 * This file is part of xine, a free video player.
 * 
 * xine is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * xine 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
 *
 * $Id: spu.h,v 1.9 2002/01/06 18:27:47 jcdutton Exp $
 *
 * This file was originally part of the OMS program.
 *
 */

#ifndef __SPU_H__
#define __SPU_H__

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <inttypes.h>
#include "video_out.h"
#include "video_overlay.h"
#include "nav_types.h"

#define NUM_SEQ_BUFFERS 50
#define MAX_STREAMS 32

typedef struct spu_clut_struct {
#ifdef WORDS_BIGENDIAN
	uint8_t	entry0	: 4;
	uint8_t	entry1	: 4;
	uint8_t	entry2	: 4;
	uint8_t	entry3	: 4;
#else
	uint8_t	entry1	: 4;
	uint8_t	entry0	: 4;
	uint8_t	entry3	: 4;
	uint8_t	entry2	: 4;
#endif
} spu_clut_t;

typedef struct {
  uint8_t *buf;
  u_int    ra_offs; /* reassembly offset */
  u_int    seq_len;
  u_int    buf_len;

  u_int    cmd_offs;

  u_int PTS;        /* Base PTS of this sequence */
  int finished;     /* Has this sequence been finished? */
} spu_seq_t;

typedef struct {
  uint8_t *cmd_ptr;

  int field_offs[2];
  int b_top,    o_top;
  int b_bottom, o_bottom;
  int b_left,   o_left;
  int b_right,  o_right;

  u_int next_pts;   /* pts of next sub-sequence */
  int modified;     /* Was the sub-picture modified? */
  int visible;      /* Must the sub-picture be shown? */
  int menu;         /* This overlay is a menu */
  int delay;        /* Delay in 90Khz / 1000 */
  int b_show;       /* is a button shown? */
  int need_clut;    /* doesn't have the right clut yet */
  int cur_colors[4];/* current 4 colors been used */

  uint32_t clut[16];
} spu_state_t;

int spu_reassembly (spu_seq_t *seq, int start, uint8_t *pkt_data, u_int pkt_len);
int spu_next_event (spu_state_t *state, spu_seq_t* seq, int pts);
void spu_do_commands (spu_state_t *state, spu_seq_t* seq, vo_overlay_t *ovl);
void spu_draw_picture (spu_state_t *state, spu_seq_t* seq, vo_overlay_t *ovl);
void spu_discover_clut (spu_state_t *state, vo_overlay_t *ovl);
void spu_update_menu (spu_state_t *state, vo_overlay_t *ovl);


typedef struct spudec_stream_state_s {
  spu_seq_t        ra_seq;
  uint32_t         ra_complete;
  uint32_t         stream_filter;
  spu_state_t      state;
  uint32_t         vpts;
  uint32_t         pts;
  int32_t          overlay_handle;
} spudec_stream_state_t;

typedef struct spudec_decoder_s {
  spu_decoder_t    spu_decoder;

  xine_t          *xine;
/*  spu_seq_t	   seq_list[NUM_SEQ_BUFFERS]; */
  spu_seq_t       *cur_seq;
  spudec_stream_state_t spu_stream_state[MAX_STREAMS];
  
  video_overlay_event_t      event;
  video_overlay_object_t     object;  
  int32_t          menu_handle;
  
  spu_seq_t       *ra_seq;
  int              ra_complete;

  uint32_t         ovl_pts;
  uint32_t         buf_pts;
  spu_state_t      state;

  vo_instance_t   *vo_out;
  vo_overlay_t     overlay;
  int              ovl_caps;
  int              output_open;
  pci_t            pci;
  uint32_t         buttonN;  /* Current button number for highlights */
} spudec_decoder_t;


#endif