25#define CACHED_BITSTREAM_READER !ARCH_X86_32
82 const uint8_t
len[], uint16_t codes_pos[33],
88 for (
int i = 31;
i > 0;
i--)
89 codes_pos[
i] += codes_pos[
i + 1];
91 for (
unsigned i = nb_elems;
i-- > 0;)
97 &he[0].
len,
sizeof(he[0]),
98 &he[0].sym,
sizeof(he[0]),
sizeof(he[0].sym),
103 const uint16_t *
diff, intptr_t
w,
104 int *
left,
int *left_top,
int max)
112 for (
i = 0;
i <
w;
i++) {
123#define READ_PLANE(dst, plane, b, c) \
126 for (; CACHED_BITSTREAM_READER && x < width-c && get_bits_left(&gb) > 0;) {\
127 ret = get_vlc_multi(&gb, (uint8_t *)dst + x * b, multi, \
128 vlc, vlc_bits, 3, b); \
130 return AVERROR_INVALIDDATA; \
133 for (; x < width && get_bits_left(&gb) > 0; x++) \
134 dst[x] = get_vlc2(&gb, vlc, vlc_bits, 3); \
143 const int bps =
s->bps;
144 const int max =
s->max - 1;
150 for (
i = 0;
i <
s->planes;
i++) {
151 int left, lefttop, top;
155 ptrdiff_t fake_stride = (p->linesize[
i] / 2) * (1 +
interlaced);
156 ptrdiff_t
stride = p->linesize[
i] / 2;
158 const VLCElem *
const vlc =
s->vlc[
i].table;
159 const int vlc_bits =
s->vlc[
i].bits;
162 s->slices[
i][j].size);
170 dst = (uint16_t *)p->data[
i] + j * sheight *
stride;
174 for (k = 0; k <
height; k++) {
175 for (x = 0; x <
width; x++)
181 for (k = 0; k <
height; k++)
187 dst = (uint16_t *)p->data[
i] + j * sheight *
stride;
200 dst = (uint16_t *)p->data[
i] + j * sheight *
stride;
208 top =
dst[-fake_stride];
211 for (x = 1; x <
width; x++) {
212 top =
dst[x - fake_stride];
213 lefttop =
dst[x - (fake_stride + 1)];
214 left += top - lefttop +
dst[x];
221 dst = (uint16_t *)p->data[
i] + j * sheight *
stride;
241 if (
s->decorrelate) {
244 uint16_t *
r = (uint16_t *)p->data[0] + j *
s->slice_height * p->linesize[0] / 2;
245 uint16_t *
g = (uint16_t *)p->data[1] + j *
s->slice_height * p->linesize[1] / 2;
246 uint16_t *
b = (uint16_t *)p->data[2] + j *
s->slice_height * p->linesize[2] / 2;
249 for (k = 0; k <
width; k++) {
250 b[k] = (
b[k] +
g[k]) &
max;
251 r[k] = (
r[k] +
g[k]) &
max;
253 b += p->linesize[0] / 2;
254 g += p->linesize[1] / 2;
255 r += p->linesize[2] / 2;
268 int i, k, x, min_width;
272 for (
i = 0;
i <
s->planes;
i++) {
273 int left, lefttop, top;
277 ptrdiff_t fake_stride = p->linesize[
i] * (1 +
interlaced);
278 ptrdiff_t
stride = p->linesize[
i];
279 const uint8_t *slice =
s->buf +
s->slices[
i][j].start;
281 const VLCElem *
const vlc =
s->vlc[
i].table;
282 const int vlc_bits =
s->vlc[
i].bits;
285 flags = bytestream_get_byte(&slice);
286 pred = bytestream_get_byte(&slice);
292 for (k = 0; k <
height; k++) {
302 for (k = 0; k <
height; k++)
330 top =
dst[-fake_stride];
333 for (x = 1; x < min_width; x++) {
334 top =
dst[x - fake_stride];
335 lefttop =
dst[x - (fake_stride + 1)];
336 left += top - lefttop +
dst[x];
340 s->llviddsp.add_gradient_pred(
dst + 32, fake_stride,
width - 32);
355 s->llviddsp.add_median_pred(
dst,
dst - fake_stride,
366 if (
s->decorrelate) {
369 uint8_t *
b = p->data[0] + j *
s->slice_height * p->linesize[0];
370 uint8_t *
g = p->data[1] + j *
s->slice_height * p->linesize[1];
371 uint8_t *
r = p->data[2] + j *
s->slice_height * p->linesize[2];
386 int table_size,
int max)
390 uint8_t *
len =
s->len;
391 uint16_t length_count[33] = { 0 };
397 int b = bytestream2_peek_byteu(&gb) & 0x80;
398 int x = bytestream2_get_byteu(&gb) & ~0x80;
404 l += bytestream2_get_byteu(&gb);
407 if (k >
max || x == 0 || x > 32) {
412 length_count[x] += l;
423 if (
i ==
s->planes) {
426 memset(length_count, 0,
sizeof(length_count));
430 if (
i !=
s->planes) {
443 uint32_t first_offset,
offset, next_offset, header_size, slice_width;
447 if (avpkt->
size < 36)
451 if (bytestream2_get_le32u(&gb) !=
MKTAG(
'M',
'A',
'G',
'Y'))
454 header_size = bytestream2_get_le32u(&gb);
455 if (header_size < 32 || header_size >= avpkt->
size) {
457 "header or packet too small %"PRIu32
"\n", header_size);
461 version = bytestream2_get_byteu(&gb);
467 format = bytestream2_get_byteu(&gb);
527 s->hshift[1] =
s->hshift[2] =
desc->log2_chroma_w;
528 s->vshift[1] =
s->vshift[2] =
desc->log2_chroma_h;
529 s->bps =
desc->comp[0].depth;
530 s->max = 1 <<
s->bps;
535 s->color_matrix = bytestream2_get_byteu(&gb);
536 s->flags = bytestream2_get_byteu(&gb);
537 s->interlaced = !!(
s->flags & 2);
540 width = bytestream2_get_le32u(&gb);
541 height = bytestream2_get_le32u(&gb);
546 slice_width = bytestream2_get_le32u(&gb);
551 s->slice_height = bytestream2_get_le32u(&gb);
552 if (
s->slice_height <= 0 ||
s->slice_height > INT_MAX - avctx->
coded_height) {
554 "invalid slice height: %d\n",
s->slice_height);
557 if (
s->vshift[1] && (
s->slice_height & ((1 <<
s->vshift[1]) - 1))) {
559 "slice_height %d is not aligned to chroma vertical "
560 "subsampling (must be a multiple of %d)\n",
561 s->slice_height, 1 <<
s->vshift[1]);
567 s->nb_slices = (avctx->
coded_height +
s->slice_height - 1) /
s->slice_height;
568 if (
s->nb_slices > INT_MAX /
FFMAX(
sizeof(
Slice), 4 * 5)) {
570 "invalid number of slices: %d\n",
s->nb_slices);
574 if ((
s->slice_height >>
s->vshift[1]) <=
s->interlaced) {
587 for (
i = 0;
i <
s->planes;
i++) {
592 offset = bytestream2_get_le32u(&gb);
599 for (j = 0; j <
s->nb_slices - 1; j++) {
600 s->slices[
i][j].start =
offset + header_size;
602 next_offset = bytestream2_get_le32u(&gb);
603 if (next_offset <= offset || next_offset >= avpkt->
size - header_size)
606 s->slices[
i][j].size = next_offset -
offset;
607 if (
s->slices[
i][j].size < 2)
612 s->slices[
i][j].start =
offset + header_size;
613 s->slices[
i][j].size = avpkt->
size -
s->slices[
i][j].start;
615 if (
s->slices[
i][j].size < 2)
619 if (bytestream2_get_byteu(&gb) !=
s->planes)
636 s->buf = avpkt->
data;
641 FFSWAP(uint8_t*, p->data[0], p->data[1]);
642 FFSWAP(
int, p->linesize[0], p->linesize[1]);
644 switch (
s->color_matrix) {
674 s->slices_size[
i] = 0;
683 .p.name =
"magicyuv",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static const char *const format[]
const FFCodec ff_magicyuv_decoder
static av_cold void close(AVCodecParserContext *s)
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
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 unsigned int bytestream_get_buffer(const uint8_t **b, uint8_t *dst, unsigned int size)
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 int bytestream2_tell(const GetByteContext *g)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define AV_CEIL_RSHIFT(a, b)
int ff_set_dimensions(AVCodecContext *s, int width, int height)
int(* init)(AVBSFContext *ctx)
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#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.
Multithreading API for decoders.
av_cold void ff_llviddsp_init(LLVidDSPContext *c)
#define FFSWAP(type, a, b)
#define MKTAG(a, b, c, d)
static av_cold int magy_decode_init(AVCodecContext *avctx)
static av_cold int magy_decode_end(AVCodecContext *avctx)
static int magy_decode_slice10(AVCodecContext *avctx, void *tdata, int j, int threadnr)
#define READ_PLANE(dst, plane, b, c)
static void magicyuv_median_pred16(uint16_t *dst, const uint16_t *src1, const uint16_t *diff, intptr_t w, int *left, int *left_top, int max)
static int build_huffman(AVCodecContext *avctx, const uint8_t *table, int table_size, int max)
static int magy_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
static int huff_build(AVCodecContext *avctx, const uint8_t len[], uint16_t codes_pos[33], VLC *vlc, VLC_MULTI *multi, int nb_elems, void *logctx)
static int magy_decode_slice(AVCodecContext *avctx, void *tdata, int j, int threadnr)
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
#define AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_YUV420P10
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_JPEG
Full range content.
#define AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GBRP12
@ 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_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A 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_GRAY10
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P10
@ 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
static const uint16_t table[]
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define FF_ARRAY_ELEMS(a)
static const float pred[4]
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
int coded_width
Bitstream width / height, may be different from width/height e.g.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
int(* magy_decode_slice)(AVCodecContext *avctx, void *tdata, int j, int threadnr)
unsigned int slices_size[4]
#define avpriv_request_sample(...)
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
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)