30 #define CACHED_BITSTREAM_READER !ARCH_X86_32
31 #define UNCHECKED_BITSTREAM_READER 1
49 int *fsym,
unsigned nb_elems)
54 uint16_t codes_count[33] = { 0 };
57 for (
i = 0;
i < nb_elems;
i++) {
61 }
else if (
src[
i] == 255) {
63 }
else if (
src[
i] <= 32) {
68 codes_count[
bits[
i]]++;
70 if (codes_count[0] == nb_elems)
78 for (
int i = 31;
i >= 0;
i--)
79 codes_count[
i] += codes_count[
i + 1];
81 for (
unsigned i = 0;
i < nb_elems;
i++)
86 &he[0].
len,
sizeof(*he),
87 &he[0].sym,
sizeof(*he), 2, 0, 0,
c->avctx);
91 uint16_t *dst, ptrdiff_t
stride,
96 int i, j, slice, pix, ret;
102 if ((ret =
build_huff(
c, huff, &vlc, &fsym, 1024)) < 0) {
108 for (slice = 0; slice <
c->slices; slice++) {
112 send = (
height * (slice + 1) /
c->slices);
113 dest = dst + sstart *
stride;
116 for (j = sstart; j < send; j++) {
133 for (slice = 0; slice <
c->slices; slice++) {
135 int slice_data_start, slice_data_end, slice_size;
138 send = (
height * (slice + 1) /
c->slices);
139 dest = dst + sstart *
stride;
142 slice_data_start = slice ?
AV_RL32(
src + slice * 4 - 4) : 0;
144 slice_size = slice_data_end - slice_data_start;
148 "yet a slice has a length of zero.\n");
153 c->bdsp.bswap_buf((uint32_t *)
c->slice_bits,
154 (uint32_t *)(
src + slice_data_start +
c->slices * 4),
155 (slice_data_end - slice_data_start + 3) >> 2);
159 for (j = sstart; j < send; j++) {
176 "Slice decoding ran out of bits\n");
198 return ~(1 + 2 * is_luma);
208 int i, j, slice, pix;
213 const int cmask =
compute_cmask(plane_no,
c->interlaced,
c->avctx->pix_fmt);
217 for (slice = 0; slice <
c->slices; slice++) {
221 ret =
init_get_bits8_le(&cbit,
c->control_stream[plane_no][slice],
c->control_stream_size[plane_no][slice]);
225 ret =
init_get_bits8_le(&pbit,
c->packed_stream[plane_no][slice],
c->packed_stream_size[plane_no][slice]);
230 send = (
height * (slice + 1) /
c->slices) & cmask;
231 dest = dst + sstart *
stride;
236 for (p = dest; p < dst + send *
stride; p += 8) {
248 for (k = 0; k < 8; k++) {
268 for (slice = 0; slice <
c->slices; slice++) {
272 send = (
height * (slice + 1) /
c->slices) & cmask;
273 dest = dst + sstart *
stride;
276 for (j = sstart; j < send; j++) {
280 prev += (unsigned)pix;
294 for (slice = 0; slice <
c->slices; slice++) {
296 int slice_data_start, slice_data_end, slice_size;
299 send = (
height * (slice + 1) /
c->slices) & cmask;
300 dest = dst + sstart *
stride;
303 slice_data_start = slice ?
AV_RL32(
src + slice * 4 - 4) : 0;
305 slice_size = slice_data_end - slice_data_start;
309 "yet a slice has a length of zero.\n");
314 c->bdsp.bswap_buf((uint32_t *)
c->slice_bits,
315 (uint32_t *)(
src + slice_data_start +
c->slices * 4),
316 (slice_data_end - slice_data_start + 3) >> 2);
320 for (j = sstart; j < send; j++) {
335 "Slice decoding ran out of bits\n");
363 int slice_start, slice_height;
364 const int cmask = ~rmode;
366 for (slice = 0; slice < slices; slice++) {
367 slice_start = ((slice *
height) / slices) & cmask;
368 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
379 if (slice_height <= 1)
397 for (j = 2; j < slice_height; j++) {
415 int slice_start, slice_height;
416 const int cmask = ~(rmode ? 3 : 1);
417 const ptrdiff_t stride2 =
stride << 1;
419 for (slice = 0; slice < slices; slice++) {
420 slice_start = ((slice *
height) / slices) & cmask;
421 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
434 if (slice_height <= 1)
447 c->llviddsp.add_median_pred(
bsrc + 16,
bsrc - stride2 + 16,
454 for (j = 2; j < slice_height; j++) {
455 c->llviddsp.add_median_pred(
bsrc,
bsrc - stride2,
470 int slice_start, slice_height;
471 const int cmask = ~rmode;
474 for (slice = 0; slice < slices; slice++) {
475 slice_start = ((slice *
height) / slices) & cmask;
476 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
487 if (slice_height <= 1)
489 for (j = 1; j < slice_height; j++) {
492 for (
i = 1;
i < min_width;
i++) {
511 int slice_start, slice_height;
512 const int cmask = ~(rmode ? 3 : 1);
513 const ptrdiff_t stride2 =
stride << 1;
516 for (slice = 0; slice < slices; slice++) {
517 slice_start = ((slice *
height) / slices) & cmask;
518 slice_height = ((((slice + 1) *
height) / slices) & cmask) -
531 if (slice_height <= 1)
533 for (j = 1; j < slice_height; j++) {
536 for (
i = 1;
i < min_width;
i++) {
538 B =
bsrc[
i - (stride2 + 1)];
543 c->llviddsp.add_gradient_pred(
bsrc + 32, stride2,
width - 32);
564 int buf_size = avpkt->
size;
568 int plane_size, max_slice_size = 0, slice_start,
slice_end, slice_size;
588 if (bytestream2_get_byte(&gb) != 1)
591 c->offset = bytestream2_get_le32(&gb);
593 if (buf_size <= c->
offset + 8LL)
598 nb_cbs = bytestream2_get_le32(&pb);
599 if (nb_cbs >
c->offset)
602 packed_stream = buf + 8;
603 control_stream = packed_stream + (
c->offset - nb_cbs);
604 left = control_stream - packed_stream;
606 for (
i = 0;
i <
c->planes;
i++) {
607 for (j = 0; j <
c->slices; j++) {
608 c->packed_stream[
i][j] = packed_stream;
609 c->packed_stream_size[
i][j] = bytestream2_get_le32(&pb);
610 if (
c->packed_stream_size[
i][j] > left)
612 left -=
c->packed_stream_size[
i][j];
613 packed_stream +=
c->packed_stream_size[
i][j];
617 left = buf + buf_size - control_stream;
619 for (
i = 0;
i <
c->planes;
i++) {
620 for (j = 0; j <
c->slices; j++) {
621 c->control_stream[
i][j] = control_stream;
622 c->control_stream_size[
i][j] = bytestream2_get_le32(&pb);
623 if (
c->control_stream_size[
i][j] > left)
625 left -=
c->control_stream_size[
i][j];
626 control_stream +=
c->control_stream_size[
i][j];
634 c->frame_info = bytestream2_get_le32u(&gb);
635 c->slices = ((
c->frame_info >> 16) & 0xff) + 1;
636 for (
i = 0;
i <
c->planes;
i++) {
644 for (j = 0; j <
c->slices; j++) {
653 max_slice_size =
FFMAX(max_slice_size, slice_size);
659 plane_start[
c->planes] = gb.
buffer;
661 for (
i = 0;
i <
c->planes;
i++) {
670 for (j = 0; j <
c->slices; j++) {
679 max_slice_size =
FFMAX(max_slice_size, slice_size);
684 plane_start[
c->planes] = gb.
buffer;
689 c->frame_info = bytestream2_get_le32u(&gb);
694 c->frame_pred = (
c->frame_info >> 8) & 3;
696 max_slice_size += 4*avctx->
width;
702 if (!
c->slice_bits) {
708 switch (
c->avctx->pix_fmt) {
711 for (
i = 0;
i <
c->planes;
i++) {
719 if (!
c->interlaced) {
730 if (!
c->interlaced) {
748 for (
i = 0;
i <
c->planes;
i++) {
752 plane_start[
i + 1] - 1024,
762 for (
i = 0;
i < 3;
i++) {
769 if (!
c->interlaced) {
780 if (!
c->interlaced) {
794 for (
i = 0;
i < 3;
i++) {
801 if (!
c->interlaced) {
811 if (!
c->interlaced) {
824 for (
i = 0;
i < 3;
i++) {
831 if (!
c->interlaced) {
841 if (!
c->interlaced) {
854 for (
i = 0;
i < 3;
i++) {
857 plane_start[
i], plane_start[
i + 1] - 1024,
c->frame_pred ==
PRED_LEFT);
863 for (
i = 0;
i < 3;
i++) {
866 plane_start[
i], plane_start[
i + 1] - 1024,
c->frame_pred ==
PRED_LEFT);
886 int h_shift, v_shift;
894 c->slice_bits_size = 0;
897 case MKTAG(
'U',
'L',
'R',
'G'):
901 case MKTAG(
'U',
'L',
'R',
'A'):
905 case MKTAG(
'U',
'L',
'Y',
'0'):
910 case MKTAG(
'U',
'L',
'Y',
'2'):
915 case MKTAG(
'U',
'L',
'Y',
'4'):
920 case MKTAG(
'U',
'Q',
'Y',
'0'):
925 case MKTAG(
'U',
'Q',
'Y',
'2'):
930 case MKTAG(
'U',
'Q',
'R',
'G'):
935 case MKTAG(
'U',
'Q',
'R',
'A'):
940 case MKTAG(
'U',
'L',
'H',
'0'):
945 case MKTAG(
'U',
'L',
'H',
'2'):
950 case MKTAG(
'U',
'L',
'H',
'4'):
955 case MKTAG(
'U',
'M',
'Y',
'2'):
961 case MKTAG(
'U',
'M',
'H',
'2'):
967 case MKTAG(
'U',
'M',
'Y',
'4'):
973 case MKTAG(
'U',
'M',
'H',
'4'):
979 case MKTAG(
'U',
'M',
'R',
'G'):
984 case MKTAG(
'U',
'M',
'R',
'A'):
996 if ((avctx->
width & ((1<<h_shift)-1)) ||
997 (avctx->
height & ((1<<v_shift)-1))) {
1009 if (
c->compression != 2)
1021 if (
c->frame_info_size != 4)
1024 c->slices = (
c->flags >> 24) + 1;
1025 c->compression =
c->flags & 1;
1026 c->interlaced =
c->flags & 0x800;
1034 c->frame_info_size = 4;
1037 "Insufficient extradata size %d, should be at least 16\n",
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
void ff_free_vlc(VLC *vlc)
int ff_init_vlc_from_lengths(VLC *vlc_arg, int nb_bits, 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_vlc2()
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
static av_always_inline int bytestream2_get_bytes_left(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 MKTAG(a, b, c, d)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static enum AVPixelFormat pix_fmt
static float add(float src0, float src1)
static float sub(float src0, float src1)
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 av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
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_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.
@ AV_PICTURE_TYPE_I
Intra.
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
av_cold void ff_utvideodsp_init(UTVideoDSPContext *c)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void ff_llviddsp_init(LLVidDSPContext *c)
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
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 / SMPTE RP177 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
FF_ENABLE_DEPRECATION_WARNINGS int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *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
some codecs need / can use extradata like Huffman tables.
const char * name
Name of the codec implementation.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int key_frame
1 -> keyframe, 0-> not
int interlaced_frame
The content of the picture is interlaced.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
enum AVPictureType pict_type
Picture type of the frame.
This structure stores compressed data.
VLC_TYPE(* table)[2]
code, bits
#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)
AVCodec ff_utvideo_decoder
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)
static int compute_cmask(int plane_no, int interlaced, enum AVPixelFormat pix_fmt)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
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)
static int build_huff(UtvideoContext *c, const uint8_t *src, VLC *vlc, int *fsym, unsigned nb_elems)
static const uint8_t offset[127][2]