30#define CACHED_BITSTREAM_READER !ARCH_X86_32
31#define UNCHECKED_BITSTREAM_READER 1
77 VLC_MULTI *multi,
int *fsym,
unsigned nb_elems)
81 uint16_t codes_count[33] = { 0 };
84 for (
unsigned i = 0;
i < nb_elems;
i++) {
88 }
else if (
src[
i] == 255) {
90 }
else if (
src[
i] <= 32) {
95 codes_count[
bits[
i]]++;
97 if (codes_count[0] == nb_elems)
105 for (
int i = 31;
i >= 0;
i--)
106 codes_count[
i] += codes_count[
i + 1];
108 for (
unsigned i = 0;
i < nb_elems;
i++)
113 &he[0].
len,
sizeof(*he),
114 &he[0].sym,
sizeof(*he), 2, 0, 0,
c->avctx);
117#define READ_PLANE(b, end) \
119 buf = !use_pred ? dest : c->buffer; \
121 for (; CACHED_BITSTREAM_READER && i < width-end && get_bits_left(&gb) > 0;) {\
122 ret = get_vlc_multi(&gb, (uint8_t *)buf + i * b, multi.table, \
123 vlc.table, VLC_BITS, 3, b); \
129 for (; i < width && get_bits_left(&gb) > 0; i++) \
130 buf[i] = get_vlc2(&gb, vlc.table, VLC_BITS, 3); \
133 c->llviddsp.add_left_pred_int16((uint16_t *)dest, (const uint16_t *)buf, 0x3ff, width, prev); \
135 c->llviddsp.add_left_pred((uint8_t *)dest, (const uint8_t *)buf, width, prev); \
137 prev = dest[width-1]; \
144 const uint8_t *
src,
const uint8_t *huff,
147 int i, j, slice,
pix, ret;
154 if ((ret =
build_huff(
c, huff, &vlc, &multi, &fsym, 1024)) < 0) {
160 for (slice = 0; slice <
c->slices; slice++) {
164 send = (
height * (slice + 1) /
c->slices);
168 for (j = sstart; j < send; j++) {
185 for (slice = 0; slice <
c->slices; slice++) {
186 uint16_t *dest, *buf;
187 int slice_data_start, slice_data_end, slice_size;
190 send = (
height * (slice + 1) /
c->slices);
194 slice_data_start = slice ?
AV_RL32(
src + slice * 4 - 4) : 0;
196 slice_size = slice_data_end - slice_data_start;
200 "yet a slice has a length of zero.\n");
205 c->bdsp.bswap_buf((uint32_t *)
c->slice_bits,
206 (uint32_t *)(
src + slice_data_start +
c->slices * 4),
207 (slice_data_end - slice_data_start + 3) >> 2);
211 for (j = sstart; j < send; j++)
233 return ~(1 + 2 * is_luma);
241 const uint8_t *
src,
int use_pred)
243 int i, j, slice,
pix;
249 const int cmask =
compute_cmask(plane_no,
c->interlaced,
c->avctx->pix_fmt);
253 for (slice = 0; slice <
c->slices; slice++) {
257 ret =
init_get_bits8_le(&cbit,
c->control_stream[plane_no][slice],
c->control_stream_size[plane_no][slice]);
261 ret =
init_get_bits8_le(&pbit,
c->packed_stream[plane_no][slice],
c->packed_stream_size[plane_no][slice]);
266 send = (
height * (slice + 1) /
c->slices) & cmask;
272 for (p = dest; p <
dst + send *
stride; p += 8) {
278 uint32_t sub = 0x80 >> (8 - (
bits + 1)), add;
284 for (k = 0; k < 8; k++) {
287 add = (~p[k] & sub) << (8 -
bits);
304 for (slice = 0; slice <
c->slices; slice++) {
308 send = (
height * (slice + 1) /
c->slices) & cmask;
312 for (j = sstart; j < send; j++) {
316 prev += (unsigned)
pix;
330 for (slice = 0; slice <
c->slices; slice++) {
332 int slice_data_start, slice_data_end, slice_size;
335 send = (
height * (slice + 1) /
c->slices) & cmask;
339 slice_data_start = slice ?
AV_RL32(
src + slice * 4 - 4) : 0;
341 slice_size = slice_data_end - slice_data_start;
345 "yet a slice has a length of zero.\n");
350 c->bdsp.bswap_buf((uint32_t *)
c->slice_bits,
351 (uint32_t *)(
src + slice_data_start +
c->slices * 4),
352 (slice_data_end - slice_data_start + 3) >> 2);
356 for (j = sstart; j < send; j++)
384 const int cmask = ~rmode;
386 for (slice = 0; slice < slices; slice++) {
388 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
397 c->llviddsp.add_left_pred(bsrc, bsrc,
width, 0);
399 if (slice_height <= 1)
412 c->llviddsp.add_median_pred(bsrc + 16, bsrc -
stride + 16,
413 bsrc + 16,
width - 16, &
A, &
B);
417 for (j = 2; j < slice_height; j++) {
418 c->llviddsp.add_median_pred(bsrc, bsrc -
stride,
436 const int cmask = ~(rmode ? 3 : 1);
437 const ptrdiff_t stride2 =
stride << 1;
439 for (slice = 0; slice < slices; slice++) {
441 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
451 A =
c->llviddsp.add_left_pred(bsrc, bsrc,
width, 0);
454 if (slice_height <= 1)
461 B = bsrc[
i - stride2];
467 c->llviddsp.add_median_pred(bsrc + 16, bsrc - stride2 + 16,
468 bsrc + 16,
width - 16, &
A, &
B);
474 for (j = 2; j < slice_height; j++) {
475 c->llviddsp.add_median_pred(bsrc, bsrc - stride2,
491 const int cmask = ~rmode;
494 for (slice = 0; slice < slices; slice++) {
496 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
505 c->llviddsp.add_left_pred(bsrc, bsrc,
width, 0);
507 if (slice_height <= 1)
509 for (j = 1; j < slice_height; j++) {
511 bsrc[0] = (bsrc[0] + bsrc[-
stride]) & 0xFF;
512 for (
i = 1;
i < min_width;
i++) {
516 bsrc[
i] = (
A -
B +
C + bsrc[
i]) & 0xFF;
519 c->llviddsp.add_gradient_pred(bsrc + 32,
stride,
width - 32);
532 const int cmask = ~(rmode ? 3 : 1);
533 const ptrdiff_t stride2 =
stride << 1;
536 for (slice = 0; slice < slices; slice++) {
538 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
548 A =
c->llviddsp.add_left_pred(bsrc, bsrc,
width, 0);
551 if (slice_height <= 1)
553 for (j = 1; j < slice_height; j++) {
555 bsrc[0] = (bsrc[0] + bsrc[-stride2]) & 0xFF;
556 for (
i = 1;
i < min_width;
i++) {
557 A = bsrc[
i - stride2];
558 B = bsrc[
i - (stride2 + 1)];
560 bsrc[
i] = (
A -
B +
C + bsrc[
i]) & 0xFF;
563 c->llviddsp.add_gradient_pred(bsrc + 32, stride2,
width - 32);
583 const uint8_t *buf = avpkt->
data;
584 int buf_size = avpkt->
size;
587 const uint8_t *plane_start[5] = {
NULL};
599 const uint8_t *packed_stream;
600 const uint8_t *control_stream;
607 if (bytestream2_get_byte(&gb) != 1)
610 c->offset = bytestream2_get_le32(&gb);
612 if (buf_size <= c->
offset + 8LL)
617 nb_cbs = bytestream2_get_le32(&pb);
618 if (nb_cbs >
c->offset)
621 packed_stream = buf + 8;
622 control_stream = packed_stream + (
c->offset - nb_cbs);
623 left = control_stream - packed_stream;
625 for (
i = 0;
i <
c->planes;
i++) {
626 for (j = 0; j <
c->slices; j++) {
627 c->packed_stream[
i][j] = packed_stream;
628 c->packed_stream_size[
i][j] = bytestream2_get_le32(&pb);
629 if (
c->packed_stream_size[
i][j] >
left)
631 left -=
c->packed_stream_size[
i][j];
632 packed_stream +=
c->packed_stream_size[
i][j];
636 left = buf + buf_size - control_stream;
638 for (
i = 0;
i <
c->planes;
i++) {
639 for (j = 0; j <
c->slices; j++) {
640 c->control_stream[
i][j] = control_stream;
641 c->control_stream_size[
i][j] = bytestream2_get_le32(&pb);
642 if (
c->control_stream_size[
i][j] >
left)
644 left -=
c->control_stream_size[
i][j];
645 control_stream +=
c->control_stream_size[
i][j];
653 c->frame_info = bytestream2_get_le32u(&gb);
654 c->slices = ((
c->frame_info >> 16) & 0xff) + 1;
655 for (
i = 0;
i <
c->planes;
i++) {
663 for (j = 0; j <
c->slices; j++) {
672 max_slice_size =
FFMAX(max_slice_size, slice_size);
678 plane_start[
c->planes] = gb.
buffer;
680 for (
i = 0;
i <
c->planes;
i++) {
689 for (j = 0; j <
c->slices; j++) {
698 max_slice_size =
FFMAX(max_slice_size, slice_size);
703 plane_start[
c->planes] = gb.
buffer;
708 c->frame_info = bytestream2_get_le32u(&gb);
713 c->frame_pred = (
c->frame_info >> 8) & 3;
715 max_slice_size += 4*avctx->
width;
721 if (!
c->slice_bits) {
727 switch (
c->avctx->pix_fmt) {
730 for (
i = 0;
i <
c->planes;
i++) {
738 if (!
c->interlaced) {
749 if (!
c->interlaced) {
767 for (
i = 0;
i <
c->planes;
i++) {
771 plane_start[
i + 1] - 1024,
776 c->utdsp.restore_rgb_planes10((uint16_t *)
frame->data[2], (uint16_t *)
frame->data[0], (uint16_t *)
frame->data[1],
777 frame->linesize[2] / 2,
frame->linesize[0] / 2,
frame->linesize[1] / 2,
781 for (
i = 0;
i < 3;
i++) {
788 if (!
c->interlaced) {
799 if (!
c->interlaced) {
813 for (
i = 0;
i < 3;
i++) {
820 if (!
c->interlaced) {
830 if (!
c->interlaced) {
843 for (
i = 0;
i < 3;
i++) {
850 if (!
c->interlaced) {
860 if (!
c->interlaced) {
873 for (
i = 0;
i < 3;
i++) {
876 plane_start[
i], plane_start[
i + 1] - 1024,
c->frame_pred ==
PRED_LEFT);
882 for (
i = 0;
i < 3;
i++) {
885 plane_start[
i], plane_start[
i + 1] - 1024,
c->frame_pred ==
PRED_LEFT);
904 int h_shift, v_shift;
912 c->slice_bits_size = 0;
915 case MKTAG(
'U',
'L',
'R',
'G'):
919 case MKTAG(
'U',
'L',
'R',
'A'):
923 case MKTAG(
'U',
'L',
'Y',
'0'):
928 case MKTAG(
'U',
'L',
'Y',
'2'):
933 case MKTAG(
'U',
'L',
'Y',
'4'):
938 case MKTAG(
'U',
'Q',
'Y',
'0'):
943 case MKTAG(
'U',
'Q',
'Y',
'2'):
948 case MKTAG(
'U',
'Q',
'R',
'G'):
953 case MKTAG(
'U',
'Q',
'R',
'A'):
958 case MKTAG(
'U',
'L',
'H',
'0'):
963 case MKTAG(
'U',
'L',
'H',
'2'):
968 case MKTAG(
'U',
'L',
'H',
'4'):
973 case MKTAG(
'U',
'M',
'Y',
'2'):
979 case MKTAG(
'U',
'M',
'H',
'2'):
985 case MKTAG(
'U',
'M',
'Y',
'4'):
991 case MKTAG(
'U',
'M',
'H',
'4'):
997 case MKTAG(
'U',
'M',
'R',
'G'):
1002 case MKTAG(
'U',
'M',
'R',
'A'):
1014 if ((avctx->
width & ((1<<h_shift)-1)) ||
1015 (avctx->
height & ((1<<v_shift)-1))) {
1027 if (
c->compression != 2)
1039 if (
c->frame_info_size != 4)
1042 c->slices = (
c->flags >> 24) + 1;
1043 c->compression =
c->flags & 1;
1044 c->interlaced =
c->flags & 0x800;
1052 c->frame_info_size = 4;
1055 "Insufficient extradata size %d, should be at least 16\n",
1078 .p.name =
"utvideo",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_utvideo_decoder
static av_cold void close(AVCodecParserContext *s)
Libavcodec external API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
#define i(width, name, range_min, range_max)
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
static enum AVPixelFormat pix_fmt
int(* init)(AVBSFContext *ctx)
static const uint8_t bits[8]
bitstream reader API header.
static unsigned int get_bits_le(GetBitContext *s, int n)
static int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer, int byte_size)
static int get_bits_left(GetBitContext *gb)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
static av_cold int decode_init(AVCodecContext *avctx)
static av_cold int decode_end(AVCodecContext *avctx)
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Multithreading API for decoders.
av_cold void ff_utvideodsp_init(UTVideoDSPContext *c)
av_cold void ff_llviddsp_init(LLVidDSPContext *c)
#define MKTAG(a, b, c, d)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define AV_PIX_FMT_GBRAP10
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
enum AVColorSpace colorspace
YUV colorspace type.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
size_t packed_stream_size[4][256]
const uint8_t * packed_stream[4][256]
size_t control_stream_size[4][256]
const uint8_t * control_stream[4][256]
#define avpriv_request_sample(...)
static void restore_gradient_planar_il(UtvideoContext *c, uint8_t *src, ptrdiff_t stride, int width, int height, int slices, int rmode)
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static int build_huff(UtvideoContext *c, const uint8_t *src, VLC *vlc, VLC_MULTI *multi, int *fsym, unsigned nb_elems)
static int decode_plane(UtvideoContext *c, int plane_no, uint8_t *dst, ptrdiff_t stride, int width, int height, const uint8_t *src, int use_pred)
static av_cold int decode_init(AVCodecContext *avctx)
static void restore_median_planar_il(UtvideoContext *c, uint8_t *src, ptrdiff_t stride, int width, int height, int slices, int rmode)
static av_cold int decode_end(AVCodecContext *avctx)
static void restore_median_planar(UtvideoContext *c, uint8_t *src, ptrdiff_t stride, int width, int height, int slices, int rmode)
static void restore_gradient_planar(UtvideoContext *c, uint8_t *src, ptrdiff_t stride, int width, int height, int slices, int rmode)
#define READ_PLANE(b, end)
static int compute_cmask(int plane_no, int interlaced, enum AVPixelFormat pix_fmt)
static int decode_plane10(UtvideoContext *c, int plane_no, uint16_t *dst, ptrdiff_t stride, int width, int height, const uint8_t *src, const uint8_t *huff, int use_pred)
int ff_vlc_init_multi_from_lengths(VLC *vlc, VLC_MULTI *multi, int nb_bits, int nb_elems, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc_multi()
void ff_vlc_free_multi(VLC_MULTI *vlc)
void ff_vlc_free(VLC *vlc)
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)