1 /*
2 * Ut Video decoder
3 * Copyright (c) 2011 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Ut Video decoder
25 */
26
27 #include <stdlib.h>
28
36
38 {
39 int i;
41 int last;
42 uint32_t codes[256];
45 uint32_t code;
46
47 *fsym = -1;
48 for (i = 0; i < 256; i++) {
51 }
53
56 return 0;
57 }
58 if (he[0].len > 32)
59 return -1;
60
61 last = 255;
62 while (he[last].len == 255 && last)
63 last--;
64
65 code = 1;
66 for (i = last; i >= 0; i--) {
67 codes[i] = code >> (32 - he[i].
len);
70 code += 0x80000000
u >> (he[i].
len - 1);
71 }
72
74 bits, sizeof(*bits), sizeof(*bits),
75 codes, sizeof(*codes), sizeof(*codes),
76 syms, sizeof(*syms), sizeof(*syms), 0);
77 }
78
83 {
84 int i, j, slice, pix;
85 int sstart, send;
88 int prev, fsym;
90
94 }
95 if (fsym >= 0) { // build_huff reported a symbol to fill slices with
96 send = 0;
97 for (slice = 0; slice < c->
slices; slice++) {
99
100 sstart = send;
101 send = (height * (slice + 1) / c->
slices) & cmask;
102 dest = dst + sstart *
stride;
103
104 prev = 0x80;
105 for (j = sstart; j < send; j++) {
106 for (i = 0; i < width * step; i += step) {
107 pix = fsym;
108 if (use_pred) {
109 prev += pix;
110 pix = prev;
111 }
112 dest[i] = pix;
113 }
115 }
116 }
117 return 0;
118 }
119
120 src += 256;
121
122 send = 0;
123 for (slice = 0; slice < c->
slices; slice++) {
125 int slice_data_start, slice_data_end, slice_size;
126
127 sstart = send;
128 send = (height * (slice + 1) / c->
slices) & cmask;
129 dest = dst + sstart *
stride;
130
131 // slice offset and size validation was done earlier
132 slice_data_start = slice ?
AV_RL32(src + slice * 4 - 4) : 0;
133 slice_data_end =
AV_RL32(src + slice * 4);
134 slice_size = slice_data_end - slice_data_start;
135
136 if (!slice_size) {
138 "yet a slice has a length of zero.\n");
139 goto fail;
140 }
141
143 slice_size);
146 (slice_data_end - slice_data_start + 3) >> 2);
148
149 prev = 0x80;
150 for (j = sstart; j < send; j++) {
151 for (i = 0; i < width * step; i += step) {
154 "Slice decoding ran out of bits\n");
155 goto fail;
156 }
158 if (pix < 0) {
160 goto fail;
161 }
162 if (use_pred) {
163 prev += pix;
164 pix = prev;
165 }
166 dest[i] = pix;
167 }
169 }
173 }
174
176
177 return 0;
178 fail:
181 }
182
185 {
186 int i, j;
188
189 for (j = 0; j <
height; j++) {
190 for (i = 0; i < width * step; i += step) {
191 r = src[i];
192 g = src[i + 1];
193 b = src[i + 2];
194 src[i] = r + g - 0x80;
195 src[i + 2] = b + g - 0x80;
196 }
198 }
199 }
200
203 {
204 int i, j, slice;
207 int slice_start, slice_height;
208 const int cmask = ~rmode;
209
210 for (slice = 0; slice < slices; slice++) {
211 slice_start = ((slice *
height) / slices) & cmask;
212 slice_height = ((((slice + 1) * height) / slices) & cmask) -
213 slice_start;
214
215 bsrc = src + slice_start *
stride;
216
217 // first line - left neighbour prediction
218 bsrc[0] += 0x80;
219 A = bsrc[0];
220 for (i = step; i < width * step; i += step) {
222 A = bsrc[i];
223 }
225 if (slice_height == 1)
226 continue;
227 // second line - first element has top prediction, the rest uses median
229 bsrc[0] += C;
230 A = bsrc[0];
231 for (i = step; i < width * step; i += step) {
235 A = bsrc[i];
236 }
238 // the rest of lines use continuous median prediction
239 for (j = 2; j < slice_height; j++) {
240 for (i = 0; i < width * step; i += step) {
244 A = bsrc[i];
245 }
247 }
248 }
249 }
250
251 /* UtVideo interlaced mode treats every two lines as a single one,
252 * so restoring function should take care of possible padding between
253 * two parts of the same "line".
254 */
257 {
258 int i, j, slice;
261 int slice_start, slice_height;
262 const int cmask = ~(rmode ? 3 : 1);
263 const int stride2 = stride << 1;
264
265 for (slice = 0; slice < slices; slice++) {
266 slice_start = ((slice *
height) / slices) & cmask;
267 slice_height = ((((slice + 1) * height) / slices) & cmask) -
268 slice_start;
269 slice_height >>= 1;
270
271 bsrc = src + slice_start *
stride;
272
273 // first line - left neighbour prediction
274 bsrc[0] += 0x80;
275 A = bsrc[0];
276 for (i = step; i < width * step; i += step) {
278 A = bsrc[i];
279 }
280 for (i = 0; i < width * step; i += step) {
281 bsrc[stride + i] +=
A;
282 A = bsrc[stride + i];
283 }
284 bsrc += stride2;
285 if (slice_height == 1)
286 continue;
287 // second line - first element has top prediction, the rest uses median
288 C = bsrc[-stride2];
289 bsrc[0] += C;
290 A = bsrc[0];
291 for (i = step; i < width * step; i += step) {
292 B = bsrc[i - stride2];
295 A = bsrc[i];
296 }
297 for (i = 0; i < width * step; i += step) {
301 A = bsrc[stride + i];
302 }
303 bsrc += stride2;
304 // the rest of lines use continuous median prediction
305 for (j = 2; j < slice_height; j++) {
306 for (i = 0; i < width * step; i += step) {
307 B = bsrc[i - stride2];
310 A = bsrc[i];
311 }
312 for (i = 0; i < width * step; i += step) {
317 }
318 bsrc += stride2;
319 }
320 }
321 }
322
325 {
327 int buf_size = avpkt->
size;
329 int i, j;
331 int plane_size, max_slice_size = 0, slice_start,
slice_end, slice_size;
335
338
339 /* parse plane structure to get frame flags and validate slice offsets */
341 for (i = 0; i < c->
planes; i++) {
342 plane_start[i] = gb.
buffer;
346 }
348 slice_start = 0;
349 slice_end = 0;
350 for (j = 0; j < c->
slices; j++) {
351 slice_end = bytestream2_get_le32u(&gb);
352 slice_size = slice_end - slice_start;
353 if (slice_end < 0 || slice_size < 0 ||
357 }
359 max_slice_size =
FFMAX(max_slice_size, slice_size);
360 }
363 }
368 }
371
373
377 }
378
381
385 }
386
390 for (i = 0; i < c->
planes; i++) {
393 avctx->
height, plane_start[i],
395 if (ret)
402 } else {
406 0);
407 }
408 }
409 }
412 break;
414 for (i = 0; i < 3; i++) {
418 if (ret)
425 } else {
430 }
431 }
432 }
433 break;
435 for (i = 0; i < 3; i++) {
439 if (ret)
446 } else {
450 }
451 }
452 }
453 break;
454 }
455
459
460 *got_frame = 1;
461
462 /* always report that the buffer was completely consumed */
463 return buf_size;
464 }
465
467 {
469
471
473
476 "Insufficient extradata size %d, should be at least 16\n",
479 }
480
488
495
497
499 case MKTAG(
'U',
'L',
'R',
'G'):
502 break;
503 case MKTAG(
'U',
'L',
'R',
'A'):
506 break;
507 case MKTAG(
'U',
'L',
'Y',
'0'):
511 break;
512 case MKTAG(
'U',
'L',
'Y',
'2'):
516 break;
517 case MKTAG(
'U',
'L',
'H',
'0'):
521 break;
522 case MKTAG(
'U',
'L',
'H',
'2'):
526 break;
527 default:
531 }
532
533 return 0;
534 }
535
537 {
539
541
542 return 0;
543 }
544
555 };