summaryrefslogtreecommitdiff
path: root/src/libspudec/spu.h
blob: 91f4f8ab62d7c17ef256dd7bb2096be11529f591 (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
137
138
139
140
141
142
143
144
145
/*
 * Copyright (C) 2000-2004 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.27 2004/07/14 01:18:48 miguelfreitas 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"
#ifdef HAVE_DVDNAV
#  include <dvdnav/nav_types.h>
#else
#  include "nav_types.h"
#endif

#define NUM_SEQ_BUFFERS 50
#define MAX_STREAMS 32

typedef struct spudec_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
} spudec_clut_t;

typedef struct {
  uint8_t   *buf;
  uint32_t   ra_offs;     /* reassembly offset */
  uint32_t   seq_len;
  uint32_t   buf_len;
  uint32_t   cmd_offs;
  int64_t    pts;        /* Base PTS of this sequence */
  int32_t    finished;   /* Has this control sequence been finished? */
  uint32_t   complete;   /* Has this reassembly been finished? */
  uint32_t   broken;     /* this SPU is broken and should be dropped */
} spudec_seq_t;

typedef struct {
  uint8_t *cmd_ptr;

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

  int32_t modified;     /* Was the sub-picture modified? */
  int32_t visible;      /* Must the sub-picture be shown? */
  int32_t forced_display; /* This overlay is a menu */
  int32_t delay;        /* Delay in 90Khz / 1000 */
  int32_t need_clut;    /* doesn't have the right clut yet */
  int32_t cur_colors[4];/* current 4 colors been used */
  int32_t vobsub;       /* vobsub must be aligned to bottom */

  uint32_t clut[16];
} spudec_state_t;

typedef struct spudec_stream_state_s {
  spudec_seq_t        ra_seq;
  spudec_state_t      state;
  int64_t          vpts;
  int64_t          pts;
  int32_t          overlay_handle;
} spudec_stream_state_t;

typedef struct {
  spu_decoder_class_t   decoder_class;
} spudec_class_t;

typedef struct pci_node_s pci_node_t;
struct pci_node_s {
  pci_t         pci;
  uint64_t      vpts;
  pci_node_t   *next;
};

typedef struct spudec_decoder_s {
  spu_decoder_t    spu_decoder;

  spudec_class_t  *class;
  xine_stream_t   *stream;
  spudec_stream_state_t spudec_stream_state[MAX_STREAMS];
  
  video_overlay_event_t      event;
  video_overlay_object_t     object;  
  int32_t          menu_handle;
  
  spudec_state_t      state;

  vo_overlay_t     overlay;
  int              ovl_caps;
  int              output_open;
  pthread_mutex_t  nav_pci_lock;
  pci_node_t       pci_cur;
  uint32_t         buttonN;  /* Current button number for highlights */
  int32_t          button_filter; /* Allow highlight changes or not */
  int64_t          last_event_vpts;
} spudec_decoder_t;

void spudec_reassembly (xine_t *xine, spudec_seq_t *seq, uint8_t *pkt_data, u_int pkt_len);
void spudec_process( spudec_decoder_t *this, int stream_id);
/* the nav functions must be called with the nav_pci_lock held */
void spudec_decode_nav( spudec_decoder_t *this, buf_element_t *buf);
void spudec_clear_nav_list(spudec_decoder_t *this);
void spudec_update_nav(spudec_decoder_t *this);
void spudec_process_nav(spudec_decoder_t *this);
int  spudec_copy_nav_to_overlay(xine_t *xine, pci_t* nav_pci, uint32_t* clut, int32_t button, int32_t mode,
                                vo_overlay_t * overlay, vo_overlay_t * base );

#endif