summaryrefslogtreecommitdiff
path: root/src/dxr3/video_out_dxr3.h
blob: 17507bcf50d7646aefae80a983e5679d3ff341c6 (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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/* 
 * Copyright (C) 2000-2001 the xine project
 * 
 * This file is part of xine, a unix 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: video_out_dxr3.h,v 1.11 2002/10/11 10:55:28 mroi Exp $
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#ifdef HAVE_X11
#  include <X11/Xlib.h>
#endif

#include "xine_internal.h"
#include "dxr3.h"

/* values for fd_video indicating why it is closed */
#define CLOSED_FOR_DECODER -1
#define CLOSED_FOR_ENCODER -2

/* the number of supported encoders */
#define SUPPORTED_ENCODER_COUNT 2


/* plugin structures */
typedef struct encoder_data_s encoder_data_t;
typedef struct spu_encoder_s spu_encoder_t;

typedef enum { ENC_FAME, ENC_RTE } encoder_type;


struct coeff {
  float            k,m;
};

typedef struct dxr3_overlay_s {
  int              fd_control;

  int              xoffset;
  int              yoffset;
  int              xcorr;
  int              jitter;
  int              stability;
  int              colorkey;
  float            color_interval;
  int              screen_xres;
  int              screen_yres;
  int              screen_depth;

  struct coeff     colcal_upper[3];
  struct coeff     colcal_lower[3];
} dxr3_overlay_t;

typedef struct dxr3_driver_s {
  xine_vo_driver_t vo_driver;
  xine_t          *xine;

  char             devname[128];
  char             devnum[3];
  int              fd_control;
  int              fd_video;
  pthread_mutex_t  spu_device_lock;
  int              fd_spu;        /* to access the relevant dxr3 devices */
  int              clut_cluttered;/* to tell spu decoder that it has to restore the palette */
  
  int              enhanced_mode;
  int              swap_fields;   /* swap fields */
  int              add_bars;      /* add black bars to correct a.r. */
  
  int              aspect;
  int              tv_mode;
  int              pan_scan;
  int              overlay_enabled;
  int              tv_switchable; /* can switch from overlay<->tvout */
  int              widescreen_enabled;
  em8300_bcs_t     bcs;

  encoder_data_t  *enc;           /* mpeg encoder data */
  spu_encoder_t   *spu_enc;       /* spu encoder */
  int              video_iheight; /* input height (before adding black bars) */
  int              video_oheight; /* output height (after adding bars) */
  int              video_width;
  int              video_ratio;
  int              top_bar;       /* the height of the upper black bar */
  int              need_redraw;   /* the image on screen needs redrawing */
  int              need_update;   /* the mpeg encoder needs to be updated */

  dxr3_overlay_t   overlay;
#ifdef HAVE_X11
  Display         *display;
  Drawable         win;
  GC               gc;
  XColor           color;
  int              xpos, ypos;
  int              width, height; 
#endif

  char            *user_data;
  void           (*frame_output_cb)(void *user_data,
                     int video_width, int video_height,
		     double video_pixel_aspect,
                     int *dest_x, int *dest_y,
                     int *dest_height, int *dest_width,
		     double *dest_pixel_aspect,
                     int *win_x, int *win_y);
} dxr3_driver_t;

typedef struct dxr3_frame_s {
  vo_frame_t       vo_frame;
  int              oheight;
  int              aspect, pan_scan;
  uint8_t         *mem;           /* allocated for YV12 or YUY2 buffers */
  uint8_t         *real_base[3];  /* yuv/yuy2 buffers in mem aligned on 16 */
  int              swap_fields;   /* shifts Y buffer one line to exchange odd/even lines */
} dxr3_frame_t;

struct encoder_data_s {
  encoder_type     type;
  int            (*on_update_format)(dxr3_driver_t *, dxr3_frame_t *);
  int            (*on_frame_copy)(dxr3_driver_t *, dxr3_frame_t *, uint8_t **src);
  int            (*on_display_frame)(dxr3_driver_t *, dxr3_frame_t *);
  int            (*on_unneeded)(dxr3_driver_t *);
  int            (*on_close)(dxr3_driver_t *);
}; 

struct spu_encoder_s {
  vo_overlay_t   *overlay;
  int             need_reencode;
  uint8_t        *target;
  int             size;
  int             malloc_size;
  uint32_t        color[16];
  uint8_t         trans[4];
  int             map[OVL_PALETTE_SIZE];
  uint32_t        clip_color[16];
  uint8_t         clip_trans[4];
  int             clip_map[OVL_PALETTE_SIZE];
};

/* mpeg encoder plugins initialization functions */
#ifdef HAVE_LIBRTE
int dxr3_rte_init(dxr3_driver_t *);
#endif
#ifdef HAVE_LIBFAME
int dxr3_fame_init(dxr3_driver_t *);
#endif

/* spu encoder functions */
spu_encoder_t *dxr3_spu_encoder_init(void);
void           dxr3_spu_encode(spu_encoder_t *);