Mercurial > mplayer.hg
annotate spudec.c @ 21254:cc1d070fda33
-lwinmm is always (also for mencoder) needed on windows for osdep/timer-win2.c
author | reimar |
---|---|
date | Sun, 26 Nov 2006 14:13:39 +0000 |
parents | 1e5cf11e8b1f |
children | bf1fbe97cc40 |
rev | line source |
---|---|
560 | 1 /* SPUdec.c |
673 | 2 Skeleton of function spudec_process_controll() is from xine sources. |
560 | 3 Further works: |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
4 LGB,... (yeah, try to improve it and insert your name here! ;-) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
5 |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
6 Kim Minh Kaplan |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
7 implement fragments reassembly, RLE decoding. |
3166 | 8 read brightness from the IFO. |
560 | 9 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
10 For information on SPU format see <URL:http://sam.zoy.org/doc/dvd/subtitles/> |
3402 | 11 and <URL:http://members.aol.com/mpucoder/DVD/spu.html> |
560 | 12 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
13 */ |
3183 | 14 #include "config.h" |
3822 | 15 #include "mp_msg.h" |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
16 |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
17 #include <errno.h> |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
18 #include <limits.h> |
560 | 19 #include <stdio.h> |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
20 #include <stdlib.h> |
3175 | 21 #include <unistd.h> |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
22 #include <string.h> |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
23 #include <math.h> |
6110 | 24 #include "libvo/video_out.h" |
560 | 25 #include "spudec.h" |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
18861
diff
changeset
|
26 #include "avutil.h" |
18861 | 27 #include "libswscale/swscale.h" |
560 | 28 |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
29 #define MIN(a, b) ((a)<(b)?(a):(b)) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
30 |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
31 /* Valid values for spu_aamode: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
32 0: none (fastest, most ugly) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
33 1: approximate |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
34 2: full (slowest) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
35 3: bilinear (similiar to vobsub, fast and not too bad) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
36 4: uses swscaler gaussian (this is the only one that looks good) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
37 */ |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
38 |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
39 int spu_aamode = 3; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
40 int spu_alignment = -1; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
41 float spu_gaussvar = 1.0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
42 extern int sub_pos; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
43 |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
44 typedef struct packet_t packet_t; |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
45 struct packet_t { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
46 unsigned char *packet; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
47 unsigned int palette[4]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
48 unsigned int alpha[4]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
49 unsigned int control_start; /* index of start of control data */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
50 unsigned int current_nibble[2]; /* next data nibble (4 bits) to be |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
51 processed (for RLE decoding) for |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
52 even and odd lines */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
53 int deinterlace_oddness; /* 0 or 1, index into current_nibble */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
54 unsigned int start_col, end_col; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
55 unsigned int start_row, end_row; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
56 unsigned int width, height, stride; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
57 unsigned int start_pts, end_pts; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
58 packet_t *next; |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
59 }; |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
60 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
61 typedef struct { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
62 packet_t *queue_head; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
63 packet_t *queue_tail; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
64 unsigned int global_palette[16]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
65 unsigned int orig_frame_width, orig_frame_height; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
66 unsigned char* packet; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
67 size_t packet_reserve; /* size of the memory pointed to by packet */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
68 unsigned int packet_offset; /* end of the currently assembled fragment */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
69 unsigned int packet_size; /* size of the packet once all fragments are assembled */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
70 unsigned int packet_pts; /* PTS for this packet */ |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
71 unsigned int palette[4]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
72 unsigned int alpha[4]; |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
73 unsigned int cuspal[4]; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
74 unsigned int custom; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
75 unsigned int now_pts; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
76 unsigned int start_pts, end_pts; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
77 unsigned int start_col, end_col; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
78 unsigned int start_row, end_row; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
79 unsigned int width, height, stride; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
80 size_t image_size; /* Size of the image buffer */ |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
81 unsigned char *image; /* Grayscale value */ |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
82 unsigned char *aimage; /* Alpha value */ |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
83 unsigned int scaled_frame_width, scaled_frame_height; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
84 unsigned int scaled_start_col, scaled_start_row; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
85 unsigned int scaled_width, scaled_height, scaled_stride; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
86 size_t scaled_image_size; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
87 unsigned char *scaled_image; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
88 unsigned char *scaled_aimage; |
6110 | 89 int auto_palette; /* 1 if we lack a palette and must use an heuristic. */ |
90 int font_start_level; /* Darkest value used for the computed font */ | |
91 vo_functions_t *hw_spu; | |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
92 int spu_changed; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
93 unsigned int forced_subs_only; /* flag: 0=display all subtitle, !0 display only forced subtitles */ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
94 unsigned int is_forced_sub; /* true if current subtitle is a forced subtitle */ |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
95 } spudec_handle_t; |
560 | 96 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
97 static void spudec_queue_packet(spudec_handle_t *this, packet_t *packet) |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
98 { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
99 if (this->queue_head == NULL) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
100 this->queue_head = packet; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
101 else |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
102 this->queue_tail->next = packet; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
103 this->queue_tail = packet; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
104 } |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
105 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
106 static packet_t *spudec_dequeue_packet(spudec_handle_t *this) |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
107 { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
108 packet_t *retval = this->queue_head; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
109 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
110 this->queue_head = retval->next; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
111 if (this->queue_head == NULL) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
112 this->queue_tail = NULL; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
113 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
114 return retval; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
115 } |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
116 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
117 static void spudec_free_packet(packet_t *packet) |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
118 { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
119 if (packet->packet != NULL) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
120 free(packet->packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
121 free(packet); |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
122 } |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
123 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
124 static inline unsigned int get_be16(const unsigned char *p) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
125 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
126 return (p[0] << 8) + p[1]; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
127 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
128 |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
129 static inline unsigned int get_be24(const unsigned char *p) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
130 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
131 return (get_be16(p) << 8) + p[2]; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
132 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
133 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
134 static void next_line(packet_t *packet) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
135 { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
136 if (packet->current_nibble[packet->deinterlace_oddness] % 2) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
137 packet->current_nibble[packet->deinterlace_oddness]++; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
138 packet->deinterlace_oddness = (packet->deinterlace_oddness + 1) % 2; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
139 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
140 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
141 static inline unsigned char get_nibble(packet_t *packet) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
142 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
143 unsigned char nib; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
144 unsigned int *nibblep = packet->current_nibble + packet->deinterlace_oddness; |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
145 if (*nibblep / 2 >= packet->control_start) { |
3822 | 146 mp_msg(MSGT_SPUDEC,MSGL_WARN, "SPUdec: ERROR: get_nibble past end of packet\n"); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
147 return 0; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
148 } |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
149 nib = packet->packet[*nibblep / 2]; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
150 if (*nibblep % 2) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
151 nib &= 0xf; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
152 else |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
153 nib >>= 4; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
154 ++*nibblep; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
155 return nib; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
156 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
157 |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
158 static inline int mkalpha(int i) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
159 { |
3166 | 160 /* In mplayer's alpha planes, 0 is transparent, then 1 is nearly |
161 opaque upto 255 which is transparent */ | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
162 switch (i) { |
3166 | 163 case 0xf: |
164 return 1; | |
165 case 0: | |
166 return 0; | |
167 default: | |
168 return (0xf - i) << 4; | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
169 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
170 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
171 |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
172 /* Cut the sub to visible part */ |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
173 static inline void spudec_cut_image(spudec_handle_t *this) |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
174 { |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
175 unsigned int fy, ly; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
176 unsigned int first_y, last_y; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
177 unsigned char *image; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
178 unsigned char *aimage; |
6223
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
179 |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
180 if (this->stride == 0 || this->height == 0) { |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
181 return; |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
182 } |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
183 |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
184 for (fy = 0; fy < this->image_size && !this->aimage[fy]; fy++); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
185 for (ly = this->stride * this->height-1; ly && !this->aimage[ly]; ly--); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
186 first_y = fy / this->stride; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
187 last_y = ly / this->stride; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
188 //printf("first_y: %d, last_y: %d\n", first_y, last_y); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
189 this->start_row += first_y; |
6223
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
190 |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
191 // Some subtitles trigger this condition |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
192 if (last_y + 1 > first_y ) { |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
193 this->height = last_y - first_y +1; |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
194 } else { |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
195 this->height = 0; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
196 this->image_size = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
197 return; |
6223
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
198 } |
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
199 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
200 // printf("new h %d new start %d (sz %d st %d)---\n\n", this->height, this->start_row, this->image_size, this->stride); |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
201 |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
202 image = malloc(2 * this->stride * this->height); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
203 if(image){ |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
204 this->image_size = this->stride * this->height; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
205 aimage = image + this->image_size; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
206 memcpy(image, this->image + this->stride * first_y, this->image_size); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
207 memcpy(aimage, this->aimage + this->stride * first_y, this->image_size); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
208 free(this->image); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
209 this->image = image; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
210 this->aimage = aimage; |
6223
7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
pl
parents:
6215
diff
changeset
|
211 } else { |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
212 mp_msg(MSGT_SPUDEC, MSGL_FATAL, "Fatal: update_spu: malloc requested %d bytes\n", 2 * this->stride * this->height); |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
213 } |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
214 } |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
215 |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
216 static void spudec_process_data(spudec_handle_t *this, packet_t *packet) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
217 { |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
218 unsigned int cmap[4], alpha[4]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
219 unsigned int i, x, y; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
220 |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
221 this->scaled_frame_width = 0; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
222 this->scaled_frame_height = 0; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
223 this->start_col = packet->start_col; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
224 this->end_col = packet->end_col; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
225 this->start_row = packet->start_row; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
226 this->end_row = packet->end_row; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
227 this->height = packet->height; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
228 this->width = packet->width; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
229 this->stride = packet->stride; |
3166 | 230 for (i = 0; i < 4; ++i) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
231 alpha[i] = mkalpha(packet->alpha[i]); |
3166 | 232 if (alpha[i] == 0) |
233 cmap[i] = 0; | |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
234 else if (this->custom){ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
235 cmap[i] = ((this->cuspal[i] >> 16) & 0xff); |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
236 if (cmap[i] + alpha[i] > 255) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
237 cmap[i] = 256 - alpha[i]; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
238 } |
3166 | 239 else { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
240 cmap[i] = ((this->global_palette[packet->palette[i]] >> 16) & 0xff); |
4122 | 241 if (cmap[i] + alpha[i] > 255) |
242 cmap[i] = 256 - alpha[i]; | |
3166 | 243 } |
244 } | |
245 | |
3402 | 246 if (this->image_size < this->stride * this->height) { |
247 if (this->image != NULL) { | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
248 free(this->image); |
3402 | 249 this->image_size = 0; |
250 } | |
251 this->image = malloc(2 * this->stride * this->height); | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
252 if (this->image) { |
3402 | 253 this->image_size = this->stride * this->height; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
254 this->aimage = this->image + this->image_size; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
255 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
256 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
257 if (this->image == NULL) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
258 return; |
3402 | 259 |
260 /* Kludge: draw_alpha needs width multiple of 8. */ | |
261 if (this->width < this->stride) | |
6459 | 262 for (y = 0; y < this->height; ++y) { |
3402 | 263 memset(this->aimage + y * this->stride + this->width, 0, this->stride - this->width); |
6459 | 264 /* FIXME: Why is this one needed? */ |
265 memset(this->image + y * this->stride + this->width, 0, this->stride - this->width); | |
266 } | |
3402 | 267 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
268 i = packet->current_nibble[1]; |
3402 | 269 x = 0; |
270 y = 0; | |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
271 while (packet->current_nibble[0] < i |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
272 && packet->current_nibble[1] / 2 < packet->control_start |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
273 && y < this->height) { |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
274 unsigned int len, color; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
275 unsigned int rle = 0; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
276 rle = get_nibble(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
277 if (rle < 0x04) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
278 rle = (rle << 4) | get_nibble(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
279 if (rle < 0x10) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
280 rle = (rle << 4) | get_nibble(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
281 if (rle < 0x040) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
282 rle = (rle << 4) | get_nibble(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
283 if (rle < 0x0004) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
284 rle |= ((this->width - x) << 2); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
285 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
286 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
287 } |
3166 | 288 color = 3 - (rle & 0x3); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
289 len = rle >> 2; |
3402 | 290 if (len > this->width - x || len == 0) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
291 len = this->width - x; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
292 /* FIXME have to use palette and alpha map*/ |
3402 | 293 memset(this->image + y * this->stride + x, cmap[color], len); |
294 memset(this->aimage + y * this->stride + x, alpha[color], len); | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
295 x += len; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
296 if (x >= this->width) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
297 next_line(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
298 x = 0; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
299 ++y; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
300 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
301 } |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
302 spudec_cut_image(this); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
303 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
304 |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
305 |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
306 /* |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
307 This function tries to create a usable palette. |
11000 | 308 It determines how many non-transparent colors are used, and assigns different |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
309 gray scale values to each color. |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
310 I tested it with four streams and even got something readable. Half of the |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
311 times I got black characters with white around and half the reverse. |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
312 */ |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
313 static void compute_palette(spudec_handle_t *this, packet_t *packet) |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
314 { |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
315 int used[16],i,cused,start,step,color; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
316 |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
317 memset(used, 0, sizeof(used)); |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
318 for (i=0; i<4; i++) |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
319 if (packet->alpha[i]) /* !Transparent? */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
320 used[packet->palette[i]] = 1; |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
321 for (cused=0, i=0; i<16; i++) |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
322 if (used[i]) cused++; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
323 if (!cused) return; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
324 if (cused == 1) { |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
325 start = 0x80; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
326 step = 0; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
327 } else { |
6110 | 328 start = this->font_start_level; |
329 step = (0xF0-this->font_start_level)/(cused-1); | |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
330 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
331 memset(used, 0, sizeof(used)); |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
332 for (i=0; i<4; i++) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
333 color = packet->palette[i]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
334 if (packet->alpha[i] && !used[color]) { /* not assigned? */ |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
335 used[color] = 1; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
336 this->global_palette[color] = start<<16; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
337 start += step; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
338 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
339 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
340 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
341 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
342 static void spudec_process_control(spudec_handle_t *this, unsigned int pts100) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
343 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
344 int a,b; /* Temporary vars */ |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
345 unsigned int date, type; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
346 unsigned int off; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
347 unsigned int start_off = 0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
348 unsigned int next_off; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
349 unsigned int start_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
350 unsigned int end_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
351 unsigned int current_nibble[2]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
352 unsigned int control_start; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
353 unsigned int display = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
354 unsigned int start_col = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
355 unsigned int end_col = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
356 unsigned int start_row = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
357 unsigned int end_row = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
358 unsigned int width = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
359 unsigned int height = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
360 unsigned int stride = 0; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
361 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
362 control_start = get_be16(this->packet + 2); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
363 next_off = control_start; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
364 while (start_off != next_off) { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
365 start_off = next_off; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
366 date = get_be16(this->packet + start_off) * 1024; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
367 next_off = get_be16(this->packet + start_off + 2); |
3822 | 368 mp_msg(MSGT_SPUDEC,MSGL_DBG2, "date=%d\n", date); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
369 off = start_off + 4; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
370 for (type = this->packet[off++]; type != 0xff; type = this->packet[off++]) { |
3822 | 371 mp_msg(MSGT_SPUDEC,MSGL_DBG2, "cmd=%d ",type); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
372 switch(type) { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
373 case 0x00: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
374 /* Menu ID, 1 byte */ |
3822 | 375 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Menu ID\n"); |
5474
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
376 /* shouldn't a Menu ID type force display start? */ |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
377 start_pts = pts100 + date; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
378 end_pts = UINT_MAX; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
379 display = 1; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
380 this->is_forced_sub=~0; // current subtitle is forced |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
381 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
382 case 0x01: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
383 /* Start display */ |
3822 | 384 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Start display!\n"); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
385 start_pts = pts100 + date; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
386 end_pts = UINT_MAX; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
387 display = 1; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
388 this->is_forced_sub=0; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
389 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
390 case 0x02: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
391 /* Stop display */ |
3822 | 392 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Stop display!\n"); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
393 end_pts = pts100 + date; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
394 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
395 case 0x03: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
396 /* Palette */ |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
397 this->palette[0] = this->packet[off] >> 4; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
398 this->palette[1] = this->packet[off] & 0xf; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
399 this->palette[2] = this->packet[off + 1] >> 4; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
400 this->palette[3] = this->packet[off + 1] & 0xf; |
3822 | 401 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Palette %d, %d, %d, %d\n", |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
402 this->palette[0], this->palette[1], this->palette[2], this->palette[3]); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
403 off+=2; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
404 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
405 case 0x04: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
406 /* Alpha */ |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
407 this->alpha[0] = this->packet[off] >> 4; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
408 this->alpha[1] = this->packet[off] & 0xf; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
409 this->alpha[2] = this->packet[off + 1] >> 4; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
410 this->alpha[3] = this->packet[off + 1] & 0xf; |
3822 | 411 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Alpha %d, %d, %d, %d\n", |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
412 this->alpha[0], this->alpha[1], this->alpha[2], this->alpha[3]); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
413 off+=2; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
414 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
415 case 0x05: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
416 /* Co-ords */ |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
417 a = get_be24(this->packet + off); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
418 b = get_be24(this->packet + off + 3); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
419 start_col = a >> 12; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
420 end_col = a & 0xfff; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
421 width = (end_col < start_col) ? 0 : end_col - start_col + 1; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
422 stride = (width + 7) & ~7; /* Kludge: draw_alpha needs width multiple of 8 */ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
423 start_row = b >> 12; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
424 end_row = b & 0xfff; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
425 height = (end_row < start_row) ? 0 : end_row - start_row /* + 1 */; |
3822 | 426 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Coords col: %d - %d row: %d - %d (%dx%d)\n", |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
427 start_col, end_col, start_row, end_row, |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
428 width, height); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
429 off+=6; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
430 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
431 case 0x06: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
432 /* Graphic lines */ |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
433 current_nibble[0] = 2 * get_be16(this->packet + off); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
434 current_nibble[1] = 2 * get_be16(this->packet + off + 2); |
3822 | 435 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Graphic offset 1: %d offset 2: %d\n", |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
436 current_nibble[0] / 2, current_nibble[1] / 2); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
437 off+=4; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
438 break; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
439 case 0xff: |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
440 /* All done, bye-bye */ |
3822 | 441 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"Done!\n"); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
442 return; |
3822 | 443 // break; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
444 default: |
3822 | 445 mp_msg(MSGT_SPUDEC,MSGL_WARN,"spudec: Error determining control type 0x%02x. Skipping %d bytes.\n", |
3402 | 446 type, next_off - off); |
447 goto next_control; | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
448 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
449 } |
3402 | 450 next_control: |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
451 if (display) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
452 packet_t *packet = calloc(1, sizeof(packet_t)); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
453 int i; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
454 packet->start_pts = start_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
455 if (end_pts == UINT_MAX && start_off != next_off) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
456 start_pts = pts100 + get_be16(this->packet + next_off) * 1024; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
457 packet->end_pts = start_pts - 1; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
458 } else packet->end_pts = end_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
459 packet->current_nibble[0] = current_nibble[0]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
460 packet->current_nibble[1] = current_nibble[1]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
461 packet->start_row = start_row; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
462 packet->end_row = end_row; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
463 packet->start_col = start_col; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
464 packet->end_col = end_col; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
465 packet->width = width; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
466 packet->height = height; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
467 packet->stride = stride; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
468 packet->control_start = control_start; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
469 for (i=0; i<4; i++) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
470 packet->alpha[i] = this->alpha[i]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
471 packet->palette[i] = this->palette[i]; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
472 } |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
473 packet->packet = malloc(this->packet_size); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
474 memcpy(packet->packet, this->packet, this->packet_size); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
475 spudec_queue_packet(this, packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
476 } |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
477 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
478 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
479 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
480 static void spudec_decode(spudec_handle_t *this, unsigned int pts100) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
481 { |
6110 | 482 if(this->hw_spu) { |
483 static vo_mpegpes_t packet = { NULL, 0, 0x20, 0 }; | |
484 static vo_mpegpes_t *pkg=&packet; | |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
485 packet.data = this->packet; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
486 packet.size = this->packet_size; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
487 packet.timestamp = pts100; |
6110 | 488 this->hw_spu->draw_frame((uint8_t**)&pkg); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
489 } else |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
490 spudec_process_control(this, pts100); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
491 } |
560 | 492 |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
493 int spudec_changed(void * this) |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
494 { |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
495 spudec_handle_t * spu = (spudec_handle_t*)this; |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
496 return (spu->spu_changed || spu->now_pts > spu->end_pts); |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
497 } |
560 | 498 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
499 void spudec_assemble(void *this, unsigned char *packet, unsigned int len, unsigned int pts100) |
560 | 500 { |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
501 spudec_handle_t *spu = (spudec_handle_t*)this; |
3842 | 502 // spudec_heartbeat(this, pts100); |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
503 if (len < 2) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
504 mp_msg(MSGT_SPUDEC,MSGL_WARN,"SPUasm: packet too short\n"); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
505 return; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
506 } |
15761 | 507 #if 0 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
508 if ((spu->packet_pts + 10000) < pts100) { |
7743
a280cc3087ea
All right: The patch adresses two issues which I found, when I analyzed
arpi
parents:
6938
diff
changeset
|
509 // [cb] too long since last fragment: force new packet |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
510 spu->packet_offset = 0; |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
511 } |
15761 | 512 #endif |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
513 spu->packet_pts = pts100; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
514 if (spu->packet_offset == 0) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
515 unsigned int len2 = get_be16(packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
516 // Start new fragment |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
517 if (spu->packet_reserve < len2) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
518 if (spu->packet != NULL) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
519 free(spu->packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
520 spu->packet = malloc(len2); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
521 spu->packet_reserve = spu->packet != NULL ? len2 : 0; |
560 | 522 } |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
523 if (spu->packet != NULL) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
524 spu->packet_size = len2; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
525 if (len > len2) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
526 mp_msg(MSGT_SPUDEC,MSGL_WARN,"SPUasm: invalid frag len / len2: %d / %d \n", len, len2); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
527 return; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
528 } |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
529 memcpy(spu->packet, packet, len); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
530 spu->packet_offset = len; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
531 spu->packet_pts = pts100; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
532 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
533 } else { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
534 // Continue current fragment |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
535 if (spu->packet_size < spu->packet_offset + len){ |
3822 | 536 mp_msg(MSGT_SPUDEC,MSGL_WARN,"SPUasm: invalid fragment\n"); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
537 spu->packet_size = spu->packet_offset = 0; |
9442 | 538 return; |
3744 | 539 } else { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
540 memcpy(spu->packet + spu->packet_offset, packet, len); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
541 spu->packet_offset += len; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
542 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
543 } |
3820 | 544 #if 1 |
545 // check if we have a complete packet (unfortunatelly packet_size is bad | |
546 // for some disks) | |
7743
a280cc3087ea
All right: The patch adresses two issues which I found, when I analyzed
arpi
parents:
6938
diff
changeset
|
547 // [cb] packet_size is padded to be even -> may be one byte too long |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
548 if ((spu->packet_offset == spu->packet_size) || |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
549 ((spu->packet_offset + 1) == spu->packet_size)){ |
5917 | 550 unsigned int x=0,y; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
551 while(x+4<=spu->packet_offset){ |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
552 y=get_be16(spu->packet+x+2); // next control pointer |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
553 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"SPUtest: x=%d y=%d off=%d size=%d\n",x,y,spu->packet_offset,spu->packet_size); |
3820 | 554 if(x>=4 && x==y){ // if it points to self - we're done! |
555 // we got it! | |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
556 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"SPUgot: off=%d size=%d \n",spu->packet_offset,spu->packet_size); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
557 spudec_decode(spu, pts100); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
558 spu->packet_offset = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
559 break; |
3820 | 560 } |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
561 if(y<=x || y>=spu->packet_size){ // invalid? |
3822 | 562 mp_msg(MSGT_SPUDEC,MSGL_WARN,"SPUtest: broken packet!!!!! y=%d < x=%d\n",y,x); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
563 spu->packet_size = spu->packet_offset = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
564 break; |
3820 | 565 } |
566 x=y; | |
567 } | |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
568 // [cb] packet is done; start new packet |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
569 spu->packet_offset = 0; |
3820 | 570 } |
571 #else | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
572 if (spu->packet_offset == spu->packet_size) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
573 spudec_decode(spu, pts100); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
574 spu->packet_offset = 0; |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
575 } |
3820 | 576 #endif |
560 | 577 } |
578 | |
3744 | 579 void spudec_reset(void *this) // called after seek |
580 { | |
581 spudec_handle_t *spu = (spudec_handle_t*)this; | |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
582 while (spu->queue_head) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
583 spudec_free_packet(spudec_dequeue_packet(spu)); |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
584 spu->now_pts = 0; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
585 spu->end_pts = 0; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
586 spu->packet_size = spu->packet_offset = 0; |
3744 | 587 } |
588 | |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
589 void spudec_heartbeat(void *this, unsigned int pts100) |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
590 { |
8843
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
591 spudec_handle_t *spu = (spudec_handle_t*) this; |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
592 spu->now_pts = pts100; |
c70444c5b516
I have seen problems where DVD subtitles don't display
arpi
parents:
7743
diff
changeset
|
593 |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
594 while (spu->queue_head != NULL && pts100 >= spu->queue_head->start_pts) { |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
595 packet_t *packet = spudec_dequeue_packet(spu); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
596 spu->start_pts = packet->start_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
597 spu->end_pts = packet->end_pts; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
598 if (spu->auto_palette) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
599 compute_palette(spu, packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
600 spudec_process_data(spu, packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
601 spudec_free_packet(packet); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
602 spu->spu_changed = 1; |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
603 } |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
604 } |
560 | 605 |
5638
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
606 int spudec_visible(void *this){ |
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
607 spudec_handle_t *spu = (spudec_handle_t *)this; |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
608 int ret=(spu->start_pts <= spu->now_pts && |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
609 spu->now_pts < spu->end_pts && |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
610 spu->height > 0); |
5638
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
611 // printf("spu visible: %d \n",ret); |
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
612 return ret; |
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
613 } |
86663f1b9b00
new osd code, use osd objs to follow changes and do minimal updates
arpi
parents:
5488
diff
changeset
|
614 |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
615 void spudec_set_forced_subs_only(void * const this, const unsigned int flag) |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
616 { |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
617 if(this){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
618 ((spudec_handle_t *)this)->forced_subs_only=flag; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
619 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"SPU: Display only forced subs now %s\n", flag ? "enabled": "disabled"); |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
620 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
621 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
622 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
623 void spudec_draw(void *this, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
624 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
625 spudec_handle_t *spu = (spudec_handle_t *)this; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
626 if (spu->start_pts <= spu->now_pts && spu->now_pts < spu->end_pts && spu->image) |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
627 { |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
628 draw_alpha(spu->start_col, spu->start_row, spu->width, spu->height, |
3402 | 629 spu->image, spu->aimage, spu->stride); |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
630 spu->spu_changed = 0; |
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
631 } |
561 | 632 } |
633 | |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
634 /* calc the bbox for spudec subs */ |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
635 void spudec_calc_bbox(void *me, unsigned int dxs, unsigned int dys, unsigned int* bbox) |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
636 { |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
637 spudec_handle_t *spu; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
638 spu = (spudec_handle_t *)me; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
639 if (spu->orig_frame_width == 0 || spu->orig_frame_height == 0 |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
640 || (spu->orig_frame_width == dxs && spu->orig_frame_height == dys)) { |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
641 bbox[0] = spu->start_col; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
642 bbox[1] = spu->start_col + spu->width; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
643 bbox[2] = spu->start_row; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
644 bbox[3] = spu->start_row + spu->height; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
645 } |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
646 else if (spu->scaled_frame_width != dxs || spu->scaled_frame_height != dys) { |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
647 unsigned int scalex = 0x100 * dxs / spu->orig_frame_width; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
648 unsigned int scaley = 0x100 * dys / spu->orig_frame_height; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
649 bbox[0] = spu->start_col * scalex / 0x100; |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
650 bbox[1] = spu->start_col * scalex / 0x100 + spu->width * scalex / 0x100; |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
651 switch (spu_alignment) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
652 case 0: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
653 bbox[3] = dys*sub_pos/100 + spu->height * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
654 if (bbox[3] > dys) bbox[3] = dys; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
655 bbox[2] = bbox[3] - spu->height * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
656 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
657 case 1: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
658 if (sub_pos < 50) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
659 bbox[2] = dys*sub_pos/100 - spu->height * scaley / 0x200; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
660 if (bbox[2] < 0) bbox[2] = 0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
661 bbox[3] = bbox[2] + spu->height; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
662 } else { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
663 bbox[3] = dys*sub_pos/100 + spu->height * scaley / 0x200; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
664 if (bbox[3] > dys) bbox[3] = dys; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
665 bbox[2] = bbox[3] - spu->height * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
666 } |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
667 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
668 case 2: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
669 bbox[2] = dys*sub_pos/100 - spu->height * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
670 if (bbox[2] < 0) bbox[2] = 0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
671 bbox[3] = bbox[2] + spu->height; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
672 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
673 default: /* -1 */ |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
674 bbox[2] = spu->start_row * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
675 bbox[3] = spu->start_row * scaley / 0x100 + spu->height * scaley / 0x100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
676 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
677 } |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
678 } |
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
679 } |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
680 /* transform mplayer's alpha value into an opacity value that is linear */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
681 static inline int canon_alpha(int alpha) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
682 { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
683 return alpha ? 256 - alpha : 0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
684 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
685 |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
686 typedef struct { |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
687 unsigned position; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
688 unsigned left_up; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
689 unsigned right_down; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
690 }scale_pixel; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
691 |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
692 |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
693 static void scale_table(unsigned int start_src, unsigned int start_tar, unsigned int end_src, unsigned int end_tar, scale_pixel * table) |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
694 { |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
695 unsigned int t; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
696 unsigned int delta_src = end_src - start_src; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
697 unsigned int delta_tar = end_tar - start_tar; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
698 int src = 0; |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
699 int src_step; |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
700 if (delta_src == 0 || delta_tar == 0) { |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
701 return; |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
702 } |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
703 src_step = (delta_src << 16) / delta_tar >>1; |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
704 for (t = 0; t<=delta_tar; src += (src_step << 1), t++){ |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
705 table[t].position= MIN(src >> 16, end_src - 1); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
706 table[t].right_down = src & 0xffff; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
707 table[t].left_up = 0x10000 - table[t].right_down; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
708 } |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
709 } |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
710 |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
711 /* bilinear scale, similar to vobsub's code */ |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
712 static void scale_image(int x, int y, scale_pixel* table_x, scale_pixel* table_y, spudec_handle_t * spu) |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
713 { |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
714 int alpha[4]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
715 int color[4]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
716 unsigned int scale[4]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
717 int base = table_y[y].position * spu->stride + table_x[x].position; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
718 int scaled = y * spu->scaled_stride + x; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
719 alpha[0] = canon_alpha(spu->aimage[base]); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
720 alpha[1] = canon_alpha(spu->aimage[base + 1]); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
721 alpha[2] = canon_alpha(spu->aimage[base + spu->stride]); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
722 alpha[3] = canon_alpha(spu->aimage[base + spu->stride + 1]); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
723 color[0] = spu->image[base]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
724 color[1] = spu->image[base + 1]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
725 color[2] = spu->image[base + spu->stride]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
726 color[3] = spu->image[base + spu->stride + 1]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
727 scale[0] = (table_x[x].left_up * table_y[y].left_up >> 16) * alpha[0]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
728 scale[1] = (table_x[x].right_down * table_y[y].left_up >>16) * alpha[1]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
729 scale[2] = (table_x[x].left_up * table_y[y].right_down >> 16) * alpha[2]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
730 scale[3] = (table_x[x].right_down * table_y[y].right_down >> 16) * alpha[3]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
731 spu->scaled_image[scaled] = (color[0] * scale[0] + color[1] * scale[1] + color[2] * scale[2] + color[3] * scale[3])>>24; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
732 spu->scaled_aimage[scaled] = (scale[0] + scale[1] + scale[2] + scale[3]) >> 16; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
733 if (spu->scaled_aimage[scaled]){ |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
734 spu->scaled_aimage[scaled] = 256 - spu->scaled_aimage[scaled]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
735 if(spu->scaled_aimage[scaled] + spu->scaled_image[scaled] > 255) |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
736 spu->scaled_image[scaled] = 256 - spu->scaled_aimage[scaled]; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
737 } |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
738 } |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
739 |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
740 void sws_spu_image(unsigned char *d1, unsigned char *d2, int dw, int dh, int ds, |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
741 unsigned char *s1, unsigned char *s2, int sw, int sh, int ss) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
742 { |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
743 struct SwsContext *ctx; |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
744 static SwsFilter filter; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
745 static int firsttime = 1; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
746 static float oldvar; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
747 int i; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
748 |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
749 if (!firsttime && oldvar != spu_gaussvar) sws_freeVec(filter.lumH); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
750 if (firsttime) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
751 filter.lumH = filter.lumV = |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
752 filter.chrH = filter.chrV = sws_getGaussianVec(spu_gaussvar, 3.0); |
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
753 sws_normalizeVec(filter.lumH, 1.0); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
754 firsttime = 0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
755 oldvar = spu_gaussvar; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
756 } |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
757 |
19870
1e5cf11e8b1f
Use PIX_FMT_* instead of IMGFMT_* when calling sws_getContext()
lucabe
parents:
18861
diff
changeset
|
758 ctx=sws_getContext(sw, sh, PIX_FMT_GRAY8, dw, dh, PIX_FMT_GRAY8, SWS_GAUSS, &filter, NULL, NULL); |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
759 sws_scale(ctx,&s1,&ss,0,sh,&d1,&ds); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
760 for (i=ss*sh-1; i>=0; i--) if (!s2[i]) s2[i] = 255; //else s2[i] = 1; |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
761 sws_scale(ctx,&s2,&ss,0,sh,&d2,&ds); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
762 for (i=ds*dh-1; i>=0; i--) if (d2[i]==0) d2[i] = 1; else if (d2[i]==255) d2[i] = 0; |
9494
543ab3909b78
sws_ prefix, more seperation between internal & external swscaler API
michael
parents:
9448
diff
changeset
|
763 sws_freeContext(ctx); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
764 } |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
765 |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
766 void spudec_draw_scaled(void *me, unsigned int dxs, unsigned int dys, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
767 { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
768 spudec_handle_t *spu = (spudec_handle_t *)me; |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
769 scale_pixel *table_x; |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
770 scale_pixel *table_y; |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
771 |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
772 if (spu->start_pts <= spu->now_pts && spu->now_pts < spu->end_pts) { |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
773 |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
774 // check if only forced subtitles are requested |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
775 if( (spu->forced_subs_only) && !(spu->is_forced_sub) ){ |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
776 return; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
777 } |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
778 |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
779 if (!(spu_aamode&16) && (spu->orig_frame_width == 0 || spu->orig_frame_height == 0 |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
780 || (spu->orig_frame_width == dxs && spu->orig_frame_height == dys))) { |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
781 if (spu->image) |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
782 { |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
783 draw_alpha(spu->start_col, spu->start_row, spu->width, spu->height, |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
784 spu->image, spu->aimage, spu->stride); |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
785 spu->spu_changed = 0; |
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
786 } |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
787 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
788 else { |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
789 if (spu->scaled_frame_width != dxs || spu->scaled_frame_height != dys) { /* Resizing is needed */ |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
790 /* scaled_x = scalex * x / 0x100 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
791 scaled_y = scaley * y / 0x100 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
792 order of operations is important because of rounding. */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
793 unsigned int scalex = 0x100 * dxs / spu->orig_frame_width; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
794 unsigned int scaley = 0x100 * dys / spu->orig_frame_height; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
795 spu->scaled_start_col = spu->start_col * scalex / 0x100; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
796 spu->scaled_start_row = spu->start_row * scaley / 0x100; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
797 spu->scaled_width = spu->width * scalex / 0x100; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
798 spu->scaled_height = spu->height * scaley / 0x100; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
799 /* Kludge: draw_alpha needs width multiple of 8 */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
800 spu->scaled_stride = (spu->scaled_width + 7) & ~7; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
801 if (spu->scaled_image_size < spu->scaled_stride * spu->scaled_height) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
802 if (spu->scaled_image) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
803 free(spu->scaled_image); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
804 spu->scaled_image_size = 0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
805 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
806 spu->scaled_image = malloc(2 * spu->scaled_stride * spu->scaled_height); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
807 if (spu->scaled_image) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
808 spu->scaled_image_size = spu->scaled_stride * spu->scaled_height; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
809 spu->scaled_aimage = spu->scaled_image + spu->scaled_image_size; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
810 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
811 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
812 if (spu->scaled_image) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
813 unsigned int x, y; |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
814 if (spu->scaled_width <= 1 || spu->scaled_height <= 1) { |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
815 goto nothing_to_do; |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
816 } |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
817 switch(spu_aamode&15) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
818 case 4: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
819 sws_spu_image(spu->scaled_image, spu->scaled_aimage, |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
820 spu->scaled_width, spu->scaled_height, spu->scaled_stride, |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
821 spu->image, spu->aimage, spu->width, spu->height, spu->stride); |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
822 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
823 case 3: |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
824 table_x = calloc(spu->scaled_width, sizeof(scale_pixel)); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
825 table_y = calloc(spu->scaled_height, sizeof(scale_pixel)); |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
826 if (!table_x || !table_y) { |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
827 mp_msg(MSGT_SPUDEC, MSGL_FATAL, "Fatal: spudec_draw_scaled: calloc failed\n"); |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
828 } |
6215
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
829 scale_table(0, 0, spu->width - 1, spu->scaled_width - 1, table_x); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
830 scale_table(0, 0, spu->height - 1, spu->scaled_height - 1, table_y); |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
831 for (y = 0; y < spu->scaled_height; y++) |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
832 for (x = 0; x < spu->scaled_width; x++) |
e435026183c3
spu/vobsub speedup patch, new all better bilinear scaler similiar to win vobsub ones. ptyh by Hephooey.
atmos4
parents:
6190
diff
changeset
|
833 scale_image(x, y, table_x, table_y, spu); |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
834 free(table_x); |
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
835 free(table_y); |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
836 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
837 case 0: |
4180
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
838 /* no antialiasing */ |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
839 for (y = 0; y < spu->scaled_height; ++y) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
840 int unscaled_y = y * 0x100 / scaley; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
841 int strides = spu->stride * unscaled_y; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
842 int scaled_strides = spu->scaled_stride * y; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
843 for (x = 0; x < spu->scaled_width; ++x) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
844 int unscaled_x = x * 0x100 / scalex; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
845 spu->scaled_image[scaled_strides + x] = spu->image[strides + unscaled_x]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
846 spu->scaled_aimage[scaled_strides + x] = spu->aimage[strides + unscaled_x]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
847 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
848 } |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
849 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
850 case 1: |
4180
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
851 { |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
852 /* Intermediate antialiasing. */ |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
853 for (y = 0; y < spu->scaled_height; ++y) { |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
854 const unsigned int unscaled_top = y * spu->orig_frame_height / dys; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
855 unsigned int unscaled_bottom = (y + 1) * spu->orig_frame_height / dys; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
856 if (unscaled_bottom >= spu->height) |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
857 unscaled_bottom = spu->height - 1; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
858 for (x = 0; x < spu->scaled_width; ++x) { |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
859 const unsigned int unscaled_left = x * spu->orig_frame_width / dxs; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
860 unsigned int unscaled_right = (x + 1) * spu->orig_frame_width / dxs; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
861 unsigned int color = 0; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
862 unsigned int alpha = 0; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
863 unsigned int walkx, walky; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
864 unsigned int base, tmp; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
865 if (unscaled_right >= spu->width) |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
866 unscaled_right = spu->width - 1; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
867 for (walky = unscaled_top; walky <= unscaled_bottom; ++walky) |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
868 for (walkx = unscaled_left; walkx <= unscaled_right; ++walkx) { |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
869 base = walky * spu->stride + walkx; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
870 tmp = canon_alpha(spu->aimage[base]); |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
871 alpha += tmp; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
872 color += tmp * spu->image[base]; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
873 } |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
874 base = y * spu->scaled_stride + x; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
875 spu->scaled_image[base] = alpha ? color / alpha : 0; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
876 spu->scaled_aimage[base] = |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
877 alpha * (1 + unscaled_bottom - unscaled_top) * (1 + unscaled_right - unscaled_left); |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
878 /* spu->scaled_aimage[base] = |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
879 alpha * dxs * dys / spu->orig_frame_width / spu->orig_frame_height; */ |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
880 if (spu->scaled_aimage[base]) { |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
881 spu->scaled_aimage[base] = 256 - spu->scaled_aimage[base]; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
882 if (spu->scaled_aimage[base] + spu->scaled_image[base] > 255) |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
883 spu->scaled_image[base] = 256 - spu->scaled_aimage[base]; |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
884 } |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
885 } |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
886 } |
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
887 } |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
888 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
889 case 2: |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
890 { |
4180
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
891 /* Best antialiasing. Very slow. */ |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
892 /* Any pixel (x, y) represents pixels from the original |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
893 rectangular region comprised between the columns |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
894 unscaled_y and unscaled_y + 0x100 / scaley and the rows |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
895 unscaled_x and unscaled_x + 0x100 / scalex |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
896 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
897 The original rectangular region that the scaled pixel |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
898 represents is cut in 9 rectangular areas like this: |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
899 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
900 +---+-----------------+---+ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
901 | 1 | 2 | 3 | |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
902 +---+-----------------+---+ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
903 | | | | |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
904 | 4 | 5 | 6 | |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
905 | | | | |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
906 +---+-----------------+---+ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
907 | 7 | 8 | 9 | |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
908 +---+-----------------+---+ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
909 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
910 The width of the left column is at most one pixel and |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
911 it is never null and its right column is at a pixel |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
912 boundary. The height of the top row is at most one |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
913 pixel it is never null and its bottom row is at a |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
914 pixel boundary. The width and height of region 5 are |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
915 integral values. The width of the right column is |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
916 what remains and is less than one pixel. The height |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
917 of the bottom row is what remains and is less than |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
918 one pixel. |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
919 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
920 The row above 1, 2, 3 is unscaled_y. The row between |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
921 1, 2, 3 and 4, 5, 6 is top_low_row. The row between 4, |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
922 5, 6 and 7, 8, 9 is (unsigned int)unscaled_y_bottom. |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
923 The row beneath 7, 8, 9 is unscaled_y_bottom. |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
924 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
925 The column left of 1, 4, 7 is unscaled_x. The column |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
926 between 1, 4, 7 and 2, 5, 8 is left_right_column. The |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
927 column between 2, 5, 8 and 3, 6, 9 is (unsigned |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
928 int)unscaled_x_right. The column right of 3, 6, 9 is |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
929 unscaled_x_right. */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
930 const double inv_scalex = (double) 0x100 / scalex; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
931 const double inv_scaley = (double) 0x100 / scaley; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
932 for (y = 0; y < spu->scaled_height; ++y) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
933 const double unscaled_y = y * inv_scaley; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
934 const double unscaled_y_bottom = unscaled_y + inv_scaley; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
935 const unsigned int top_low_row = MIN(unscaled_y_bottom, unscaled_y + 1.0); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
936 const double top = top_low_row - unscaled_y; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
937 const unsigned int height = unscaled_y_bottom > top_low_row |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
938 ? (unsigned int) unscaled_y_bottom - top_low_row |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
939 : 0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
940 const double bottom = unscaled_y_bottom > top_low_row |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
941 ? unscaled_y_bottom - floor(unscaled_y_bottom) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
942 : 0.0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
943 for (x = 0; x < spu->scaled_width; ++x) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
944 const double unscaled_x = x * inv_scalex; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
945 const double unscaled_x_right = unscaled_x + inv_scalex; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
946 const unsigned int left_right_column = MIN(unscaled_x_right, unscaled_x + 1.0); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
947 const double left = left_right_column - unscaled_x; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
948 const unsigned int width = unscaled_x_right > left_right_column |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
949 ? (unsigned int) unscaled_x_right - left_right_column |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
950 : 0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
951 const double right = unscaled_x_right > left_right_column |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
952 ? unscaled_x_right - floor(unscaled_x_right) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
953 : 0.0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
954 double color = 0.0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
955 double alpha = 0.0; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
956 double tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
957 unsigned int base; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
958 /* Now use these informations to compute a good alpha, |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
959 and lightness. The sum is on each of the 9 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
960 region's surface and alpha and lightness. |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
961 |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
962 transformed alpha = sum(surface * alpha) / sum(surface) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
963 transformed color = sum(surface * alpha * color) / sum(surface * alpha) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
964 */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
965 /* 1: top left part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
966 base = spu->stride * (unsigned int) unscaled_y; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
967 tmp = left * top * canon_alpha(spu->aimage[base + (unsigned int) unscaled_x]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
968 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
969 color += tmp * spu->image[base + (unsigned int) unscaled_x]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
970 /* 2: top center part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
971 if (width > 0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
972 unsigned int walkx; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
973 for (walkx = left_right_column; walkx < (unsigned int) unscaled_x_right; ++walkx) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
974 base = spu->stride * (unsigned int) unscaled_y + walkx; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
975 tmp = /* 1.0 * */ top * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
976 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
977 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
978 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
979 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
980 /* 3: top right part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
981 if (right > 0.0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
982 base = spu->stride * (unsigned int) unscaled_y + (unsigned int) unscaled_x_right; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
983 tmp = right * top * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
984 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
985 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
986 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
987 /* 4: center left part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
988 if (height > 0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
989 unsigned int walky; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
990 for (walky = top_low_row; walky < (unsigned int) unscaled_y_bottom; ++walky) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
991 base = spu->stride * walky + (unsigned int) unscaled_x; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
992 tmp = left /* * 1.0 */ * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
993 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
994 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
995 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
996 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
997 /* 5: center part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
998 if (width > 0 && height > 0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
999 unsigned int walky; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1000 for (walky = top_low_row; walky < (unsigned int) unscaled_y_bottom; ++walky) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1001 unsigned int walkx; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1002 base = spu->stride * walky; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1003 for (walkx = left_right_column; walkx < (unsigned int) unscaled_x_right; ++walkx) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1004 tmp = /* 1.0 * 1.0 * */ canon_alpha(spu->aimage[base + walkx]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1005 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1006 color += tmp * spu->image[base + walkx]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1007 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1008 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1009 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1010 /* 6: center right part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1011 if (right > 0.0 && height > 0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1012 unsigned int walky; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1013 for (walky = top_low_row; walky < (unsigned int) unscaled_y_bottom; ++walky) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1014 base = spu->stride * walky + (unsigned int) unscaled_x_right; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1015 tmp = right /* * 1.0 */ * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1016 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1017 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1018 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1019 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1020 /* 7: bottom left part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1021 if (bottom > 0.0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1022 base = spu->stride * (unsigned int) unscaled_y_bottom + (unsigned int) unscaled_x; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1023 tmp = left * bottom * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1024 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1025 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1026 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1027 /* 8: bottom center part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1028 if (width > 0 && bottom > 0.0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1029 unsigned int walkx; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1030 base = spu->stride * (unsigned int) unscaled_y_bottom; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1031 for (walkx = left_right_column; walkx < (unsigned int) unscaled_x_right; ++walkx) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1032 tmp = /* 1.0 * */ bottom * canon_alpha(spu->aimage[base + walkx]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1033 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1034 color += tmp * spu->image[base + walkx]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1035 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1036 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1037 /* 9: bottom right part */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1038 if (right > 0.0 && bottom > 0.0) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1039 base = spu->stride * (unsigned int) unscaled_y_bottom + (unsigned int) unscaled_x_right; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1040 tmp = right * bottom * canon_alpha(spu->aimage[base]); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1041 alpha += tmp; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1042 color += tmp * spu->image[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1043 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1044 /* Finally mix these transparency and brightness information suitably */ |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1045 base = spu->scaled_stride * y + x; |
4180
a70ded82ff77
Add a third scaling algorithm wich should be faster. Select by
kmkaplan
parents:
4122
diff
changeset
|
1046 spu->scaled_image[base] = alpha > 0 ? color / alpha : 0; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1047 spu->scaled_aimage[base] = alpha * scalex * scaley / 0x10000; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1048 if (spu->scaled_aimage[base]) { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1049 spu->scaled_aimage[base] = 256 - spu->scaled_aimage[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1050 if (spu->scaled_aimage[base] + spu->scaled_image[base] > 255) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1051 spu->scaled_image[base] = 256 - spu->scaled_aimage[base]; |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1052 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1053 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1054 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1055 } |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1056 } |
6225
75e8e1cf1f77
- hardened a bit the new bilinear algo (missing checks)
pl
parents:
6223
diff
changeset
|
1057 nothing_to_do: |
14432
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1058 /* Kludge: draw_alpha needs width multiple of 8. */ |
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1059 if (spu->scaled_width < spu->scaled_stride) |
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1060 for (y = 0; y < spu->scaled_height; ++y) { |
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1061 memset(spu->scaled_aimage + y * spu->scaled_stride + spu->scaled_width, 0, |
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1062 spu->scaled_stride - spu->scaled_width); |
275b2ce30af7
Fix black line on right of subtitle with -spuaa 4 by setting alpha of
reimar
parents:
13373
diff
changeset
|
1063 } |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
1064 spu->scaled_frame_width = dxs; |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
4810
diff
changeset
|
1065 spu->scaled_frame_height = dys; |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1066 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1067 } |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
1068 if (spu->scaled_image){ |
9077
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1069 switch (spu_alignment) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1070 case 0: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1071 spu->scaled_start_row = dys*sub_pos/100; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1072 if (spu->scaled_start_row + spu->scaled_height > dys) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1073 spu->scaled_start_row = dys - spu->scaled_height; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1074 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1075 case 1: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1076 spu->scaled_start_row = dys*sub_pos/100 - spu->scaled_height/2; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1077 if (sub_pos < 50) { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1078 if (spu->scaled_start_row < 0) spu->scaled_start_row = 0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1079 } else { |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1080 if (spu->scaled_start_row + spu->scaled_height > dys) |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1081 spu->scaled_start_row = dys - spu->scaled_height; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1082 } |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1083 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1084 case 2: |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1085 spu->scaled_start_row = dys*sub_pos/100 - spu->scaled_height; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1086 if (spu->scaled_start_row < 0) spu->scaled_start_row = 0; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1087 break; |
d430529c5b4b
Improvements to spudec (DVD/VobSub) subtitle code:
rfelker
parents:
8843
diff
changeset
|
1088 } |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1089 draw_alpha(spu->scaled_start_col, spu->scaled_start_row, spu->scaled_width, spu->scaled_height, |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1090 spu->scaled_image, spu->scaled_aimage, spu->scaled_stride); |
6778
f33d4ab7a6b2
Make spudec_assemble more resistent in the face of incomplete packets.
kmkaplan
parents:
6459
diff
changeset
|
1091 spu->spu_changed = 0; |
6190
bd6748605681
Bounding box and partial update patch for vob/dvdsub by Hephooey.
atmos4
parents:
6110
diff
changeset
|
1092 } |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1093 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1094 } |
5474
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1095 else |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1096 { |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1097 mp_msg(MSGT_SPUDEC,MSGL_DBG2,"SPU not displayed: start_pts=%d end_pts=%d now_pts=%d\n", |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1098 spu->start_pts, spu->end_pts, spu->now_pts); |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1099 } |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1100 } |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1101 |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1102 void spudec_update_palette(void * this, unsigned int *palette) |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1103 { |
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1104 spudec_handle_t *spu = (spudec_handle_t *) this; |
6110 | 1105 if (spu && palette) { |
5474
a303ae797429
spudec_update_palette() added - dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5388
diff
changeset
|
1106 memcpy(spu->global_palette, palette, sizeof(spu->global_palette)); |
6110 | 1107 if(spu->hw_spu) |
1108 spu->hw_spu->control(VOCTRL_SET_SPU_PALETTE,spu->global_palette); | |
1109 } | |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1110 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1111 |
6110 | 1112 void spudec_set_font_factor(void * this, double factor) |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1113 { |
6110 | 1114 spudec_handle_t *spu = (spudec_handle_t *) this; |
1115 spu->font_start_level = (int)(0xF0-(0xE0*factor)); | |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1116 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1117 |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1118 void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height) |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1119 { |
6938 | 1120 return spudec_new_scaled_vobsub(palette, NULL, 0, frame_width, frame_height); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1121 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1122 |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1123 /* get palette custom color, width, height from .idx file */ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1124 void *spudec_new_scaled_vobsub(unsigned int *palette, unsigned int *cuspal, unsigned int custom, unsigned int frame_width, unsigned int frame_height) |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1125 { |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1126 spudec_handle_t *this = calloc(1, sizeof(spudec_handle_t)); |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1127 if (this){ |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1128 //(fprintf(stderr,"VobSub Custom Palette: %d,%d,%d,%d", this->cuspal[0], this->cuspal[1], this->cuspal[2],this->cuspal[3]); |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
1129 this->packet = NULL; |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1130 this->image = NULL; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1131 this->scaled_image = NULL; |
6938 | 1132 /* XXX Although the video frame is some size, the SPU frame is |
1133 always maximum size i.e. 720 wide and 576 or 480 high */ | |
1134 this->orig_frame_width = 720; | |
1135 this->orig_frame_height = (frame_height == 480 || frame_height == 240) ? 480 : 576; | |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1136 this->custom = custom; |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1137 // set up palette: |
6110 | 1138 this->auto_palette = 1; |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1139 if (palette){ |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1140 memcpy(this->global_palette, palette, sizeof(this->global_palette)); |
6110 | 1141 this->auto_palette = 0; |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1142 } |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1143 this->custom = custom; |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1144 if (custom && cuspal) { |
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1145 memcpy(this->cuspal, cuspal, sizeof(this->cuspal)); |
6110 | 1146 this->auto_palette = 0; |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1147 } |
10917
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
1148 // forced subtitles default: show all subtitles |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
1149 this->forced_subs_only=0; |
d45870f67728
Forced subtitles patch by Arne Driescher <driescher@mpi-magdeburg.mpg.de>
attila
parents:
9494
diff
changeset
|
1150 this->is_forced_sub=0; |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1151 } |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1152 else |
6110 | 1153 mp_msg(MSGT_SPUDEC,MSGL_FATAL, "FATAL: spudec_init: calloc"); |
5833
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1154 return this; |
91d766389a5d
VobSub updates, custom palette support and other stuff, can't write the name of the chinese(?) patch supplier.
atmos4
parents:
5638
diff
changeset
|
1155 } |
5908
31159f453cf9
guessing palette - patch by salvador <salvador@inti.gov.ar>
arpi
parents:
5833
diff
changeset
|
1156 |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1157 void *spudec_new(unsigned int *palette) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1158 { |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1159 return spudec_new_scaled(palette, 0, 0); |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1160 } |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1161 |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1162 void spudec_free(void *this) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1163 { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1164 spudec_handle_t *spu = (spudec_handle_t*)this; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1165 if (spu) { |
9448
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
1166 while (spu->queue_head) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
1167 spudec_free_packet(spudec_dequeue_packet(spu)); |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
1168 if (spu->packet) |
5b130e0682a8
Improved subtitle queueing, parameters (start_pts, end_pts, palette, alpha)
ranma
parents:
9442
diff
changeset
|
1169 free(spu->packet); |
4078
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1170 if (spu->scaled_image) |
a8e7238bb7b4
Add spudec_new_scaled and spudec_draw_scaled for vobsub support.
kmkaplan
parents:
3842
diff
changeset
|
1171 free(spu->scaled_image); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1172 if (spu->image) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1173 free(spu->image); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1174 free(spu); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1175 } |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
673
diff
changeset
|
1176 } |
6110 | 1177 |
1178 void spudec_set_hw_spu(void *this, vo_functions_t *hw_spu) | |
1179 { | |
1180 spudec_handle_t *spu = (spudec_handle_t*)this; | |
1181 if (!spu) | |
1182 return; | |
1183 spu->hw_spu = hw_spu; | |
1184 hw_spu->control(VOCTRL_SET_SPU_PALETTE,spu->global_palette); | |
1185 } |