FFmpeg
rv60dec.c
Go to the documentation of this file.
1 /*
2  * RV60 decoder
3  * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov
4  * Copyright (C) 2023 Peter Ross
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "avcodec.h"
24 #include "codec_internal.h"
25 #include "decode.h"
26 #include "get_bits.h"
27 #include "golomb.h"
28 #include "libavutil/mem.h"
29 #include "rv60data.h"
30 #include "rv60dsp.h"
31 #include "rv60vlcs.h"
32 #include "threadprogress.h"
33 #include "unary.h"
34 #include "videodsp.h"
35 
37 
38 enum CUType {
39  CU_INTRA = 0,
43 };
44 
45 enum PUType {
46  PU_FULL = 0,
54 };
55 
56 enum IntraMode {
61 };
62 
63 enum MVRefEnum {
73 };
74 
76 
77 enum {
82 };
83 
84 static const VLCElem * cbp8_vlc[7][4];
85 static const VLCElem * cbp16_vlc[7][4][4];
86 
87 typedef struct {
88  const VLCElem * l0[2];
89  const VLCElem * l12[2];
90  const VLCElem * l3[2];
91  const VLCElem * esc;
92 } CoeffVLCs;
93 
96 
97 #define MAX_VLC_SIZE 864
98 static VLCElem table_data[129148];
99 
100 /* 32-bit version of rv34_gen_vlc */
101 static const VLCElem * gen_vlc(const uint8_t * bits, int size, VLCInitState * state)
102 {
103  int counts[17] = {0};
104  uint32_t codes[18];
105  uint32_t cw[MAX_VLC_SIZE];
106 
107  for (int i = 0; i < size; i++)
108  counts[bits[i]]++;
109 
110  codes[0] = counts[0] = 0;
111  for (int i = 0; i < 17; i++)
112  codes[i+1] = (codes[i] + counts[i]) << 1;
113 
114  for (int i = 0; i < size; i++)
115  cw[i] = codes[bits[i]]++;
116 
117  return ff_vlc_init_tables(state, 9, size,
118  bits, 1, 1,
119  cw, 4, 4, 0);
120 }
121 
122 static void build_coeff_vlc(const CoeffLens * lens, CoeffVLCs * vlc, int count, VLCInitState * state)
123 {
124  for (int i = 0; i < count; i++) {
125  for (int j = 0; j < 2; j++) {
126  vlc[i].l0[j] = gen_vlc(lens[i].l0[j], 864, state);
127  vlc[i].l12[j] = gen_vlc(lens[i].l12[j], 108, state);
128  vlc[i].l3[j] = gen_vlc(lens[i].l3[j], 108, state);
129  }
130  vlc[i].esc = gen_vlc(lens[i].esc, 32, state);
131  }
132 }
133 
135 {
137 
138  for (int i = 0; i < 7; i++)
139  for (int j = 0; j < 4; j++)
140  cbp16_vlc[i][0][j] = cbp8_vlc[i][j] = gen_vlc(rv60_cbp8_lens[i][j], 64, &state);
141 
142  for (int i = 0; i < 7; i++)
143  for (int j = 0; j < 3; j++)
144  for (int k = 0; k < 4; k++)
145  cbp16_vlc[i][j + 1][k] = gen_vlc(rv60_cbp16_lens[i][j][k], 64, &state);
146 
149 }
150 
151 typedef struct {
152  int sign;
153  int size;
154  const uint8_t * data;
156 } Slice;
157 
158 typedef struct {
160  uint8_t cu_split[1+4+16+64];
161 
162  uint8_t coded_blk[64];
163 
164  uint8_t avg_buffer[64*64 + 32*32*2];
165  uint8_t * avg_data[3];
166  int avg_linesize[3];
167 } ThreadContext;
168 
169 typedef struct {
170  int16_t x;
171  int16_t y;
172 } MV;
173 
174 typedef struct {
175  enum MVRefEnum mvref;
178 } MVInfo;
179 
180 typedef struct {
181  enum IntraMode imode;
183 } BlockInfo;
184 
185 typedef struct {
186  enum CUType cu_type;
187  enum PUType pu_type;
188 } PUInfo;
189 
190 typedef struct RV60Context {
193 
194 #define CUR_PIC 0
195 #define LAST_PIC 1
196 #define NEXT_PIC 2
198 
200  int qp;
201  int osvquant;
202  int ts;
205  int deblock;
207  int awidth;
208  int aheight;
209  int cu_width;
211 
213 
216 
219 
221  uint8_t * left_str;
222  uint8_t * top_str;
223 
224  uint64_t ref_pts[2], ts_scale;
225  uint32_t ref_ts[2];
226 
228  unsigned nb_progress;
229 } RV60Context;
230 
231 static int progress_init(RV60Context *s, unsigned count)
232 {
233  if (s->nb_progress < count) {
234  void *tmp = av_realloc_array(s->progress, count, sizeof(*s->progress));
235  if (!tmp)
236  return AVERROR(ENOMEM);
237  s->progress = tmp;
238  memset(s->progress + s->nb_progress, 0, (count - s->nb_progress) * sizeof(*s->progress));
239  for (int i = s->nb_progress; i < count; i++) {
240  int ret = ff_thread_progress_init(&s->progress[i], 1);
241  if (ret < 0)
242  return ret;
243  s->nb_progress = i + 1;
244  }
245  }
246 
247  for (int i = 0; i < count; i++)
248  ff_thread_progress_reset(&s->progress[i]);
249 
250  return 0;
251 }
252 
254 {
255  static AVOnce init_static_once = AV_ONCE_INIT;
256  RV60Context *s = avctx->priv_data;
257 
258  s->avctx = avctx;
259 
260  ff_videodsp_init(&s->vdsp, 8);
261 
262  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
263 
264  for (int i = 0; i < 3; i++) {
265  s->last_frame[i] = av_frame_alloc();
266  if (!s->last_frame[i])
267  return AVERROR(ENOMEM);
268  }
269 
270  ff_thread_once(&init_static_once, rv60_init_static_data);
271 
272  return 0;
273 }
274 
276 {
277  int ret;
278 
279  if (width != s->avctx->width || height != s->avctx->height) {
280 
281  av_log(s->avctx, AV_LOG_INFO, "changing dimensions to %dx%d\n", width, height);
282 
283  for (int i = 0; i < 3; i++)
284  av_frame_unref(s->last_frame[i]);
285 
286  if ((ret = ff_set_dimensions(s->avctx, width, height)) < 0)
287  return ret;
288 
289  if (s->avctx->width <= 64 || s->avctx->height <= 64)
290  av_log(s->avctx, AV_LOG_WARNING, "unable to faithfully reproduce emulated edges; expect visual artefacts\n");
291  }
292 
293  s->awidth = FFALIGN(width, 16);
294  s->aheight = FFALIGN(height, 16);
295 
296  s->cu_width = (width + 63) >> 6;
297  s->cu_height = (height + 63) >> 6;
298 
299  s->pu_stride = s->cu_width << 3;
300  s->blk_stride = s->cu_width << 4;
301 
302  if ((ret = av_reallocp_array(&s->slice, s->cu_height, sizeof(s->slice[0]))) < 0)
303  return ret;
304 
305  if ((ret = av_reallocp_array(&s->pu_info, s->pu_stride * (s->cu_height << 3), sizeof(s->pu_info[0]))) < 0)
306  return ret;
307 
308  if ((ret = av_reallocp_array(&s->blk_info, s->blk_stride * (s->cu_height << 4), sizeof(s->blk_info[0]))) < 0)
309  return ret;
310 
311  for (int j = 0; j < s->cu_height << 4; j++)
312  for (int i = 0; i < s->cu_width << 4; i++)
313  s->blk_info[j*s->blk_stride + i].mv.mvref = MVREF_NONE;
314 
315  if (s->deblock) {
316  int size;
317 
318  s->dblk_stride = s->awidth >> 2;
319 
320  size = s->dblk_stride * (s->aheight >> 2);
321 
322  if ((ret = av_reallocp_array(&s->top_str, size, sizeof(s->top_str[0]))) < 0)
323  return ret;
324 
325  if ((ret = av_reallocp_array(&s->left_str, size, sizeof(s->left_str[0]))) < 0)
326  return ret;
327 
328  memset(s->top_str, 0, size);
329  memset(s->left_str, 0, size);
330  }
331 
332  return 0;
333 }
334 
335 static int read_code012(GetBitContext * gb)
336 {
337  if (!get_bits1(gb))
338  return 0;
339  return get_bits1(gb) + 1;
340 }
341 
342 static int read_frame_header(RV60Context *s, GetBitContext *gb, int * width, int * height)
343 {
344  if (get_bits(gb, 2) != 3)
345  return AVERROR_INVALIDDATA;
346 
347  skip_bits(gb, 2);
348  skip_bits(gb, 4);
349 
350  s->pict_type = frame_types[get_bits(gb, 2)];
351  if (s->pict_type == AV_PICTURE_TYPE_NONE)
352  return AVERROR_INVALIDDATA;
353 
354  s->qp = get_bits(gb, 6);
355  skip_bits1(gb);
356  skip_bits(gb, 2);
357  s->osvquant = get_bits(gb, 2);
358  skip_bits1(gb);
359  skip_bits(gb, 2);
360  s->ts = get_bits(gb, 24);
361  *width = (get_bits(gb, 11) + 1) * 4;
362  *height = get_bits(gb, 11) * 4;
363  skip_bits1(gb);
364  if (s->pict_type == AV_PICTURE_TYPE_I) {
365  s->two_f_refs = 0;
366  } else {
367  if (get_bits1(gb))
368  skip_bits(gb, 3);
369  s->two_f_refs = get_bits1(gb);
370  }
371  read_code012(gb);
372  read_code012(gb);
373  s->qp_off_type = read_code012(gb);
374  s->deblock = get_bits1(gb);
375  s->deblock_chroma = s->deblock && !get_bits1(gb);
376 
377  if (get_bits1(gb)) {
378  int count = get_bits(gb, 2);
379  if (count) {
380  skip_bits(gb, 2);
381  for (int i = 0; i < count; i++)
382  for (int j = 0; j < 2 << i; j++)
383  skip_bits(gb, 8);
384  }
385  }
386 
387  return 0;
388 }
389 
391 {
392  int nbits = get_bits(gb, 5) + 1;
393  int last_size;
394 
395  for (int i = 0; i < s->cu_height; i++)
396  s->slice[i].sign = get_bits1(gb);
397 
398  s->slice[0].size = last_size = get_bits_long(gb, nbits);
399 
400  if (last_size < 0)
401  return AVERROR_INVALIDDATA;
402 
403  for (int i = 1; i < s->cu_height; i++) {
404  int diff = get_bits_long(gb, nbits);
405  if (s->slice[i].sign)
406  last_size += diff;
407  else
408  last_size -= diff;
409  if (last_size <= 0)
410  return AVERROR_INVALIDDATA;
411  s->slice[i].size = last_size;
412  }
413 
414  align_get_bits(gb);
415  return 0;
416 }
417 
418 static int read_intra_mode(GetBitContext * gb, int * param)
419 {
420  if (get_bits1(gb)) {
421  *param = read_code012(gb);
422  return INTRAMODE_INDEX;
423  } else {
424  *param = get_bits(gb, 5);
425  return INTRAMODE_MODE;
426  }
427 }
428 
429 static int has_top_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
430 {
431  return ypos + dy && xpos + dx + size <= s->awidth;
432 }
433 
434 static int has_left_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
435 {
436  return xpos + dx && ypos + dy + size <= s->aheight;
437 }
438 
439 static int has_top_right_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
440 {
441  if (has_top_block(s, xpos, ypos, dx, dy, size * 2)) {
442  int cxpos = ((xpos + dx) & 63) >> ff_log2(size);
443  int cypos = ((ypos + dy) & 63) >> ff_log2(size);
444  return !(rv60_avail_mask[cxpos] & cypos);
445  }
446  return 0;
447 }
448 
449 static int has_left_down_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
450 {
451  if (has_left_block(s, xpos, ypos, dx, dy, size * 2)) {
452  int cxpos = (~(xpos + dx) & 63) >> ff_log2(size);
453  int cypos = (~(ypos + dy) & 63) >> ff_log2(size);
454  return rv60_avail_mask[cxpos] & cypos;
455  }
456  return 0;
457 }
458 
459 typedef struct {
460  uint8_t t[129];
461  uint8_t l[129];
462  int has_t;
463  int has_tr;
464  int has_l;
465  int has_ld;
467 
468 typedef struct {
469  int xpos;
470  int ypos;
471  int pu_pos;
472  int blk_pos;
473 
474  enum CUType cu_type;
475  enum PUType pu_type;
476  enum IntraMode imode[4];
477  int imode_param[4];
478  MVInfo mv[4];
479 
481 } CUContext;
482 
484 {
485  memset(i->t, 0x80, sizeof(i->t));
486  memset(i->l, 0x80, sizeof(i->l));
487  i->has_t = i->has_tr = i->has_l = i->has_ld = 0;
488 }
489 
490 static void populate_ipred(const RV60Context * s, CUContext * cu, const uint8_t * src, int stride, int xoff, int yoff, int size, int is_luma)
491 {
492  if (is_luma)
493  src += (cu->ypos + yoff) * stride + cu->xpos + xoff;
494  else
495  src += (cu->ypos >> 1) * stride + (cu->xpos >> 1);
496 
497  ipred_init(&cu->ipred);
498 
499  if (cu->ypos + yoff > 0) {
500  cu->ipred.has_t = 1;
501 
502  memcpy(cu->ipred.t + 1, src - stride, size);
503 
504  if ((is_luma && has_top_right_block(s, cu->xpos, cu->ypos, xoff, yoff, size)) ||
505  (!is_luma && has_top_right_block(s, cu->xpos, cu->ypos, 0, 0, size << 1))) {
506  cu->ipred.has_tr = 1;
507  memcpy(cu->ipred.t + size + 1, src - stride + size, size);
508  } else
509  memset(cu->ipred.t + size + 1, cu->ipred.t[size], size);
510 
511  if (cu->xpos + xoff > 0)
512  cu->ipred.t[0] = src[-stride - 1];
513  }
514 
515  if (cu->xpos + xoff > 0) {
516  cu->ipred.has_l = 1;
517 
518  for (int y = 0; y < size; y++)
519  cu->ipred.l[y + 1] = src[y*stride - 1];
520 
521  if ((is_luma && has_left_down_block(s, cu->xpos, cu->ypos, xoff, yoff, size)) ||
522  (!is_luma && has_left_down_block(s, cu->xpos, cu->ypos, 0, 0, size << 1))) {
523  cu->ipred.has_ld = 1;
524  for (int y = size; y < size * 2; y++)
525  cu->ipred.l[y + 1] = src[y*stride - 1];
526  } else
527  memset(cu->ipred.l + size + 1, cu->ipred.l[size], size);
528 
529  if (cu->ypos + yoff > 0)
530  cu->ipred.l[0] = src[-stride - 1];
531  }
532 }
533 
534 static void pred_plane(const IntraPredContext * p, uint8_t * dst, int stride, int size)
535 {
536  int lastl = p->l[size + 1];
537  int lastt = p->t[size + 1];
538  int tmp1[64], tmp2[64];
539  int top_ref[64], left_ref[64];
540  int shift;
541 
542  for (int i = 0; i < size; i++) {
543  tmp1[i] = lastl - p->t[i + 1];
544  tmp2[i] = lastt - p->l[i + 1];
545  }
546 
547  shift = ff_log2(size) + 1;
548  for (int i = 0; i < size; i++) {
549  top_ref[i] = p->t[i + 1] << (shift - 1);
550  left_ref[i] = p->l[i + 1] << (shift - 1);
551  }
552 
553  for (int y = 0; y < size; y++) {
554  int add = tmp2[y];
555  int sum = left_ref[y] + size;
556  for (int x = 0; x < size; x++) {
557  int v = tmp1[x] + top_ref[x];
558  sum += add;
559  top_ref[x] = v;
560  dst[y*stride + x] = (sum + v) >> shift;
561  }
562  }
563 }
564 
565 static void pred_dc(const IntraPredContext * p, uint8_t * dst, int stride, int size, int filter)
566 {
567  int dc;
568 
569  if (!p->has_t && !p->has_l)
570  dc = 0x80;
571  else {
572  int sum = 0;
573  if (p->has_t)
574  for (int x = 0; x < size; x++)
575  sum += p->t[x + 1];
576  if (p->has_l)
577  for (int y = 0; y < size; y++)
578  sum += p->l[y + 1];
579  if (p->has_t && p->has_l)
580  dc = (sum + size) / (size * 2);
581  else
582  dc = (sum + size / 2) / size;
583  }
584 
585  for (int y = 0; y < size; y++)
586  memset(dst + y*stride, dc, size);
587 
588  if (filter && p->has_t && p->has_l) {
589  dst[0] = (p->t[1] + p->l[1] + 2 * dst[0] + 2) >> 2;
590  for (int x = 1; x < size; x++)
591  dst[x] = (p->t[x + 1] + 3 * dst[x] + 2) >> 2;
592  for (int y = 1; y < size; y++)
593  dst[y*stride] = (p->l[y + 1] + 3 * dst[y*stride] + 2) >> 2;
594  }
595 }
596 
597 static void filter_weak(uint8_t * dst, const uint8_t * src, int size)
598 {
599  dst[0] = src[0];
600  for (int i = 1; i < size - 1; i++)
601  dst[i] = (src[i - 1] + 2*src[i] + src[i + 1] + 2) >> 2;
602  dst[size - 1] = src[size - 1];
603 }
604 
605 static void filter_bilin32(uint8_t * dst, int v0, int v1, int size)
606 {
607  int diff = v1 - v0;
608  int sum = (v0 << 5) + (1 << (5 - 1));
609  for (int i = 0; i < size; i++) {
610  dst[i] = sum >> 5;
611  sum += diff;
612  }
613 }
614 
615 static void pred_hor_angle(uint8_t * dst, int stride, int size, int weight, const uint8_t * src)
616 {
617  int sum = 0;
618  for (int x = 0; x < size; x++) {
619  int off, frac;
620  sum += weight;
621  off = (sum >> 5) + 32;
622  frac = sum & 0x1F;
623  if (!frac)
624  for (int y = 0; y < size; y++)
625  dst[y*stride + x] = src[off + y];
626  else {
627  for (int y = 0; y < size; y++) {
628  int a = src[off + y];
629  int b = src[off + y + 1];
630  dst[y*stride + x] = ((32 - frac) * a + frac * b + 16) >> 5;
631  }
632  }
633  }
634 }
635 
636 static void pred_ver_angle(uint8_t * dst, int stride, int size, int weight, const uint8_t * src)
637 {
638  int sum = 0;
639  for (int y = 0; y < size; y++) {
640  int off, frac;
641  sum += weight;
642  off = (sum >> 5) + 32;
643  frac = sum & 0x1F;
644  if (!frac)
645  memcpy(dst + y*stride, src + off, size);
646  else {
647  for (int x = 0; x < size; x++) {
648  int a = src[off + x];
649  int b = src[off + x + 1];
650  dst[y*stride + x] = ((32 - frac) * a + frac * b + 16) >> 5;
651  }
652  }
653  }
654 }
655 
656 static int pred_angle(const IntraPredContext * p, uint8_t * dst, int stride, int size, int imode, int filter)
657 {
658  uint8_t filtered1[96], filtered2[96];
659 
660  if (!imode) {
661  pred_plane(p, dst, stride, size);
662  } else if (imode == 1) {
663  pred_dc(p, dst, stride, size, filter);
664  } else if (imode <= 9) {
665  int ang_weight = rv60_ipred_angle[10 - imode];
666  int add_size = (size * ang_weight + 31) >> 5;
667  if (size <= 16) {
668  filter_weak(filtered1 + 32, &p->l[1], size + add_size);
669  } else {
670  filter_bilin32(filtered1 + 32, p->l[1], p->l[33], 32);
671  filter_bilin32(filtered1 + 64, p->l[32], p->l[64], add_size);
672  }
673  pred_hor_angle(dst, stride, size, ang_weight, filtered1);
674  } else if (imode == 10) {
675  if (size <= 16)
676  filter_weak(filtered1 + 32, &p->l[1], size);
677  else
678  filter_bilin32(filtered1 + 32, p->l[1], p->l[33], 32);
679  for (int y = 0; y < size; y++)
680  for (int x = 0; x < size; x++)
681  dst[y*stride + x] = filtered1[32 + y];
682  if (filter) {
683  int tl = p->t[0];
684  for (int x = 0; x < size; x++)
685  dst[x] = av_clip_uint8(dst[x] + ((p->t[x + 1] - tl) >> 1));
686  }
687  } else if (imode <= 17) {
688  int ang_weight = rv60_ipred_angle[imode - 10];
689  int inv_angle = rv60_ipred_inv_angle[imode - 10];
690  int add_size = (size * ang_weight + 31) >> 5;
691  if (size <= 16) {
692  memcpy(filtered1 + 32 - 1, p->l, size + 1);
693  memcpy(filtered2 + 32 - 1, p->t, size + 1);
694  } else {
695  filtered1[32 - 1] = p->l[0];
696  filter_bilin32(filtered1 + 32, p->l[0], p->l[32], 32);
697  filtered2[32 - 1] = p->t[0];
698  filter_bilin32(filtered2 + 32, p->t[0], p->t[32], 32);
699  }
700  if (add_size > 1) {
701  int sum = 0x80;
702  for (int i = 1; i < add_size; i++) {
703  sum += inv_angle;
704  filtered1[32 - 1 - i] = filtered2[32 - 1 + (sum >> 8)];
705  }
706  }
707  pred_hor_angle(dst, stride, size, -ang_weight, filtered1);
708  } else if (imode <= 25) {
709  int ang_weight = rv60_ipred_angle[26 - imode];
710  int inv_angle = rv60_ipred_inv_angle[26 - imode];
711  int add_size = (size * ang_weight + 31) >> 5;
712  if (size <= 16) {
713  memcpy(filtered1 + 32 - 1, p->t, size + 1);
714  memcpy(filtered2 + 32 - 1, p->l, size + 1);
715  } else {
716  filtered1[32 - 1] = p->t[0];
717  filter_bilin32(filtered1 + 32, p->t[0], p->t[32], 32);
718  filtered2[32 - 1] = p->l[0];
719  filter_bilin32(filtered2 + 32, p->l[0], p->l[32], 32);
720  }
721  if (add_size > 1) {
722  int sum = 0x80;
723  for (int i = 1; i < add_size; i++) {
724  sum += inv_angle;
725  filtered1[32 - 1 - i] = filtered2[32 - 1 + (sum >> 8)];
726  }
727  }
728  pred_ver_angle(dst, stride, size, -ang_weight, filtered1);
729  } else if (imode == 26) {
730  if (size <= 16)
731  filter_weak(&filtered1[32], &p->t[1], size);
732  else
733  filter_bilin32(filtered1 + 32, p->t[1], p->t[33], 32);
734  for (int i = 0; i < size; i++)
735  memcpy(dst + i*stride, filtered1 + 32, size);
736  if (filter) {
737  int tl = p->l[0];
738  for (int y = 0; y < size; y++)
739  dst[y*stride] = av_clip_uint8(dst[y*stride] + ((p->l[y+1] - tl) >> 1));
740  }
741  } else if (imode <= 34) {
742  int ang_weight = rv60_ipred_angle[imode - 26];
743  int add_size = (size * ang_weight + 31) >> 5;
744  if (size <= 16)
745  filter_weak(&filtered1[32], &p->t[1], size + add_size);
746  else {
747  filter_bilin32(filtered1 + 32, p->t[1], p->t[33], 32);
748  filter_bilin32(filtered1 + 64, p->t[32], p->t[64], add_size);
749  }
750  pred_ver_angle(dst, stride, size, ang_weight, filtered1);
751  } else
752  return AVERROR_INVALIDDATA;
753  return 0;
754 }
755 
756 static int pu_is_intra(const PUInfo * pu)
757 {
758  return pu->cu_type == CU_INTRA;
759 }
760 
761 static int ipm_compar(const void * a, const void * b)
762 {
763  return *(const enum IntraMode *)a - *(const enum IntraMode *)b;
764 }
765 
766 #define MK_UNIQUELIST(name, type, max_size) \
767 typedef struct { \
768  type list[max_size]; \
769  int size; \
770 } unique_list_##name; \
771 \
772 static void unique_list_##name##_init(unique_list_##name * s) \
773 { \
774  memset(s->list, 0, sizeof(s->list)); \
775  s->size = 0; \
776 } \
777 \
778 static void unique_list_##name##_add(unique_list_##name * s, type cand) \
779 { \
780  if (s->size == max_size) \
781  return; \
782  \
783  for (int i = 0; i < s->size; i++) { \
784  if (!memcmp(&s->list[i], &cand, sizeof(type))) { \
785  return; \
786  } \
787  } \
788  s->list[s->size++] = cand; \
789 }
790 
791 MK_UNIQUELIST(intramode, enum IntraMode, 3)
792 MK_UNIQUELIST(mvinfo, MVInfo, 4)
793 
794 static int reconstruct_intra(const RV60Context * s, const CUContext * cu, int size, int sub)
795 {
796  int blk_pos, tl_x, tl_y;
797  unique_list_intramode ipm_cand;
798 
799  if (cu->imode[0] == INTRAMODE_DC64)
800  return 1;
801 
802  if (cu->imode[0] == INTRAMODE_PLANE64)
803  return 0;
804 
805  unique_list_intramode_init(&ipm_cand);
806 
807  if (has_top_block(s, cu->xpos, cu->ypos, (sub & 1) * 4, 0, size)) {
808  const PUInfo * pu = &s->pu_info[cu->pu_pos - s->pu_stride];
809  if (pu_is_intra(pu))
810  unique_list_intramode_add(&ipm_cand, s->blk_info[cu->blk_pos - s->blk_stride + (sub & 1)].imode);
811  }
812 
813  blk_pos = cu->blk_pos + (sub >> 1) * s->blk_stride + (sub & 1);
814 
815  if (has_left_block(s, cu->xpos, cu->ypos, 0, (sub & 2) * 2, size)) {
816  const PUInfo * pu = &s->pu_info[cu->pu_pos - 1];
817  if (pu_is_intra(pu))
818  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - 1 - (sub & 1)].imode);
819  }
820 
821  tl_x = !(sub & 2) ? (cu->xpos + (sub & 1) * 4) : cu->xpos;
822  tl_y = cu->ypos + (sub & 2) * 4;
823  if (tl_x > 0 && tl_y > 0) {
824  const PUInfo * pu;
825  switch (sub) {
826  case 0: pu = &s->pu_info[cu->pu_pos - s->pu_stride - 1]; break;
827  case 1: pu = &s->pu_info[cu->pu_pos - s->pu_stride]; break;
828  default: pu = &s->pu_info[cu->pu_pos - 1];
829  }
830  if (pu_is_intra(pu)) {
831  if (sub != 3)
832  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - s->blk_stride - 1].imode);
833  else
834  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - s->blk_stride - 2].imode);
835  }
836  }
837 
838  for (int i = 0; i < FF_ARRAY_ELEMS(rv60_candidate_intra_angles); i++)
839  unique_list_intramode_add(&ipm_cand, rv60_candidate_intra_angles[i]);
840 
841  if (cu->imode[sub] == INTRAMODE_INDEX)
842  return ipm_cand.list[cu->imode_param[sub]];
843 
844  if (cu->imode[sub] == INTRAMODE_MODE) {
845  enum IntraMode imode = cu->imode_param[sub];
846  qsort(ipm_cand.list, 3, sizeof(ipm_cand.list[0]), ipm_compar);
847  for (int i = 0; i < 3; i++)
848  if (imode >= ipm_cand.list[i])
849  imode++;
850  return imode;
851  }
852 
853  av_assert0(0); // should never reach here
854  return 0;
855 }
856 
857 static int get_skip_mv_index(enum MVRefEnum mvref)
858 {
859  switch (mvref) {
860  case MVREF_SKIP1: return 1;
861  case MVREF_SKIP2: return 2;
862  case MVREF_SKIP3: return 3;
863  default: return 0;
864  }
865 }
866 
867 static void add_if_valid(unique_list_mvinfo * skip_cand, const MVInfo * mvi)
868 {
869  if (mvi->mvref != MVREF_NONE)
870  unique_list_mvinfo_add(skip_cand, *mvi);
871 }
872 
873 static void fill_mv_skip_cand(RV60Context * s, const CUContext * cu, unique_list_mvinfo * skip_cand, int size)
874 {
875  int mv_size = size >> 2;
876 
877  if (cu->xpos)
878  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - 1].mv);
879  if (cu->ypos)
880  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride].mv);
881  if (cu->ypos && cu->xpos + size < s->awidth)
882  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride + mv_size].mv);
883  if (cu->xpos && cu->ypos + size < s->aheight)
884  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos + s->blk_stride * mv_size - 1].mv);
885  if (cu->xpos)
886  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos + s->blk_stride * (mv_size - 1) - 1].mv);
887  if (cu->ypos)
888  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride + mv_size - 1].mv);
889  if (cu->xpos && cu->ypos)
890  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride - 1].mv);
891 
892  for (int i = skip_cand->size; i < 4; i++)
893  skip_cand->list[i] = (MVInfo){.mvref=MVREF_REF0,.f_mv={0,0},.b_mv={0,0}};
894 }
895 
896 typedef struct {
897  int w, h;
898 } Dimensions;
899 
900 static void get_mv_dimensions(Dimensions * dim, enum PUType pu_type, int part_no, int size)
901 {
902  int mv_size = size >> 2;
903  switch (pu_type) {
904  case PU_FULL:
905  dim->w = dim->h = mv_size;
906  break;
907  case PU_N2HOR:
908  dim->w = mv_size;
909  dim->h = mv_size >> 1;
910  break;
911  case PU_N2VER:
912  dim->w = mv_size >> 1;
913  dim->h = mv_size;
914  break;
915  case PU_QUARTERS:
916  dim->w = dim->h = mv_size >> 1;
917  break;
918  case PU_N4HOR:
919  dim->w = mv_size;
920  dim->h = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
921  break;
922  case PU_N34HOR:
923  dim->w = mv_size;
924  dim->h = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
925  break;
926  case PU_N4VER:
927  dim->w = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
928  dim->h = mv_size;
929  break;
930  case PU_N34VER:
931  dim->w = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
932  dim->h = mv_size;
933  break;
934  }
935 }
936 
937 static int has_hor_split(enum PUType pu_type)
938 {
939  return pu_type == PU_N2HOR || pu_type == PU_N4HOR || pu_type == PU_N34HOR || pu_type == PU_QUARTERS;
940 }
941 
942 static int has_ver_split(enum PUType pu_type)
943 {
944  return pu_type == PU_N2VER || pu_type == PU_N4VER || pu_type == PU_N34VER || pu_type == PU_QUARTERS;
945 }
946 
947 static int pu_type_num_parts(enum PUType pu_type)
948 {
949  switch (pu_type) {
950  case PU_FULL: return 1;
951  case PU_QUARTERS: return 4;
952  default: return 2;
953  }
954 }
955 
956 static void get_next_mv(const RV60Context * s, const Dimensions * dim, enum PUType pu_type, int part_no, int * mv_pos, int * mv_x, int * mv_y)
957 {
958  if (pu_type == PU_QUARTERS) {
959  if (part_no != 1) {
960  *mv_pos += dim->w;
961  *mv_x += dim->w;
962  } else {
963  *mv_pos += dim->h*s->blk_stride - dim->w;
964  *mv_x -= dim->w;
965  *mv_y += dim->h;
966  }
967  } else if (has_hor_split(pu_type)) {
968  *mv_pos += dim->h * s->blk_stride;
969  *mv_y += dim->h;
970  } else if (has_ver_split(pu_type)) {
971  *mv_pos += dim->w;
972  *mv_x += dim->w;
973  }
974 }
975 
976 static int mv_is_ref0(enum MVRefEnum mvref)
977 {
978  return mvref == MVREF_REF0 || mvref == MVREF_REF0ANDBREF;
979 }
980 
981 static int mv_is_forward(enum MVRefEnum mvref)
982 {
983  return mvref == MVREF_REF0 || mvref == MVREF_REF1 || mvref == MVREF_REF0ANDBREF;
984 }
985 
986 static int mv_is_backward(enum MVRefEnum mvref)
987 {
988  return mvref == MVREF_BREF || mvref == MVREF_REF0ANDBREF;
989 }
990 
991 static int mvinfo_matches_forward(const MVInfo * a, const MVInfo * b)
992 {
993  return a->mvref == b->mvref || (mv_is_ref0(a->mvref) && mv_is_ref0(b->mvref));
994 }
995 
996 static int mvinfo_matches_backward(const MVInfo * a, const MVInfo * b)
997 {
998  return mv_is_backward(a->mvref) && mv_is_backward(b->mvref);
999 }
1000 
1001 static int mvinfo_is_deblock_cand(const MVInfo * a, const MVInfo * b)
1002 {
1003  int diff;
1004 
1005  if (a->mvref != b->mvref)
1006  return 1;
1007 
1008  diff = 0;
1009  if (mv_is_forward(a->mvref)) {
1010  int dx = a->f_mv.x - b->f_mv.x;
1011  int dy = a->f_mv.y - b->f_mv.y;
1012  diff += FFABS(dx) + FFABS(dy);
1013  }
1014  if (mv_is_backward(a->mvref)) {
1015  int dx = a->b_mv.x - b->b_mv.x;
1016  int dy = a->b_mv.y - b->b_mv.y;
1017  diff += FFABS(dx) + FFABS(dy);
1018  }
1019  return diff > 4;
1020 }
1021 
1022 static void mv_pred(MV * ret, MV a, MV b, MV c)
1023 {
1024 #define MEDIAN(x) \
1025  if (a.x < b.x) \
1026  if (b.x < c.x) \
1027  ret->x = b.x; \
1028  else \
1029  ret->x = a.x < c.x ? c.x : a.x; \
1030  else \
1031  if (b.x < c.x) \
1032  ret->x = a.x < c.x ? a.x : c.x; \
1033  else \
1034  ret->x = b.x; \
1035 
1036  MEDIAN(x)
1037  MEDIAN(y)
1038 }
1039 
1040 static void predict_mv(const RV60Context * s, MVInfo * dst, int mv_x, int mv_y, int mv_w, const MVInfo * src)
1041 {
1042  int mv_pos = mv_y * s->blk_stride + mv_x;
1043  MV f_mv, b_mv;
1044 
1045  dst->mvref = src->mvref;
1046 
1047  if (mv_is_forward(src->mvref)) {
1048  MV cand[3] = {0};
1049  int cand_size = 0;
1050  if (mv_x > 0) {
1051  const MVInfo * mv = &s->blk_info[mv_pos - 1].mv;
1053  cand[cand_size++] = mv->f_mv;
1054  }
1055  if (mv_y > 0) {
1056  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride].mv;
1058  cand[cand_size++] = mv->f_mv;
1059  }
1060  if (has_top_block(s, mv_x << 2, mv_y << 2, mv_w << 2, 0, 4)) {
1061  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride + mv_w].mv;
1063  cand[cand_size++] = mv->f_mv;
1064  }
1065 
1066  switch (cand_size) {
1067  case 1:
1068  f_mv.x = cand[0].x;
1069  f_mv.y = cand[0].y;
1070  break;
1071  case 2:
1072  f_mv.x = (cand[0].x + cand[1].x) >> 1;
1073  f_mv.y = (cand[0].y + cand[1].y) >> 1;
1074  break;
1075  case 3:
1076  mv_pred(&f_mv, cand[0], cand[1], cand[2]);
1077  break;
1078  default:
1079  f_mv = (MV){0,0};
1080  break;
1081  }
1082  } else {
1083  f_mv = (MV){0,0};
1084  }
1085 
1086  dst->f_mv.x = src->f_mv.x + f_mv.x;
1087  dst->f_mv.y = src->f_mv.y + f_mv.y;
1088 
1089  if (mv_is_backward(src->mvref)) {
1090  MV cand[3] = {0};
1091  int cand_size = 0;
1092  if (mv_x > 0) {
1093  const MVInfo * mv = &s->blk_info[mv_pos - 1].mv;
1095  cand[cand_size++] = mv->b_mv;
1096  }
1097  if (mv_y > 0) {
1098  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride].mv;
1100  cand[cand_size++] = mv->b_mv;
1101  }
1102  if (has_top_block(s, mv_x << 2, mv_y << 2, mv_w << 2, 0, 4)) {
1103  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride + mv_w].mv;
1105  cand[cand_size++] = mv->b_mv;
1106  }
1107 
1108  switch (cand_size) {
1109  case 1:
1110  b_mv.x = cand[0].x;
1111  b_mv.y = cand[0].y;
1112  break;
1113  case 2:
1114  b_mv.x = (cand[0].x + cand[1].x) >> 1;
1115  b_mv.y = (cand[0].y + cand[1].y) >> 1;
1116  break;
1117  case 3:
1118  mv_pred(&b_mv, cand[0], cand[1], cand[2]);
1119  break;
1120  default:
1121  b_mv = (MV){0,0};
1122  break;
1123  }
1124  } else {
1125  b_mv = (MV){0,0};
1126  }
1127 
1128  dst->b_mv.x = src->b_mv.x + b_mv.x;
1129  dst->b_mv.y = src->b_mv.y + b_mv.y;
1130 }
1131 
1132 static void reconstruct(RV60Context * s, const CUContext * cu, int size)
1133 {
1134  int pu_size = size >> 3;
1135  PUInfo pui;
1136  int imode, mv_x, mv_y, mv_pos, count, mv_size;
1137  unique_list_mvinfo skip_cand;
1138  Dimensions dim;
1139  MVInfo mv;
1140 
1141  pui.cu_type = cu->cu_type;
1142  pui.pu_type = cu->pu_type;
1143 
1144  if (cu->cu_type == CU_INTRA && cu->pu_type == PU_QUARTERS) {
1145  s->pu_info[cu->pu_pos] = pui;
1146  for (int y = 0; y < 2; y++)
1147  for (int x = 0; x < 2; x++)
1148  s->blk_info[cu->blk_pos + y*s->blk_stride + x].imode =
1149  reconstruct_intra(s, cu, 4, y*2 + x);
1150  return;
1151  }
1152 
1153  switch (cu->cu_type) {
1154  case CU_INTRA:
1155  imode = reconstruct_intra(s, cu, size, 0);
1156  for (int y = 0; y < size >> 2; y++)
1157  for (int x = 0; x < size >> 2; x++)
1158  s->blk_info[cu->blk_pos + y*s->blk_stride + x].imode = imode;
1159  break;
1160  case CU_INTER_MV:
1161  mv_x = cu->xpos >> 2;
1162  mv_y = cu->ypos >> 2;
1163  mv_pos = cu->blk_pos;
1164  count = pu_type_num_parts(cu->pu_type);
1165  for (int part_no = 0; part_no < count; part_no++) {
1166  MVInfo mv;
1167  get_mv_dimensions(&dim, cu->pu_type, part_no, size);
1168  predict_mv(s, &mv, mv_x, mv_y, dim.w, &cu->mv[part_no]);
1169  for (int y = 0; y < dim.h; y++)
1170  for (int x = 0; x < dim.w; x++)
1171  s->blk_info[mv_pos + y*s->blk_stride + x].mv = mv;
1172  get_next_mv(s, &dim, cu->pu_type, part_no, &mv_pos, &mv_x, &mv_y);
1173  }
1174  break;
1175  default:
1176  unique_list_mvinfo_init(&skip_cand);
1177  fill_mv_skip_cand(s, cu, &skip_cand, size);
1178  mv = skip_cand.list[get_skip_mv_index(cu->mv[0].mvref)];
1179  mv_size = size >> 2;
1180  for (int y = 0; y < mv_size; y++)
1181  for (int x = 0; x < mv_size; x++)
1182  s->blk_info[cu->blk_pos + y*s->blk_stride + x].mv = mv;
1183  }
1184 
1185  for (int y = 0; y < pu_size; y++)
1186  for (int x = 0; x < pu_size; x++)
1187  s->pu_info[cu->pu_pos + y*s->pu_stride + x] = pui;
1188 }
1189 
1190 static void read_mv(GetBitContext * gb, MV * mv)
1191 {
1192  mv->x = get_interleaved_se_golomb(gb);
1193  mv->y = get_interleaved_se_golomb(gb);
1194 }
1195 
1196 static void read_mv_info(RV60Context *s, GetBitContext * gb, MVInfo * mvinfo, int size, enum PUType pu_type)
1197 {
1198  if (s->pict_type != AV_PICTURE_TYPE_B) {
1199  if (s->two_f_refs && get_bits1(gb))
1200  mvinfo->mvref = MVREF_REF1;
1201  else
1202  mvinfo->mvref = MVREF_REF0;
1203  read_mv(gb, &mvinfo->f_mv);
1204  mvinfo->b_mv.x = mvinfo->b_mv.y = 0;
1205  } else {
1206  if ((size <= 8 && (size != 8 || pu_type != PU_FULL)) || get_bits1(gb)) {
1207  if (!get_bits1(gb)) {
1208  mvinfo->mvref = MVREF_REF0;
1209  read_mv(gb, &mvinfo->f_mv);
1210  mvinfo->b_mv.x = mvinfo->b_mv.y = 0;
1211  } else {
1212  mvinfo->mvref = MVREF_BREF;
1213  mvinfo->f_mv.x = mvinfo->f_mv.y = 0;
1214  read_mv(gb, &mvinfo->b_mv);
1215  }
1216  } else {
1217  mvinfo->mvref = MVREF_REF0ANDBREF;
1218  read_mv(gb, &mvinfo->f_mv);
1219  read_mv(gb, &mvinfo->b_mv);
1220  }
1221  }
1222 }
1223 
1224 #define FILTER1(src, src_stride, src_y_ofs, step) \
1225  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1226  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1227  +52 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1228  +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1229  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1230  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1231 
1232 #define FILTER2(src, src_stride, src_y_ofs, step) \
1233  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1234  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1235  +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1236  +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1237  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1238  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 16) >> 5
1239 
1240 #define FILTER3(src, src_stride, src_y_ofs, step) \
1241  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1242  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1243  +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1244  +52 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1245  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1246  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1247 
1248 #define FILTER_CASE(idx, dst, dst_stride, filter, w, h) \
1249  case idx: \
1250  for (int y = 0; y < h; y++) \
1251  for (int x = 0; x < w; x++) \
1252  (dst)[y*dst_stride + x] = av_clip_uint8(filter); \
1253  break;
1254 
1255 #define FILTER_BLOCK(dst, dst_stride, src, src_stride, src_y_ofs, w, h, cond, step) \
1256  switch (cond) { \
1257  FILTER_CASE(1, dst, dst_stride, FILTER1(src, src_stride, src_y_ofs, step), w, h) \
1258  FILTER_CASE(2, dst, dst_stride, FILTER2(src, src_stride, src_y_ofs, step), w, h) \
1259  FILTER_CASE(3, dst, dst_stride, FILTER3(src, src_stride, src_y_ofs, step), w, h) \
1260  }
1261 
1262 static void luma_mc(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h, int cx, int cy)
1263 {
1264  if (!cx && !cy) {
1265  for (int y = 0; y < h; y++)
1266  memcpy(dst + y*dst_stride, src + y*src_stride, w);
1267  } else if (!cy) {
1268  FILTER_BLOCK(dst, dst_stride, src, src_stride, 0, w, h, cx, 1)
1269  } else if (!cx) {
1270  FILTER_BLOCK(dst, dst_stride, src, src_stride, 0, w, h, cy, src_stride)
1271  } else if (cx != 3 || cy != 3) {
1272  uint8_t tmp[70 * 64];
1273  FILTER_BLOCK(tmp, 64, src - src_stride * 2, src_stride, 0, w, h + 5, cx, 1)
1274  FILTER_BLOCK(dst, dst_stride, tmp + 2*64, 64, 0, w, h, cy, 64)
1275  } else {
1276  for (int j = 0; j < h; j++)
1277  for (int i = 0; i < w; i++)
1278  dst[j*dst_stride + i] = (
1279  src[j*src_stride + i] +
1280  src[j*src_stride + i + 1] +
1281  src[(j + 1)*src_stride + i] +
1282  src[(j + 1)*src_stride + i + 1] + 2) >> 2;
1283  }
1284 }
1285 
1286 static void chroma_mc(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h, int x, int y)
1287 {
1288  if (!x && !y) {
1289  for (int j = 0; j < h; j++)
1290  memcpy(dst + j*dst_stride, src + j*src_stride, w);
1291  } else if (x > 0 && y > 0) {
1292  int a, b, c, d;
1293 
1294  if (x == 3 && y == 3)
1295  y = 2; //reproduce bug in rv60 decoder. tested with realplayer version 18.1.7.344 and 22.0.0.321
1296 
1297  a = (4 - x) * (4 - y);
1298  b = x * (4 - y);
1299  c = (4 - x) * y;
1300  d = x * y;
1301  for (int j = 0; j < h; j++)
1302  for (int i = 0; i < w; i++)
1303  dst[j*dst_stride + i] =
1304  (a * src[j*src_stride + i] +
1305  b * src[j*src_stride + i + 1] +
1306  c * src[(j + 1)*src_stride + i] +
1307  d * src[(j + 1)*src_stride + i + 1] + 8) >> 4;
1308  } else {
1309  int a = (4 - x) * (4 - y);
1310  int e = x * (4 - y) + (4 - x) * y;
1311  int step = y > 0 ? src_stride : 1;
1312  for (int j = 0; j < h; j++)
1313  for (int i = 0; i < w; i++)
1314  dst[j*dst_stride + i] =
1315  (a * src[j*src_stride + i] +
1316  e * src[j*src_stride + i + step] + 8) >> 4;
1317  }
1318 }
1319 
1320 static int check_pos(int x, int y, int cw, int ch, int w, int h, int dx, int dy, int e0, int e1, int e2, int e3)
1321 {
1322  int x2 = x + dx;
1323  int y2 = y + dy;
1324  return x2 - e0 >= 0 && x2 + cw + e1 <= w && y2 - e2 >= 0 && y2 + ch + e3 <= h;
1325 }
1326 
1327 static void mc(RV60Context * s, uint8_t * frame_data[3], int frame_linesize[3], const AVFrame * ref, int x, int y, int w, int h, MV mv, int avg)
1328 {
1329  {
1330  int off = !avg ? y * frame_linesize[0] + x : 0;
1331  int fw = s->awidth;
1332  int fh = s->aheight;
1333  int dx = mv.x >> 2;
1334  int cx = mv.x & 3;
1335  int dy = mv.y >> 2;
1336  int cy = mv.y & 3;
1337 
1338  if (check_pos(x, y, w, h, fw, fh, dx, dy, rv60_edge1[cx], rv60_edge2[cx], rv60_edge1[cy], rv60_edge2[cy])) {
1339  luma_mc(
1340  frame_data[0] + off,
1341  frame_linesize[0],
1342  ref->data[0] + (y + dy) * ref->linesize[0] + x + dx,
1343  ref->linesize[0],
1344  w, h, cx, cy);
1345  } else {
1346  uint8_t buf[70*70];
1347  int xoff = x + dx - 2;
1348  int yoff = y + dy - 2;
1349  s->vdsp.emulated_edge_mc(buf,
1350  ref->data[0] + yoff * ref->linesize[0] + xoff,
1351  70, ref->linesize[0],
1352  w + 5, h + 5,
1353  xoff, yoff,
1354  fw, fh);
1355 
1356  luma_mc(frame_data[0] + off, frame_linesize[0],
1357  buf + 70 * 2 + 2, 70, w, h, cx, cy);
1358  }
1359  }
1360  {
1361  int fw = s->awidth >> 1;
1362  int fh = s->aheight >> 1;
1363  int mvx = mv.x / 2;
1364  int mvy = mv.y / 2;
1365  int dx = mvx >> 2;
1366  int cx = mvx & 3;
1367  int dy = mvy >> 2;
1368  int cy = mvy & 3;
1369  int cw = w >> 1;
1370  int ch = h >> 1;
1371 
1372  for (int plane = 1; plane < 3; plane++) {
1373  int off = !avg ? (y >> 1) * frame_linesize[plane] + (x >> 1) : 0;
1374  if (check_pos(x >> 1, y >> 1, cw, ch, fw, fh, dx, dy, 0, 1, 0, 1)) {
1375  chroma_mc(
1376  frame_data[plane] + off,
1377  frame_linesize[plane],
1378  ref->data[plane] + ((y >> 1) + dy) * ref->linesize[plane] + (x >> 1) + dx,
1379  ref->linesize[plane],
1380  cw, ch, cx, cy);
1381  } else {
1382  uint8_t buf[40*40];
1383  s->vdsp.emulated_edge_mc(buf,
1384  ref->data[plane] + ((y >> 1) + dy) * ref->linesize[plane] + (x >> 1) + dx,
1385  40, ref->linesize[plane],
1386  cw + 1, ch + 1,
1387  (x >> 1) + dx, (y >> 1) + dy,
1388  fw, fh);
1389  chroma_mc(frame_data[plane] + off, frame_linesize[plane], buf, 40, cw, ch, cx, cy);
1390  }
1391  }
1392  }
1393 }
1394 
1395 static void avg_plane(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h)
1396 {
1397  for (int j = 0; j < h; j++)
1398  for (int i = 0; i < w; i++)
1399  dst[j*dst_stride + i] = (dst[j*dst_stride + i] + src[j*src_stride + i]) >> 1;
1400 }
1401 
1402 static void avg(AVFrame * frame, uint8_t * prev_frame_data[3], int prev_frame_linesize[3], int x, int y, int w, int h)
1403 {
1404  for (int plane = 0; plane < 3; plane++) {
1405  int shift = !plane ? 0 : 1;
1406  avg_plane(frame->data[plane] + (y >> shift) * frame->linesize[plane] + (x >> shift), frame->linesize[plane],
1407  prev_frame_data[plane], prev_frame_linesize[plane],
1408  w >> shift, h >> shift);
1409  }
1410 }
1411 
1412 static int get_c4x4_set(int qp, int is_intra)
1413 {
1414  if (is_intra)
1415  return rv60_qp_to_idx[qp + 32];
1416  else
1417  return rv60_qp_to_idx[qp];
1418 }
1419 
1420 static int quant(int v, int q)
1421 {
1422  return (v * q + 8) >> 4;
1423 }
1424 
1425 static int decode_coeff(GetBitContext * gb, const CoeffVLCs * vlcs, int inval, int val)
1426 {
1427  int esc_sym;
1428 
1429  if (inval != val)
1430  return inval && get_bits1(gb) ? -inval : inval;
1431 
1432  esc_sym = get_vlc2(gb, vlcs->esc, 9, 2);
1433  if (esc_sym > 23) {
1434  int esc_bits = esc_sym - 23;
1435  val += (1 << esc_bits) + get_bits(gb, esc_bits) + 22;
1436  } else
1437  val += esc_sym;
1438 
1439  return get_bits1(gb) ? -val : val;
1440 }
1441 
1442 static void decode_2x2_dc(GetBitContext * gb, const CoeffVLCs * vlcs, int16_t * coeffs, int stride, int block2, int dsc, int q_dc, int q_ac)
1443 {
1444  const uint8_t * lx;
1445  if (!dsc)
1446  return;
1447 
1448  lx = rv60_dsc_to_lx[dsc - 1];
1449 
1450  coeffs[0] = quant(decode_coeff(gb, vlcs, lx[0], 3), q_dc);
1451  if (!block2) {
1452  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1453  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1454  } else {
1455  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1456  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1457  }
1458  coeffs[stride + 1] = quant(decode_coeff(gb, vlcs, lx[3], 2), q_ac);
1459 }
1460 
1461 static void decode_2x2(GetBitContext * gb, const CoeffVLCs * vlcs, int16_t * coeffs, int stride, int block2, int dsc, int q_ac)
1462 {
1463  const uint8_t * lx;
1464  if (!dsc)
1465  return;
1466 
1467  lx = rv60_dsc_to_lx[dsc - 1];
1468 
1469  coeffs[0] = quant(decode_coeff(gb, vlcs, lx[0], 3), q_ac);
1470  if (!block2) {
1471  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1472  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1473  } else {
1474  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1475  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1476  }
1477  coeffs[stride + 1] = quant(decode_coeff(gb, vlcs, lx[3], 2), q_ac);
1478 }
1479 
1480 static void decode_4x4_block_dc(GetBitContext * gb, const CoeffVLCs * vlcs, int is_luma, int16_t * coeffs, int stride, int q_dc, int q_ac)
1481 {
1482  int sym0 = get_vlc2(gb, vlcs->l0[!is_luma], 9, 2);
1483  int grp0 = sym0 >> 3;
1484 
1485  if (grp0)
1486  decode_2x2_dc(gb, vlcs, coeffs, stride, 0, grp0, q_dc, q_ac);
1487 
1488  if (sym0 & 4) {
1489  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1490  decode_2x2(gb, vlcs, coeffs + 2, stride, 0, grp, q_ac);
1491  }
1492  if (sym0 & 2) {
1493  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1494  decode_2x2(gb, vlcs, coeffs + 2*stride, stride, 1, grp, q_ac);
1495  }
1496  if (sym0 & 1) {
1497  int grp = get_vlc2(gb, vlcs->l3[!is_luma], 9, 2);
1498  decode_2x2(gb, vlcs, coeffs + 2*stride + 2, stride, 0, grp, q_ac);
1499  }
1500 }
1501 
1502 static void decode_4x4_block(GetBitContext * gb, const CoeffVLCs * vlcs, int is_luma, int16_t * coeffs, int stride, int q_ac)
1503 {
1504  int sym0 = get_vlc2(gb, vlcs->l0[!is_luma], 9, 2);
1505  int grp0 = (sym0 >> 3);
1506 
1507  if (grp0)
1508  decode_2x2(gb, vlcs, coeffs, stride, 0, grp0, q_ac);
1509 
1510  if (sym0 & 4) {
1511  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1512  decode_2x2(gb, vlcs, coeffs + 2, stride, 0, grp, q_ac);
1513  }
1514  if (sym0 & 2) {
1515  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1516  decode_2x2(gb, vlcs, coeffs + 2*stride, stride, 1, grp, q_ac);
1517  }
1518  if (sym0 & 1) {
1519  int grp = get_vlc2(gb, vlcs->l3[!is_luma], 9, 2);
1520  decode_2x2(gb, vlcs, coeffs + 2*stride + 2, stride, 0, grp, q_ac);
1521  }
1522 }
1523 
1524 static void decode_cu_4x4in16x16(GetBitContext * gb, int is_intra, int qp, int sel_qp, int16_t * y_coeffs, int16_t * u_coeffs, int16_t * v_coeffs, int cbp)
1525 {
1526  int cb_set = get_c4x4_set(sel_qp, is_intra);
1527  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1528  int q_y = rv60_quants_b[qp];
1529  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1530  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1531 
1532  memset(y_coeffs, 0, sizeof(y_coeffs[0])*256);
1533  for (int i = 0; i < 16; i++)
1534  if ((cbp >> i) & 1)
1535  decode_4x4_block(gb, vlc, 1, y_coeffs + i * 16 , 4, q_y);
1536 
1537  memset(u_coeffs, 0, sizeof(u_coeffs[0])*64);
1538  for (int i = 0; i < 4; i++)
1539  if ((cbp >> (16 + i)) & 1)
1540  decode_4x4_block_dc(gb, vlc, 0, u_coeffs + i * 16, 4, q_c_dc, q_c_ac);
1541 
1542  memset(v_coeffs, 0, sizeof(v_coeffs[0])*64);
1543  for (int i = 0; i < 4; i++)
1544  if ((cbp >> (20 + i)) & 1)
1545  decode_4x4_block_dc(gb, vlc, 0, v_coeffs + i * 16, 4, q_c_dc, q_c_ac);
1546 }
1547 
1548 static int decode_cbp8(GetBitContext * gb, int subset, int qp)
1549 {
1550  int cb_set = rv60_qp_to_idx[qp];
1551  return get_vlc2(gb, cbp8_vlc[cb_set][subset], 9, 2);
1552 }
1553 
1554 static void decode_cu_8x8(GetBitContext * gb, int is_intra, int qp, int sel_qp, int16_t * y_coeffs, int16_t * u_coeffs, int16_t * v_coeffs, int ccbp, int mode4x4)
1555 {
1556  int cb_set = get_c4x4_set(sel_qp, is_intra);
1557  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1558  int q_y = rv60_quants_b[qp];
1559  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1560  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1561 
1562  memset(y_coeffs, 0, sizeof(y_coeffs[0])*64);
1563  for (int i = 0; i < 4; i++) {
1564  if ((ccbp >> i) & 1) {
1565  int offset, stride;
1566  if (mode4x4) {
1567  offset = i*16;
1568  stride = 4;
1569  } else {
1570  offset = (i & 1) * 4 + (i & 2) * 2 * 8;
1571  stride = 8;
1572  }
1573  decode_4x4_block(gb, vlc, 1, y_coeffs + offset, stride, q_y);
1574  }
1575  }
1576 
1577  if ((ccbp >> 4) & 1) {
1578  memset(u_coeffs, 0, sizeof(u_coeffs[0])*16);
1579  decode_4x4_block_dc(gb, vlc, 0, u_coeffs, 4, q_c_dc, q_c_ac);
1580  }
1581 
1582  if ((ccbp >> 5) & 1) {
1583  memset(v_coeffs, 0, sizeof(u_coeffs[0])*16);
1584  decode_4x4_block_dc(gb, vlc, 0, v_coeffs, 4, q_c_dc, q_c_ac);
1585  }
1586 }
1587 
1588 static void decode_cu_16x16(GetBitContext * gb, int is_intra, int qp, int sel_qp, int16_t * y_coeffs, int16_t * u_coeffs, int16_t * v_coeffs, int ccbp)
1589 {
1590  int cb_set = get_c4x4_set(sel_qp, is_intra);
1591  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1592  int q_y = rv60_quants_b[qp];
1593  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1594  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1595 
1596  memset(y_coeffs, 0, sizeof(y_coeffs[0])*256);
1597  for (int i = 0; i < 16; i++)
1598  if ((ccbp >> i) & 1) {
1599  int off = (i & 3) * 4 + (i >> 2) * 4 * 16;
1600  decode_4x4_block(gb, vlc, 1, y_coeffs + off, 16, q_y);
1601  }
1602 
1603  memset(u_coeffs, 0, sizeof(u_coeffs[0])*64);
1604  for (int i = 0; i < 4; i++)
1605  if ((ccbp >> (16 + i)) & 1) {
1606  int off = (i & 1) * 4 + (i & 2) * 2 * 8;
1607  if (!i)
1608  decode_4x4_block_dc(gb, vlc, 0, u_coeffs + off, 8, q_c_dc, q_c_ac);
1609  else
1610  decode_4x4_block(gb, vlc, 0, u_coeffs + off, 8, q_c_ac);
1611  }
1612 
1613  memset(v_coeffs, 0, sizeof(v_coeffs[0])*64);
1614  for (int i = 0; i < 4; i++)
1615  if ((ccbp >> (20 + i)) & 1) {
1616  int off = (i & 1) * 4 + (i & 2) * 2 * 8;
1617  if (!i)
1618  decode_4x4_block_dc(gb, vlc, 0, v_coeffs + off, 8, q_c_dc, q_c_ac);
1619  else
1620  decode_4x4_block(gb, vlc, 0, v_coeffs + off, 8, q_c_ac);
1621  }
1622 }
1623 
1624 static int decode_super_cbp(GetBitContext * gb, const VLCElem * vlc[4])
1625 {
1626  int sym0 = get_vlc2(gb, vlc[0], 9, 2);
1627  int sym1 = get_vlc2(gb, vlc[1], 9, 2);
1628  int sym2 = get_vlc2(gb, vlc[2], 9, 2);
1629  int sym3 = get_vlc2(gb, vlc[3], 9, 2);
1630  return 0
1631  + ((sym0 & 0x03) << 0)
1632  + ((sym0 & 0x0C) << 2)
1633  + ((sym0 & 0x10) << 12)
1634  + ((sym0 & 0x20) << 15)
1635  + ((sym1 & 0x03) << 2)
1636  + ((sym1 & 0x0C) << 4)
1637  + ((sym1 & 0x10) << 13)
1638  + ((sym1 & 0x20) << 16)
1639  + ((sym2 & 0x03) << 8)
1640  + ((sym2 & 0x0C) << 10)
1641  + ((sym2 & 0x10) << 14)
1642  + ((sym2 & 0x20) << 17)
1643  + ((sym3 & 0x03) << 10)
1644  + ((sym3 & 0x0C) << 12)
1645  + ((sym3 & 0x10) << 15)
1646  + ((sym3 & 0x20) << 18);
1647 }
1648 
1649 static int decode_cbp16(GetBitContext * gb, int subset, int qp)
1650 {
1651  int cb_set = rv60_qp_to_idx[qp];
1652  return decode_super_cbp(gb, cbp16_vlc[cb_set][subset]);
1653 }
1654 
1655 static int decode_cu_r(RV60Context * s, AVFrame * frame, ThreadContext * thread, GetBitContext * gb, int xpos, int ypos, int log_size, int qp, int sel_qp)
1656 {
1657  int size = 1 << log_size;
1658  int split, ret, ttype, count, is_intra, cu_pos, subset, cbp8, imode, split_i4x4, num_clusters, cl_cbp, super_cbp, mv_x, mv_y, mv_pos;
1659  int16_t y_coeffs[16*16], u_coeffs[8*8], v_coeffs[8*8];
1660  CUContext cu;
1661 
1662  if (xpos >= s->awidth || ypos >= s->aheight)
1663  return 0;
1664 
1665  split = xpos + size > s->awidth || ypos + size > s->aheight || (size > 8 && get_bits1(gb));
1666  thread->cu_split[thread->cu_split_pos++] = split;
1667  if (split) {
1668  size >>= 1;
1669  log_size -= 1;
1670  if ((ret = decode_cu_r(s, frame, thread, gb, xpos, ypos, log_size, qp, sel_qp)) < 0 ||
1671  (ret = decode_cu_r(s, frame, thread, gb, xpos + size, ypos, log_size, qp, sel_qp)) < 0 ||
1672  (ret = decode_cu_r(s, frame, thread, gb, xpos, ypos + size, log_size, qp, sel_qp)) < 0 ||
1673  (ret = decode_cu_r(s, frame, thread, gb, xpos + size, ypos + size, log_size, qp, sel_qp)) < 0)
1674  return ret;
1675  return 0;
1676  }
1677 
1678  cu.xpos = xpos;
1679  cu.ypos = ypos;
1680  cu.pu_pos = (xpos >> 3) + (ypos >> 3) * s->pu_stride;
1681  cu.blk_pos = (xpos >> 2) + (ypos >> 2) * s->blk_stride;
1682  cu.cu_type = s->pict_type != AV_PICTURE_TYPE_I ? get_bits(gb, 2) : CU_INTRA;
1683 
1684  switch (cu.cu_type) {
1685  case CU_INTRA:
1686  cu.pu_type = size == 8 && get_bits1(gb) ? PU_QUARTERS : PU_FULL;
1687  if (cu.pu_type == PU_QUARTERS)
1688  for (int i = 0; i < 4; i++)
1689  cu.imode[i] = read_intra_mode(gb, &cu.imode_param[i]);
1690  else if (size <= 32)
1691  cu.imode[0] = read_intra_mode(gb, &cu.imode_param[0]);
1692  else
1694  break;
1695  case CU_INTER_MV:
1696  cu.pu_type = get_bits(gb, size == 8 ? 2 : 3);
1697  count = pu_type_num_parts(cu.pu_type);
1698  for (int i = 0; i < count; i++)
1699  read_mv_info(s, gb, &cu.mv[i], size, cu.pu_type);
1700  break;
1701  default:
1702  cu.pu_type = PU_FULL;
1703  cu.mv[0].mvref = skip_mv_ref[get_unary(gb, 0, 3)];
1704  break;
1705  }
1706 
1707  reconstruct(s, &cu, size);
1708 
1709  split_i4x4 = cu.cu_type == CU_INTRA && size == 8 && cu.pu_type == PU_QUARTERS;
1710 
1711  switch (cu.cu_type) {
1712  case CU_INTRA:
1713  imode = s->blk_info[cu.blk_pos].imode;
1714  if (!split_i4x4) {
1715  int off = ypos * frame->linesize[0] + xpos;
1716  populate_ipred(s, &cu, frame->data[0], frame->linesize[0], 0, 0, size, 1);
1717  if (pred_angle(&cu.ipred, frame->data[0] + off, frame->linesize[0], size, imode, 1) < 0)
1718  return AVERROR_INVALIDDATA;
1719  }
1720  for (int plane = 1; plane < 3; plane++) {
1721  int off = (ypos >> 1) * frame->linesize[plane] + (xpos >> 1);
1722  populate_ipred(s, &cu, frame->data[plane], frame->linesize[plane], 0, 0, size >> 1, 0);
1723  if (pred_angle(&cu.ipred, frame->data[plane] + off, frame->linesize[plane], size >> 1, imode, 0) < 0)
1724  return AVERROR_INVALIDDATA;
1725  }
1726  break;
1727  default:
1728  mv_x = xpos >> 2;
1729  mv_y = ypos >> 2;
1730  mv_pos = mv_y * s->blk_stride + mv_x;
1731  count = pu_type_num_parts(cu.pu_type);
1732  for (int part_no = 0; part_no < count; part_no++) {
1733  MVInfo mv;
1734  Dimensions dim;
1735  int bw, bh, bx, by;
1736 
1737  mv = s->blk_info[mv_pos].mv;
1738  get_mv_dimensions(&dim, cu.pu_type, part_no, size);
1739  bw = dim.w << 2;
1740  bh = dim.h << 2;
1741  bx = mv_x << 2;
1742  by = mv_y << 2;
1743 
1744  if (!(mv.mvref & 2)) {
1745  if (!s->last_frame[LAST_PIC]->data[0]) {
1746  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
1747  return AVERROR_INVALIDDATA;
1748  }
1749  }
1750  if (mv.mvref & 6) {
1751  if (!s->last_frame[NEXT_PIC]->data[0]) {
1752  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
1753  return AVERROR_INVALIDDATA;
1754  }
1755  }
1756 
1757  switch (mv.mvref) {
1758  case MVREF_REF0:
1759  mc(s, frame->data, frame->linesize, s->last_frame[LAST_PIC], bx, by, bw, bh, mv.f_mv, 0);
1760  break;
1761  case MVREF_REF1:
1762  mc(s, frame->data, frame->linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.f_mv, 0);
1763  break;
1764  case MVREF_BREF:
1765  mc(s, frame->data, frame->linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.b_mv, 0);
1766  break;
1767  case MVREF_REF0ANDBREF:
1768  mc(s, frame->data, frame->linesize, s->last_frame[LAST_PIC], bx, by, bw, bh, mv.f_mv, 0);
1769  mc(s, thread->avg_data, thread->avg_linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.b_mv, 1);
1770  avg(frame, thread->avg_data, thread->avg_linesize, bx, by, bw, bh);
1771  break;
1772  default:
1773  av_assert0(0); //should never reach here
1774  }
1775  get_next_mv(s, &dim, cu.pu_type, part_no, &mv_pos, &mv_x, &mv_y);
1776  }
1777  break;
1778  }
1779 
1780  if (cu.cu_type == CU_SKIP)
1781  ttype = TRANSFORM_NONE;
1782  else if (size >= 32)
1783  ttype = TRANSFORM_16X16;
1784  else if (size == 16)
1785  ttype = cu.cu_type == CU_INTRA || cu.pu_type == PU_FULL ? TRANSFORM_16X16 : TRANSFORM_4X4;
1786  else
1787  ttype = cu.pu_type == PU_FULL ? TRANSFORM_8X8 : TRANSFORM_4X4;
1788 
1789  is_intra = cu.cu_type == CU_INTRA;
1790  if (qp >= 32)
1791  return AVERROR_INVALIDDATA;
1792  cu_pos = ((xpos & 63) >> 3) + ((ypos & 63) >> 3) * 8;
1793 
1794  switch (ttype) {
1795  case TRANSFORM_4X4:
1796  subset = is_intra ? 0 : 2;
1797  if (size == 16) {
1798  int cbp16 = get_bits1(gb) ? decode_cbp16(gb, subset, sel_qp) : 0;
1799  if (cbp16) {
1800  decode_cu_4x4in16x16(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp16);
1801  for (int y = 0; y < 4; y++)
1802  for (int x = 0; x < 4; x++) {
1803  int i = y*4 + x;
1804  if ((cbp16 >> i) & 1) {
1805  int off = (ypos + y * 4)*frame->linesize[0] + xpos + x * 4;
1806  ff_rv60_idct4x4_add(y_coeffs + i*16, frame->data[0] + off, frame->linesize[0]);
1807  thread->coded_blk[cu_pos + (y/2)*8 + (x/2)] = 1;
1808  }
1809  }
1810  for (int y = 0; y < 2; y++)
1811  for (int x = 0; x < 2; x++) {
1812  int i = y * 2 + x;
1813  int xoff = (xpos >> 1) + x * 4;
1814  int yoff = (ypos >> 1) + y * 4;
1815  if ((cbp16 >> (16 + i)) & 1) {
1816  int off = yoff * frame->linesize[1] + xoff;
1817  ff_rv60_idct4x4_add(u_coeffs + i * 16, frame->data[1] + off, frame->linesize[1]);
1818  thread->coded_blk[cu_pos + y*8 + x] = 1;
1819  }
1820  if ((cbp16 >> (20 + i)) & 1) {
1821  int off = yoff * frame->linesize[2] + xoff;
1822  ff_rv60_idct4x4_add(v_coeffs + i * 16, frame->data[2] + off, frame->linesize[2]);
1823  thread->coded_blk[cu_pos + y*8 + x] = 1;
1824  }
1825  }
1826  }
1827  } else {
1828  cbp8 = decode_cbp8(gb, subset, sel_qp);
1829  if (cbp8) {
1830  thread->coded_blk[cu_pos] = 1;
1831  decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 1);
1832  }
1833  for (int i = 0; i < 4; i++) {
1834  int xoff = (i & 1) << 2;
1835  int yoff = (i & 2) << 1;
1836  if (split_i4x4) {
1837  int off = (ypos + yoff) * frame->linesize[0] + xpos + xoff;
1838  int imode = s->blk_info[cu.blk_pos + (i >> 1) * s->blk_stride + (i & 1)].imode;
1839  populate_ipred(s, &cu, frame->data[0], frame->linesize[0], xoff, yoff, 4, 1);
1840  if (pred_angle(&cu.ipred, frame->data[0] + off, frame->linesize[0], 4, imode, 1) < 0)
1841  return AVERROR_INVALIDDATA;
1842  }
1843  if ((cbp8 >> i) & 1) {
1844  int off = (ypos + yoff) * frame->linesize[0] + xpos + xoff;
1845  ff_rv60_idct4x4_add(y_coeffs + i * 16, frame->data[0] + off, frame->linesize[0]);
1846  }
1847  }
1848  if ((cbp8 >> 4) & 1) {
1849  int off = (ypos >> 1) * frame->linesize[1] + (xpos >> 1);
1850  ff_rv60_idct4x4_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1851  }
1852  if ((cbp8 >> 5) & 1) {
1853  int off = (ypos >> 1) * frame->linesize[2] + (xpos >> 1);
1854  ff_rv60_idct4x4_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1855  }
1856  }
1857  break;
1858  case TRANSFORM_8X8:
1859  subset = is_intra ? 1 : 3;
1860  cbp8 = decode_cbp8(gb, subset, sel_qp);
1861  if (cbp8) {
1862  thread->coded_blk[cu_pos] = 1;
1863  decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 0);
1864  if (cbp8 & 0xF) {
1865  int off = ypos * frame->linesize[0] + xpos;
1866  ff_rv60_idct8x8_add(y_coeffs, frame->data[0] + off, frame->linesize[0]);
1867  }
1868  if ((cbp8 >> 4) & 1) {
1869  int off = (ypos >> 1) * frame->linesize[1] + (xpos >> 1);
1870  ff_rv60_idct4x4_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1871  }
1872  if ((cbp8 >> 5) & 1) {
1873  int off = (ypos >> 1) * frame->linesize[2] + (xpos >> 1);
1874  ff_rv60_idct4x4_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1875  }
1876  }
1877  break;
1878  case TRANSFORM_16X16:
1879  subset = is_intra ? 1 : 3;
1880  num_clusters = size >> 4;
1881  cl_cbp = get_bits(gb, num_clusters * num_clusters);
1882  for (int y = 0; y < num_clusters; y++) {
1883  for (int x = 0; x < num_clusters; x++) {
1884  if (!((cl_cbp >> (y*num_clusters + x)) & 1))
1885  continue;
1886  thread->coded_blk[cu_pos + y*2*8 + x*2 + 0] = 1;
1887  thread->coded_blk[cu_pos + y*2*8 + x*2 + 1] = 1;
1888  thread->coded_blk[cu_pos + y*2*8 + x*2 + 8] = 1;
1889  thread->coded_blk[cu_pos + y*2*8 + x*2 + 9] = 1;
1890  super_cbp = decode_cbp16(gb, subset, sel_qp);
1891  if (super_cbp) {
1892  decode_cu_16x16(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, super_cbp);
1893  if (super_cbp & 0xFFFF) {
1894  int off = (ypos + y * 16) * frame->linesize[0] + xpos + x * 16;
1895  ff_rv60_idct16x16_add(y_coeffs, frame->data[0] + off, frame->linesize[0]);
1896  }
1897  if ((super_cbp >> 16) & 0xF) {
1898  int off = ((ypos >> 1) + y * 8) * frame->linesize[1] + (xpos >> 1) + x * 8;
1899  ff_rv60_idct8x8_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1900  }
1901  if ((super_cbp >> 20) & 0xF) {
1902  int off = ((ypos >> 1) + y * 8) * frame->linesize[2] + (xpos >> 1) + x * 8;
1903  ff_rv60_idct8x8_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1904  }
1905  }
1906  }
1907  }
1908  break;
1909  }
1910 
1911  return 0;
1912 }
1913 
1914 static int deblock_get_pos(RV60Context * s, int xpos, int ypos)
1915 {
1916  return (ypos >> 2) * s->dblk_stride + (xpos >> 2);
1917 }
1918 
1919 static void deblock_set_strength(RV60Context * s, int xpos, int ypos, int size, int q, int strength)
1920 {
1921  int pos = deblock_get_pos(s, xpos, ypos);
1922  int dsize = size >> 2;
1923  int dval = (q << 2) + strength;
1924 
1925  for (int x = 0; x < dsize; x++) {
1926  s->top_str[pos + x] = dval;
1927  s->top_str[pos + (dsize - 1)*s->dblk_stride + x] = dval;
1928  }
1929 
1930  for (int y = 0; y < dsize; y++) {
1931  s->left_str[pos + y*s->dblk_stride] = dval;
1932  s->left_str[pos + y*s->dblk_stride + dsize - 1] = dval;
1933  }
1934 }
1935 
1936 static int deblock_get_top_strength(const RV60Context * s, int pos)
1937 {
1938  return s->top_str[pos] & 3;
1939 }
1940 
1941 static int deblock_get_left_strength(const RV60Context * s, int pos)
1942 {
1943  return s->left_str[pos] & 3;
1944 }
1945 
1946 static void deblock_set_top_strength(RV60Context * s, int pos, int strength)
1947 {
1948  s->top_str[pos] |= strength;
1949 }
1950 
1951 static void deblock_set_left_strength(RV60Context * s, int pos, int strength)
1952 {
1953  s->left_str[pos] |= strength;
1954 }
1955 
1956 static void derive_deblock_strength(RV60Context * s, int xpos, int ypos, int size)
1957 {
1958  int blk_pos = (ypos >> 2) * s->blk_stride + (xpos >> 2);
1959  int dblk_pos = deblock_get_pos(s, xpos, ypos);
1960  if (ypos > 0)
1961  for (int i = 0; i < size; i++)
1962  if (!deblock_get_top_strength(s, dblk_pos - s->dblk_stride + i) && mvinfo_is_deblock_cand(&s->blk_info[blk_pos + i].mv, &s->blk_info[blk_pos - s->blk_stride + i].mv))
1963  deblock_set_top_strength(s, dblk_pos + i, 1);
1964  if (xpos > 0)
1965  for (int i = 0; i < size; i++)
1966  if (!deblock_get_left_strength(s, dblk_pos + i *s->dblk_stride - 1) && mvinfo_is_deblock_cand(&s->blk_info[blk_pos + i*s->blk_stride].mv, &s->blk_info[blk_pos + i*s->blk_stride - 1].mv))
1967  deblock_set_left_strength(s, dblk_pos + i *s->dblk_stride, 1);
1968 }
1969 
1970 #define STRENGTH(el, lim) (FFABS(el) < (lim) ? 3 : 1)
1971 #define CLIP_SYMM(a, b) av_clip(a, -(b), b)
1972 
1973 static void filter_luma_edge(uint8_t * dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
1974 {
1975  int16_t diff_q1q0[4];
1976  int16_t diff_p1p0[4];
1977  int str_p, str_q, msum, maxprod, weak;
1978 
1979  for (int i = 0; i < 4; i++) {
1980  diff_q1q0[i] = dst[i * stride - 2*step] - dst[i*stride - step];
1981  diff_p1p0[i] = dst[i * stride + step] - dst[i*stride];
1982  }
1983 
1984  str_p = STRENGTH(diff_q1q0[0] + diff_q1q0[1] + diff_q1q0[2] + diff_q1q0[3], lim2);
1985  str_q = STRENGTH(diff_p1p0[0] + diff_p1p0[1] + diff_p1p0[2] + diff_p1p0[3], lim2);
1986 
1987  if (str_p + str_q <= 2)
1988  return;
1989 
1990  msum = (mode1 + mode2 + str_q + str_p) >> 1;
1991  if (str_q == 1 || str_p == 1) {
1992  maxprod = 384;
1993  weak = 1;
1994  } else {
1995  maxprod = 256;
1996  weak = 0;
1997  }
1998 
1999  for (int y = 0; y < 4; y++) {
2000  int diff_p0q0 = dst[0] - dst[-step];
2001  int result = (lim1 * FFABS(diff_p0q0)) & -128;
2002  if (diff_p0q0 && result <= maxprod) {
2003  int diff_q1q2 = dst[-2*step] - dst[-3*step];
2004  int diff_p1p2 = dst[step] - dst[2*step];
2005  int delta;
2006  if (weak) {
2007  delta = CLIP_SYMM((diff_p0q0 + 1) >> 1, msum >> 1);
2008  } else {
2009  int diff_strg = (dst[-2*step] - dst[step] + 4 * diff_p0q0 + 4) >> 3;
2010  delta = CLIP_SYMM(diff_strg, msum);
2011  }
2012  dst[-step] = av_clip_uint8(dst[-step] + delta);
2013  dst[0] = av_clip_uint8(dst[0] - delta);
2014  if (str_p != 1 && FFABS(diff_q1q2) <= (lim2 >> 2)) {
2015  int diff = (diff_q1q0[y] + diff_q1q2 - delta) >> 1;
2016  int delta_q1 = weak ? CLIP_SYMM(diff, mode1 >> 1) : CLIP_SYMM(diff, mode1);
2017  dst[-2 * step] = av_clip_uint8(dst[-2*step] - delta_q1);
2018  }
2019  if (str_q != 1 && FFABS(diff_p1p2) <= (lim2 >> 2)) {
2020  int diff = (diff_p1p0[y] + diff_p1p2 + delta) >> 1;
2021  int delta_p1 = weak ? CLIP_SYMM(diff, mode2 >> 1) : CLIP_SYMM(diff, mode2);
2022  dst[step] = av_clip_uint8(dst[step] - delta_p1);
2023  }
2024  }
2025  dst += stride;
2026  }
2027 }
2028 
2029 static void filter_chroma_edge(uint8_t * dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
2030 {
2031  int diff_q = 4 * FFABS(dst[-2*step] - dst[-step]);
2032  int diff_p = 4 * FFABS(dst[ step] - dst[0]);
2033  int str_q = STRENGTH(diff_q, lim2);
2034  int str_p = STRENGTH(diff_p, lim2);
2035  int msum, maxprod, weak;
2036 
2037  if (str_p + str_q <= 2)
2038  return;
2039 
2040  msum = (mode1 + mode2 + str_q + str_p) >> 1;
2041  if (str_q == 1 || str_p == 1) {
2042  maxprod = 384;
2043  weak = 1;
2044  } else {
2045  maxprod = 256;
2046  weak = 0;
2047  }
2048 
2049  for (int y = 0; y < 2; y++) {
2050  int diff_pq = dst[0] - dst[-step];
2051  int result = (lim1 * FFABS(diff_pq)) & -128;
2052  if (diff_pq && result <= maxprod) {
2053  int delta;
2054  if (weak) {
2055  delta = CLIP_SYMM((diff_pq + 1) >> 1, msum >> 1);
2056  } else {
2057  int diff_strg = (dst[-2*step] - dst[step] + 4 * diff_pq + 4) >> 3;
2058  delta = CLIP_SYMM(diff_strg, msum);
2059  }
2060  dst[-step] = av_clip_uint8(dst[-step] + delta);
2061  dst[ 0 ] = av_clip_uint8(dst[ 0 ] - delta);
2062  }
2063  dst += stride;
2064  }
2065 }
2066 
2067 static void deblock_edge_ver(AVFrame * frame, int xpos, int ypos, int dblk_l, int dblk_r, int deblock_chroma)
2068 {
2069  int qp_l = dblk_l >> 2;
2070  int str_l = dblk_l & 3;
2071  int qp_r = dblk_r >> 2;
2072  int str_r = dblk_r & 3;
2073  const uint8_t * dl_l = rv60_deblock_limits[qp_l];
2074  const uint8_t * dl_r = rv60_deblock_limits[qp_r];
2075  int mode_l = str_l ? dl_l[str_l - 1] : 0;
2076  int mode_r = str_r ? dl_r[str_r - 1] : 0;
2077  int lim1 = dl_r[2];
2078  int lim2 = dl_r[3] * 4;
2079 
2080  filter_luma_edge(frame->data[0] + ypos * frame->linesize[0] + xpos, 1, frame->linesize[0], mode_l, mode_r, lim1, lim2);
2081  if ((str_l | str_r) >= 2 && deblock_chroma)
2082  for (int plane = 1; plane < 3; plane++)
2083  filter_chroma_edge(frame->data[plane] + (ypos >> 1) * frame->linesize[plane] + (xpos >> 1), 1, frame->linesize[plane], mode_l, mode_r, lim1, lim2);
2084 }
2085 
2086 static void deblock_edge_hor(AVFrame * frame, int xpos, int ypos, int dblk_t, int dblk_d, int deblock_chroma)
2087 {
2088  int qp_t = dblk_t >> 2;
2089  int str_t = dblk_t & 3;
2090  int qp_d = dblk_d >> 2;
2091  int str_d = dblk_d & 3;
2092  const uint8_t * dl_t = rv60_deblock_limits[qp_t];
2093  const uint8_t * dl_d = rv60_deblock_limits[qp_d];
2094  int mode_t = str_t ? dl_t[str_t - 1] : 0;
2095  int mode_d = str_d ? dl_d[str_d - 1] : 0;
2096  int lim1 = dl_d[2];
2097  int lim2 = dl_d[3] * 4;
2098 
2099  filter_luma_edge(frame->data[0] + ypos * frame->linesize[0] + xpos, frame->linesize[0], 1, mode_t, mode_d, lim1, lim2);
2100  if ((str_t | str_d) >= 2 && deblock_chroma)
2101  for (int plane = 1; plane < 3; plane++)
2102  filter_chroma_edge(frame->data[plane] + (ypos >> 1) * frame->linesize[plane] + (xpos >> 1), frame->linesize[plane], 1, mode_t, mode_d, lim1, lim2);
2103 }
2104 
2105 static void deblock8x8(const RV60Context * s, AVFrame * frame, int xpos, int ypos, int dblkpos)
2106 {
2107  if (xpos > 0) {
2108  if (ypos > 0) {
2109  int str_l = s->left_str[dblkpos - s->dblk_stride - 1];
2110  int str_r = s->left_str[dblkpos - s->dblk_stride];
2111  if ((str_l | str_r) & 3)
2112  deblock_edge_ver(frame, xpos, ypos - 4, str_l, str_r, s->deblock_chroma);
2113  }
2114  {
2115  int str_l = s->left_str[dblkpos - 1];
2116  int str_r = s->left_str[dblkpos];
2117  if ((str_l | str_r) & 3)
2118  deblock_edge_ver(frame, xpos, ypos, str_l, str_r, s->deblock_chroma);
2119  }
2120  if (ypos + 8 >= s->aheight) {
2121  int str_l = s->left_str[dblkpos + s->dblk_stride - 1];
2122  int str_r = s->left_str[dblkpos + s->dblk_stride];
2123  if ((str_l | str_r) & 3)
2124  deblock_edge_ver(frame, xpos, ypos + 4, str_l, str_r, s->deblock_chroma);
2125  }
2126  }
2127  if (ypos > 0) {
2128  if (xpos > 0) {
2129  int str_t = s->top_str[dblkpos - s->dblk_stride - 1];
2130  int str_d = s->top_str[dblkpos - 1];
2131  if ((str_t | str_d) & 3)
2132  deblock_edge_hor(frame, xpos - 4, ypos, str_t, str_d, s->deblock_chroma);
2133  }
2134  {
2135  int str_t = s->top_str[dblkpos - s->dblk_stride];
2136  int str_d = s->top_str[dblkpos];
2137  if ((str_t | str_d) & 3)
2138  deblock_edge_hor(frame, xpos, ypos, str_t, str_d, s->deblock_chroma);
2139  }
2140  if (xpos + 8 >= s->awidth) {
2141  int str_t = s->top_str[dblkpos - s->dblk_stride + 1];
2142  int str_d = s->top_str[dblkpos + 1];
2143  if ((str_t | str_d) & 3)
2144  deblock_edge_hor(frame, xpos + 4, ypos, str_t, str_d, s->deblock_chroma);
2145  }
2146  }
2147 }
2148 
2149 static void deblock(const RV60Context * s, AVFrame * frame, int xpos, int ypos, int size, int dpos)
2150 {
2151  for (int x = 0; x < size >> 3; x++)
2152  deblock8x8(s, frame, xpos + x * 8, ypos, dpos + x * 2);
2153 
2154  for (int y = 1; y < size >> 3; y++)
2155  deblock8x8(s, frame, xpos, ypos + y * 8, dpos + y * 2 * s->dblk_stride);
2156 }
2157 
2158 static void deblock_cu_r(RV60Context * s, AVFrame * frame, ThreadContext * thread, int xpos, int ypos, int log_size, int qp)
2159 {
2160  int pu_pos, tsize, ntiles;
2161  enum CUType cu_type;
2162 
2163  if (xpos >= s->awidth || ypos >= s->aheight)
2164  return;
2165 
2166  if (thread->cu_split[thread->cu_split_pos++]) {
2167  int hsize = 1 << (log_size - 1);
2168  log_size--;
2169  deblock_cu_r(s, frame, thread, xpos, ypos, log_size, qp);
2170  deblock_cu_r(s, frame, thread, xpos + hsize, ypos, log_size, qp);
2171  deblock_cu_r(s, frame, thread, xpos, ypos + hsize, log_size, qp);
2172  deblock_cu_r(s, frame, thread, xpos + hsize, ypos + hsize, log_size, qp);
2173  return;
2174  }
2175 
2176  pu_pos = (ypos >> 3) * s->pu_stride + (xpos >> 3);
2177  cu_type = s->pu_info[pu_pos].cu_type;
2178  switch (log_size) {
2179  case 3: tsize = 3; break;
2180  case 4: tsize = cu_type && s->pu_info[pu_pos].pu_type ? 3 : 4; break;
2181  case 5:
2182  case 6: tsize = 4; break;
2183  }
2184  ntiles = 1 << (log_size - tsize);
2185 
2186  for (int ty = 0; ty < ntiles; ty++)
2187  for (int tx = 0; tx < ntiles; tx++) {
2188  int x = xpos + (tx << tsize);
2189  int y = ypos + (ty << tsize);
2190  int cu_pos = ((y & 63) >> 3) * 8 + ((x & 63) >> 3);
2191 
2192  if (cu_type == CU_INTRA)
2193  deblock_set_strength(s, x, y, 1 << tsize, qp, 2);
2194  else if (cu_type != CU_SKIP && thread->coded_blk[cu_pos])
2195  deblock_set_strength(s, x, y, 1 << tsize, qp, 1);
2196  else {
2197  deblock_set_strength(s, x, y, 1 << tsize, qp, 0);
2198  derive_deblock_strength(s, x, y, 1 << (tsize - 2));
2199  }
2200 
2201  deblock(s, frame, x, y, 1 << tsize, deblock_get_pos(s, x, y));
2202  }
2203 }
2204 
2205 static int read_qp_offset(GetBitContext *gb, int qp_off_type)
2206 {
2207  int val;
2208 
2209  switch (qp_off_type) {
2210  case 0:
2211  return 0;
2212  case 1:
2213  val = read_code012(gb);
2214  return val != 2 ? val : -1;
2215  default:
2216  if (!get_bits1(gb))
2217  return 0;
2218  val = get_bits(gb, 2);
2219  if (!(val & 2))
2220  return val + 1;
2221  else
2222  return -((val & 1) + 1);
2223  }
2224 }
2225 
2226 static int calc_sel_qp(int osvquant, int qp)
2227 {
2228  switch (osvquant) {
2229  case 0: return qp;
2230  case 1: return qp <= 25 ? qp + 5 : qp;
2231  default:
2232  if (qp <= 18)
2233  return qp + 10;
2234  else if (qp <= 25)
2235  return qp + 5;
2236  else
2237  return qp;
2238  }
2239 }
2240 
2241 static int decode_slice(AVCodecContext *avctx, void *tdata, int cu_y, int threadnr)
2242 {
2243  RV60Context *s = avctx->priv_data;
2244  AVFrame * frame = tdata;
2245  ThreadContext thread;
2246  GetBitContext gb;
2247  int qp, sel_qp, ret;
2248 
2249  thread.avg_data[0] = thread.avg_buffer;
2250  thread.avg_data[1] = thread.avg_buffer + 64*64;
2251  thread.avg_data[2] = thread.avg_buffer + 64*64 + 32*32;
2252  thread.avg_linesize[0] = 64;
2253  thread.avg_linesize[1] = 32;
2254  thread.avg_linesize[2] = 32;
2255 
2256  if ((ret = init_get_bits8(&gb, s->slice[cu_y].data, s->slice[cu_y].data_size)) < 0)
2257  return ret;
2258 
2259  for (int cu_x = 0; cu_x < s->cu_width; cu_x++) {
2260  if ((s->avctx->active_thread_type & FF_THREAD_SLICE) && cu_y)
2261  ff_thread_progress_await(&s->progress[cu_y - 1], cu_x + 2);
2262 
2263  qp = s->qp + read_qp_offset(&gb, s->qp_off_type);
2264  if (qp < 0) {
2266  break;
2267  }
2268  sel_qp = calc_sel_qp(s->osvquant, qp);
2269 
2270  memset(thread.coded_blk, 0, sizeof(thread.coded_blk));
2271  thread.cu_split_pos = 0;
2272 
2273  if ((ret = decode_cu_r(s, frame, &thread, &gb, cu_x << 6, cu_y << 6, 6, qp, sel_qp)) < 0)
2274  break;
2275 
2276  if (s->deblock) {
2277  thread.cu_split_pos = 0;
2278  deblock_cu_r(s, frame, &thread, cu_x << 6, cu_y << 6, 6, qp);
2279  }
2280 
2281  if (s->avctx->active_thread_type & FF_THREAD_SLICE)
2282  ff_thread_progress_report(&s->progress[cu_y], cu_x + 1);
2283  }
2284 
2285  if (s->avctx->active_thread_type & FF_THREAD_SLICE)
2286  ff_thread_progress_report(&s->progress[cu_y], INT_MAX);
2287 
2288  return ret;
2289 }
2290 
2292  int * got_frame, AVPacket * avpkt)
2293 {
2294  RV60Context *s = avctx->priv_data;
2295  GetBitContext gb;
2296  int ret, header_size, width, height, ofs;
2297 
2298  if (avpkt->size == 0) {
2299  if (s->last_frame[NEXT_PIC]->data[0]) {
2300  av_frame_move_ref(frame, s->last_frame[NEXT_PIC]);
2301  *got_frame = 1;
2302  }
2303  return 0;
2304  }
2305 
2306  if (avpkt->size < 9)
2307  return AVERROR_INVALIDDATA;
2308 
2309  header_size = avpkt->data[0] * 8 + 9;
2310  if (avpkt->size < header_size)
2311  return AVERROR_INVALIDDATA;
2312 
2313  if ((ret = init_get_bits8(&gb, avpkt->data + header_size, avpkt->size - header_size)) < 0)
2314  return ret;
2315 
2316  if ((ret = read_frame_header(s, &gb, &width, &height)) < 0)
2317  return ret;
2318 
2319  if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
2320  avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
2321  avctx->skip_frame >= AVDISCARD_ALL)
2322  return avpkt->size;
2323 
2324  if (s->pict_type != AV_PICTURE_TYPE_B)
2325  FFSWAP(AVFrame *, s->last_frame[NEXT_PIC], s->last_frame[LAST_PIC]);
2326 
2327  if ((s->pict_type == AV_PICTURE_TYPE_P && !s->last_frame[LAST_PIC]->data[0]) ||
2328  (s->pict_type == AV_PICTURE_TYPE_B && (!s->last_frame[LAST_PIC]->data[0] || !s->last_frame[NEXT_PIC]->data[0]))) {
2329  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
2330  return AVERROR_INVALIDDATA;
2331  }
2332 
2333  s->last_frame[CUR_PIC]->pict_type = s->pict_type;
2334  if (s->pict_type == AV_PICTURE_TYPE_I)
2335  s->last_frame[CUR_PIC]->flags |= AV_FRAME_FLAG_KEY;
2336 
2338  return ret;
2339 
2340  if (!s->last_frame[CUR_PIC]->data[0])
2341  if ((ret = ff_get_buffer(avctx, s->last_frame[CUR_PIC], 0)) < 0)
2342  return ret;
2343 
2344  if ((ret = read_slice_sizes(s, &gb)) < 0)
2345  return ret;
2346 
2347  ofs = get_bits_count(&gb) / 8;
2348 
2349  for (int i = 0; i < s->cu_height; i++) {
2350  if (header_size + ofs >= avpkt->size)
2351  return AVERROR_INVALIDDATA;
2352  s->slice[i].data = avpkt->data + header_size + ofs;
2353  s->slice[i].data_size = FFMIN(s->slice[i].size, avpkt->size - header_size - ofs);
2354  ofs += s->slice[i].size;
2355  }
2356 
2357  ret = progress_init(s, s->cu_height);
2358  if (ret < 0)
2359  return ret;
2360 
2361  s->avctx->execute2(s->avctx, decode_slice, s->last_frame[CUR_PIC], NULL, s->cu_height);
2362 
2363  ret = 0;
2364  if (s->pict_type == AV_PICTURE_TYPE_B)
2365  av_frame_move_ref(frame, s->last_frame[CUR_PIC]);
2366  else if (s->last_frame[LAST_PIC]->data[0])
2367  ret = av_frame_ref(frame, s->last_frame[LAST_PIC]);
2368  if (ret < 0)
2369  return ret;
2370 
2371  if (frame->data[0])
2372  *got_frame = 1;
2373 
2374  if (s->pict_type != AV_PICTURE_TYPE_B) {
2375  av_frame_unref(s->last_frame[NEXT_PIC]);
2376  FFSWAP(AVFrame *, s->last_frame[CUR_PIC], s->last_frame[NEXT_PIC]);
2377  }
2378 
2379  if (s->pict_type != AV_PICTURE_TYPE_B) {
2380  s->ref_pts[0] = s->ref_pts[1];
2381  s->ref_pts[1] = avpkt->pts;
2382 
2383  s->ref_ts[0] = s->ref_ts[1];
2384  s->ref_ts[1] = s->ts;
2385 
2386  if (s->ref_pts[1] > s->ref_pts[0] && s->ref_ts[1] > s->ref_ts[0])
2387  s->ts_scale = (s->ref_pts[1] - s->ref_pts[0]) / (s->ref_ts[1] - s->ref_ts[0]);
2388  } else {
2389  frame->pts = s->ref_pts[0] + (s->ts - s->ref_ts[0]) * s->ts_scale;
2390  }
2391 
2392  return avpkt->size;
2393 }
2394 
2395 static void rv60_flush(AVCodecContext *avctx)
2396 {
2397  RV60Context *s = avctx->priv_data;
2398 
2399  for (int i = 0; i < 3; i++)
2400  av_frame_unref(s->last_frame[i]);
2401 }
2402 
2404 {
2405  RV60Context *s = avctx->priv_data;
2406 
2407  for (int i = 0; i < 3; i++)
2408  av_frame_free(&s->last_frame[i]);
2409 
2410  av_freep(&s->slice);
2411  av_freep(&s->pu_info);
2412  av_freep(&s->blk_info);
2413  av_freep(&s->top_str);
2414  av_freep(&s->left_str);
2415 
2416  for (int i = 0; i < s->nb_progress; i++)
2417  ff_thread_progress_destroy(&s->progress[i]);
2418  av_freep(&s->progress);
2419 
2420  return 0;
2421 }
2422 
2424  .p.name = "rv60",
2425  CODEC_LONG_NAME("RealVideo 6.0"),
2426  .p.type = AVMEDIA_TYPE_VIDEO,
2427  .p.id = AV_CODEC_ID_RV60,
2428  .priv_data_size = sizeof(RV60Context),
2432  .flush = rv60_flush,
2434  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
2435 };
fill_mv_skip_cand
static void fill_mv_skip_cand(RV60Context *s, const CUContext *cu, unique_list_mvinfo *skip_cand, int size)
Definition: rv60dec.c:873
filter_luma_edge
static void filter_luma_edge(uint8_t *dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
Definition: rv60dec.c:1973
skip_mv_ref
static const uint8_t skip_mv_ref[4]
Definition: rv60dec.c:75
ThreadContext::coded_blk
uint8_t coded_blk[64]
Definition: rv60dec.c:162
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
decode_2x2_dc
static void decode_2x2_dc(GetBitContext *gb, const CoeffVLCs *vlcs, int16_t *coeffs, int stride, int block2, int dsc, int q_dc, int q_ac)
Definition: rv60dec.c:1442
IntraMode
IntraMode
Definition: rv60dec.c:56
ff_thread_progress_report
void ff_thread_progress_report(ThreadProgress *pro, int n)
This function is a no-op in no-op mode; otherwise it notifies other threads that a certain level of p...
Definition: threadprogress.c:53
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
CoeffVLCs::l12
const VLCElem * l12[2]
Definition: rv60dec.c:89
IntraPredContext::l
uint8_t l[129]
Definition: rv60dec.c:461
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
rv60_flush
static void rv60_flush(AVCodecContext *avctx)
Definition: rv60dec.c:2395
pu_is_intra
static int pu_is_intra(const PUInfo *pu)
Definition: rv60dec.c:756
threadprogress.h
state
static struct @508 state
PUInfo::pu_type
enum PUType pu_type
Definition: rv60dec.c:187
RV60Context::deblock
int deblock
Definition: rv60dec.c:205
ThreadProgress
ThreadProgress is an API to easily notify other threads about progress of any kind as long as it can ...
Definition: threadprogress.h:43
RV60Context::deblock_chroma
int deblock_chroma
Definition: rv60dec.c:206
deblock_get_top_strength
static int deblock_get_top_strength(const RV60Context *s, int pos)
Definition: rv60dec.c:1936
MVREF_SKIP1
@ MVREF_SKIP1
Definition: rv60dec.c:70
AV_CODEC_ID_RV60
@ AV_CODEC_ID_RV60
Definition: codec_id.h:330
deblock
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
Definition: rv60dec.c:2149
CUContext::xpos
int xpos
Definition: rv60dec.c:469
CU_INTRA
@ CU_INTRA
Definition: rv60dec.c:39
RV60Context::osvquant
int osvquant
Definition: rv60dec.c:201
RV60Context::cu_width
int cu_width
Definition: rv60dec.c:209
pred_angle
static int pred_angle(const IntraPredContext *p, uint8_t *dst, int stride, int size, int imode, int filter)
Definition: rv60dec.c:656
IntraPredContext::has_t
int has_t
Definition: rv60dec.c:462
ff_rv60_idct8x8_add
void ff_rv60_idct8x8_add(const int16_t *block, uint8_t *dst, int dst_stride)
Definition: rv60dsp.c:50
read_mv
static void read_mv(GetBitContext *gb, MV *mv)
Definition: rv60dec.c:1190
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:404
decode_cu_16x16
static void decode_cu_16x16(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int ccbp)
Definition: rv60dec.c:1588
RV60Context::qp
int qp
Definition: rv60dec.c:200
mv
static const int8_t mv[256][2]
Definition: 4xm.c:81
FILTER_BLOCK
#define FILTER_BLOCK(dst, dst_stride, src, src_stride, src_y_ofs, w, h, cond, step)
Definition: rv60dec.c:1255
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:249
deblock_edge_ver
static void deblock_edge_ver(AVFrame *frame, int xpos, int ypos, int dblk_l, int dblk_r, int deblock_chroma)
Definition: rv60dec.c:2067
cbp8_vlc
static const VLCElem * cbp8_vlc[7][4]
Definition: rv60dec.c:84
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:63
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
MV::y
int16_t y
Definition: clearvideo.c:49
rv60_init_static_data
static av_cold void rv60_init_static_data(void)
Definition: rv60dec.c:134
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
INTRAMODE_PLANE64
@ INTRAMODE_PLANE64
Definition: rv60dec.c:59
IntraPredContext::has_tr
int has_tr
Definition: rv60dec.c:463
mvinfo_matches_forward
static int mvinfo_matches_forward(const MVInfo *a, const MVInfo *b)
Definition: rv60dec.c:991
RV60Context::dblk_stride
int dblk_stride
Definition: rv60dec.c:220
TRANSFORM_4X4
@ TRANSFORM_4X4
Definition: rv60dec.c:81
w
uint8_t w
Definition: llviddspenc.c:38
mc
static void mc(RV60Context *s, uint8_t *frame_data[3], int frame_linesize[3], const AVFrame *ref, int x, int y, int w, int h, MV mv, int avg)
Definition: rv60dec.c:1327
AVPacket::data
uint8_t * data
Definition: packet.h:535
filter_weak
static void filter_weak(uint8_t *dst, const uint8_t *src, int size)
Definition: rv60dec.c:597
b
#define b
Definition: input.c:42
ff_rv60_decoder
const FFCodec ff_rv60_decoder
Definition: rv60dec.c:2423
FFCodec
Definition: codec_internal.h:127
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
rv60_cbp8_lens
static const uint8_t rv60_cbp8_lens[7][4][64]
Definition: rv60vlcs.h:26
PU_N4VER
@ PU_N4VER
Definition: rv60dec.c:52
update_dimensions_clear_info
static int update_dimensions_clear_info(RV60Context *s, int width, int height)
Definition: rv60dec.c:275
CUContext
Definition: rv60dec.c:468
decode_4x4_block
static void decode_4x4_block(GetBitContext *gb, const CoeffVLCs *vlcs, int is_luma, int16_t *coeffs, int stride, int q_ac)
Definition: rv60dec.c:1502
rv60dsp.h
decode_cu_4x4in16x16
static void decode_cu_4x4in16x16(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int cbp)
Definition: rv60dec.c:1524
ipm_compar
static int ipm_compar(const void *a, const void *b)
Definition: rv60dec.c:761
ff_set_dimensions
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:91
PU_FULL
@ PU_FULL
Definition: rv60dec.c:46
deblock_get_pos
static int deblock_get_pos(RV60Context *s, int xpos, int ypos)
Definition: rv60dec.c:1914
IntraPredContext::has_l
int has_l
Definition: rv60dec.c:464
CUContext::pu_pos
int pu_pos
Definition: rv60dec.c:471
deblock_get_left_strength
static int deblock_get_left_strength(const RV60Context *s, int pos)
Definition: rv60dec.c:1941
populate_ipred
static void populate_ipred(const RV60Context *s, CUContext *cu, const uint8_t *src, int stride, int xoff, int yoff, int size, int is_luma)
Definition: rv60dec.c:490
ThreadContext::avg_buffer
uint8_t avg_buffer[64 *64+32 *32 *2]
Definition: rv60dec.c:164
TRANSFORM_16X16
@ TRANSFORM_16X16
Definition: rv60dec.c:79
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:364
golomb.h
exp golomb vlc stuff
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:135
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:318
Slice::data_size
int data_size
Definition: rv60dec.c:155
IntraPredContext::has_ld
int has_ld
Definition: rv60dec.c:465
MVREF_REF0ANDBREF
@ MVREF_REF0ANDBREF
Definition: rv60dec.c:68
has_left_block
static int has_left_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
Definition: rv60dec.c:434
CU_INTER_MV
@ CU_INTER_MV
Definition: rv60dec.c:40
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
CoeffVLCs::esc
const VLCElem * esc
Definition: rv60dec.c:91
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1662
RV60Context::left_str
uint8_t * left_str
Definition: rv60dec.c:221
RV60Context::qp_off_type
int qp_off_type
Definition: rv60dec.c:204
CoeffVLCs
Definition: rv60dec.c:87
GetBitContext
Definition: get_bits.h:108
deblock_set_top_strength
static void deblock_set_top_strength(RV60Context *s, int pos, int strength)
Definition: rv60dec.c:1946
get_skip_mv_index
static int get_skip_mv_index(enum MVRefEnum mvref)
Definition: rv60dec.c:857
deblock_edge_hor
static void deblock_edge_hor(AVFrame *frame, int xpos, int ypos, int dblk_t, int dblk_d, int deblock_chroma)
Definition: rv60dec.c:2086
weight
const h264_weight_func weight
Definition: h264dsp_init.c:33
val
static double val(void *priv, double ch)
Definition: aeval.c:77
ff_videodsp_init
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:39
get_mv_dimensions
static void get_mv_dimensions(Dimensions *dim, enum PUType pu_type, int part_no, int size)
Definition: rv60dec.c:900
LAST_PIC
#define LAST_PIC
Definition: rv60dec.c:195
CoeffLens
Definition: rv60vlcs.h:550
pred_plane
static void pred_plane(const IntraPredContext *p, uint8_t *dst, int stride, int size)
Definition: rv60dec.c:534
PU_N2VER
@ PU_N2VER
Definition: rv60dec.c:48
CU_SKIP
@ CU_SKIP
Definition: rv60dec.c:41
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:51
derive_deblock_strength
static void derive_deblock_strength(RV60Context *s, int xpos, int ypos, int size)
Definition: rv60dec.c:1956
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
CUContext::blk_pos
int blk_pos
Definition: rv60dec.c:472
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:528
quant
static int quant(int v, int q)
Definition: rv60dec.c:1420
MVREF_SKIP3
@ MVREF_SKIP3
Definition: rv60dec.c:72
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:625
VLCInitState
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
Definition: vlc.h:220
RV60Context::last_frame
AVFrame * last_frame[3]
Definition: rv60dec.c:197
decode_slice
static int decode_slice(AVCodecContext *avctx, void *tdata, int cu_y, int threadnr)
Definition: rv60dec.c:2241
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:341
s
#define s(width, name)
Definition: cbs_vp9.c:198
PU_QUARTERS
@ PU_QUARTERS
Definition: rv60dec.c:49
rv60_deblock_limits
static const uint8_t rv60_deblock_limits[32][4]
Definition: rv60data.h:107
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
rv60_edge2
static const uint8_t rv60_edge2[4]
Definition: rv60data.h:49
CoeffVLCs::l3
const VLCElem * l3[2]
Definition: rv60dec.c:90
PU_N2HOR
@ PU_N2HOR
Definition: rv60dec.c:47
ThreadContext::cu_split
uint8_t cu_split[1+4+16+64]
Definition: rv60dec.c:160
MK_UNIQUELIST
#define MK_UNIQUELIST(name, type, max_size)
Definition: rv60dec.c:766
Dimensions::w
int w
Definition: rv60dec.c:897
bits
uint8_t bits
Definition: vp3data.h:128
MEDIAN
#define MEDIAN(x)
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
rv60_cbp16_lens
static const uint8_t rv60_cbp16_lens[7][3][4][64]
Definition: rv60vlcs.h:155
MVREF_NONE
@ MVREF_NONE
Definition: rv60dec.c:64
predict_mv
static void predict_mv(const RV60Context *s, MVInfo *dst, int mv_x, int mv_y, int mv_w, const MVInfo *src)
Definition: rv60dec.c:1040
mv_is_forward
static int mv_is_forward(enum MVRefEnum mvref)
Definition: rv60dec.c:981
rv60_ipred_angle
static const uint8_t rv60_ipred_angle[9]
Definition: rv60data.h:30
decode.h
RV60Context::nb_progress
unsigned nb_progress
Definition: rv60dec.c:228
get_bits.h
MV::x
int16_t x
Definition: clearvideo.c:49
Slice
Definition: magicyuv.c:40
mv_is_ref0
static int mv_is_ref0(enum MVRefEnum mvref)
Definition: rv60dec.c:976
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
mv_pred
static void mv_pred(MV *ret, MV a, MV b, MV c)
Definition: rv60dec.c:1022
deblock8x8
static void deblock8x8(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int dblkpos)
Definition: rv60dec.c:2105
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
read_frame_header
static int read_frame_header(RV60Context *s, GetBitContext *gb, int *width, int *height)
Definition: rv60dec.c:342
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:229
MVREF_REF1
@ MVREF_REF1
Definition: rv60dec.c:66
decode_4x4_block_dc
static void decode_4x4_block_dc(GetBitContext *gb, const CoeffVLCs *vlcs, int is_luma, int16_t *coeffs, int stride, int q_dc, int q_ac)
Definition: rv60dec.c:1480
ipred_init
static void ipred_init(IntraPredContext *i)
Definition: rv60dec.c:483
ff_thread_progress_await
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
Definition: threadprogress.c:64
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
mvinfo_is_deblock_cand
static int mvinfo_is_deblock_cand(const MVInfo *a, const MVInfo *b)
Definition: rv60dec.c:1001
PUInfo
Definition: rv60dec.c:185
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
decode_cu_r
static int decode_cu_r(RV60Context *s, AVFrame *frame, ThreadContext *thread, GetBitContext *gb, int xpos, int ypos, int log_size, int qp, int sel_qp)
Definition: rv60dec.c:1655
NULL
#define NULL
Definition: coverity.c:32
CUContext::ypos
int ypos
Definition: rv60dec.c:470
PU_N4HOR
@ PU_N4HOR
Definition: rv60dec.c:50
rv60_chroma_quant_ac
static const uint8_t rv60_chroma_quant_ac[32]
Definition: rv60data.h:72
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
has_ver_split
static int has_ver_split(enum PUType pu_type)
Definition: rv60dec.c:942
RV60Context::pu_info
PUInfo * pu_info
Definition: rv60dec.c:215
TRANSFORM_8X8
@ TRANSFORM_8X8
Definition: rv60dec.c:80
table_data
static VLCElem table_data[129148]
Definition: rv60dec.c:98
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:371
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
read_slice_sizes
static int read_slice_sizes(RV60Context *s, GetBitContext *gb)
Definition: rv60dec.c:390
RV60Context::pu_stride
int pu_stride
Definition: rv60dec.c:214
has_hor_split
static int has_hor_split(enum PUType pu_type)
Definition: rv60dec.c:937
decode_2x2
static void decode_2x2(GetBitContext *gb, const CoeffVLCs *vlcs, int16_t *coeffs, int stride, int block2, int dsc, int q_ac)
Definition: rv60dec.c:1461
has_top_block
static int has_top_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
Definition: rv60dec.c:429
rv60_dsc_to_lx
static const uint8_t rv60_dsc_to_lx[][4]
Definition: rv60data.h:77
CUContext::mv
MVInfo mv[4]
Definition: rv60dec.c:478
IntraPredContext::t
uint8_t t[129]
Definition: rv60dec.c:460
cbp16_vlc
static const VLCElem * cbp16_vlc[7][4][4]
Definition: rv60dec.c:85
ff_log2
#define ff_log2
Definition: intmath.h:51
rv60data.h
Slice::data
const uint8_t * data
Definition: rv60dec.c:154
MVInfo
Definition: clearvideo.c:54
gen_vlc
static const VLCElem * gen_vlc(const uint8_t *bits, int size, VLCInitState *state)
Definition: rv60dec.c:101
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:635
RV60Context
Definition: rv60dec.c:190
rv60_intra_lens
static const CoeffLens rv60_intra_lens[5]
Definition: rv60vlcs.h:557
luma_mc
static void luma_mc(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h, int cx, int cy)
Definition: rv60dec.c:1262
AVOnce
#define AVOnce
Definition: thread.h:202
ThreadContext::avg_data
uint8_t * avg_data[3]
Definition: rv60dec.c:165
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
RV60Context::vdsp
VideoDSPContext vdsp
Definition: rv60dec.c:192
pred_dc
static void pred_dc(const IntraPredContext *p, uint8_t *dst, int stride, int size, int filter)
Definition: rv60dec.c:565
get_unary
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
Definition: unary.h:46
BlockInfo
Definition: dvdec.c:57
RV60Context::slice
Slice * slice
Definition: rv60dec.c:212
MVInfo::f_mv
MV f_mv
Definition: rv60dec.c:176
NEXT_PIC
#define NEXT_PIC
Definition: rv60dec.c:196
read_mv_info
static void read_mv_info(RV60Context *s, GetBitContext *gb, MVInfo *mvinfo, int size, enum PUType pu_type)
Definition: rv60dec.c:1196
CUContext::imode_param
int imode_param[4]
Definition: rv60dec.c:477
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:228
PUInfo::cu_type
enum CUType cu_type
Definition: rv60dec.c:186
MAX_VLC_SIZE
#define MAX_VLC_SIZE
Definition: rv60dec.c:97
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1635
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
RV60Context::ref_pts
uint64_t ref_pts[2]
Definition: rv60dec.c:224
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
rv60_avail_mask
static const uint8_t rv60_avail_mask[64]
Definition: rv60data.h:38
AVPacket::size
int size
Definition: packet.h:536
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
rv60_ipred_inv_angle
static const uint16_t rv60_ipred_inv_angle[9]
Definition: rv60data.h:34
height
#define height
Definition: dsp.h:89
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:276
filter_bilin32
static void filter_bilin32(uint8_t *dst, int v0, int v1, int size)
Definition: rv60dec.c:605
codec_internal.h
build_coeff_vlc
static void build_coeff_vlc(const CoeffLens *lens, CoeffVLCs *vlc, int count, VLCInitState *state)
Definition: rv60dec.c:122
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
rv60_decode_frame
static int rv60_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition: rv60dec.c:2291
pu_type_num_parts
static int pu_type_num_parts(enum PUType pu_type)
Definition: rv60dec.c:947
add_if_valid
static void add_if_valid(unique_list_mvinfo *skip_cand, const MVInfo *mvi)
Definition: rv60dec.c:867
MV
Definition: clearvideo.c:48
INTRAMODE_INDEX
@ INTRAMODE_INDEX
Definition: rv60dec.c:57
get_interleaved_se_golomb
static int get_interleaved_se_golomb(GetBitContext *gb)
Definition: golomb.h:301
size
int size
Definition: twinvq_data.h:10344
VLCElem
Definition: vlc.h:32
rv60_inter_lens
static const CoeffLens rv60_inter_lens[7]
Definition: rv60vlcs.h:1290
CU_INTER
@ CU_INTER
Definition: rv60dec.c:42
chroma_mc
static void chroma_mc(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h, int x, int y)
Definition: rv60dec.c:1286
FF_THREAD_SLICE
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1573
CoeffVLCs::l0
const VLCElem * l0[2]
Definition: rv60dec.c:88
filter_chroma_edge
static void filter_chroma_edge(uint8_t *dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
Definition: rv60dec.c:2029
RV60Context::cu_height
int cu_height
Definition: rv60dec.c:210
PUType
PUType
Definition: rv60dec.c:45
rv60_decode_end
static av_cold int rv60_decode_end(AVCodecContext *avctx)
Definition: rv60dec.c:2403
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:277
RV60Context::ts_scale
uint64_t ts_scale
Definition: rv60dec.c:224
ThreadContext::avg_linesize
int avg_linesize[3]
Definition: rv60dec.c:166
frame_data
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
Definition: ffmpeg.c:460
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
split
static char * split(char *message, char delim)
Definition: af_channelmap.c:89
RV60Context::pict_type
int pict_type
Definition: rv60dec.c:199
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
intra_coeff_vlc
static CoeffVLCs intra_coeff_vlc[5]
Definition: rv60dec.c:94
CUContext::imode
enum IntraMode imode[4]
Definition: rv60dec.c:476
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
MVREF_REF0
@ MVREF_REF0
Definition: rv60dec.c:65
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
pred_hor_angle
static void pred_hor_angle(uint8_t *dst, int stride, int size, int weight, const uint8_t *src)
Definition: rv60dec.c:615
RV60Context::progress
struct ThreadProgress * progress
Definition: rv60dec.c:227
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:396
deblock_cu_r
static void deblock_cu_r(RV60Context *s, AVFrame *frame, ThreadContext *thread, int xpos, int ypos, int log_size, int qp)
Definition: rv60dec.c:2158
calc_sel_qp
static int calc_sel_qp(int osvquant, int qp)
Definition: rv60dec.c:2226
unary.h
read_intra_mode
static int read_intra_mode(GetBitContext *gb, int *param)
Definition: rv60dec.c:418
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
RV60Context::ref_ts
uint32_t ref_ts[2]
Definition: rv60dec.c:225
decode_super_cbp
static int decode_super_cbp(GetBitContext *gb, const VLCElem *vlc[4])
Definition: rv60dec.c:1624
STRENGTH
#define STRENGTH(el, lim)
Definition: rv60dec.c:1970
rv60_candidate_intra_angles
static const uint8_t rv60_candidate_intra_angles[6]
Definition: rv60data.h:26
PU_N34VER
@ PU_N34VER
Definition: rv60dec.c:53
decode_cbp8
static int decode_cbp8(GetBitContext *gb, int subset, int qp)
Definition: rv60dec.c:1548
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
INTRAMODE_MODE
@ INTRAMODE_MODE
Definition: rv60dec.c:60
has_left_down_block
static int has_left_down_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
Definition: rv60dec.c:449
INTRAMODE_DC64
@ INTRAMODE_DC64
Definition: rv60dec.c:58
delta
float delta
Definition: vorbis_enc_data.h:430
ff_thread_progress_init
av_cold int ff_thread_progress_init(ThreadProgress *pro, int init_mode)
Initialize a ThreadProgress.
Definition: threadprogress.c:33
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:521
MVREF_BREF
@ MVREF_BREF
Definition: rv60dec.c:67
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:494
has_top_right_block
static int has_top_right_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
Definition: rv60dec.c:439
avg
static void avg(AVFrame *frame, uint8_t *prev_frame_data[3], int prev_frame_linesize[3], int x, int y, int w, int h)
Definition: rv60dec.c:1402
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
ff_rv60_idct4x4_add
void ff_rv60_idct4x4_add(const int16_t *block, uint8_t *dst, int dst_stride)
Definition: rv60dsp.c:24
pred_ver_angle
static void pred_ver_angle(uint8_t *dst, int stride, int size, int weight, const uint8_t *src)
Definition: rv60dec.c:636
rv60_decode_init
static av_cold int rv60_decode_init(AVCodecContext *avctx)
Definition: rv60dec.c:253
decode_coeff
static int decode_coeff(GetBitContext *gb, const CoeffVLCs *vlcs, int inval, int val)
Definition: rv60dec.c:1425
CUContext::cu_type
enum CUType cu_type
Definition: rv60dec.c:474
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
ThreadContext::cu_split_pos
int cu_split_pos
Definition: rv60dec.c:159
mv_is_backward
static int mv_is_backward(enum MVRefEnum mvref)
Definition: rv60dec.c:986
reconstruct_intra
static int reconstruct_intra(const RV60Context *s, const CUContext *cu, int size, int sub)
Definition: rv60dec.c:794
avcodec.h
stride
#define stride
Definition: h264pred_template.c:536
dim
int dim
Definition: vorbis_enc_data.h:425
BlockInfo::mv
MVInfo mv
Definition: rv60dec.c:182
CUContext::ipred
IntraPredContext ipred
Definition: rv60dec.c:480
mvinfo_matches_backward
static int mvinfo_matches_backward(const MVInfo *a, const MVInfo *b)
Definition: rv60dec.c:996
ret
ret
Definition: filter_design.txt:187
PU_N34HOR
@ PU_N34HOR
Definition: rv60dec.c:51
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
RV60Context::awidth
int awidth
Definition: rv60dec.c:207
MVInfo::mvref
enum MVRefEnum mvref
Definition: rv60dec.c:175
progress_init
static int progress_init(RV60Context *s, unsigned count)
Definition: rv60dec.c:231
MVRefEnum
MVRefEnum
Definition: rv60dec.c:63
align_get_bits
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:544
RV60Context::avctx
AVCodecContext * avctx
Definition: rv60dec.c:191
inter_coeff_vlc
static CoeffVLCs inter_coeff_vlc[7]
Definition: rv60dec.c:95
pos
unsigned int pos
Definition: spdifenc.c:414
ff_thread_progress_destroy
av_cold void ff_thread_progress_destroy(ThreadProgress *pro)
Destroy a ThreadProgress.
Definition: threadprogress.c:44
decode_cbp16
static int decode_cbp16(GetBitContext *gb, int subset, int qp)
Definition: rv60dec.c:1649
AVCodecContext
main external API structure.
Definition: avcodec.h:431
ThreadContext
Definition: frame_thread_encoder.c:52
CLIP_SYMM
#define CLIP_SYMM(a, b)
Definition: rv60dec.c:1971
rv60vlcs.h
RV60Context::blk_stride
int blk_stride
Definition: rv60dec.c:217
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:280
CUR_PIC
#define CUR_PIC
Definition: rv60dec.c:194
CUType
CUType
Definition: rv60dec.c:38
RV60Context::ts
int ts
Definition: rv60dec.c:202
get_next_mv
static void get_next_mv(const RV60Context *s, const Dimensions *dim, enum PUType pu_type, int part_no, int *mv_pos, int *mv_x, int *mv_y)
Definition: rv60dec.c:956
RV60Context::aheight
int aheight
Definition: rv60dec.c:208
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
ff_thread_progress_reset
static void ff_thread_progress_reset(ThreadProgress *pro)
Reset the ThreadProgress.progress counter; must only be called if the ThreadProgress is not in use in...
Definition: threadprogress.h:72
Slice::sign
int sign
Definition: rv60dec.c:152
MVREF_SKIP2
@ MVREF_SKIP2
Definition: rv60dec.c:71
deblock_set_strength
static void deblock_set_strength(RV60Context *s, int xpos, int ypos, int size, int q, int strength)
Definition: rv60dec.c:1919
av_clip_uint8
#define av_clip_uint8
Definition: common.h:106
VideoDSPContext
Definition: videodsp.h:40
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
ff_vlc_init_tables
static const VLCElem * ff_vlc_init_tables(VLCInitState *state, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, int flags)
Definition: vlc.h:254
deblock_set_left_strength
static void deblock_set_left_strength(RV60Context *s, int pos, int strength)
Definition: rv60dec.c:1951
mem.h
rv60_chroma_quant_dc
static const uint8_t rv60_chroma_quant_dc[32]
Definition: rv60data.h:67
read_qp_offset
static int read_qp_offset(GetBitContext *gb, int qp_off_type)
Definition: rv60dec.c:2205
read_code012
static int read_code012(GetBitContext *gb)
Definition: rv60dec.c:335
check_pos
static int check_pos(int x, int y, int cw, int ch, int w, int h, int dx, int dy, int e0, int e1, int e2, int e3)
Definition: rv60dec.c:1320
TRANSFORM_NONE
@ TRANSFORM_NONE
Definition: rv60dec.c:78
rv60_qp_to_idx
static const uint8_t rv60_qp_to_idx[64]
Definition: rv60data.h:53
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
VLC_INIT_STATE
#define VLC_INIT_STATE(_table)
Definition: vlc.h:225
get_c4x4_set
static int get_c4x4_set(int qp, int is_intra)
Definition: rv60dec.c:1412
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
MVInfo::b_mv
MV b_mv
Definition: rv60dec.c:177
videodsp.h
avg_plane
static void avg_plane(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h)
Definition: rv60dec.c:1395
IntraPredContext
Definition: rv60dec.c:459
ff_rv60_idct16x16_add
void ff_rv60_idct16x16_add(const int16_t *block, uint8_t *dst, int dst_stride)
Definition: rv60dsp.c:92
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
RV60Context::top_str
uint8_t * top_str
Definition: rv60dec.c:222
h
h
Definition: vp9dsp_template.c:2070
decode_cu_8x8
static void decode_cu_8x8(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int ccbp, int mode4x4)
Definition: rv60dec.c:1554
width
#define width
Definition: dsp.h:89
CUContext::pu_type
enum PUType pu_type
Definition: rv60dec.c:475
MVREF_SKIP0
@ MVREF_SKIP0
Definition: rv60dec.c:69
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:225
rv60_edge1
static const uint8_t rv60_edge1[4]
Definition: rv60data.h:45
RV60Context::two_f_refs
int two_f_refs
Definition: rv60dec.c:203
reconstruct
static void reconstruct(RV60Context *s, const CUContext *cu, int size)
Definition: rv60dec.c:1132
src
#define src
Definition: vp8dsp.c:248
Dimensions
Definition: rv60dec.c:896
frame_types
static const int8_t frame_types[4]
Definition: rv60dec.c:36
rv60_quants_b
static const uint16_t rv60_quants_b[32]
Definition: rv60data.h:60
Slice::size
int size
Definition: rv60dec.c:153
RV60Context::blk_info
BlockInfo * blk_info
Definition: rv60dec.c:218