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