annotate dvdsubdec.c @ 5876:731ee5ad6bde libavcodec

Correct assignment of interlaced_frame; was being set on output frames, in display order, based on decoding information in decoding order. Now set properly, immediately upon completion of decode. Based on original patch from Reinhard Nissl, rnisssl % gmx , de Original Thread: [FFmpeg-devel] H.264 + PAFF: BBC HD recording shows extreme interlacing artefacts, Thu, 01 Nov 2007 22:43:09
author heydowns
date Mon, 05 Nov 2007 18:16:42 +0000
parents 392483301260
children d030978bcd93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
1 /*
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
2 * DVD subtitle decoding for ffmpeg
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
3 * Copyright (c) 2005 Fabrice Bellard.
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
4 *
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
6 *
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
11 *
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
16 *
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
20 */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
21 #include "avcodec.h"
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
22 #include "bitstream.h"
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
23 #include "colorspace.h"
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
24 #include "dsputil.h"
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
25
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
26 //#define DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
27
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
28 static void yuv_a_to_rgba(const uint8_t *ycbcr, const uint8_t *alpha, uint32_t *rgba, int num_values)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
29 {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
30 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
31 uint8_t r, g, b;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
32 int i, y, cb, cr;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
33 int r_add, g_add, b_add;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
34
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
35 for (i = num_values; i > 0; i--) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
36 y = *ycbcr++;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
37 cb = *ycbcr++;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
38 cr = *ycbcr++;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
39 YUV_TO_RGB1_CCIR(cb, cr);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
40 YUV_TO_RGB2_CCIR(r, g, b, y);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
41 *rgba++ = (*alpha++ << 24) | (r << 16) | (g << 8) | b;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
42 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
43 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
44
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
45 static int dvdsub_init_decoder(AVCodecContext *avctx)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
46 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
47 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
48 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
49
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
50 static int decode_run_2bit(GetBitContext *gb, int *color)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
51 {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
52 unsigned int v, t;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
53
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
54 v = 0;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
55 for (t = 1; v < t && t <= 0x40; t <<= 2)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
56 v = (v << 4) | get_bits(gb, 4);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
57 *color = v & 3;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
58 if (v < 4) { /* Code for fill rest of line */
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
59 return INT_MAX;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
60 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
61 return v >> 2;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
62 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
63
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
64 static int decode_run_8bit(GetBitContext *gb, int *color)
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
65 {
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
66 int len;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
67 int has_run = get_bits1(gb);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
68 if (get_bits1(gb))
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
69 *color = get_bits(gb, 8);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
70 else
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
71 *color = get_bits(gb, 2);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
72 if (has_run) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
73 if (get_bits1(gb)) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
74 len = get_bits(gb, 7);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
75 if (len == 0)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
76 len = INT_MAX;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
77 else
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
78 len += 9;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
79 } else
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
80 len = get_bits(gb, 3) + 2;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
81 } else
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
82 len = 1;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
83 return len;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
84 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
85
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
86 static int decode_rle(uint8_t *bitmap, int linesize, int w, int h,
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
87 const uint8_t *buf, int start, int buf_size, int is_8bit)
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
88 {
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
89 GetBitContext gb;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
90 int bit_len;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
91 int x, y, len, color;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
92 uint8_t *d;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
93
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
94 bit_len = (buf_size - start) * 8;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
95 init_get_bits(&gb, buf + start, bit_len);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
96
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
97 x = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
98 y = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
99 d = bitmap;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
100 for(;;) {
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
101 if (get_bits_count(&gb) > bit_len)
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
102 return -1;
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
103 if (is_8bit)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
104 len = decode_run_8bit(&gb, &color);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
105 else
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
106 len = decode_run_2bit(&gb, &color);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
107 len = FFMIN(len, w - x);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
108 memset(d + x, color, len);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
109 x += len;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
110 if (x >= w) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
111 y++;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
112 if (y >= h)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
113 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
114 d += linesize;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
115 x = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
116 /* byte align */
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
117 align_get_bits(&gb);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
118 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
119 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
120 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
121 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
122
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
123 static void guess_palette(uint32_t *rgba_palette,
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
124 uint8_t *colormap,
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
125 uint8_t *alpha,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
126 uint32_t subtitle_color)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
127 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
128 uint8_t color_used[16];
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
129 int nb_opaque_colors, i, level, j, r, g, b;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
130
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
131 for(i = 0; i < 4; i++)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
132 rgba_palette[i] = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
133
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
134 memset(color_used, 0, 16);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
135 nb_opaque_colors = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
136 for(i = 0; i < 4; i++) {
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
137 if (alpha[i] != 0 && !color_used[colormap[i]]) {
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
138 color_used[colormap[i]] = 1;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
139 nb_opaque_colors++;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
140 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
141 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
142
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
143 if (nb_opaque_colors == 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
144 return;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
145
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
146 j = nb_opaque_colors;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
147 memset(color_used, 0, 16);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
148 for(i = 0; i < 4; i++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
149 if (alpha[i] != 0) {
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
150 if (!color_used[colormap[i]]) {
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
151 level = (0xff * j) / nb_opaque_colors;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
152 r = (((subtitle_color >> 16) & 0xff) * level) >> 8;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
153 g = (((subtitle_color >> 8) & 0xff) * level) >> 8;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
154 b = (((subtitle_color >> 0) & 0xff) * level) >> 8;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
155 rgba_palette[i] = b | (g << 8) | (r << 16) | ((alpha[i] * 17) << 24);
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
156 color_used[colormap[i]] = (i + 1);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
157 j--;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
158 } else {
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
159 rgba_palette[i] = (rgba_palette[color_used[colormap[i]] - 1] & 0x00ffffff) |
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
160 ((alpha[i] * 17) << 24);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
161 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
162 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
163 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
164 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
165
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
166 #define READ_OFFSET(a) (big_offsets ? AV_RB32(a) : AV_RB16(a))
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
167
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
168 static int decode_dvd_subtitles(AVSubtitle *sub_header,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
169 const uint8_t *buf, int buf_size)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
170 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
171 int cmd_pos, pos, cmd, x1, y1, x2, y2, offset1, offset2, next_cmd_pos;
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
172 int big_offsets, offset_size, is_8bit = 0;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
173 const uint8_t *yuv_palette = 0;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
174 uint8_t colormap[4], alpha[256];
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
175 int date;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
176 int i;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
177 int is_menu = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
178
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
179 if (buf_size < 10)
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
180 return -1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
181 sub_header->rects = NULL;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
182 sub_header->num_rects = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
183 sub_header->start_display_time = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
184 sub_header->end_display_time = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
185
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
186 if (AV_RB16(buf) == 0) { /* HD subpicture with 4-byte offsets */
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
187 big_offsets = 1;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
188 offset_size = 4;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
189 cmd_pos = 6;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
190 } else {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
191 big_offsets = 0;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
192 offset_size = 2;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
193 cmd_pos = 2;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
194 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
195
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
196 cmd_pos = READ_OFFSET(buf + cmd_pos);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
197
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
198 while ((cmd_pos + 2 + offset_size) < buf_size) {
4438
fe3179006730 Remove the getbe16 functions and use the AV_RB16 macro instead. Patch by Ian
takis
parents: 4437
diff changeset
199 date = AV_RB16(buf + cmd_pos);
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
200 next_cmd_pos = READ_OFFSET(buf + cmd_pos + 2);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
201 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
202 av_log(NULL, AV_LOG_INFO, "cmd_pos=0x%04x next=0x%04x date=%d\n",
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
203 cmd_pos, next_cmd_pos, date);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
204 #endif
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
205 pos = cmd_pos + 2 + offset_size;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
206 offset1 = -1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
207 offset2 = -1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
208 x1 = y1 = x2 = y2 = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
209 while (pos < buf_size) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
210 cmd = buf[pos++];
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
211 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
212 av_log(NULL, AV_LOG_INFO, "cmd=%02x\n", cmd);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
213 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
214 switch(cmd) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
215 case 0x00:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
216 /* menu subpicture */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
217 is_menu = 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
218 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
219 case 0x01:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
220 /* set start date */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
221 sub_header->start_display_time = (date << 10) / 90;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
222 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
223 case 0x02:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
224 /* set end date */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
225 sub_header->end_display_time = (date << 10) / 90;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
226 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
227 case 0x03:
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
228 /* set colormap */
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
229 if ((buf_size - pos) < 2)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
230 goto fail;
5396
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
231 colormap[3] = buf[pos] >> 4;
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
232 colormap[2] = buf[pos] & 0x0f;
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
233 colormap[1] = buf[pos + 1] >> 4;
9f0f022ca8e7 Rename "palette" to "colormap" when it's referring to the mapping from a 2-bit
takis
parents: 4924
diff changeset
234 colormap[0] = buf[pos + 1] & 0x0f;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
235 pos += 2;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
236 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
237 case 0x04:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
238 /* set alpha */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
239 if ((buf_size - pos) < 2)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
240 goto fail;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
241 alpha[3] = buf[pos] >> 4;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
242 alpha[2] = buf[pos] & 0x0f;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
243 alpha[1] = buf[pos + 1] >> 4;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
244 alpha[0] = buf[pos + 1] & 0x0f;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
245 pos += 2;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
246 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
247 av_log(NULL, AV_LOG_INFO, "alpha=%x%x%x%x\n", alpha[0],alpha[1],alpha[2],alpha[3]);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
248 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
249 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
250 case 0x05:
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
251 case 0x85:
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
252 if ((buf_size - pos) < 6)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
253 goto fail;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
254 x1 = (buf[pos] << 4) | (buf[pos + 1] >> 4);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
255 x2 = ((buf[pos + 1] & 0x0f) << 8) | buf[pos + 2];
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
256 y1 = (buf[pos + 3] << 4) | (buf[pos + 4] >> 4);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
257 y2 = ((buf[pos + 4] & 0x0f) << 8) | buf[pos + 5];
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
258 if (cmd & 0x80)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
259 is_8bit = 1;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
260 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
261 av_log(NULL, AV_LOG_INFO, "x1=%d x2=%d y1=%d y2=%d\n",
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
262 x1, x2, y1, y2);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
263 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
264 pos += 6;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
265 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
266 case 0x06:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
267 if ((buf_size - pos) < 4)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
268 goto fail;
4438
fe3179006730 Remove the getbe16 functions and use the AV_RB16 macro instead. Patch by Ian
takis
parents: 4437
diff changeset
269 offset1 = AV_RB16(buf + pos);
fe3179006730 Remove the getbe16 functions and use the AV_RB16 macro instead. Patch by Ian
takis
parents: 4437
diff changeset
270 offset2 = AV_RB16(buf + pos + 2);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
271 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
272 av_log(NULL, AV_LOG_INFO, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
273 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
274 pos += 4;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
275 break;
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
276 case 0x86:
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
277 if ((buf_size - pos) < 8)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
278 goto fail;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
279 offset1 = AV_RB32(buf + pos);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
280 offset2 = AV_RB32(buf + pos + 4);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
281 #ifdef DEBUG
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
282 av_log(NULL, AV_LOG_INFO, "offset1=0x%04x offset2=0x%04x\n", offset1, offset2);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
283 #endif
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
284 pos += 8;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
285 break;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
286
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
287 case 0x83:
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
288 /* HD set palette */
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
289 if ((buf_size - pos) < 768)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
290 goto fail;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
291 yuv_palette = buf + pos;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
292 pos += 768;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
293 break;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
294 case 0x84:
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
295 /* HD set contrast (alpha) */
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
296 if ((buf_size - pos) < 256)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
297 goto fail;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
298 for (i = 0; i < 256; i++)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
299 alpha[i] = 0xFF - buf[pos+i];
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
300 pos += 256;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
301 break;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
302
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
303 case 0xff:
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
304 goto the_end;
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
305 default:
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
306 #ifdef DEBUG
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
307 av_log(NULL, AV_LOG_INFO, "unrecognised subpicture command 0x%x\n", cmd);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
308 #endif
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
309 goto the_end;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
310 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
311 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
312 the_end:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
313 if (offset1 >= 0) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
314 int w, h;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
315 uint8_t *bitmap;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
316
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
317 /* decode the bitmap */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
318 w = x2 - x1 + 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
319 if (w < 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
320 w = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
321 h = y2 - y1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
322 if (h < 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
323 h = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
324 if (w > 0 && h > 0) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
325 if (sub_header->rects != NULL) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
326 for (i = 0; i < sub_header->num_rects; i++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
327 av_free(sub_header->rects[i].bitmap);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
328 av_free(sub_header->rects[i].rgba_palette);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
329 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
330 av_freep(&sub_header->rects);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
331 sub_header->num_rects = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
332 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
333
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
334 bitmap = av_malloc(w * h);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
335 sub_header->rects = av_mallocz(sizeof(AVSubtitleRect));
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
336 sub_header->num_rects = 1;
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
337 sub_header->rects[0].bitmap = bitmap;
4437
42ad7d63fb5d Fix a bug in the DVD subtitle decoder where subtitles with odd heights would not
takis
parents: 4091
diff changeset
338 decode_rle(bitmap, w * 2, w, (h + 1) / 2,
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
339 buf, offset1, buf_size, is_8bit);
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
340 decode_rle(bitmap + w, w * 2, w, h / 2,
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
341 buf, offset2, buf_size, is_8bit);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
342 if (is_8bit) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
343 if (yuv_palette == 0)
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
344 goto fail;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
345 sub_header->rects[0].rgba_palette = av_malloc(256 * 4);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
346 sub_header->rects[0].nb_colors = 256;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
347 yuv_a_to_rgba(yuv_palette, alpha, sub_header->rects[0].rgba_palette, 256);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
348 } else {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
349 sub_header->rects[0].rgba_palette = av_malloc(4 * 4);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
350 sub_header->rects[0].nb_colors = 4;
5398
392483301260 Reindent two lines.
takis
parents: 5397
diff changeset
351 guess_palette(sub_header->rects[0].rgba_palette,
392483301260 Reindent two lines.
takis
parents: 5397
diff changeset
352 colormap, alpha, 0xffff00);
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
353 }
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
354 sub_header->rects[0].x = x1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
355 sub_header->rects[0].y = y1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
356 sub_header->rects[0].w = w;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
357 sub_header->rects[0].h = h;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
358 sub_header->rects[0].linesize = w;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
359 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
360 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
361 if (next_cmd_pos == cmd_pos)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
362 break;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
363 cmd_pos = next_cmd_pos;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
364 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
365 if (sub_header->num_rects > 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
366 return is_menu;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
367 fail:
5397
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
368 if (sub_header->rects != NULL) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
369 for (i = 0; i < sub_header->num_rects; i++) {
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
370 av_free(sub_header->rects[i].bitmap);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
371 av_free(sub_header->rects[i].rgba_palette);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
372 }
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
373 av_freep(&sub_header->rects);
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
374 sub_header->num_rects = 0;
31f367bf1a99 Add HD-DVD subpicture decoding.
takis
parents: 5396
diff changeset
375 }
4091
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
376 return -1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
377 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
378
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
379 static int is_transp(const uint8_t *buf, int pitch, int n,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
380 const uint8_t *transp_color)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
381 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
382 int i;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
383 for(i = 0; i < n; i++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
384 if (!transp_color[*buf])
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
385 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
386 buf += pitch;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
387 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
388 return 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
389 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
390
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
391 /* return 0 if empty rectangle, 1 if non empty */
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
392 static int find_smallest_bounding_rectangle(AVSubtitle *s)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
393 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
394 uint8_t transp_color[256];
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
395 int y1, y2, x1, x2, y, w, h, i;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
396 uint8_t *bitmap;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
397
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
398 if (s->num_rects == 0 || s->rects == NULL || s->rects[0].w <= 0 || s->rects[0].h <= 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
399 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
400
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
401 memset(transp_color, 0, 256);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
402 for(i = 0; i < s->rects[0].nb_colors; i++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
403 if ((s->rects[0].rgba_palette[i] >> 24) == 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
404 transp_color[i] = 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
405 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
406 y1 = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
407 while (y1 < s->rects[0].h && is_transp(s->rects[0].bitmap + y1 * s->rects[0].linesize,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
408 1, s->rects[0].w, transp_color))
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
409 y1++;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
410 if (y1 == s->rects[0].h) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
411 av_freep(&s->rects[0].bitmap);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
412 s->rects[0].w = s->rects[0].h = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
413 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
414 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
415
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
416 y2 = s->rects[0].h - 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
417 while (y2 > 0 && is_transp(s->rects[0].bitmap + y2 * s->rects[0].linesize, 1,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
418 s->rects[0].w, transp_color))
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
419 y2--;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
420 x1 = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
421 while (x1 < (s->rects[0].w - 1) && is_transp(s->rects[0].bitmap + x1, s->rects[0].linesize,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
422 s->rects[0].h, transp_color))
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
423 x1++;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
424 x2 = s->rects[0].w - 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
425 while (x2 > 0 && is_transp(s->rects[0].bitmap + x2, s->rects[0].linesize, s->rects[0].h,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
426 transp_color))
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
427 x2--;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
428 w = x2 - x1 + 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
429 h = y2 - y1 + 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
430 bitmap = av_malloc(w * h);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
431 if (!bitmap)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
432 return 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
433 for(y = 0; y < h; y++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
434 memcpy(bitmap + w * y, s->rects[0].bitmap + x1 + (y1 + y) * s->rects[0].linesize, w);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
435 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
436 av_freep(&s->rects[0].bitmap);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
437 s->rects[0].bitmap = bitmap;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
438 s->rects[0].linesize = w;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
439 s->rects[0].w = w;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
440 s->rects[0].h = h;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
441 s->rects[0].x += x1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
442 s->rects[0].y += y1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
443 return 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
444 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
445
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
446 static int dvdsub_close_decoder(AVCodecContext *avctx)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
447 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
448 return 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
449 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
450
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
451 #ifdef DEBUG
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
452 #undef fprintf
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
453 static void ppm_save(const char *filename, uint8_t *bitmap, int w, int h,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
454 uint32_t *rgba_palette)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
455 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
456 int x, y, v;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
457 FILE *f;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
458
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
459 f = fopen(filename, "w");
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
460 if (!f) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
461 perror(filename);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
462 exit(1);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
463 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
464 fprintf(f, "P6\n"
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
465 "%d %d\n"
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
466 "%d\n",
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
467 w, h, 255);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
468 for(y = 0; y < h; y++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
469 for(x = 0; x < w; x++) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
470 v = rgba_palette[bitmap[y * w + x]];
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
471 putc((v >> 16) & 0xff, f);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
472 putc((v >> 8) & 0xff, f);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
473 putc((v >> 0) & 0xff, f);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
474 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
475 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
476 fclose(f);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
477 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
478 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
479
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
480 static int dvdsub_decode(AVCodecContext *avctx,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
481 void *data, int *data_size,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
482 uint8_t *buf, int buf_size)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
483 {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
484 AVSubtitle *sub = (void *)data;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
485 int is_menu;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
486
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
487 is_menu = decode_dvd_subtitles(sub, buf, buf_size);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
488
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
489 if (is_menu < 0) {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
490 no_subtitle:
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
491 *data_size = 0;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
492
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
493 return buf_size;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
494 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
495 if (!is_menu && find_smallest_bounding_rectangle(sub) == 0)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
496 goto no_subtitle;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
497
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
498 #if defined(DEBUG)
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
499 av_log(NULL, AV_LOG_INFO, "start=%d ms end =%d ms\n",
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
500 sub->start_display_time,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
501 sub->end_display_time);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
502 ppm_save("/tmp/a.ppm", sub->rects[0].bitmap,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
503 sub->rects[0].w, sub->rects[0].h, sub->rects[0].rgba_palette);
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
504 #endif
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
505
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
506 *data_size = 1;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
507 return buf_size;
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
508 }
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
509
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
510 AVCodec dvdsub_decoder = {
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
511 "dvdsub",
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
512 CODEC_TYPE_SUBTITLE,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
513 CODEC_ID_DVD_SUBTITLE,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
514 0,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
515 dvdsub_init_decoder,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
516 NULL,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
517 dvdsub_close_decoder,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
518 dvdsub_decode,
3c00eb82db0d Rename dvdsub.c to dvdsubdec.c.
diego
parents:
diff changeset
519 };