annotate dvbsub.c @ 5312:2c875e6274d5 libavcodec

AC-3 decoder, soc revision 52, Aug 16 22:45:07 2006 UTC by cloud9 Reset the blksw and dithflag to 0 at the begining of each block. Otherwise blockswitching propagates over multiple frames even if block switching is not enabled for that frame. Also reuse rematflg.
author jbr
date Sat, 14 Jul 2007 15:59:25 +0000
parents 6166fbf375cc
children dfa6e7fa2bac
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
1 /*
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
2 * DVB subtitle encoding for ffmpeg
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
3 * Copyright (c) 2005 Fabrice Bellard.
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
16 *
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
20 */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
21 #include "avcodec.h"
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
22 #include "bytestream.h"
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
23
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
24 typedef struct DVBSubtitleContext {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
25 int hide_state;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
26 int object_version;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
27 } DVBSubtitleContext;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
28
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
29 #define PUTBITS2(val)\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
30 {\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
31 bitbuf |= (val) << bitcnt;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
32 bitcnt -= 2;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
33 if (bitcnt < 0) {\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
34 bitcnt = 6;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
35 *q++ = bitbuf;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
36 bitbuf = 0;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
37 }\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
38 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
39
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
40 static void dvb_encode_rle2(uint8_t **pq,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
41 const uint8_t *bitmap, int linesize,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
42 int w, int h)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
43 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
44 uint8_t *q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
45 unsigned int bitbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
46 int bitcnt;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
47 int x, y, len, x1, v, color;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
48
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
49 q = *pq;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
50
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
51 for(y = 0; y < h; y++) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
52 *q++ = 0x10;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
53 bitbuf = 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
54 bitcnt = 6;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
55
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
56 x = 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
57 while (x < w) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
58 x1 = x;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
59 color = bitmap[x1++];
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
60 while (x1 < w && bitmap[x1] == color)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
61 x1++;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
62 len = x1 - x;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
63 if (color == 0 && len == 2) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
64 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
65 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
66 PUTBITS2(1);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
67 } else if (len >= 3 && len <= 10) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
68 v = len - 3;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
69 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
70 PUTBITS2((v >> 2) | 2);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
71 PUTBITS2(v & 3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
72 PUTBITS2(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
73 } else if (len >= 12 && len <= 27) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
74 v = len - 12;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
75 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
76 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
77 PUTBITS2(2);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
78 PUTBITS2(v >> 2);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
79 PUTBITS2(v & 3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
80 PUTBITS2(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
81 } else if (len >= 29) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
82 /* length = 29 ... 284 */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
83 if (len > 284)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
84 len = 284;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
85 v = len - 29;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
86 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
87 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
88 PUTBITS2(3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
89 PUTBITS2((v >> 6));
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
90 PUTBITS2((v >> 4) & 3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
91 PUTBITS2((v >> 2) & 3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
92 PUTBITS2(v & 3);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
93 PUTBITS2(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
94 } else {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
95 PUTBITS2(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
96 if (color == 0) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
97 PUTBITS2(1);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
98 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
99 len = 1;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
100 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
101 x += len;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
102 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
103 /* end of line */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
104 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
105 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
106 PUTBITS2(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
107 if (bitcnt != 6) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
108 *q++ = bitbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
109 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
110 *q++ = 0xf0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
111 bitmap += linesize;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
112 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
113 *pq = q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
114 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
115
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
116 #define PUTBITS4(val)\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
117 {\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
118 bitbuf |= (val) << bitcnt;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
119 bitcnt -= 4;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
120 if (bitcnt < 0) {\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
121 bitcnt = 4;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
122 *q++ = bitbuf;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
123 bitbuf = 0;\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
124 }\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
125 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
126
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
127 /* some DVB decoders only implement 4 bits/pixel */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
128 static void dvb_encode_rle4(uint8_t **pq,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
129 const uint8_t *bitmap, int linesize,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
130 int w, int h)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
131 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
132 uint8_t *q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
133 unsigned int bitbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
134 int bitcnt;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
135 int x, y, len, x1, v, color;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
136
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
137 q = *pq;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
138
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
139 for(y = 0; y < h; y++) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
140 *q++ = 0x11;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
141 bitbuf = 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
142 bitcnt = 4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
143
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
144 x = 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
145 while (x < w) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
146 x1 = x;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
147 color = bitmap[x1++];
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
148 while (x1 < w && bitmap[x1] == color)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
149 x1++;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
150 len = x1 - x;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
151 if (color == 0 && len == 2) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
152 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
153 PUTBITS4(0xd);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
154 } else if (color == 0 && (len >= 3 && len <= 9)) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
155 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
156 PUTBITS4(len - 2);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
157 } else if (len >= 4 && len <= 7) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
158 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
159 PUTBITS4(8 + len - 4);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
160 PUTBITS4(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
161 } else if (len >= 9 && len <= 24) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
162 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
163 PUTBITS4(0xe);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
164 PUTBITS4(len - 9);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
165 PUTBITS4(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
166 } else if (len >= 25) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
167 if (len > 280)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
168 len = 280;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
169 v = len - 25;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
170 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
171 PUTBITS4(0xf);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
172 PUTBITS4(v >> 4);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
173 PUTBITS4(v & 0xf);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
174 PUTBITS4(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
175 } else {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
176 PUTBITS4(color);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
177 if (color == 0) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
178 PUTBITS4(0xc);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
179 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
180 len = 1;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
181 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
182 x += len;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
183 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
184 /* end of line */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
185 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
186 PUTBITS4(0);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
187 if (bitcnt != 4) {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
188 *q++ = bitbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
189 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
190 *q++ = 0xf0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
191 bitmap += linesize;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
192 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
193 *pq = q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
194 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
195
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
196 #define SCALEBITS 10
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
197 #define ONE_HALF (1 << (SCALEBITS - 1))
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
198 #define FIX(x) ((int) ((x) * (1<<SCALEBITS) + 0.5))
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
199
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
200 #define RGB_TO_Y_CCIR(r, g, b) \
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
201 ((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + \
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
202 FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
203
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
204 #define RGB_TO_U_CCIR(r1, g1, b1, shift)\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
205 (((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 + \
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
206 FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
207
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
208 #define RGB_TO_V_CCIR(r1, g1, b1, shift)\
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
209 (((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 - \
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
210 FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
211
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
212 static int encode_dvb_subtitles(DVBSubtitleContext *s,
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
213 uint8_t *outbuf, AVSubtitle *h)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
214 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
215 uint8_t *q, *pseg_len;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
216 int page_id, region_id, clut_id, object_id, i, bpp_index, page_state;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
217
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
218
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
219 q = outbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
220
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
221 page_id = 1;
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
222
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
223 if (h->num_rects == 0 || h->rects == NULL)
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
224 return -1;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
225
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
226 *q++ = 0x00; /* subtitle_stream_id */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
227
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
228 /* page composition segment */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
229
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
230 *q++ = 0x0f; /* sync_byte */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
231 *q++ = 0x10; /* segment_type */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
232 bytestream_put_be16(&q, page_id);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
233 pseg_len = q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
234 q += 2; /* segment length */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
235 *q++ = 30; /* page_timeout (seconds) */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
236 if (s->hide_state)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
237 page_state = 0; /* normal case */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
238 else
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
239 page_state = 2; /* mode change */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
240 /* page_version = 0 + page_state */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
241 *q++ = s->object_version | (page_state << 2) | 3;
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
242
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
243 for (region_id = 0; region_id < h->num_rects; region_id++) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
244 *q++ = region_id;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
245 *q++ = 0xff; /* reserved */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
246 bytestream_put_be16(&q, h->rects[region_id].x); /* left pos */
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
247 bytestream_put_be16(&q, h->rects[region_id].y); /* top pos */
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
248 }
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
249
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
250 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
251
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
252 if (!s->hide_state) {
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
253 for (clut_id = 0; clut_id < h->num_rects; clut_id++) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
254
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
255 /* CLUT segment */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
256
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
257 if (h->rects[clut_id].nb_colors <= 4) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
258 /* 2 bpp, some decoders do not support it correctly */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
259 bpp_index = 0;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
260 } else if (h->rects[clut_id].nb_colors <= 16) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
261 /* 4 bpp, standard encoding */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
262 bpp_index = 1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
263 } else {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
264 return -1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
265 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
266
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
267 *q++ = 0x0f; /* sync byte */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
268 *q++ = 0x12; /* CLUT definition segment */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
269 bytestream_put_be16(&q, page_id);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
270 pseg_len = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
271 q += 2; /* segment length */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
272 *q++ = clut_id;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
273 *q++ = (0 << 4) | 0xf; /* version = 0 */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
274
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
275 for(i = 0; i < h->rects[clut_id].nb_colors; i++) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
276 *q++ = i; /* clut_entry_id */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
277 *q++ = (1 << (7 - bpp_index)) | (0xf << 1) | 1; /* 2 bits/pixel full range */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
278 {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
279 int a, r, g, b;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
280 a = (h->rects[clut_id].rgba_palette[i] >> 24) & 0xff;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
281 r = (h->rects[clut_id].rgba_palette[i] >> 16) & 0xff;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
282 g = (h->rects[clut_id].rgba_palette[i] >> 8) & 0xff;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
283 b = (h->rects[clut_id].rgba_palette[i] >> 0) & 0xff;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
284
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
285 *q++ = RGB_TO_Y_CCIR(r, g, b);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
286 *q++ = RGB_TO_V_CCIR(r, g, b, 0);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
287 *q++ = RGB_TO_U_CCIR(r, g, b, 0);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
288 *q++ = 255 - a;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
289 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
290 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
291
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
292 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
293 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
294 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
295
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
296 for (region_id = 0; region_id < h->num_rects; region_id++) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
297
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
298 /* region composition segment */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
299
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
300 if (h->rects[region_id].nb_colors <= 4) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
301 /* 2 bpp, some decoders do not support it correctly */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
302 bpp_index = 0;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
303 } else if (h->rects[region_id].nb_colors <= 16) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
304 /* 4 bpp, standard encoding */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
305 bpp_index = 1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
306 } else {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
307 return -1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
308 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
309
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
310 *q++ = 0x0f; /* sync_byte */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
311 *q++ = 0x11; /* segment_type */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
312 bytestream_put_be16(&q, page_id);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
313 pseg_len = q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
314 q += 2; /* segment length */
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
315 *q++ = region_id;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
316 *q++ = (s->object_version << 4) | (0 << 3) | 0x07; /* version , no fill */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
317 bytestream_put_be16(&q, h->rects[region_id].w); /* region width */
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
318 bytestream_put_be16(&q, h->rects[region_id].h); /* region height */
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
319 *q++ = ((1 + bpp_index) << 5) | ((1 + bpp_index) << 2) | 0x03;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
320 *q++ = region_id; /* clut_id == region_id */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
321 *q++ = 0; /* 8 bit fill colors */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
322 *q++ = 0x03; /* 4 bit and 2 bit fill colors */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
323
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
324 if (!s->hide_state) {
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
325 bytestream_put_be16(&q, region_id); /* object_id == region_id */
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
326 *q++ = (0 << 6) | (0 << 4);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
327 *q++ = 0;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
328 *q++ = 0xf0;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
329 *q++ = 0;
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
330 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
331
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
332 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
333 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
334
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
335 if (!s->hide_state) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2946
diff changeset
336
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
337 for (object_id = 0; object_id < h->num_rects; object_id++) {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
338 /* Object Data segment */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
339
2946
ac94d509884e dvbsub encoder, patch by Wolfram Gloger < wmglo AH dent POIS med POIS uni-muenchen POIS de >
gpoirier
parents: 2796
diff changeset
340 if (h->rects[object_id].nb_colors <= 4) {
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
341 /* 2 bpp, some decoders do not support it correctly */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
342 bpp_index = 0;
2946
ac94d509884e dvbsub encoder, patch by Wolfram Gloger < wmglo AH dent POIS med POIS uni-muenchen POIS de >
gpoirier
parents: 2796
diff changeset
343 } else if (h->rects[object_id].nb_colors <= 16) {
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
344 /* 4 bpp, standard encoding */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
345 bpp_index = 1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
346 } else {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
347 return -1;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
348 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
349
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
350 *q++ = 0x0f; /* sync byte */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
351 *q++ = 0x13;
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
352 bytestream_put_be16(&q, page_id);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
353 pseg_len = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
354 q += 2; /* segment length */
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
355
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
356 bytestream_put_be16(&q, object_id);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
357 *q++ = (s->object_version << 4) | (0 << 2) | (0 << 1) | 1; /* version = 0,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
358 onject_coding_method,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
359 non_modifying_color_flag */
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
360 {
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
361 uint8_t *ptop_field_len, *pbottom_field_len, *top_ptr, *bottom_ptr;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
362 void (*dvb_encode_rle)(uint8_t **pq,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
363 const uint8_t *bitmap, int linesize,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
364 int w, int h);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
365 ptop_field_len = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
366 q += 2;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
367 pbottom_field_len = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
368 q += 2;
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
369
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
370 if (bpp_index == 0)
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
371 dvb_encode_rle = dvb_encode_rle2;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
372 else
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
373 dvb_encode_rle = dvb_encode_rle4;
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
374
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
375 top_ptr = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
376 dvb_encode_rle(&q, h->rects[object_id].bitmap, h->rects[object_id].w * 2,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
377 h->rects[object_id].w, h->rects[object_id].h >> 1);
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
378 bottom_ptr = q;
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
379 dvb_encode_rle(&q, h->rects[object_id].bitmap + h->rects[object_id].w,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
380 h->rects[object_id].w * 2, h->rects[object_id].w,
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
381 h->rects[object_id].h >> 1);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
382
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
383 bytestream_put_be16(&ptop_field_len, bottom_ptr - top_ptr);
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
384 bytestream_put_be16(&pbottom_field_len, q - bottom_ptr);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
385 }
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
386
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
387 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
2796
95c35706acbb DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents: 2756
diff changeset
388 }
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
389 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
390
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
391 /* end of display set segment */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
392
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
393 *q++ = 0x0f; /* sync_byte */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
394 *q++ = 0x80; /* segment_type */
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
395 bytestream_put_be16(&q, page_id);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
396 pseg_len = q;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
397 q += 2; /* segment length */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
398
5067
6166fbf375cc Remove duplicate bytestream functions
ramiro
parents: 3947
diff changeset
399 bytestream_put_be16(&pseg_len, q - pseg_len - 2);
2756
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
400
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
401 *q++ = 0xff; /* end of PES data */
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
402
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
403 s->object_version = (s->object_version + 1) & 0xf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
404 s->hide_state = !s->hide_state;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
405 return q - outbuf;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
406 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
407
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
408 static int dvbsub_init_decoder(AVCodecContext *avctx)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
409 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
410 return 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
411 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
412
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
413 static int dvbsub_close_decoder(AVCodecContext *avctx)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
414 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
415 return 0;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
416 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
417
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
418 static int dvbsub_encode(AVCodecContext *avctx,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
419 unsigned char *buf, int buf_size, void *data)
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
420 {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
421 DVBSubtitleContext *s = avctx->priv_data;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
422 AVSubtitle *sub = data;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
423 int ret;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
424
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
425 ret = encode_dvb_subtitles(s, buf, sub);
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
426 return ret;
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
427 }
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
428
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
429 AVCodec dvbsub_encoder = {
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
430 "dvbsub",
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
431 CODEC_TYPE_SUBTITLE,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
432 CODEC_ID_DVB_SUBTITLE,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
433 sizeof(DVBSubtitleContext),
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
434 dvbsub_init_decoder,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
435 dvbsub_encode,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
436 dvbsub_close_decoder,
d8874c8749ec subtitle codec type support
bellard
parents:
diff changeset
437 };