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
|
/*
* post_util.h: post plugin utility functions
*
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
* $Id: post_util.h,v 1.3.2.1 2008-09-26 13:33:31 phintuka Exp $
*
*/
#if POST_PLUGIN_IFACE_VERSION < 9
# warning POST_PLUGIN_IFACE_VERSION < 9 not supported !
#endif
#if POST_PLUGIN_IFACE_VERSION > 10
# warning POST_PLUGIN_IFACE_VERSION > 10 not supported !
#endif
/*
* class util prototypes
*/
static void *init_plugin(xine_t *xine, void *data);
#if POST_PLUGIN_IFACE_VERSION < 10
static char *get_identifier(post_class_t *class_gen);
static char *get_description(post_class_t *class_gen);
static void class_dispose(post_class_t *class_gen);
#endif
/* required from plugin: */
static post_plugin_t *open_plugin(post_class_t *class_gen, int inputs,
xine_audio_port_t **audio_target,
xine_video_port_t **video_target);
/*
* plugin util prototypes
*/
static int dispatch_draw(vo_frame_t *frame, xine_stream_t *stream);
static int intercept_frame_yuy(post_video_port_t *port, vo_frame_t *frame);
static int post_draw(vo_frame_t *frame, xine_stream_t *stream);
#ifdef ENABLE_SLICED
static void dispatch_slice(vo_frame_t *vo_img, uint8_t **src);
#endif
/* required from plugin: */
static vo_frame_t *got_frame(vo_frame_t *frame);
static void draw_internal(vo_frame_t *frame, vo_frame_t *new_frame);
/*
* class utils
*/
static void *init_plugin(xine_t *xine, void *data)
{
post_class_t *class = calloc(1, sizeof(post_class_t));
if (!class)
return NULL;
class->open_plugin = open_plugin;
#if POST_PLUGIN_IFACE_VERSION < 10
class->get_identifier = get_identifier;
class->get_description = get_description;
class->dispose = class_dispose;
#else
class->identifier = PLUGIN_ID;
class->description = PLUGIN_DESCR;
class->dispose = default_post_class_dispose;
#endif
return class;
}
#if POST_PLUGIN_IFACE_VERSION < 10
static char *get_identifier(post_class_t *class_gen)
{
return PLUGIN_ID;
}
static char *get_description(post_class_t *class_gen)
{
return PLUGIN_DESCR;
}
static void class_dispose(post_class_t *class_gen)
{
free(class_gen);
}
#endif
/*
* plugin utils
*/
#ifdef ENABLE_SLICED
static void dispatch_slice(vo_frame_t *vo_img, uint8_t **src)
{
if (vo_img->next->proc_slice) {
_x_post_frame_copy_down(vo_img, vo_img->next);
vo_img->next->proc_slice(vo_img->next, src);
_x_post_frame_copy_up(vo_img, vo_img->next);
}
}
#endif
static int dispatch_draw(vo_frame_t *frame, xine_stream_t *stream)
{
int skip;
_x_post_frame_copy_down(frame, frame->next);
skip = frame->next->draw(frame->next, stream);
_x_post_frame_copy_up(frame, frame->next);
return skip;
}
static int intercept_frame_yuy(post_video_port_t *port, vo_frame_t *frame)
{
return (frame->format == XINE_IMGFMT_YV12 || frame->format == XINE_IMGFMT_YUY2);
}
static int post_draw(vo_frame_t *frame, xine_stream_t *stream)
{
vo_frame_t *new_frame;
int skip;
if (frame->bad_frame)
return dispatch_draw(frame, stream);
new_frame = got_frame(frame);
if (!new_frame)
return dispatch_draw(frame, stream);
_x_post_frame_copy_down(frame, new_frame);
draw_internal(frame, new_frame);
skip = new_frame->draw(new_frame, stream);
_x_post_frame_copy_up(frame, new_frame);
new_frame->free(new_frame);
return skip;
}
|