FFmpeg  4.4.8
magicyuv.c
Go to the documentation of this file.
1 /*
2  * MagicYUV decoder
3  * Copyright (c) 2016 Paul B Mahol
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 #include <stdlib.h>
23 #include <string.h>
24 
25 #define CACHED_BITSTREAM_READER !ARCH_X86_32
26 
27 #include "libavutil/pixdesc.h"
28 
29 #include "avcodec.h"
30 #include "bytestream.h"
31 #include "get_bits.h"
32 #include "huffyuvdsp.h"
33 #include "internal.h"
34 #include "lossless_videodsp.h"
35 #include "thread.h"
36 
37 typedef struct Slice {
38  uint32_t start;
39  uint32_t size;
40 } Slice;
41 
42 typedef enum Prediction {
43  LEFT = 1,
46 } Prediction;
47 
48 typedef struct HuffEntry {
49  uint8_t len;
50  uint16_t sym;
51 } HuffEntry;
52 
53 typedef struct MagicYUVContext {
55  int max;
56  int bps;
58  int nb_slices;
59  int planes; // number of encoded planes in bitstream
60  int decorrelate; // postprocessing work
61  int color_matrix; // video color matrix
62  int flags;
63  int interlaced; // video is interlaced
64  const uint8_t *buf; // pointer to AVPacket->data
65  int hshift[4];
66  int vshift[4];
67  Slice *slices[4]; // slice bitstream positions for each plane
68  unsigned int slices_size[4]; // slice sizes for each plane
69  VLC vlc[4]; // VLC for each plane
70  int (*magy_decode_slice)(AVCodecContext *avctx, void *tdata,
71  int j, int threadnr);
74 
75 static int huff_build(const uint8_t len[], uint16_t codes_pos[33],
76  VLC *vlc, int nb_elems, void *logctx)
77 {
78  HuffEntry he[4096];
79 
80  for (int i = 31; i > 0; i--)
81  codes_pos[i] += codes_pos[i + 1];
82 
83  for (unsigned i = nb_elems; i-- > 0;)
84  he[--codes_pos[len[i]]] = (HuffEntry){ len[i], i };
85 
86  ff_free_vlc(vlc);
87  return ff_init_vlc_from_lengths(vlc, FFMIN(he[0].len, 12), nb_elems,
88  &he[0].len, sizeof(he[0]),
89  &he[0].sym, sizeof(he[0]), sizeof(he[0].sym),
90  0, 0, logctx);
91 }
92 
93 static void magicyuv_median_pred16(uint16_t *dst, const uint16_t *src1,
94  const uint16_t *diff, intptr_t w,
95  int *left, int *left_top, int max)
96 {
97  int i;
98  uint16_t l, lt;
99 
100  l = *left;
101  lt = *left_top;
102 
103  for (i = 0; i < w; i++) {
104  l = mid_pred(l, src1[i], (l + src1[i] - lt)) + diff[i];
105  l &= max;
106  lt = src1[i];
107  dst[i] = l;
108  }
109 
110  *left = l;
111  *left_top = lt;
112 }
113 
114 static int magy_decode_slice10(AVCodecContext *avctx, void *tdata,
115  int j, int threadnr)
116 {
117  MagicYUVContext *s = avctx->priv_data;
118  int interlaced = s->interlaced;
119  const int bps = s->bps;
120  const int max = s->max - 1;
121  AVFrame *p = s->p;
122  int i, k, x;
123  GetBitContext gb;
124  uint16_t *dst;
125 
126  for (i = 0; i < s->planes; i++) {
127  int left, lefttop, top;
128  int height = AV_CEIL_RSHIFT(FFMIN(s->slice_height, avctx->coded_height - j * s->slice_height), s->vshift[i]);
129  int width = AV_CEIL_RSHIFT(avctx->coded_width, s->hshift[i]);
130  int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]);
131  ptrdiff_t fake_stride = (p->linesize[i] / 2) * (1 + interlaced);
132  ptrdiff_t stride = p->linesize[i] / 2;
133  int flags, pred;
134  int ret = init_get_bits8(&gb, s->buf + s->slices[i][j].start,
135  s->slices[i][j].size);
136 
137  if (ret < 0)
138  return ret;
139 
140  flags = get_bits(&gb, 8);
141  pred = get_bits(&gb, 8);
142 
143  dst = (uint16_t *)p->data[i] + j * sheight * stride;
144  if (flags & 1) {
145  if (get_bits_left(&gb) < bps * width * height)
146  return AVERROR_INVALIDDATA;
147  for (k = 0; k < height; k++) {
148  for (x = 0; x < width; x++)
149  dst[x] = get_bits(&gb, bps);
150 
151  dst += stride;
152  }
153  } else {
154  for (k = 0; k < height; k++) {
155  for (x = 0; x < width; x++) {
156  int pix;
157  if (get_bits_left(&gb) <= 0)
158  return AVERROR_INVALIDDATA;
159 
160  pix = get_vlc2(&gb, s->vlc[i].table, s->vlc[i].bits, 3);
161  if (pix < 0)
162  return AVERROR_INVALIDDATA;
163 
164  dst[x] = pix;
165  }
166  dst += stride;
167  }
168  }
169 
170  switch (pred) {
171  case LEFT:
172  dst = (uint16_t *)p->data[i] + j * sheight * stride;
173  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
174  dst += stride;
175  if (interlaced) {
176  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
177  dst += stride;
178  }
179  for (k = 1 + interlaced; k < height; k++) {
180  s->llviddsp.add_left_pred_int16(dst, dst, max, width, dst[-fake_stride]);
181  dst += stride;
182  }
183  break;
184  case GRADIENT:
185  dst = (uint16_t *)p->data[i] + j * sheight * stride;
186  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
187  dst += stride;
188  if (interlaced) {
189  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
190  dst += stride;
191  }
192  for (k = 1 + interlaced; k < height; k++) {
193  top = dst[-fake_stride];
194  left = top + dst[0];
195  dst[0] = left & max;
196  for (x = 1; x < width; x++) {
197  top = dst[x - fake_stride];
198  lefttop = dst[x - (fake_stride + 1)];
199  left += top - lefttop + dst[x];
200  dst[x] = left & max;
201  }
202  dst += stride;
203  }
204  break;
205  case MEDIAN:
206  dst = (uint16_t *)p->data[i] + j * sheight * stride;
207  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
208  dst += stride;
209  if (interlaced) {
210  s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
211  dst += stride;
212  }
213  if (1 + interlaced < height)
214  lefttop = left = dst[0];
215  for (k = 1 + interlaced; k < height; k++) {
216  magicyuv_median_pred16(dst, dst - fake_stride, dst, width, &left, &lefttop, max);
217  lefttop = left = dst[0];
218  dst += stride;
219  }
220  break;
221  default:
222  avpriv_request_sample(avctx, "Unknown prediction: %d", pred);
223  }
224  }
225 
226  if (s->decorrelate) {
227  int height = FFMIN(s->slice_height, avctx->coded_height - j * s->slice_height);
228  int width = avctx->coded_width;
229  uint16_t *r = (uint16_t *)p->data[0] + j * s->slice_height * p->linesize[0] / 2;
230  uint16_t *g = (uint16_t *)p->data[1] + j * s->slice_height * p->linesize[1] / 2;
231  uint16_t *b = (uint16_t *)p->data[2] + j * s->slice_height * p->linesize[2] / 2;
232 
233  for (i = 0; i < height; i++) {
234  for (k = 0; k < width; k++) {
235  b[k] = (b[k] + g[k]) & max;
236  r[k] = (r[k] + g[k]) & max;
237  }
238  b += p->linesize[0] / 2;
239  g += p->linesize[1] / 2;
240  r += p->linesize[2] / 2;
241  }
242  }
243 
244  return 0;
245 }
246 
247 static int magy_decode_slice(AVCodecContext *avctx, void *tdata,
248  int j, int threadnr)
249 {
250  MagicYUVContext *s = avctx->priv_data;
251  int interlaced = s->interlaced;
252  AVFrame *p = s->p;
253  int i, k, x, min_width;
254  GetBitContext gb;
255  uint8_t *dst;
256 
257  for (i = 0; i < s->planes; i++) {
258  int left, lefttop, top;
259  int height = AV_CEIL_RSHIFT(FFMIN(s->slice_height, avctx->coded_height - j * s->slice_height), s->vshift[i]);
260  int width = AV_CEIL_RSHIFT(avctx->coded_width, s->hshift[i]);
261  int sheight = AV_CEIL_RSHIFT(s->slice_height, s->vshift[i]);
262  ptrdiff_t fake_stride = p->linesize[i] * (1 + interlaced);
263  ptrdiff_t stride = p->linesize[i];
264  const uint8_t *slice = s->buf + s->slices[i][j].start;
265  int flags, pred;
266 
267  flags = bytestream_get_byte(&slice);
268  pred = bytestream_get_byte(&slice);
269 
270  dst = p->data[i] + j * sheight * stride;
271  if (flags & 1) {
272  if (s->slices[i][j].size - 2 < width * height)
273  return AVERROR_INVALIDDATA;
274  for (k = 0; k < height; k++) {
275  bytestream_get_buffer(&slice, dst, width);
276  dst += stride;
277  }
278  } else {
279  int ret = init_get_bits8(&gb, slice, s->slices[i][j].size - 2);
280 
281  if (ret < 0)
282  return ret;
283 
284  for (k = 0; k < height; k++) {
285  for (x = 0; x < width; x++) {
286  int pix;
287  if (get_bits_left(&gb) <= 0)
288  return AVERROR_INVALIDDATA;
289 
290  pix = get_vlc2(&gb, s->vlc[i].table, s->vlc[i].bits, 3);
291  if (pix < 0)
292  return AVERROR_INVALIDDATA;
293 
294  dst[x] = pix;
295  }
296  dst += stride;
297  }
298  }
299 
300  switch (pred) {
301  case LEFT:
302  dst = p->data[i] + j * sheight * stride;
303  s->llviddsp.add_left_pred(dst, dst, width, 0);
304  dst += stride;
305  if (interlaced) {
306  s->llviddsp.add_left_pred(dst, dst, width, 0);
307  dst += stride;
308  }
309  for (k = 1 + interlaced; k < height; k++) {
310  s->llviddsp.add_left_pred(dst, dst, width, dst[-fake_stride]);
311  dst += stride;
312  }
313  break;
314  case GRADIENT:
315  dst = p->data[i] + j * sheight * stride;
316  s->llviddsp.add_left_pred(dst, dst, width, 0);
317  dst += stride;
318  if (interlaced) {
319  s->llviddsp.add_left_pred(dst, dst, width, 0);
320  dst += stride;
321  }
322  min_width = FFMIN(width, 32);
323  for (k = 1 + interlaced; k < height; k++) {
324  top = dst[-fake_stride];
325  left = top + dst[0];
326  dst[0] = left;
327  for (x = 1; x < min_width; x++) { /* dsp need aligned 32 */
328  top = dst[x - fake_stride];
329  lefttop = dst[x - (fake_stride + 1)];
330  left += top - lefttop + dst[x];
331  dst[x] = left;
332  }
333  if (width > 32)
334  s->llviddsp.add_gradient_pred(dst + 32, fake_stride, width - 32);
335  dst += stride;
336  }
337  break;
338  case MEDIAN:
339  dst = p->data[i] + j * sheight * stride;
340  s->llviddsp.add_left_pred(dst, dst, width, 0);
341  dst += stride;
342  if (interlaced) {
343  s->llviddsp.add_left_pred(dst, dst, width, 0);
344  dst += stride;
345  }
346  if (1 + interlaced < height)
347  lefttop = left = dst[0];
348  for (k = 1 + interlaced; k < height; k++) {
349  s->llviddsp.add_median_pred(dst, dst - fake_stride,
350  dst, width, &left, &lefttop);
351  lefttop = left = dst[0];
352  dst += stride;
353  }
354  break;
355  default:
356  avpriv_request_sample(avctx, "Unknown prediction: %d", pred);
357  }
358  }
359 
360  if (s->decorrelate) {
361  int height = FFMIN(s->slice_height, avctx->coded_height - j * s->slice_height);
362  int width = avctx->coded_width;
363  uint8_t *b = p->data[0] + j * s->slice_height * p->linesize[0];
364  uint8_t *g = p->data[1] + j * s->slice_height * p->linesize[1];
365  uint8_t *r = p->data[2] + j * s->slice_height * p->linesize[2];
366 
367  for (i = 0; i < height; i++) {
368  s->llviddsp.add_bytes(b, g, width);
369  s->llviddsp.add_bytes(r, g, width);
370  b += p->linesize[0];
371  g += p->linesize[1];
372  r += p->linesize[2];
373  }
374  }
375 
376  return 0;
377 }
378 
379 static int build_huffman(AVCodecContext *avctx, const uint8_t *table,
380  int table_size, int max)
381 {
382  MagicYUVContext *s = avctx->priv_data;
383  GetByteContext gb;
384  uint8_t len[4096];
385  uint16_t length_count[33] = { 0 };
386  int i = 0, j = 0, k;
387 
388  bytestream2_init(&gb, table, table_size);
389 
390  while (bytestream2_get_bytes_left(&gb) > 0) {
391  int b = bytestream2_peek_byteu(&gb) & 0x80;
392  int x = bytestream2_get_byteu(&gb) & ~0x80;
393  int l = 1;
394 
395  if (b) {
396  if (bytestream2_get_bytes_left(&gb) <= 0)
397  break;
398  l += bytestream2_get_byteu(&gb);
399  }
400  k = j + l;
401  if (k > max || x == 0 || x > 32) {
402  av_log(avctx, AV_LOG_ERROR, "Invalid Huffman codes\n");
403  return AVERROR_INVALIDDATA;
404  }
405 
406  length_count[x] += l;
407  for (; j < k; j++)
408  len[j] = x;
409 
410  if (j == max) {
411  j = 0;
412  if (huff_build(len, length_count, &s->vlc[i], max, avctx)) {
413  av_log(avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");
414  return AVERROR_INVALIDDATA;
415  }
416  i++;
417  if (i == s->planes) {
418  break;
419  }
420  memset(length_count, 0, sizeof(length_count));
421  }
422  }
423 
424  if (i != s->planes) {
425  av_log(avctx, AV_LOG_ERROR, "Huffman tables too short\n");
426  return AVERROR_INVALIDDATA;
427  }
428 
429  return 0;
430 }
431 
432 static int magy_decode_frame(AVCodecContext *avctx, void *data,
433  int *got_frame, AVPacket *avpkt)
434 {
435  MagicYUVContext *s = avctx->priv_data;
436  ThreadFrame frame = { .f = data };
437  AVFrame *p = data;
438  GetByteContext gb;
439  uint32_t first_offset, offset, next_offset, header_size, slice_width;
440  int width, height, format, version, table_size;
441  int ret, i, j;
442 
443  if (avpkt->size < 36)
444  return AVERROR_INVALIDDATA;
445 
446  bytestream2_init(&gb, avpkt->data, avpkt->size);
447  if (bytestream2_get_le32u(&gb) != MKTAG('M', 'A', 'G', 'Y'))
448  return AVERROR_INVALIDDATA;
449 
450  header_size = bytestream2_get_le32u(&gb);
451  if (header_size < 32 || header_size >= avpkt->size) {
452  av_log(avctx, AV_LOG_ERROR,
453  "header or packet too small %"PRIu32"\n", header_size);
454  return AVERROR_INVALIDDATA;
455  }
456 
457  version = bytestream2_get_byteu(&gb);
458  if (version != 7) {
459  avpriv_request_sample(avctx, "Version %d", version);
460  return AVERROR_PATCHWELCOME;
461  }
462 
463  s->hshift[1] =
464  s->vshift[1] =
465  s->hshift[2] =
466  s->vshift[2] = 0;
467  s->decorrelate = 0;
468  s->bps = 8;
469 
470  format = bytestream2_get_byteu(&gb);
471  switch (format) {
472  case 0x65:
473  avctx->pix_fmt = AV_PIX_FMT_GBRP;
474  s->decorrelate = 1;
475  break;
476  case 0x66:
477  avctx->pix_fmt = AV_PIX_FMT_GBRAP;
478  s->decorrelate = 1;
479  break;
480  case 0x67:
481  avctx->pix_fmt = AV_PIX_FMT_YUV444P;
482  break;
483  case 0x68:
484  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
485  s->hshift[1] =
486  s->hshift[2] = 1;
487  break;
488  case 0x69:
489  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
490  s->hshift[1] =
491  s->vshift[1] =
492  s->hshift[2] =
493  s->vshift[2] = 1;
494  break;
495  case 0x6a:
496  avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
497  break;
498  case 0x6b:
499  avctx->pix_fmt = AV_PIX_FMT_GRAY8;
500  break;
501  case 0x6c:
502  avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
503  s->hshift[1] =
504  s->hshift[2] = 1;
505  s->bps = 10;
506  break;
507  case 0x76:
508  avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
509  s->bps = 10;
510  break;
511  case 0x6d:
512  avctx->pix_fmt = AV_PIX_FMT_GBRP10;
513  s->decorrelate = 1;
514  s->bps = 10;
515  break;
516  case 0x6e:
517  avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
518  s->decorrelate = 1;
519  s->bps = 10;
520  break;
521  case 0x6f:
522  avctx->pix_fmt = AV_PIX_FMT_GBRP12;
523  s->decorrelate = 1;
524  s->bps = 12;
525  break;
526  case 0x70:
527  avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
528  s->decorrelate = 1;
529  s->bps = 12;
530  break;
531  case 0x73:
532  avctx->pix_fmt = AV_PIX_FMT_GRAY10;
533  s->bps = 10;
534  break;
535  case 0x7b:
536  avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
537  s->hshift[1] =
538  s->vshift[1] =
539  s->hshift[2] =
540  s->vshift[2] = 1;
541  s->bps = 10;
542  break;
543  default:
544  avpriv_request_sample(avctx, "Format 0x%X", format);
545  return AVERROR_PATCHWELCOME;
546  }
547  s->max = 1 << s->bps;
548  s->magy_decode_slice = s->bps == 8 ? magy_decode_slice : magy_decode_slice10;
549  s->planes = av_pix_fmt_count_planes(avctx->pix_fmt);
550 
551  bytestream2_skipu(&gb, 1);
552  s->color_matrix = bytestream2_get_byteu(&gb);
553  s->flags = bytestream2_get_byteu(&gb);
554  s->interlaced = !!(s->flags & 2);
555  bytestream2_skipu(&gb, 3);
556 
557  width = bytestream2_get_le32u(&gb);
558  height = bytestream2_get_le32u(&gb);
559  ret = ff_set_dimensions(avctx, width, height);
560  if (ret < 0)
561  return ret;
562 
563  slice_width = bytestream2_get_le32u(&gb);
564  if (slice_width != avctx->coded_width) {
565  avpriv_request_sample(avctx, "Slice width %"PRIu32, slice_width);
566  return AVERROR_PATCHWELCOME;
567  }
568  s->slice_height = bytestream2_get_le32u(&gb);
569  if (s->slice_height <= 0 || s->slice_height > INT_MAX - avctx->coded_height) {
570  av_log(avctx, AV_LOG_ERROR,
571  "invalid slice height: %d\n", s->slice_height);
572  return AVERROR_INVALIDDATA;
573  }
574  if (s->vshift[1] && (s->slice_height & ((1 << s->vshift[1]) - 1))) {
575  av_log(avctx, AV_LOG_ERROR,
576  "slice_height %d is not aligned to chroma vertical "
577  "subsampling (must be a multiple of %d)\n",
578  s->slice_height, 1 << s->vshift[1]);
579  return AVERROR_INVALIDDATA;
580  }
581 
582  bytestream2_skipu(&gb, 4);
583 
584  s->nb_slices = (avctx->coded_height + s->slice_height - 1) / s->slice_height;
585  if (s->nb_slices > INT_MAX / FFMAX(sizeof(Slice), 4 * 5)) {
586  av_log(avctx, AV_LOG_ERROR,
587  "invalid number of slices: %d\n", s->nb_slices);
588  return AVERROR_INVALIDDATA;
589  }
590 
591  if ((s->slice_height >> s->vshift[1]) <= s->interlaced) {
592  av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
593  return AVERROR_INVALIDDATA;
594  }
595  if (s->interlaced) {
596  if ((avctx->coded_height % s->slice_height) && ((avctx->coded_height % s->slice_height) >> s->vshift[1]) < 2) {
597  av_log(avctx, AV_LOG_ERROR, "impossible height\n");
598  return AVERROR_INVALIDDATA;
599  }
600  }
601 
602  if (bytestream2_get_bytes_left(&gb) <= s->nb_slices * s->planes * 5)
603  return AVERROR_INVALIDDATA;
604  for (i = 0; i < s->planes; i++) {
605  av_fast_malloc(&s->slices[i], &s->slices_size[i], s->nb_slices * sizeof(Slice));
606  if (!s->slices[i])
607  return AVERROR(ENOMEM);
608 
609  offset = bytestream2_get_le32u(&gb);
610  if (offset >= avpkt->size - header_size)
611  return AVERROR_INVALIDDATA;
612 
613  if (i == 0)
614  first_offset = offset;
615 
616  for (j = 0; j < s->nb_slices - 1; j++) {
617  s->slices[i][j].start = offset + header_size;
618 
619  next_offset = bytestream2_get_le32u(&gb);
620  if (next_offset <= offset || next_offset >= avpkt->size - header_size)
621  return AVERROR_INVALIDDATA;
622 
623  s->slices[i][j].size = next_offset - offset;
624  if (s->slices[i][j].size < 2)
625  return AVERROR_INVALIDDATA;
626  offset = next_offset;
627  }
628 
629  s->slices[i][j].start = offset + header_size;
630  s->slices[i][j].size = avpkt->size - s->slices[i][j].start;
631 
632  if (s->slices[i][j].size < 2)
633  return AVERROR_INVALIDDATA;
634  }
635 
636  if (bytestream2_get_byteu(&gb) != s->planes)
637  return AVERROR_INVALIDDATA;
638 
639  bytestream2_skipu(&gb, s->nb_slices * s->planes);
640 
641  table_size = header_size + first_offset - bytestream2_tell(&gb);
642  if (table_size < 2)
643  return AVERROR_INVALIDDATA;
644 
645  ret = build_huffman(avctx, avpkt->data + bytestream2_tell(&gb),
646  table_size, s->max);
647  if (ret < 0)
648  return ret;
649 
651  p->key_frame = 1;
652 
653  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
654  return ret;
655 
656  s->buf = avpkt->data;
657  s->p = p;
658  avctx->execute2(avctx, s->magy_decode_slice, NULL, NULL, s->nb_slices);
659 
660  if (avctx->pix_fmt == AV_PIX_FMT_GBRP ||
661  avctx->pix_fmt == AV_PIX_FMT_GBRAP ||
662  avctx->pix_fmt == AV_PIX_FMT_GBRP10 ||
663  avctx->pix_fmt == AV_PIX_FMT_GBRAP10||
664  avctx->pix_fmt == AV_PIX_FMT_GBRAP12||
665  avctx->pix_fmt == AV_PIX_FMT_GBRP12) {
666  FFSWAP(uint8_t*, p->data[0], p->data[1]);
667  FFSWAP(int, p->linesize[0], p->linesize[1]);
668  } else {
669  switch (s->color_matrix) {
670  case 1:
672  break;
673  case 2:
675  break;
676  }
677  p->color_range = (s->flags & 4) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
678  }
679 
680  *got_frame = 1;
681 
682  return avpkt->size;
683 }
684 
686 {
687  MagicYUVContext *s = avctx->priv_data;
688  ff_llviddsp_init(&s->llviddsp);
689  return 0;
690 }
691 
693 {
694  MagicYUVContext * const s = avctx->priv_data;
695  int i;
696 
697  for (i = 0; i < FF_ARRAY_ELEMS(s->slices); i++) {
698  av_freep(&s->slices[i]);
699  s->slices_size[i] = 0;
700  ff_free_vlc(&s->vlc[i]);
701  }
702 
703  return 0;
704 }
705 
707  .name = "magicyuv",
708  .long_name = NULL_IF_CONFIG_SMALL("MagicYUV video"),
709  .type = AVMEDIA_TYPE_VIDEO,
710  .id = AV_CODEC_ID_MAGICYUV,
711  .priv_data_size = sizeof(MagicYUVContext),
713  .close = magy_decode_end,
715  .capabilities = AV_CODEC_CAP_DR1 |
718  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
719 };
static const char *const format[]
Definition: af_aiir.c:456
#define av_cold
Definition: attributes.h:88
uint8_t
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:431
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()
Definition: bitstream.c:381
static av_always_inline unsigned int bytestream_get_buffer(const uint8_t **b, uint8_t *dst, unsigned int size)
Definition: bytestream.h:363
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:174
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:192
#define flags(name, subs,...)
Definition: cbs_av1.c:572
#define s(width, name)
Definition: cbs_vp9.c:257
#define FFSWAP(type, a, b)
Definition: common.h:108
#define FFMIN(a, b)
Definition: common.h:105
#define MKTAG(a, b, c, d)
Definition: common.h:478
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:58
#define FFMAX(a, b)
Definition: common.h:103
#define NULL
Definition: coverity.c:32
#define max(a, b)
Definition: cuda_runtime.h:33
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
static AVFrame * frame
int
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:849
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:112
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:108
@ AV_CODEC_ID_MAGICYUV
Definition: codec_id.h:269
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define AVERROR(e)
Definition: error.h:43
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:502
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
for(j=16;j >0;--j)
int i
Definition: input.c:407
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:41
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:84
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
version
Definition: libkvazaar.c:326
uint8_t w
Definition: llviddspenc.c:39
void ff_llviddsp_init(LLVidDSPContext *c)
int stride
Definition: mace.c:144
static av_cold int magy_decode_init(AVCodecContext *avctx)
Definition: magicyuv.c:685
static av_cold int magy_decode_end(AVCodecContext *avctx)
Definition: magicyuv.c:692
static int magy_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: magicyuv.c:432
static int magy_decode_slice10(AVCodecContext *avctx, void *tdata, int j, int threadnr)
Definition: magicyuv.c:114
static int huff_build(const uint8_t len[], uint16_t codes_pos[33], VLC *vlc, int nb_elems, void *logctx)
Definition: magicyuv.c:75
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)
Definition: magicyuv.c:93
Prediction
Definition: magicyuv.c:42
@ LEFT
Definition: magicyuv.c:43
@ GRADIENT
Definition: magicyuv.c:44
@ MEDIAN
Definition: magicyuv.c:45
AVCodec ff_magicyuv_decoder
Definition: magicyuv.c:706
static int build_huffman(AVCodecContext *avctx, const uint8_t *table, int table_size, int max)
Definition: magicyuv.c:379
static int magy_decode_slice(AVCodecContext *avctx, void *tdata, int j, int threadnr)
Definition: magicyuv.c:247
#define mid_pred
Definition: mathops.h:97
unsigned bps
Definition: movenc.c:1612
const char data[16]
Definition: mxf.c:142
uint8_t interlaced
Definition: mxfenc.c:2208
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2613
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:420
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:399
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:569
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:586
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:415
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:400
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:416
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:177
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:215
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:380
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:419
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:402
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
Definition: pixfmt.h:514
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition: pixfmt.h:518
static const uint16_t table[]
Definition: prosumer.c:206
FF_ENABLE_DEPRECATION_WARNINGS int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define FF_ARRAY_ELEMS(a)
static const float pred[4]
Definition: siprdata.h:259
main external API structure.
Definition: avcodec.h:536
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
int coded_height
Definition: avcodec.h:724
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.
Definition: avcodec.h:1848
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:724
void * priv_data
Definition: avcodec.h:563
AVCodec.
Definition: codec.h:197
const char * name
Name of the codec implementation.
Definition: codec.h:204
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:332
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:396
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: frame.h:562
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:573
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:349
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:401
This structure stores compressed data.
Definition: packet.h:346
int size
Definition: packet.h:370
uint8_t * data
Definition: packet.h:369
Definition: exr.c:93
uint8_t len
Definition: exr.c:94
uint16_t sym
Definition: exr.c:95
int color_matrix
Definition: magicyuv.c:61
int slice_height
Definition: magicyuv.c:57
int hshift[4]
Definition: magicyuv.c:65
int vshift[4]
Definition: magicyuv.c:66
AVFrame * p
Definition: magicyuv.c:54
int(* magy_decode_slice)(AVCodecContext *avctx, void *tdata, int j, int threadnr)
Definition: magicyuv.c:70
VLC vlc[4]
Definition: magicyuv.c:69
LLVidDSPContext llviddsp
Definition: magicyuv.c:72
const uint8_t * buf
Definition: magicyuv.c:64
unsigned int slices_size[4]
Definition: magicyuv.c:68
Slice * slices[4]
Definition: magicyuv.c:67
Definition: magicyuv.c:37
uint32_t start
Definition: magicyuv.c:38
uint32_t size
Definition: magicyuv.c:39
Definition: vlc.h:26
#define avpriv_request_sample(...)
#define av_freep(p)
#define av_log(a,...)
#define src1
Definition: h264pred.c:140
#define height
#define width
const char * b
Definition: vf_curves.c:119
const char * g
Definition: vf_curves.c:118
const char * r
Definition: vf_curves.c:117
if(ret< 0)
Definition: vf_mcdeint.c:282
static av_always_inline int diff(const uint32_t a, const uint32_t b)
static const uint8_t offset[127][2]
Definition: vf_spp.c:107
int len