3 * Copyright (c) 2011 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "libavutil/intreadwrite.h"
31 #include "bytestream.h"
37 static int build_huff(const uint8_t *src
, VLC
*vlc
, int *fsym
)
48 for (i
= 0; i
< 256; i
++) {
52 qsort(he
, 256, sizeof(*he
), ff_ut_huff_cmp_len
);
62 while (he
[last
].len
== 255 && last
)
66 for (i
= last
; i
>= 0; i
--) {
67 codes
[i
] = code
>> (32 - he
[i
].len
);
70 code
+= 0x80000000u
>> (he
[i
].len
- 1);
73 return ff_init_vlc_sparse(vlc
, FFMIN(he
[last
].len
, 9), last
+ 1,
74 bits
, sizeof(*bits
), sizeof(*bits
),
75 codes
, sizeof(*codes
), sizeof(*codes
),
76 syms
, sizeof(*syms
), sizeof(*syms
), 0);
79 static int decode_plane(UtvideoContext
*c
, int plane_no
,
80 uint8_t *dst
, int step
, int stride
,
81 int width
, int height
,
82 const uint8_t *src
, int use_pred
)
89 const int cmask
= ~(!plane_no
&& c
->avctx
->pix_fmt
== PIX_FMT_YUV420P
);
91 if (build_huff(src
, &vlc
, &fsym
)) {
92 av_log(c
->avctx
, AV_LOG_ERROR
, "Cannot build Huffman codes\n");
93 return AVERROR_INVALIDDATA
;
95 if (fsym
>= 0) { // build_huff reported a symbol to fill slices with
97 for (slice
= 0; slice
< c
->slices
; slice
++) {
101 send
= (height
* (slice
+ 1) / c
->slices
) & cmask
;
102 dest
= dst
+ sstart
* stride
;
105 for (j
= sstart
; j
< send
; j
++) {
106 for (i
= 0; i
< width
* step
; i
+= step
) {
123 for (slice
= 0; slice
< c
->slices
; slice
++) {
125 int slice_data_start
, slice_data_end
, slice_size
;
128 send
= (height
* (slice
+ 1) / c
->slices
) & cmask
;
129 dest
= dst
+ sstart
* stride
;
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
;
137 for (j
= sstart
; j
< send
; j
++) {
138 for (i
= 0; i
< width
* step
; i
+= step
)
145 memcpy(c
->slice_bits
, src
+ slice_data_start
+ c
->slices
* 4,
147 memset(c
->slice_bits
+ slice_size
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
148 c
->dsp
.bswap_buf((uint32_t *) c
->slice_bits
, (uint32_t *) c
->slice_bits
,
149 (slice_data_end
- slice_data_start
+ 3) >> 2);
150 init_get_bits(&gb
, c
->slice_bits
, slice_size
* 8);
153 for (j
= sstart
; j
< send
; j
++) {
154 for (i
= 0; i
< width
* step
; i
+= step
) {
155 if (get_bits_left(&gb
) <= 0) {
156 av_log(c
->avctx
, AV_LOG_ERROR
,
157 "Slice decoding ran out of bits\n");
160 pix
= get_vlc2(&gb
, vlc
.table
, vlc
.bits
, 4);
162 av_log(c
->avctx
, AV_LOG_ERROR
, "Decoding error\n");
173 if (get_bits_left(&gb
) > 32)
174 av_log(c
->avctx
, AV_LOG_WARNING
,
175 "%d bits left after decoding slice\n", get_bits_left(&gb
));
183 return AVERROR_INVALIDDATA
;
186 static void restore_rgb_planes(uint8_t *src
, int step
, int stride
, int width
,
192 for (j
= 0; j
< height
; j
++) {
193 for (i
= 0; i
< width
* step
; i
+= step
) {
197 src
[i
] = r
+ g
- 0x80;
198 src
[i
+ 2] = b
+ g
- 0x80;
204 static void restore_median(uint8_t *src
, int step
, int stride
,
205 int width
, int height
, int slices
, int rmode
)
210 int slice_start
, slice_height
;
211 const int cmask
= ~rmode
;
213 for (slice
= 0; slice
< slices
; slice
++) {
214 slice_start
= ((slice
* height
) / slices
) & cmask
;
215 slice_height
= ((((slice
+ 1) * height
) / slices
) & cmask
) -
218 bsrc
= src
+ slice_start
* stride
;
220 // first line - left neighbour prediction
223 for (i
= step
; i
< width
* step
; i
+= step
) {
228 if (slice_height
== 1)
230 // second line - first element has top prediction, the rest uses median
234 for (i
= step
; i
< width
* step
; i
+= step
) {
235 B
= bsrc
[i
- stride
];
236 bsrc
[i
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
241 // the rest of lines use continuous median prediction
242 for (j
= 2; j
< slice_height
; j
++) {
243 for (i
= 0; i
< width
* step
; i
+= step
) {
244 B
= bsrc
[i
- stride
];
245 bsrc
[i
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
254 /* UtVideo interlaced mode treats every two lines as a single one,
255 * so restoring function should take care of possible padding between
256 * two parts of the same "line".
258 static void restore_median_il(uint8_t *src
, int step
, int stride
,
259 int width
, int height
, int slices
, int rmode
)
264 int slice_start
, slice_height
;
265 const int cmask
= ~(rmode ?
3 : 1);
266 const int stride2
= stride
<< 1;
268 for (slice
= 0; slice
< slices
; slice
++) {
269 slice_start
= ((slice
* height
) / slices
) & cmask
;
270 slice_height
= ((((slice
+ 1) * height
) / slices
) & cmask
) -
274 bsrc
= src
+ slice_start
* stride
;
276 // first line - left neighbour prediction
279 for (i
= step
; i
< width
* step
; i
+= step
) {
283 for (i
= 0; i
< width
* step
; i
+= step
) {
284 bsrc
[stride
+ i
] += A
;
285 A
= bsrc
[stride
+ i
];
288 if (slice_height
== 1)
290 // second line - first element has top prediction, the rest uses median
294 for (i
= step
; i
< width
* step
; i
+= step
) {
295 B
= bsrc
[i
- stride2
];
296 bsrc
[i
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
300 for (i
= 0; i
< width
* step
; i
+= step
) {
301 B
= bsrc
[i
- stride
];
302 bsrc
[stride
+ i
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
304 A
= bsrc
[stride
+ i
];
307 // the rest of lines use continuous median prediction
308 for (j
= 2; j
< slice_height
; j
++) {
309 for (i
= 0; i
< width
* step
; i
+= step
) {
310 B
= bsrc
[i
- stride2
];
311 bsrc
[i
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
315 for (i
= 0; i
< width
* step
; i
+= step
) {
316 B
= bsrc
[i
- stride
];
317 bsrc
[i
+ stride
] += mid_pred(A
, B
, (uint8_t)(A
+ B
- C
));
319 A
= bsrc
[i
+ stride
];
326 static int decode_frame(AVCodecContext
*avctx
, void *data
, int *data_size
,
329 const uint8_t *buf
= avpkt
->data
;
330 int buf_size
= avpkt
->size
;
331 UtvideoContext
*c
= avctx
->priv_data
;
333 const uint8_t *plane_start
[5];
334 int plane_size
, max_slice_size
= 0, slice_start
, slice_end
, slice_size
;
339 ff_thread_release_buffer(avctx
, &c
->pic
);
341 c
->pic
.reference
= 1;
342 c
->pic
.buffer_hints
= FF_BUFFER_HINTS_VALID
;
343 if ((ret
= ff_thread_get_buffer(avctx
, &c
->pic
)) < 0) {
344 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
348 ff_thread_finish_setup(avctx
);
350 /* parse plane structure to get frame flags and validate slice offsets */
351 bytestream2_init(&gb
, buf
, buf_size
);
352 for (i
= 0; i
< c
->planes
; i
++) {
353 plane_start
[i
] = gb
.buffer
;
354 if (bytestream2_get_bytes_left(&gb
) < 256 + 4 * c
->slices
) {
355 av_log(avctx
, AV_LOG_ERROR
, "Insufficient data for a plane\n");
356 return AVERROR_INVALIDDATA
;
358 bytestream2_skipu(&gb
, 256);
361 for (j
= 0; j
< c
->slices
; j
++) {
362 slice_end
= bytestream2_get_le32u(&gb
);
363 slice_size
= slice_end
- slice_start
;
364 if (slice_end
<= 0 || slice_size
<= 0 ||
365 bytestream2_get_bytes_left(&gb
) < slice_end
) {
366 av_log(avctx
, AV_LOG_ERROR
, "Incorrect slice size\n");
367 return AVERROR_INVALIDDATA
;
369 slice_start
= slice_end
;
370 max_slice_size
= FFMAX(max_slice_size
, slice_size
);
372 plane_size
= slice_end
;
373 bytestream2_skipu(&gb
, plane_size
);
375 plane_start
[c
->planes
] = gb
.buffer
;
376 if (bytestream2_get_bytes_left(&gb
) < c
->frame_info_size
) {
377 av_log(avctx
, AV_LOG_ERROR
, "Not enough data for frame information\n");
378 return AVERROR_INVALIDDATA
;
380 c
->frame_info
= bytestream2_get_le32u(&gb
);
381 av_log(avctx
, AV_LOG_DEBUG
, "frame information flags %X\n", c
->frame_info
);
383 c
->frame_pred
= (c
->frame_info
>> 8) & 3;
385 if (c
->frame_pred
== PRED_GRADIENT
) {
386 av_log_ask_for_sample(avctx
, "Frame uses gradient prediction\n");
387 return AVERROR_PATCHWELCOME
;
390 av_fast_malloc(&c
->slice_bits
, &c
->slice_bits_size
,
391 max_slice_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
393 if (!c
->slice_bits
) {
394 av_log(avctx
, AV_LOG_ERROR
, "Cannot allocate temporary buffer\n");
395 return AVERROR(ENOMEM
);
398 switch (c
->avctx
->pix_fmt
) {
401 for (i
= 0; i
< c
->planes
; i
++) {
402 ret
= decode_plane(c
, i
, c
->pic
.data
[0] + ff_ut_rgb_order
[i
],
403 c
->planes
, c
->pic
.linesize
[0], avctx
->width
,
404 avctx
->height
, plane_start
[i
],
405 c
->frame_pred
== PRED_LEFT
);
408 if (c
->frame_pred
== PRED_MEDIAN
) {
409 if (!c
->interlaced
) {
410 restore_median(c
->pic
.data
[0] + ff_ut_rgb_order
[i
],
411 c
->planes
, c
->pic
.linesize
[0], avctx
->width
,
412 avctx
->height
, c
->slices
, 0);
414 restore_median_il(c
->pic
.data
[0] + ff_ut_rgb_order
[i
],
415 c
->planes
, c
->pic
.linesize
[0],
416 avctx
->width
, avctx
->height
, c
->slices
,
421 restore_rgb_planes(c
->pic
.data
[0], c
->planes
, c
->pic
.linesize
[0],
422 avctx
->width
, avctx
->height
);
424 case PIX_FMT_YUV420P
:
425 for (i
= 0; i
< 3; i
++) {
426 ret
= decode_plane(c
, i
, c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
427 avctx
->width
>> !!i
, avctx
->height
>> !!i
,
428 plane_start
[i
], c
->frame_pred
== PRED_LEFT
);
431 if (c
->frame_pred
== PRED_MEDIAN
) {
432 if (!c
->interlaced
) {
433 restore_median(c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
434 avctx
->width
>> !!i
, avctx
->height
>> !!i
,
437 restore_median_il(c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
439 avctx
->height
>> !!i
,
445 case PIX_FMT_YUV422P
:
446 for (i
= 0; i
< 3; i
++) {
447 ret
= decode_plane(c
, i
, c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
448 avctx
->width
>> !!i
, avctx
->height
,
449 plane_start
[i
], c
->frame_pred
== PRED_LEFT
);
452 if (c
->frame_pred
== PRED_MEDIAN
) {
453 if (!c
->interlaced
) {
454 restore_median(c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
455 avctx
->width
>> !!i
, avctx
->height
,
458 restore_median_il(c
->pic
.data
[i
], 1, c
->pic
.linesize
[i
],
459 avctx
->width
>> !!i
, avctx
->height
,
467 c
->pic
.key_frame
= 1;
468 c
->pic
.pict_type
= AV_PICTURE_TYPE_I
;
469 c
->pic
.interlaced_frame
= !!c
->interlaced
;
471 *data_size
= sizeof(AVFrame
);
472 *(AVFrame
*)data
= c
->pic
;
474 /* always report that the buffer was completely consumed */
478 static av_cold
int decode_init(AVCodecContext
*avctx
)
480 UtvideoContext
* const c
= avctx
->priv_data
;
484 ff_dsputil_init(&c
->dsp
, avctx
);
486 if (avctx
->extradata_size
< 16) {
487 av_log(avctx
, AV_LOG_ERROR
,
488 "Insufficient extradata size %d, should be at least 16\n",
489 avctx
->extradata_size
);
490 return AVERROR_INVALIDDATA
;
493 av_log(avctx
, AV_LOG_DEBUG
, "Encoder version %d.%d.%d.%d\n",
494 avctx
->extradata
[3], avctx
->extradata
[2],
495 avctx
->extradata
[1], avctx
->extradata
[0]);
496 av_log(avctx
, AV_LOG_DEBUG
, "Original format %X\n",
497 AV_RB32(avctx
->extradata
+ 4));
498 c
->frame_info_size
= AV_RL32(avctx
->extradata
+ 8);
499 c
->flags
= AV_RL32(avctx
->extradata
+ 12);
501 if (c
->frame_info_size
!= 4)
502 av_log_ask_for_sample(avctx
, "Frame info is not 4 bytes\n");
503 av_log(avctx
, AV_LOG_DEBUG
, "Encoding parameters %08X\n", c
->flags
);
504 c
->slices
= (c
->flags
>> 24) + 1;
505 c
->compression
= c
->flags
& 1;
506 c
->interlaced
= c
->flags
& 0x800;
508 c
->slice_bits_size
= 0;
510 switch (avctx
->codec_tag
) {
511 case MKTAG('U', 'L', 'R', 'G'):
513 avctx
->pix_fmt
= PIX_FMT_RGB24
;
515 case MKTAG('U', 'L', 'R', 'A'):
517 avctx
->pix_fmt
= PIX_FMT_RGBA
;
519 case MKTAG('U', 'L', 'Y', '0'):
521 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
523 case MKTAG('U', 'L', 'Y', '2'):
525 avctx
->pix_fmt
= PIX_FMT_YUV422P
;
528 av_log(avctx
, AV_LOG_ERROR
, "Unknown Ut Video FOURCC provided (%08X)\n",
530 return AVERROR_INVALIDDATA
;
536 static av_cold
int decode_end(AVCodecContext
*avctx
)
538 UtvideoContext
* const c
= avctx
->priv_data
;
541 ff_thread_release_buffer(avctx
, &c
->pic
);
543 av_freep(&c
->slice_bits
);
548 AVCodec ff_utvideo_decoder
= {
550 .type
= AVMEDIA_TYPE_VIDEO
,
551 .id
= AV_CODEC_ID_UTVIDEO
,
552 .priv_data_size
= sizeof(UtvideoContext
),
555 .decode
= decode_frame
,
556 .capabilities
= CODEC_CAP_DR1
| CODEC_CAP_FRAME_THREADS
,
557 .long_name
= NULL_IF_CONFIG_SMALL("Ut Video"),