FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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  memset(s->pu_info, 0, s->pu_stride * (s->cu_height << 3) * sizeof(s->pu_info[0]));
312 
313  for (int j = 0; j < s->cu_height << 4; j++)
314  for (int i = 0; i < s->cu_width << 4; i++)
315  s->blk_info[j*s->blk_stride + i].mv.mvref = MVREF_NONE;
316 
317  if (s->deblock) {
318  int size;
319 
320  s->dblk_stride = s->awidth >> 2;
321 
322  size = s->dblk_stride * (s->aheight >> 2);
323 
324  if ((ret = av_reallocp_array(&s->top_str, size, sizeof(s->top_str[0]))) < 0)
325  return ret;
326 
327  if ((ret = av_reallocp_array(&s->left_str, size, sizeof(s->left_str[0]))) < 0)
328  return ret;
329 
330  memset(s->top_str, 0, size);
331  memset(s->left_str, 0, size);
332  }
333 
334  return 0;
335 }
336 
337 static int read_code012(GetBitContext * gb)
338 {
339  if (!get_bits1(gb))
340  return 0;
341  return get_bits1(gb) + 1;
342 }
343 
344 static int read_frame_header(RV60Context *s, GetBitContext *gb, int * width, int * height)
345 {
346  if (get_bits(gb, 2) != 3)
347  return AVERROR_INVALIDDATA;
348 
349  skip_bits(gb, 2);
350  skip_bits(gb, 4);
351 
352  s->pict_type = frame_types[get_bits(gb, 2)];
353  if (s->pict_type == AV_PICTURE_TYPE_NONE)
354  return AVERROR_INVALIDDATA;
355 
356  s->qp = get_bits(gb, 6);
357  skip_bits1(gb);
358  skip_bits(gb, 2);
359  s->osvquant = get_bits(gb, 2);
360  skip_bits1(gb);
361  skip_bits(gb, 2);
362  s->ts = get_bits(gb, 24);
363  *width = (get_bits(gb, 11) + 1) * 4;
364  *height = get_bits(gb, 11) * 4;
365  skip_bits1(gb);
366  if (s->pict_type == AV_PICTURE_TYPE_I) {
367  s->two_f_refs = 0;
368  } else {
369  if (get_bits1(gb))
370  skip_bits(gb, 3);
371  s->two_f_refs = get_bits1(gb);
372  }
373  read_code012(gb);
374  read_code012(gb);
375  s->qp_off_type = read_code012(gb);
376  s->deblock = get_bits1(gb);
377  s->deblock_chroma = s->deblock && !get_bits1(gb);
378 
379  if (get_bits1(gb)) {
380  int count = get_bits(gb, 2);
381  if (count) {
382  skip_bits(gb, 2);
383  for (int i = 0; i < count; i++)
384  for (int j = 0; j < 2 << i; j++)
385  skip_bits(gb, 8);
386  }
387  }
388 
389  return 0;
390 }
391 
393 {
394  int nbits = get_bits(gb, 5) + 1;
395  int last_size;
396 
397  for (int i = 0; i < s->cu_height; i++)
398  s->slice[i].sign = get_bits1(gb);
399 
400  s->slice[0].size = last_size = get_bits_long(gb, nbits);
401 
402  if (last_size < 0)
403  return AVERROR_INVALIDDATA;
404 
405  for (int i = 1; i < s->cu_height; i++) {
406  int diff = get_bits_long(gb, nbits);
407  if (s->slice[i].sign)
408  last_size += diff;
409  else
410  last_size -= diff;
411  if (last_size <= 0)
412  return AVERROR_INVALIDDATA;
413  s->slice[i].size = last_size;
414  }
415 
416  align_get_bits(gb);
417  return 0;
418 }
419 
420 static int read_intra_mode(GetBitContext * gb, int * param)
421 {
422  if (get_bits1(gb)) {
423  *param = read_code012(gb);
424  return INTRAMODE_INDEX;
425  } else {
426  *param = get_bits(gb, 5);
427  return INTRAMODE_MODE;
428  }
429 }
430 
431 static int has_top_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
432 {
433  return ypos + dy && xpos + dx + size <= s->awidth;
434 }
435 
436 static int has_left_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
437 {
438  return xpos + dx && ypos + dy + size <= s->aheight;
439 }
440 
441 static int has_top_right_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
442 {
443  if (has_top_block(s, xpos, ypos, dx, dy, size * 2)) {
444  int cxpos = ((xpos + dx) & 63) >> ff_log2(size);
445  int cypos = ((ypos + dy) & 63) >> ff_log2(size);
446  return !(rv60_avail_mask[cxpos] & cypos);
447  }
448  return 0;
449 }
450 
451 static int has_left_down_block(const RV60Context * s, int xpos, int ypos, int dx, int dy, int size)
452 {
453  if (has_left_block(s, xpos, ypos, dx, dy, size * 2)) {
454  int cxpos = (~(xpos + dx) & 63) >> ff_log2(size);
455  int cypos = (~(ypos + dy) & 63) >> ff_log2(size);
456  return rv60_avail_mask[cxpos] & cypos;
457  }
458  return 0;
459 }
460 
461 typedef struct {
462  uint8_t t[129];
463  uint8_t l[129];
464  int has_t;
465  int has_tr;
466  int has_l;
467  int has_ld;
469 
470 typedef struct {
471  int xpos;
472  int ypos;
473  int pu_pos;
474  int blk_pos;
475 
476  enum CUType cu_type;
477  enum PUType pu_type;
478  enum IntraMode imode[4];
479  int imode_param[4];
480  MVInfo mv[4];
481 
483 } CUContext;
484 
486 {
487  memset(i->t, 0x80, sizeof(i->t));
488  memset(i->l, 0x80, sizeof(i->l));
489  i->has_t = i->has_tr = i->has_l = i->has_ld = 0;
490 }
491 
492 static void populate_ipred(const RV60Context * s, CUContext * cu, const uint8_t * src, int stride, int xoff, int yoff, int size, int is_luma)
493 {
494  if (is_luma)
495  src += (cu->ypos + yoff) * stride + cu->xpos + xoff;
496  else
497  src += (cu->ypos >> 1) * stride + (cu->xpos >> 1);
498 
499  ipred_init(&cu->ipred);
500 
501  if (cu->ypos + yoff > 0) {
502  cu->ipred.has_t = 1;
503 
504  memcpy(cu->ipred.t + 1, src - stride, size);
505 
506  if ((is_luma && has_top_right_block(s, cu->xpos, cu->ypos, xoff, yoff, size)) ||
507  (!is_luma && has_top_right_block(s, cu->xpos, cu->ypos, 0, 0, size << 1))) {
508  cu->ipred.has_tr = 1;
509  memcpy(cu->ipred.t + size + 1, src - stride + size, size);
510  } else
511  memset(cu->ipred.t + size + 1, cu->ipred.t[size], size);
512 
513  if (cu->xpos + xoff > 0)
514  cu->ipred.t[0] = src[-stride - 1];
515  }
516 
517  if (cu->xpos + xoff > 0) {
518  cu->ipred.has_l = 1;
519 
520  for (int y = 0; y < size; y++)
521  cu->ipred.l[y + 1] = src[y*stride - 1];
522 
523  if ((is_luma && has_left_down_block(s, cu->xpos, cu->ypos, xoff, yoff, size)) ||
524  (!is_luma && has_left_down_block(s, cu->xpos, cu->ypos, 0, 0, size << 1))) {
525  cu->ipred.has_ld = 1;
526  for (int y = size; y < size * 2; y++)
527  cu->ipred.l[y + 1] = src[y*stride - 1];
528  } else
529  memset(cu->ipred.l + size + 1, cu->ipred.l[size], size);
530 
531  if (cu->ypos + yoff > 0)
532  cu->ipred.l[0] = src[-stride - 1];
533  }
534 }
535 
536 static void pred_plane(const IntraPredContext * p, uint8_t * dst, int stride, int size)
537 {
538  int lastl = p->l[size + 1];
539  int lastt = p->t[size + 1];
540  int tmp1[64], tmp2[64];
541  int top_ref[64], left_ref[64];
542  int shift;
543 
544  for (int i = 0; i < size; i++) {
545  tmp1[i] = lastl - p->t[i + 1];
546  tmp2[i] = lastt - p->l[i + 1];
547  }
548 
549  shift = ff_log2(size) + 1;
550  for (int i = 0; i < size; i++) {
551  top_ref[i] = p->t[i + 1] << (shift - 1);
552  left_ref[i] = p->l[i + 1] << (shift - 1);
553  }
554 
555  for (int y = 0; y < size; y++) {
556  int add = tmp2[y];
557  int sum = left_ref[y] + size;
558  for (int x = 0; x < size; x++) {
559  int v = tmp1[x] + top_ref[x];
560  sum += add;
561  top_ref[x] = v;
562  dst[y*stride + x] = (sum + v) >> shift;
563  }
564  }
565 }
566 
567 static void pred_dc(const IntraPredContext * p, uint8_t * dst, int stride, int size, int filter)
568 {
569  int dc;
570 
571  if (!p->has_t && !p->has_l)
572  dc = 0x80;
573  else {
574  int sum = 0;
575  if (p->has_t)
576  for (int x = 0; x < size; x++)
577  sum += p->t[x + 1];
578  if (p->has_l)
579  for (int y = 0; y < size; y++)
580  sum += p->l[y + 1];
581  if (p->has_t && p->has_l)
582  dc = (sum + size) / (size * 2);
583  else
584  dc = (sum + size / 2) / size;
585  }
586 
587  for (int y = 0; y < size; y++)
588  memset(dst + y*stride, dc, size);
589 
590  if (filter && p->has_t && p->has_l) {
591  dst[0] = (p->t[1] + p->l[1] + 2 * dst[0] + 2) >> 2;
592  for (int x = 1; x < size; x++)
593  dst[x] = (p->t[x + 1] + 3 * dst[x] + 2) >> 2;
594  for (int y = 1; y < size; y++)
595  dst[y*stride] = (p->l[y + 1] + 3 * dst[y*stride] + 2) >> 2;
596  }
597 }
598 
599 static void filter_weak(uint8_t * dst, const uint8_t * src, int size)
600 {
601  dst[0] = src[0];
602  for (int i = 1; i < size - 1; i++)
603  dst[i] = (src[i - 1] + 2*src[i] + src[i + 1] + 2) >> 2;
604  dst[size - 1] = src[size - 1];
605 }
606 
607 static void filter_bilin32(uint8_t * dst, int v0, int v1, int size)
608 {
609  int diff = v1 - v0;
610  int sum = (v0 << 5) + (1 << (5 - 1));
611  for (int i = 0; i < size; i++) {
612  dst[i] = sum >> 5;
613  sum += diff;
614  }
615 }
616 
617 static void pred_hor_angle(uint8_t * dst, int stride, int size, int weight, const uint8_t * src)
618 {
619  int sum = 0;
620  for (int x = 0; x < size; x++) {
621  int off, frac;
622  sum += weight;
623  off = (sum >> 5) + 32;
624  frac = sum & 0x1F;
625  if (!frac)
626  for (int y = 0; y < size; y++)
627  dst[y*stride + x] = src[off + y];
628  else {
629  for (int y = 0; y < size; y++) {
630  int a = src[off + y];
631  int b = src[off + y + 1];
632  dst[y*stride + x] = ((32 - frac) * a + frac * b + 16) >> 5;
633  }
634  }
635  }
636 }
637 
638 static void pred_ver_angle(uint8_t * dst, int stride, int size, int weight, const uint8_t * src)
639 {
640  int sum = 0;
641  for (int y = 0; y < size; y++) {
642  int off, frac;
643  sum += weight;
644  off = (sum >> 5) + 32;
645  frac = sum & 0x1F;
646  if (!frac)
647  memcpy(dst + y*stride, src + off, size);
648  else {
649  for (int x = 0; x < size; x++) {
650  int a = src[off + x];
651  int b = src[off + x + 1];
652  dst[y*stride + x] = ((32 - frac) * a + frac * b + 16) >> 5;
653  }
654  }
655  }
656 }
657 
658 static int pred_angle(const IntraPredContext * p, uint8_t * dst, int stride, int size, int imode, int filter)
659 {
660  uint8_t filtered1[96], filtered2[96];
661 
662  if (!imode) {
663  pred_plane(p, dst, stride, size);
664  } else if (imode == 1) {
665  pred_dc(p, dst, stride, size, filter);
666  } else if (imode <= 9) {
667  int ang_weight = rv60_ipred_angle[10 - imode];
668  int add_size = (size * ang_weight + 31) >> 5;
669  if (size <= 16) {
670  filter_weak(filtered1 + 32, &p->l[1], size + add_size);
671  } else {
672  filter_bilin32(filtered1 + 32, p->l[1], p->l[33], 32);
673  filter_bilin32(filtered1 + 64, p->l[32], p->l[64], add_size);
674  }
675  pred_hor_angle(dst, stride, size, ang_weight, filtered1);
676  } else if (imode == 10) {
677  if (size <= 16)
678  filter_weak(filtered1 + 32, &p->l[1], size);
679  else
680  filter_bilin32(filtered1 + 32, p->l[1], p->l[33], 32);
681  for (int y = 0; y < size; y++)
682  for (int x = 0; x < size; x++)
683  dst[y*stride + x] = filtered1[32 + y];
684  if (filter) {
685  int tl = p->t[0];
686  for (int x = 0; x < size; x++)
687  dst[x] = av_clip_uint8(dst[x] + ((p->t[x + 1] - tl) >> 1));
688  }
689  } else if (imode <= 17) {
690  int ang_weight = rv60_ipred_angle[imode - 10];
691  int inv_angle = rv60_ipred_inv_angle[imode - 10];
692  int add_size = (size * ang_weight + 31) >> 5;
693  if (size <= 16) {
694  memcpy(filtered1 + 32 - 1, p->l, size + 1);
695  memcpy(filtered2 + 32 - 1, p->t, size + 1);
696  } else {
697  filtered1[32 - 1] = p->l[0];
698  filter_bilin32(filtered1 + 32, p->l[0], p->l[32], 32);
699  filtered2[32 - 1] = p->t[0];
700  filter_bilin32(filtered2 + 32, p->t[0], p->t[32], 32);
701  }
702  if (add_size > 1) {
703  int sum = 0x80;
704  for (int i = 1; i < add_size; i++) {
705  sum += inv_angle;
706  filtered1[32 - 1 - i] = filtered2[32 - 1 + (sum >> 8)];
707  }
708  }
709  pred_hor_angle(dst, stride, size, -ang_weight, filtered1);
710  } else if (imode <= 25) {
711  int ang_weight = rv60_ipred_angle[26 - imode];
712  int inv_angle = rv60_ipred_inv_angle[26 - imode];
713  int add_size = (size * ang_weight + 31) >> 5;
714  if (size <= 16) {
715  memcpy(filtered1 + 32 - 1, p->t, size + 1);
716  memcpy(filtered2 + 32 - 1, p->l, size + 1);
717  } else {
718  filtered1[32 - 1] = p->t[0];
719  filter_bilin32(filtered1 + 32, p->t[0], p->t[32], 32);
720  filtered2[32 - 1] = p->l[0];
721  filter_bilin32(filtered2 + 32, p->l[0], p->l[32], 32);
722  }
723  if (add_size > 1) {
724  int sum = 0x80;
725  for (int i = 1; i < add_size; i++) {
726  sum += inv_angle;
727  filtered1[32 - 1 - i] = filtered2[32 - 1 + (sum >> 8)];
728  }
729  }
730  pred_ver_angle(dst, stride, size, -ang_weight, filtered1);
731  } else if (imode == 26) {
732  if (size <= 16)
733  filter_weak(&filtered1[32], &p->t[1], size);
734  else
735  filter_bilin32(filtered1 + 32, p->t[1], p->t[33], 32);
736  for (int i = 0; i < size; i++)
737  memcpy(dst + i*stride, filtered1 + 32, size);
738  if (filter) {
739  int tl = p->l[0];
740  for (int y = 0; y < size; y++)
741  dst[y*stride] = av_clip_uint8(dst[y*stride] + ((p->l[y+1] - tl) >> 1));
742  }
743  } else if (imode <= 34) {
744  int ang_weight = rv60_ipred_angle[imode - 26];
745  int add_size = (size * ang_weight + 31) >> 5;
746  if (size <= 16)
747  filter_weak(&filtered1[32], &p->t[1], size + add_size);
748  else {
749  filter_bilin32(filtered1 + 32, p->t[1], p->t[33], 32);
750  filter_bilin32(filtered1 + 64, p->t[32], p->t[64], add_size);
751  }
752  pred_ver_angle(dst, stride, size, ang_weight, filtered1);
753  } else
754  return AVERROR_INVALIDDATA;
755  return 0;
756 }
757 
758 static int pu_is_intra(const PUInfo * pu)
759 {
760  return pu->cu_type == CU_INTRA;
761 }
762 
763 static int ipm_compar(const void * a, const void * b)
764 {
765  return *(const enum IntraMode *)a - *(const enum IntraMode *)b;
766 }
767 
768 #define MK_UNIQUELIST(name, type, max_size) \
769 typedef struct { \
770  type list[max_size]; \
771  int size; \
772 } unique_list_##name; \
773 \
774 static void unique_list_##name##_init(unique_list_##name * s) \
775 { \
776  memset(s->list, 0, sizeof(s->list)); \
777  s->size = 0; \
778 } \
779 \
780 static void unique_list_##name##_add(unique_list_##name * s, type cand) \
781 { \
782  if (s->size == max_size) \
783  return; \
784  \
785  for (int i = 0; i < s->size; i++) { \
786  if (!memcmp(&s->list[i], &cand, sizeof(type))) { \
787  return; \
788  } \
789  } \
790  s->list[s->size++] = cand; \
791 }
792 
793 MK_UNIQUELIST(intramode, enum IntraMode, 3)
794 MK_UNIQUELIST(mvinfo, MVInfo, 4)
795 
796 static int reconstruct_intra(const RV60Context * s, const CUContext * cu, int size, int sub)
797 {
798  int blk_pos, tl_x, tl_y;
799  unique_list_intramode ipm_cand;
800 
801  if (cu->imode[0] == INTRAMODE_DC64)
802  return 1;
803 
804  if (cu->imode[0] == INTRAMODE_PLANE64)
805  return 0;
806 
807  unique_list_intramode_init(&ipm_cand);
808 
809  if (has_top_block(s, cu->xpos, cu->ypos, (sub & 1) * 4, 0, size)) {
810  const PUInfo * pu = &s->pu_info[cu->pu_pos - s->pu_stride];
811  if (pu_is_intra(pu))
812  unique_list_intramode_add(&ipm_cand, s->blk_info[cu->blk_pos - s->blk_stride + (sub & 1)].imode);
813  }
814 
815  blk_pos = cu->blk_pos + (sub >> 1) * s->blk_stride + (sub & 1);
816 
817  if (has_left_block(s, cu->xpos, cu->ypos, 0, (sub & 2) * 2, size)) {
818  const PUInfo * pu = &s->pu_info[cu->pu_pos - 1];
819  if (pu_is_intra(pu))
820  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - 1 - (sub & 1)].imode);
821  }
822 
823  tl_x = !(sub & 2) ? (cu->xpos + (sub & 1) * 4) : cu->xpos;
824  tl_y = cu->ypos + (sub & 2) * 4;
825  if (tl_x > 0 && tl_y > 0) {
826  const PUInfo * pu;
827  switch (sub) {
828  case 0: pu = &s->pu_info[cu->pu_pos - s->pu_stride - 1]; break;
829  case 1: pu = &s->pu_info[cu->pu_pos - s->pu_stride]; break;
830  default: pu = &s->pu_info[cu->pu_pos - 1];
831  }
832  if (pu_is_intra(pu)) {
833  if (sub != 3)
834  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - s->blk_stride - 1].imode);
835  else
836  unique_list_intramode_add(&ipm_cand, s->blk_info[blk_pos - s->blk_stride - 2].imode);
837  }
838  }
839 
840  for (int i = 0; i < FF_ARRAY_ELEMS(rv60_candidate_intra_angles); i++)
841  unique_list_intramode_add(&ipm_cand, rv60_candidate_intra_angles[i]);
842 
843  if (cu->imode[sub] == INTRAMODE_INDEX)
844  return ipm_cand.list[cu->imode_param[sub]];
845 
846  if (cu->imode[sub] == INTRAMODE_MODE) {
847  enum IntraMode imode = cu->imode_param[sub];
848  qsort(ipm_cand.list, 3, sizeof(ipm_cand.list[0]), ipm_compar);
849  for (int i = 0; i < 3; i++)
850  if (imode >= ipm_cand.list[i])
851  imode++;
852  return imode;
853  }
854 
855  av_assert0(0); // should never reach here
856  return 0;
857 }
858 
859 static int get_skip_mv_index(enum MVRefEnum mvref)
860 {
861  switch (mvref) {
862  case MVREF_SKIP1: return 1;
863  case MVREF_SKIP2: return 2;
864  case MVREF_SKIP3: return 3;
865  default: return 0;
866  }
867 }
868 
869 static void add_if_valid(unique_list_mvinfo * skip_cand, const MVInfo * mvi)
870 {
871  if (mvi->mvref != MVREF_NONE)
872  unique_list_mvinfo_add(skip_cand, *mvi);
873 }
874 
875 static void fill_mv_skip_cand(RV60Context * s, const CUContext * cu, unique_list_mvinfo * skip_cand, int size)
876 {
877  int mv_size = size >> 2;
878 
879  if (cu->xpos)
880  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - 1].mv);
881  if (cu->ypos)
882  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride].mv);
883  if (cu->ypos && cu->xpos + size < s->awidth)
884  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride + mv_size].mv);
885  if (cu->xpos && cu->ypos + size < s->aheight)
886  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos + s->blk_stride * mv_size - 1].mv);
887  if (cu->xpos)
888  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos + s->blk_stride * (mv_size - 1) - 1].mv);
889  if (cu->ypos)
890  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride + mv_size - 1].mv);
891  if (cu->xpos && cu->ypos)
892  add_if_valid(skip_cand, &s->blk_info[cu->blk_pos - s->blk_stride - 1].mv);
893 
894  for (int i = skip_cand->size; i < 4; i++)
895  skip_cand->list[i] = (MVInfo){.mvref=MVREF_REF0,.f_mv={0,0},.b_mv={0,0}};
896 }
897 
898 typedef struct {
899  int w, h;
900 } Dimensions;
901 
902 static void get_mv_dimensions(Dimensions * dim, enum PUType pu_type, int part_no, int size)
903 {
904  int mv_size = size >> 2;
905  switch (pu_type) {
906  case PU_FULL:
907  dim->w = dim->h = mv_size;
908  break;
909  case PU_N2HOR:
910  dim->w = mv_size;
911  dim->h = mv_size >> 1;
912  break;
913  case PU_N2VER:
914  dim->w = mv_size >> 1;
915  dim->h = mv_size;
916  break;
917  case PU_QUARTERS:
918  dim->w = dim->h = mv_size >> 1;
919  break;
920  case PU_N4HOR:
921  dim->w = mv_size;
922  dim->h = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
923  break;
924  case PU_N34HOR:
925  dim->w = mv_size;
926  dim->h = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
927  break;
928  case PU_N4VER:
929  dim->w = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
930  dim->h = mv_size;
931  break;
932  case PU_N34VER:
933  dim->w = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
934  dim->h = mv_size;
935  break;
936  }
937 }
938 
939 static int has_hor_split(enum PUType pu_type)
940 {
941  return pu_type == PU_N2HOR || pu_type == PU_N4HOR || pu_type == PU_N34HOR || pu_type == PU_QUARTERS;
942 }
943 
944 static int has_ver_split(enum PUType pu_type)
945 {
946  return pu_type == PU_N2VER || pu_type == PU_N4VER || pu_type == PU_N34VER || pu_type == PU_QUARTERS;
947 }
948 
949 static int pu_type_num_parts(enum PUType pu_type)
950 {
951  switch (pu_type) {
952  case PU_FULL: return 1;
953  case PU_QUARTERS: return 4;
954  default: return 2;
955  }
956 }
957 
958 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)
959 {
960  if (pu_type == PU_QUARTERS) {
961  if (part_no != 1) {
962  *mv_pos += dim->w;
963  *mv_x += dim->w;
964  } else {
965  *mv_pos += dim->h*s->blk_stride - dim->w;
966  *mv_x -= dim->w;
967  *mv_y += dim->h;
968  }
969  } else if (has_hor_split(pu_type)) {
970  *mv_pos += dim->h * s->blk_stride;
971  *mv_y += dim->h;
972  } else if (has_ver_split(pu_type)) {
973  *mv_pos += dim->w;
974  *mv_x += dim->w;
975  }
976 }
977 
978 static int mv_is_ref0(enum MVRefEnum mvref)
979 {
980  return mvref == MVREF_REF0 || mvref == MVREF_REF0ANDBREF;
981 }
982 
983 static int mv_is_forward(enum MVRefEnum mvref)
984 {
985  return mvref == MVREF_REF0 || mvref == MVREF_REF1 || mvref == MVREF_REF0ANDBREF;
986 }
987 
988 static int mv_is_backward(enum MVRefEnum mvref)
989 {
990  return mvref == MVREF_BREF || mvref == MVREF_REF0ANDBREF;
991 }
992 
993 static int mvinfo_matches_forward(const MVInfo * a, const MVInfo * b)
994 {
995  return a->mvref == b->mvref || (mv_is_ref0(a->mvref) && mv_is_ref0(b->mvref));
996 }
997 
998 static int mvinfo_matches_backward(const MVInfo * a, const MVInfo * b)
999 {
1000  return mv_is_backward(a->mvref) && mv_is_backward(b->mvref);
1001 }
1002 
1003 static int mvinfo_is_deblock_cand(const MVInfo * a, const MVInfo * b)
1004 {
1005  int diff;
1006 
1007  if (a->mvref != b->mvref)
1008  return 1;
1009 
1010  diff = 0;
1011  if (mv_is_forward(a->mvref)) {
1012  int dx = a->f_mv.x - b->f_mv.x;
1013  int dy = a->f_mv.y - b->f_mv.y;
1014  diff += FFABS(dx) + FFABS(dy);
1015  }
1016  if (mv_is_backward(a->mvref)) {
1017  int dx = a->b_mv.x - b->b_mv.x;
1018  int dy = a->b_mv.y - b->b_mv.y;
1019  diff += FFABS(dx) + FFABS(dy);
1020  }
1021  return diff > 4;
1022 }
1023 
1024 static void mv_pred(MV * ret, MV a, MV b, MV c)
1025 {
1026 #define MEDIAN(x) \
1027  if (a.x < b.x) \
1028  if (b.x < c.x) \
1029  ret->x = b.x; \
1030  else \
1031  ret->x = a.x < c.x ? c.x : a.x; \
1032  else \
1033  if (b.x < c.x) \
1034  ret->x = a.x < c.x ? a.x : c.x; \
1035  else \
1036  ret->x = b.x; \
1037 
1038  MEDIAN(x)
1039  MEDIAN(y)
1040 }
1041 
1042 static void predict_mv(const RV60Context * s, MVInfo * dst, int mv_x, int mv_y, int mv_w, const MVInfo * src)
1043 {
1044  int mv_pos = mv_y * s->blk_stride + mv_x;
1045  MV f_mv, b_mv;
1046 
1047  dst->mvref = src->mvref;
1048 
1049  if (mv_is_forward(src->mvref)) {
1050  MV cand[3] = {0};
1051  int cand_size = 0;
1052  if (mv_x > 0) {
1053  const MVInfo * mv = &s->blk_info[mv_pos - 1].mv;
1055  cand[cand_size++] = mv->f_mv;
1056  }
1057  if (mv_y > 0) {
1058  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride].mv;
1060  cand[cand_size++] = mv->f_mv;
1061  }
1062  if (has_top_block(s, mv_x << 2, mv_y << 2, mv_w << 2, 0, 4)) {
1063  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride + mv_w].mv;
1065  cand[cand_size++] = mv->f_mv;
1066  }
1067 
1068  switch (cand_size) {
1069  case 1:
1070  f_mv.x = cand[0].x;
1071  f_mv.y = cand[0].y;
1072  break;
1073  case 2:
1074  f_mv.x = (cand[0].x + cand[1].x) >> 1;
1075  f_mv.y = (cand[0].y + cand[1].y) >> 1;
1076  break;
1077  case 3:
1078  mv_pred(&f_mv, cand[0], cand[1], cand[2]);
1079  break;
1080  default:
1081  f_mv = (MV){0,0};
1082  break;
1083  }
1084  } else {
1085  f_mv = (MV){0,0};
1086  }
1087 
1088  dst->f_mv.x = src->f_mv.x + f_mv.x;
1089  dst->f_mv.y = src->f_mv.y + f_mv.y;
1090 
1091  if (mv_is_backward(src->mvref)) {
1092  MV cand[3] = {0};
1093  int cand_size = 0;
1094  if (mv_x > 0) {
1095  const MVInfo * mv = &s->blk_info[mv_pos - 1].mv;
1097  cand[cand_size++] = mv->b_mv;
1098  }
1099  if (mv_y > 0) {
1100  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride].mv;
1102  cand[cand_size++] = mv->b_mv;
1103  }
1104  if (has_top_block(s, mv_x << 2, mv_y << 2, mv_w << 2, 0, 4)) {
1105  const MVInfo * mv = &s->blk_info[mv_pos - s->blk_stride + mv_w].mv;
1107  cand[cand_size++] = mv->b_mv;
1108  }
1109 
1110  switch (cand_size) {
1111  case 1:
1112  b_mv.x = cand[0].x;
1113  b_mv.y = cand[0].y;
1114  break;
1115  case 2:
1116  b_mv.x = (cand[0].x + cand[1].x) >> 1;
1117  b_mv.y = (cand[0].y + cand[1].y) >> 1;
1118  break;
1119  case 3:
1120  mv_pred(&b_mv, cand[0], cand[1], cand[2]);
1121  break;
1122  default:
1123  b_mv = (MV){0,0};
1124  break;
1125  }
1126  } else {
1127  b_mv = (MV){0,0};
1128  }
1129 
1130  dst->b_mv.x = src->b_mv.x + b_mv.x;
1131  dst->b_mv.y = src->b_mv.y + b_mv.y;
1132 }
1133 
1134 static void reconstruct(RV60Context * s, const CUContext * cu, int size)
1135 {
1136  int pu_size = size >> 3;
1137  PUInfo pui;
1138  int imode, mv_x, mv_y, mv_pos, count, mv_size;
1139  unique_list_mvinfo skip_cand;
1140  Dimensions dim;
1141  MVInfo mv;
1142 
1143  pui.cu_type = cu->cu_type;
1144  pui.pu_type = cu->pu_type;
1145 
1146  if (cu->cu_type == CU_INTRA && cu->pu_type == PU_QUARTERS) {
1147  s->pu_info[cu->pu_pos] = pui;
1148  for (int y = 0; y < 2; y++)
1149  for (int x = 0; x < 2; x++)
1150  s->blk_info[cu->blk_pos + y*s->blk_stride + x].imode =
1151  reconstruct_intra(s, cu, 4, y*2 + x);
1152  return;
1153  }
1154 
1155  switch (cu->cu_type) {
1156  case CU_INTRA:
1157  imode = reconstruct_intra(s, cu, size, 0);
1158  for (int y = 0; y < size >> 2; y++)
1159  for (int x = 0; x < size >> 2; x++)
1160  s->blk_info[cu->blk_pos + y*s->blk_stride + x].imode = imode;
1161  break;
1162  case CU_INTER_MV:
1163  mv_x = cu->xpos >> 2;
1164  mv_y = cu->ypos >> 2;
1165  mv_pos = cu->blk_pos;
1166  count = pu_type_num_parts(cu->pu_type);
1167  for (int part_no = 0; part_no < count; part_no++) {
1168  MVInfo mv;
1169  get_mv_dimensions(&dim, cu->pu_type, part_no, size);
1170  predict_mv(s, &mv, mv_x, mv_y, dim.w, &cu->mv[part_no]);
1171  for (int y = 0; y < dim.h; y++)
1172  for (int x = 0; x < dim.w; x++)
1173  s->blk_info[mv_pos + y*s->blk_stride + x].mv = mv;
1174  get_next_mv(s, &dim, cu->pu_type, part_no, &mv_pos, &mv_x, &mv_y);
1175  }
1176  break;
1177  default:
1178  unique_list_mvinfo_init(&skip_cand);
1179  fill_mv_skip_cand(s, cu, &skip_cand, size);
1180  mv = skip_cand.list[get_skip_mv_index(cu->mv[0].mvref)];
1181  mv_size = size >> 2;
1182  for (int y = 0; y < mv_size; y++)
1183  for (int x = 0; x < mv_size; x++)
1184  s->blk_info[cu->blk_pos + y*s->blk_stride + x].mv = mv;
1185  }
1186 
1187  for (int y = 0; y < pu_size; y++)
1188  for (int x = 0; x < pu_size; x++)
1189  s->pu_info[cu->pu_pos + y*s->pu_stride + x] = pui;
1190 }
1191 
1192 static void read_mv(GetBitContext * gb, MV * mv)
1193 {
1194  mv->x = get_interleaved_se_golomb(gb);
1195  mv->y = get_interleaved_se_golomb(gb);
1196 }
1197 
1198 static void read_mv_info(RV60Context *s, GetBitContext * gb, MVInfo * mvinfo, int size, enum PUType pu_type)
1199 {
1200  if (s->pict_type != AV_PICTURE_TYPE_B) {
1201  if (s->two_f_refs && get_bits1(gb))
1202  mvinfo->mvref = MVREF_REF1;
1203  else
1204  mvinfo->mvref = MVREF_REF0;
1205  read_mv(gb, &mvinfo->f_mv);
1206  mvinfo->b_mv.x = mvinfo->b_mv.y = 0;
1207  } else {
1208  if ((size <= 8 && (size != 8 || pu_type != PU_FULL)) || get_bits1(gb)) {
1209  if (!get_bits1(gb)) {
1210  mvinfo->mvref = MVREF_REF0;
1211  read_mv(gb, &mvinfo->f_mv);
1212  mvinfo->b_mv.x = mvinfo->b_mv.y = 0;
1213  } else {
1214  mvinfo->mvref = MVREF_BREF;
1215  mvinfo->f_mv.x = mvinfo->f_mv.y = 0;
1216  read_mv(gb, &mvinfo->b_mv);
1217  }
1218  } else {
1219  mvinfo->mvref = MVREF_REF0ANDBREF;
1220  read_mv(gb, &mvinfo->f_mv);
1221  read_mv(gb, &mvinfo->b_mv);
1222  }
1223  }
1224 }
1225 
1226 #define FILTER1(src, src_stride, src_y_ofs, step) \
1227  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1228  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1229  +52 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1230  +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1231  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1232  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1233 
1234 #define FILTER2(src, src_stride, src_y_ofs, step) \
1235  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1236  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1237  +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1238  +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1239  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1240  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 16) >> 5
1241 
1242 #define FILTER3(src, src_stride, src_y_ofs, step) \
1243  ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1244  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1245  +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1246  +52 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1247  - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1248  + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1249 
1250 #define FILTER_CASE(idx, dst, dst_stride, filter, w, h) \
1251  case idx: \
1252  for (int y = 0; y < h; y++) \
1253  for (int x = 0; x < w; x++) \
1254  (dst)[y*dst_stride + x] = av_clip_uint8(filter); \
1255  break;
1256 
1257 #define FILTER_BLOCK(dst, dst_stride, src, src_stride, src_y_ofs, w, h, cond, step) \
1258  switch (cond) { \
1259  FILTER_CASE(1, dst, dst_stride, FILTER1(src, src_stride, src_y_ofs, step), w, h) \
1260  FILTER_CASE(2, dst, dst_stride, FILTER2(src, src_stride, src_y_ofs, step), w, h) \
1261  FILTER_CASE(3, dst, dst_stride, FILTER3(src, src_stride, src_y_ofs, step), w, h) \
1262  }
1263 
1264 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)
1265 {
1266  if (!cx && !cy) {
1267  for (int y = 0; y < h; y++)
1268  memcpy(dst + y*dst_stride, src + y*src_stride, w);
1269  } else if (!cy) {
1270  FILTER_BLOCK(dst, dst_stride, src, src_stride, 0, w, h, cx, 1)
1271  } else if (!cx) {
1272  FILTER_BLOCK(dst, dst_stride, src, src_stride, 0, w, h, cy, src_stride)
1273  } else if (cx != 3 || cy != 3) {
1274  uint8_t tmp[70 * 64];
1275  FILTER_BLOCK(tmp, 64, src - src_stride * 2, src_stride, 0, w, h + 5, cx, 1)
1276  FILTER_BLOCK(dst, dst_stride, tmp + 2*64, 64, 0, w, h, cy, 64)
1277  } else {
1278  for (int j = 0; j < h; j++)
1279  for (int i = 0; i < w; i++)
1280  dst[j*dst_stride + i] = (
1281  src[j*src_stride + i] +
1282  src[j*src_stride + i + 1] +
1283  src[(j + 1)*src_stride + i] +
1284  src[(j + 1)*src_stride + i + 1] + 2) >> 2;
1285  }
1286 }
1287 
1288 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)
1289 {
1290  if (!x && !y) {
1291  for (int j = 0; j < h; j++)
1292  memcpy(dst + j*dst_stride, src + j*src_stride, w);
1293  } else if (x > 0 && y > 0) {
1294  int a, b, c, d;
1295 
1296  if (x == 3 && y == 3)
1297  y = 2; //reproduce bug in rv60 decoder. tested with realplayer version 18.1.7.344 and 22.0.0.321
1298 
1299  a = (4 - x) * (4 - y);
1300  b = x * (4 - y);
1301  c = (4 - x) * y;
1302  d = x * y;
1303  for (int j = 0; j < h; j++)
1304  for (int i = 0; i < w; i++)
1305  dst[j*dst_stride + i] =
1306  (a * src[j*src_stride + i] +
1307  b * src[j*src_stride + i + 1] +
1308  c * src[(j + 1)*src_stride + i] +
1309  d * src[(j + 1)*src_stride + i + 1] + 8) >> 4;
1310  } else {
1311  int a = (4 - x) * (4 - y);
1312  int e = x * (4 - y) + (4 - x) * y;
1313  int step = y > 0 ? src_stride : 1;
1314  for (int j = 0; j < h; j++)
1315  for (int i = 0; i < w; i++)
1316  dst[j*dst_stride + i] =
1317  (a * src[j*src_stride + i] +
1318  e * src[j*src_stride + i + step] + 8) >> 4;
1319  }
1320 }
1321 
1322 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)
1323 {
1324  int x2 = x + dx;
1325  int y2 = y + dy;
1326  return x2 - e0 >= 0 && x2 + cw + e1 <= w && y2 - e2 >= 0 && y2 + ch + e3 <= h;
1327 }
1328 
1329 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)
1330 {
1331  {
1332  int off = !avg ? y * frame_linesize[0] + x : 0;
1333  int fw = s->awidth;
1334  int fh = s->aheight;
1335  int dx = mv.x >> 2;
1336  int cx = mv.x & 3;
1337  int dy = mv.y >> 2;
1338  int cy = mv.y & 3;
1339 
1340  if (check_pos(x, y, w, h, fw, fh, dx, dy, rv60_edge1[cx], rv60_edge2[cx], rv60_edge1[cy], rv60_edge2[cy])) {
1341  luma_mc(
1342  frame_data[0] + off,
1343  frame_linesize[0],
1344  ref->data[0] + (y + dy) * ref->linesize[0] + x + dx,
1345  ref->linesize[0],
1346  w, h, cx, cy);
1347  } else {
1348  uint8_t buf[70*70];
1349  int xoff = x + dx - 2;
1350  int yoff = y + dy - 2;
1351  s->vdsp.emulated_edge_mc(buf,
1352  ref->data[0] + yoff * ref->linesize[0] + xoff,
1353  70, ref->linesize[0],
1354  w + 5, h + 5,
1355  xoff, yoff,
1356  fw, fh);
1357 
1358  luma_mc(frame_data[0] + off, frame_linesize[0],
1359  buf + 70 * 2 + 2, 70, w, h, cx, cy);
1360  }
1361  }
1362  {
1363  int fw = s->awidth >> 1;
1364  int fh = s->aheight >> 1;
1365  int mvx = mv.x / 2;
1366  int mvy = mv.y / 2;
1367  int dx = mvx >> 2;
1368  int cx = mvx & 3;
1369  int dy = mvy >> 2;
1370  int cy = mvy & 3;
1371  int cw = w >> 1;
1372  int ch = h >> 1;
1373 
1374  for (int plane = 1; plane < 3; plane++) {
1375  int off = !avg ? (y >> 1) * frame_linesize[plane] + (x >> 1) : 0;
1376  if (check_pos(x >> 1, y >> 1, cw, ch, fw, fh, dx, dy, 0, 1, 0, 1)) {
1377  chroma_mc(
1378  frame_data[plane] + off,
1379  frame_linesize[plane],
1380  ref->data[plane] + ((y >> 1) + dy) * ref->linesize[plane] + (x >> 1) + dx,
1381  ref->linesize[plane],
1382  cw, ch, cx, cy);
1383  } else {
1384  uint8_t buf[40*40];
1385  s->vdsp.emulated_edge_mc(buf,
1386  ref->data[plane] + ((y >> 1) + dy) * ref->linesize[plane] + (x >> 1) + dx,
1387  40, ref->linesize[plane],
1388  cw + 1, ch + 1,
1389  (x >> 1) + dx, (y >> 1) + dy,
1390  fw, fh);
1391  chroma_mc(frame_data[plane] + off, frame_linesize[plane], buf, 40, cw, ch, cx, cy);
1392  }
1393  }
1394  }
1395 }
1396 
1397 static void avg_plane(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h)
1398 {
1399  for (int j = 0; j < h; j++)
1400  for (int i = 0; i < w; i++)
1401  dst[j*dst_stride + i] = (dst[j*dst_stride + i] + src[j*src_stride + i]) >> 1;
1402 }
1403 
1404 static void avg(AVFrame * frame, uint8_t * prev_frame_data[3], int prev_frame_linesize[3], int x, int y, int w, int h)
1405 {
1406  for (int plane = 0; plane < 3; plane++) {
1407  int shift = !plane ? 0 : 1;
1408  avg_plane(frame->data[plane] + (y >> shift) * frame->linesize[plane] + (x >> shift), frame->linesize[plane],
1409  prev_frame_data[plane], prev_frame_linesize[plane],
1410  w >> shift, h >> shift);
1411  }
1412 }
1413 
1414 static int get_c4x4_set(int qp, int is_intra)
1415 {
1416  if (is_intra)
1417  return rv60_qp_to_idx[qp + 32];
1418  else
1419  return rv60_qp_to_idx[qp];
1420 }
1421 
1422 static int quant(int v, int q)
1423 {
1424  return (v * q + 8) >> 4;
1425 }
1426 
1427 static int decode_coeff(GetBitContext * gb, const CoeffVLCs * vlcs, int inval, int val)
1428 {
1429  int esc_sym;
1430 
1431  if (inval != val)
1432  return inval && get_bits1(gb) ? -inval : inval;
1433 
1434  esc_sym = get_vlc2(gb, vlcs->esc, 9, 2);
1435  if (esc_sym > 23) {
1436  int esc_bits = esc_sym - 23;
1437  val += (1 << esc_bits) + get_bits(gb, esc_bits) + 22;
1438  } else
1439  val += esc_sym;
1440 
1441  return get_bits1(gb) ? -val : val;
1442 }
1443 
1444 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)
1445 {
1446  const uint8_t * lx;
1447  if (!dsc)
1448  return;
1449 
1450  lx = rv60_dsc_to_lx[dsc - 1];
1451 
1452  coeffs[0] = quant(decode_coeff(gb, vlcs, lx[0], 3), q_dc);
1453  if (!block2) {
1454  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1455  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1456  } else {
1457  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1458  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1459  }
1460  coeffs[stride + 1] = quant(decode_coeff(gb, vlcs, lx[3], 2), q_ac);
1461 }
1462 
1463 static void decode_2x2(GetBitContext * gb, const CoeffVLCs * vlcs, int16_t * coeffs, int stride, int block2, int dsc, int q_ac)
1464 {
1465  const uint8_t * lx;
1466  if (!dsc)
1467  return;
1468 
1469  lx = rv60_dsc_to_lx[dsc - 1];
1470 
1471  coeffs[0] = quant(decode_coeff(gb, vlcs, lx[0], 3), q_ac);
1472  if (!block2) {
1473  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1474  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1475  } else {
1476  coeffs[stride] = quant(decode_coeff(gb, vlcs, lx[1], 2), q_ac);
1477  coeffs[1] = quant(decode_coeff(gb, vlcs, lx[2], 2), q_ac);
1478  }
1479  coeffs[stride + 1] = quant(decode_coeff(gb, vlcs, lx[3], 2), q_ac);
1480 }
1481 
1482 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)
1483 {
1484  int sym0 = get_vlc2(gb, vlcs->l0[!is_luma], 9, 2);
1485  int grp0 = sym0 >> 3;
1486 
1487  if (grp0)
1488  decode_2x2_dc(gb, vlcs, coeffs, stride, 0, grp0, q_dc, q_ac);
1489 
1490  if (sym0 & 4) {
1491  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1492  decode_2x2(gb, vlcs, coeffs + 2, stride, 0, grp, q_ac);
1493  }
1494  if (sym0 & 2) {
1495  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1496  decode_2x2(gb, vlcs, coeffs + 2*stride, stride, 1, grp, q_ac);
1497  }
1498  if (sym0 & 1) {
1499  int grp = get_vlc2(gb, vlcs->l3[!is_luma], 9, 2);
1500  decode_2x2(gb, vlcs, coeffs + 2*stride + 2, stride, 0, grp, q_ac);
1501  }
1502 }
1503 
1504 static void decode_4x4_block(GetBitContext * gb, const CoeffVLCs * vlcs, int is_luma, int16_t * coeffs, int stride, int q_ac)
1505 {
1506  int sym0 = get_vlc2(gb, vlcs->l0[!is_luma], 9, 2);
1507  int grp0 = (sym0 >> 3);
1508 
1509  if (grp0)
1510  decode_2x2(gb, vlcs, coeffs, stride, 0, grp0, q_ac);
1511 
1512  if (sym0 & 4) {
1513  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1514  decode_2x2(gb, vlcs, coeffs + 2, stride, 0, grp, q_ac);
1515  }
1516  if (sym0 & 2) {
1517  int grp = get_vlc2(gb, vlcs->l12[!is_luma], 9, 2);
1518  decode_2x2(gb, vlcs, coeffs + 2*stride, stride, 1, grp, q_ac);
1519  }
1520  if (sym0 & 1) {
1521  int grp = get_vlc2(gb, vlcs->l3[!is_luma], 9, 2);
1522  decode_2x2(gb, vlcs, coeffs + 2*stride + 2, stride, 0, grp, q_ac);
1523  }
1524 }
1525 
1526 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)
1527 {
1528  int cb_set = get_c4x4_set(sel_qp, is_intra);
1529  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1530  int q_y = rv60_quants_b[qp];
1531  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1532  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1533 
1534  memset(y_coeffs, 0, sizeof(y_coeffs[0])*256);
1535  for (int i = 0; i < 16; i++)
1536  if ((cbp >> i) & 1)
1537  decode_4x4_block(gb, vlc, 1, y_coeffs + i * 16 , 4, q_y);
1538 
1539  memset(u_coeffs, 0, sizeof(u_coeffs[0])*64);
1540  for (int i = 0; i < 4; i++)
1541  if ((cbp >> (16 + i)) & 1)
1542  decode_4x4_block_dc(gb, vlc, 0, u_coeffs + i * 16, 4, q_c_dc, q_c_ac);
1543 
1544  memset(v_coeffs, 0, sizeof(v_coeffs[0])*64);
1545  for (int i = 0; i < 4; i++)
1546  if ((cbp >> (20 + i)) & 1)
1547  decode_4x4_block_dc(gb, vlc, 0, v_coeffs + i * 16, 4, q_c_dc, q_c_ac);
1548 }
1549 
1550 static int decode_cbp8(GetBitContext * gb, int subset, int qp)
1551 {
1552  int cb_set = rv60_qp_to_idx[qp];
1553  return get_vlc2(gb, cbp8_vlc[cb_set][subset], 9, 2);
1554 }
1555 
1556 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)
1557 {
1558  int cb_set = get_c4x4_set(sel_qp, is_intra);
1559  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1560  int q_y = rv60_quants_b[qp];
1561  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1562  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1563 
1564  memset(y_coeffs, 0, sizeof(y_coeffs[0])*64);
1565  for (int i = 0; i < 4; i++) {
1566  if ((ccbp >> i) & 1) {
1567  int offset, stride;
1568  if (mode4x4) {
1569  offset = i*16;
1570  stride = 4;
1571  } else {
1572  offset = (i & 1) * 4 + (i & 2) * 2 * 8;
1573  stride = 8;
1574  }
1575  decode_4x4_block(gb, vlc, 1, y_coeffs + offset, stride, q_y);
1576  }
1577  }
1578 
1579  if ((ccbp >> 4) & 1) {
1580  memset(u_coeffs, 0, sizeof(u_coeffs[0])*16);
1581  decode_4x4_block_dc(gb, vlc, 0, u_coeffs, 4, q_c_dc, q_c_ac);
1582  }
1583 
1584  if ((ccbp >> 5) & 1) {
1585  memset(v_coeffs, 0, sizeof(u_coeffs[0])*16);
1586  decode_4x4_block_dc(gb, vlc, 0, v_coeffs, 4, q_c_dc, q_c_ac);
1587  }
1588 }
1589 
1590 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)
1591 {
1592  int cb_set = get_c4x4_set(sel_qp, is_intra);
1593  const CoeffVLCs * vlc = is_intra ? &intra_coeff_vlc[cb_set] : &inter_coeff_vlc[cb_set];
1594  int q_y = rv60_quants_b[qp];
1595  int q_c_dc = rv60_quants_b[rv60_chroma_quant_dc[qp]];
1596  int q_c_ac = rv60_quants_b[rv60_chroma_quant_ac[qp]];
1597 
1598  memset(y_coeffs, 0, sizeof(y_coeffs[0])*256);
1599  for (int i = 0; i < 16; i++)
1600  if ((ccbp >> i) & 1) {
1601  int off = (i & 3) * 4 + (i >> 2) * 4 * 16;
1602  decode_4x4_block(gb, vlc, 1, y_coeffs + off, 16, q_y);
1603  }
1604 
1605  memset(u_coeffs, 0, sizeof(u_coeffs[0])*64);
1606  for (int i = 0; i < 4; i++)
1607  if ((ccbp >> (16 + i)) & 1) {
1608  int off = (i & 1) * 4 + (i & 2) * 2 * 8;
1609  if (!i)
1610  decode_4x4_block_dc(gb, vlc, 0, u_coeffs + off, 8, q_c_dc, q_c_ac);
1611  else
1612  decode_4x4_block(gb, vlc, 0, u_coeffs + off, 8, q_c_ac);
1613  }
1614 
1615  memset(v_coeffs, 0, sizeof(v_coeffs[0])*64);
1616  for (int i = 0; i < 4; i++)
1617  if ((ccbp >> (20 + i)) & 1) {
1618  int off = (i & 1) * 4 + (i & 2) * 2 * 8;
1619  if (!i)
1620  decode_4x4_block_dc(gb, vlc, 0, v_coeffs + off, 8, q_c_dc, q_c_ac);
1621  else
1622  decode_4x4_block(gb, vlc, 0, v_coeffs + off, 8, q_c_ac);
1623  }
1624 }
1625 
1626 static int decode_super_cbp(GetBitContext * gb, const VLCElem * vlc[4])
1627 {
1628  int sym0 = get_vlc2(gb, vlc[0], 9, 2);
1629  int sym1 = get_vlc2(gb, vlc[1], 9, 2);
1630  int sym2 = get_vlc2(gb, vlc[2], 9, 2);
1631  int sym3 = get_vlc2(gb, vlc[3], 9, 2);
1632  return 0
1633  + ((sym0 & 0x03) << 0)
1634  + ((sym0 & 0x0C) << 2)
1635  + ((sym0 & 0x10) << 12)
1636  + ((sym0 & 0x20) << 15)
1637  + ((sym1 & 0x03) << 2)
1638  + ((sym1 & 0x0C) << 4)
1639  + ((sym1 & 0x10) << 13)
1640  + ((sym1 & 0x20) << 16)
1641  + ((sym2 & 0x03) << 8)
1642  + ((sym2 & 0x0C) << 10)
1643  + ((sym2 & 0x10) << 14)
1644  + ((sym2 & 0x20) << 17)
1645  + ((sym3 & 0x03) << 10)
1646  + ((sym3 & 0x0C) << 12)
1647  + ((sym3 & 0x10) << 15)
1648  + ((sym3 & 0x20) << 18);
1649 }
1650 
1651 static int decode_cbp16(GetBitContext * gb, int subset, int qp)
1652 {
1653  int cb_set = rv60_qp_to_idx[qp];
1654  return decode_super_cbp(gb, cbp16_vlc[cb_set][subset]);
1655 }
1656 
1657 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)
1658 {
1659  int size = 1 << log_size;
1660  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;
1661  int16_t y_coeffs[16*16], u_coeffs[8*8], v_coeffs[8*8];
1662  CUContext cu;
1663 
1664  if (xpos >= s->awidth || ypos >= s->aheight)
1665  return 0;
1666 
1667  split = xpos + size > s->awidth || ypos + size > s->aheight || (size > 8 && get_bits1(gb));
1668  thread->cu_split[thread->cu_split_pos++] = split;
1669  if (split) {
1670  size >>= 1;
1671  log_size -= 1;
1672  if ((ret = decode_cu_r(s, frame, thread, gb, xpos, ypos, log_size, qp, sel_qp)) < 0 ||
1673  (ret = decode_cu_r(s, frame, thread, gb, xpos + size, ypos, log_size, qp, sel_qp)) < 0 ||
1674  (ret = decode_cu_r(s, frame, thread, gb, xpos, ypos + size, log_size, qp, sel_qp)) < 0 ||
1675  (ret = decode_cu_r(s, frame, thread, gb, xpos + size, ypos + size, log_size, qp, sel_qp)) < 0)
1676  return ret;
1677  return 0;
1678  }
1679 
1680  cu.xpos = xpos;
1681  cu.ypos = ypos;
1682  cu.pu_pos = (xpos >> 3) + (ypos >> 3) * s->pu_stride;
1683  cu.blk_pos = (xpos >> 2) + (ypos >> 2) * s->blk_stride;
1684  cu.cu_type = s->pict_type != AV_PICTURE_TYPE_I ? get_bits(gb, 2) : CU_INTRA;
1685 
1686  switch (cu.cu_type) {
1687  case CU_INTRA:
1688  cu.pu_type = size == 8 && get_bits1(gb) ? PU_QUARTERS : PU_FULL;
1689  if (cu.pu_type == PU_QUARTERS)
1690  for (int i = 0; i < 4; i++)
1691  cu.imode[i] = read_intra_mode(gb, &cu.imode_param[i]);
1692  else if (size <= 32)
1693  cu.imode[0] = read_intra_mode(gb, &cu.imode_param[0]);
1694  else
1696  break;
1697  case CU_INTER_MV:
1698  cu.pu_type = get_bits(gb, size == 8 ? 2 : 3);
1699  count = pu_type_num_parts(cu.pu_type);
1700  for (int i = 0; i < count; i++)
1701  read_mv_info(s, gb, &cu.mv[i], size, cu.pu_type);
1702  break;
1703  default:
1704  cu.pu_type = PU_FULL;
1705  cu.mv[0].mvref = skip_mv_ref[get_unary(gb, 0, 3)];
1706  break;
1707  }
1708 
1709  reconstruct(s, &cu, size);
1710 
1711  split_i4x4 = cu.cu_type == CU_INTRA && size == 8 && cu.pu_type == PU_QUARTERS;
1712 
1713  switch (cu.cu_type) {
1714  case CU_INTRA:
1715  imode = s->blk_info[cu.blk_pos].imode;
1716  if (!split_i4x4) {
1717  int off = ypos * frame->linesize[0] + xpos;
1718  populate_ipred(s, &cu, frame->data[0], frame->linesize[0], 0, 0, size, 1);
1719  if (pred_angle(&cu.ipred, frame->data[0] + off, frame->linesize[0], size, imode, 1) < 0)
1720  return AVERROR_INVALIDDATA;
1721  }
1722  for (int plane = 1; plane < 3; plane++) {
1723  int off = (ypos >> 1) * frame->linesize[plane] + (xpos >> 1);
1724  populate_ipred(s, &cu, frame->data[plane], frame->linesize[plane], 0, 0, size >> 1, 0);
1725  if (pred_angle(&cu.ipred, frame->data[plane] + off, frame->linesize[plane], size >> 1, imode, 0) < 0)
1726  return AVERROR_INVALIDDATA;
1727  }
1728  break;
1729  default:
1730  mv_x = xpos >> 2;
1731  mv_y = ypos >> 2;
1732  mv_pos = mv_y * s->blk_stride + mv_x;
1733  count = pu_type_num_parts(cu.pu_type);
1734  for (int part_no = 0; part_no < count; part_no++) {
1735  MVInfo mv;
1736  Dimensions dim;
1737  int bw, bh, bx, by;
1738 
1739  mv = s->blk_info[mv_pos].mv;
1740  get_mv_dimensions(&dim, cu.pu_type, part_no, size);
1741  bw = dim.w << 2;
1742  bh = dim.h << 2;
1743  bx = mv_x << 2;
1744  by = mv_y << 2;
1745 
1746  if (!(mv.mvref & 2)) {
1747  if (!s->last_frame[LAST_PIC]->data[0]) {
1748  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
1749  return AVERROR_INVALIDDATA;
1750  }
1751  }
1752  if (mv.mvref & 6) {
1753  if (!s->last_frame[NEXT_PIC]->data[0]) {
1754  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
1755  return AVERROR_INVALIDDATA;
1756  }
1757  }
1758 
1759  switch (mv.mvref) {
1760  case MVREF_REF0:
1761  mc(s, frame->data, frame->linesize, s->last_frame[LAST_PIC], bx, by, bw, bh, mv.f_mv, 0);
1762  break;
1763  case MVREF_REF1:
1764  mc(s, frame->data, frame->linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.f_mv, 0);
1765  break;
1766  case MVREF_BREF:
1767  mc(s, frame->data, frame->linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.b_mv, 0);
1768  break;
1769  case MVREF_REF0ANDBREF:
1770  mc(s, frame->data, frame->linesize, s->last_frame[LAST_PIC], bx, by, bw, bh, mv.f_mv, 0);
1771  mc(s, thread->avg_data, thread->avg_linesize, s->last_frame[NEXT_PIC], bx, by, bw, bh, mv.b_mv, 1);
1772  avg(frame, thread->avg_data, thread->avg_linesize, bx, by, bw, bh);
1773  break;
1774  default:
1775  av_assert0(0); //should never reach here
1776  }
1777  get_next_mv(s, &dim, cu.pu_type, part_no, &mv_pos, &mv_x, &mv_y);
1778  }
1779  break;
1780  }
1781 
1782  if (cu.cu_type == CU_SKIP)
1783  ttype = TRANSFORM_NONE;
1784  else if (size >= 32)
1785  ttype = TRANSFORM_16X16;
1786  else if (size == 16)
1787  ttype = cu.cu_type == CU_INTRA || cu.pu_type == PU_FULL ? TRANSFORM_16X16 : TRANSFORM_4X4;
1788  else
1789  ttype = cu.pu_type == PU_FULL ? TRANSFORM_8X8 : TRANSFORM_4X4;
1790 
1791  is_intra = cu.cu_type == CU_INTRA;
1792  if (qp >= 32)
1793  return AVERROR_INVALIDDATA;
1794  cu_pos = ((xpos & 63) >> 3) + ((ypos & 63) >> 3) * 8;
1795 
1796  switch (ttype) {
1797  case TRANSFORM_4X4:
1798  subset = is_intra ? 0 : 2;
1799  if (size == 16) {
1800  int cbp16 = get_bits1(gb) ? decode_cbp16(gb, subset, sel_qp) : 0;
1801  if (cbp16) {
1802  decode_cu_4x4in16x16(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp16);
1803  for (int y = 0; y < 4; y++)
1804  for (int x = 0; x < 4; x++) {
1805  int i = y*4 + x;
1806  if ((cbp16 >> i) & 1) {
1807  int off = (ypos + y * 4)*frame->linesize[0] + xpos + x * 4;
1808  ff_rv60_idct4x4_add(y_coeffs + i*16, frame->data[0] + off, frame->linesize[0]);
1809  thread->coded_blk[cu_pos + (y/2)*8 + (x/2)] = 1;
1810  }
1811  }
1812  for (int y = 0; y < 2; y++)
1813  for (int x = 0; x < 2; x++) {
1814  int i = y * 2 + x;
1815  int xoff = (xpos >> 1) + x * 4;
1816  int yoff = (ypos >> 1) + y * 4;
1817  if ((cbp16 >> (16 + i)) & 1) {
1818  int off = yoff * frame->linesize[1] + xoff;
1819  ff_rv60_idct4x4_add(u_coeffs + i * 16, frame->data[1] + off, frame->linesize[1]);
1820  thread->coded_blk[cu_pos + y*8 + x] = 1;
1821  }
1822  if ((cbp16 >> (20 + i)) & 1) {
1823  int off = yoff * frame->linesize[2] + xoff;
1824  ff_rv60_idct4x4_add(v_coeffs + i * 16, frame->data[2] + off, frame->linesize[2]);
1825  thread->coded_blk[cu_pos + y*8 + x] = 1;
1826  }
1827  }
1828  }
1829  } else {
1830  cbp8 = decode_cbp8(gb, subset, sel_qp);
1831  if (cbp8) {
1832  thread->coded_blk[cu_pos] = 1;
1833  decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 1);
1834  }
1835  for (int i = 0; i < 4; i++) {
1836  int xoff = (i & 1) << 2;
1837  int yoff = (i & 2) << 1;
1838  if (split_i4x4) {
1839  int off = (ypos + yoff) * frame->linesize[0] + xpos + xoff;
1840  int imode = s->blk_info[cu.blk_pos + (i >> 1) * s->blk_stride + (i & 1)].imode;
1841  populate_ipred(s, &cu, frame->data[0], frame->linesize[0], xoff, yoff, 4, 1);
1842  if (pred_angle(&cu.ipred, frame->data[0] + off, frame->linesize[0], 4, imode, 1) < 0)
1843  return AVERROR_INVALIDDATA;
1844  }
1845  if ((cbp8 >> i) & 1) {
1846  int off = (ypos + yoff) * frame->linesize[0] + xpos + xoff;
1847  ff_rv60_idct4x4_add(y_coeffs + i * 16, frame->data[0] + off, frame->linesize[0]);
1848  }
1849  }
1850  if ((cbp8 >> 4) & 1) {
1851  int off = (ypos >> 1) * frame->linesize[1] + (xpos >> 1);
1852  ff_rv60_idct4x4_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1853  }
1854  if ((cbp8 >> 5) & 1) {
1855  int off = (ypos >> 1) * frame->linesize[2] + (xpos >> 1);
1856  ff_rv60_idct4x4_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1857  }
1858  }
1859  break;
1860  case TRANSFORM_8X8:
1861  subset = is_intra ? 1 : 3;
1862  cbp8 = decode_cbp8(gb, subset, sel_qp);
1863  if (cbp8) {
1864  thread->coded_blk[cu_pos] = 1;
1865  decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 0);
1866  if (cbp8 & 0xF) {
1867  int off = ypos * frame->linesize[0] + xpos;
1868  ff_rv60_idct8x8_add(y_coeffs, frame->data[0] + off, frame->linesize[0]);
1869  }
1870  if ((cbp8 >> 4) & 1) {
1871  int off = (ypos >> 1) * frame->linesize[1] + (xpos >> 1);
1872  ff_rv60_idct4x4_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1873  }
1874  if ((cbp8 >> 5) & 1) {
1875  int off = (ypos >> 1) * frame->linesize[2] + (xpos >> 1);
1876  ff_rv60_idct4x4_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1877  }
1878  }
1879  break;
1880  case TRANSFORM_16X16:
1881  subset = is_intra ? 1 : 3;
1882  num_clusters = size >> 4;
1883  cl_cbp = get_bits(gb, num_clusters * num_clusters);
1884  for (int y = 0; y < num_clusters; y++) {
1885  for (int x = 0; x < num_clusters; x++) {
1886  if (!((cl_cbp >> (y*num_clusters + x)) & 1))
1887  continue;
1888  thread->coded_blk[cu_pos + y*2*8 + x*2 + 0] = 1;
1889  thread->coded_blk[cu_pos + y*2*8 + x*2 + 1] = 1;
1890  thread->coded_blk[cu_pos + y*2*8 + x*2 + 8] = 1;
1891  thread->coded_blk[cu_pos + y*2*8 + x*2 + 9] = 1;
1892  super_cbp = decode_cbp16(gb, subset, sel_qp);
1893  if (super_cbp) {
1894  decode_cu_16x16(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, super_cbp);
1895  if (super_cbp & 0xFFFF) {
1896  int off = (ypos + y * 16) * frame->linesize[0] + xpos + x * 16;
1897  ff_rv60_idct16x16_add(y_coeffs, frame->data[0] + off, frame->linesize[0]);
1898  }
1899  if ((super_cbp >> 16) & 0xF) {
1900  int off = ((ypos >> 1) + y * 8) * frame->linesize[1] + (xpos >> 1) + x * 8;
1901  ff_rv60_idct8x8_add(u_coeffs, frame->data[1] + off, frame->linesize[1]);
1902  }
1903  if ((super_cbp >> 20) & 0xF) {
1904  int off = ((ypos >> 1) + y * 8) * frame->linesize[2] + (xpos >> 1) + x * 8;
1905  ff_rv60_idct8x8_add(v_coeffs, frame->data[2] + off, frame->linesize[2]);
1906  }
1907  }
1908  }
1909  }
1910  break;
1911  }
1912 
1913  return 0;
1914 }
1915 
1916 static int deblock_get_pos(RV60Context * s, int xpos, int ypos)
1917 {
1918  return (ypos >> 2) * s->dblk_stride + (xpos >> 2);
1919 }
1920 
1921 static void deblock_set_strength(RV60Context * s, int xpos, int ypos, int size, int q, int strength)
1922 {
1923  int pos = deblock_get_pos(s, xpos, ypos);
1924  int dsize = size >> 2;
1925  int dval = (q << 2) + strength;
1926 
1927  for (int x = 0; x < dsize; x++) {
1928  s->top_str[pos + x] = dval;
1929  s->top_str[pos + (dsize - 1)*s->dblk_stride + x] = dval;
1930  }
1931 
1932  for (int y = 0; y < dsize; y++) {
1933  s->left_str[pos + y*s->dblk_stride] = dval;
1934  s->left_str[pos + y*s->dblk_stride + dsize - 1] = dval;
1935  }
1936 }
1937 
1938 static int deblock_get_top_strength(const RV60Context * s, int pos)
1939 {
1940  return s->top_str[pos] & 3;
1941 }
1942 
1943 static int deblock_get_left_strength(const RV60Context * s, int pos)
1944 {
1945  return s->left_str[pos] & 3;
1946 }
1947 
1948 static void deblock_set_top_strength(RV60Context * s, int pos, int strength)
1949 {
1950  s->top_str[pos] |= strength;
1951 }
1952 
1953 static void deblock_set_left_strength(RV60Context * s, int pos, int strength)
1954 {
1955  s->left_str[pos] |= strength;
1956 }
1957 
1958 static void derive_deblock_strength(RV60Context * s, int xpos, int ypos, int size)
1959 {
1960  int blk_pos = (ypos >> 2) * s->blk_stride + (xpos >> 2);
1961  int dblk_pos = deblock_get_pos(s, xpos, ypos);
1962  if (ypos > 0)
1963  for (int i = 0; i < size; i++)
1964  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))
1965  deblock_set_top_strength(s, dblk_pos + i, 1);
1966  if (xpos > 0)
1967  for (int i = 0; i < size; i++)
1968  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))
1969  deblock_set_left_strength(s, dblk_pos + i *s->dblk_stride, 1);
1970 }
1971 
1972 #define STRENGTH(el, lim) (FFABS(el) < (lim) ? 3 : 1)
1973 #define CLIP_SYMM(a, b) av_clip(a, -(b), b)
1974 
1975 static void filter_luma_edge(uint8_t * dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
1976 {
1977  int16_t diff_q1q0[4];
1978  int16_t diff_p1p0[4];
1979  int str_p, str_q, msum, maxprod, weak;
1980 
1981  for (int i = 0; i < 4; i++) {
1982  diff_q1q0[i] = dst[i * stride - 2*step] - dst[i*stride - step];
1983  diff_p1p0[i] = dst[i * stride + step] - dst[i*stride];
1984  }
1985 
1986  str_p = STRENGTH(diff_q1q0[0] + diff_q1q0[1] + diff_q1q0[2] + diff_q1q0[3], lim2);
1987  str_q = STRENGTH(diff_p1p0[0] + diff_p1p0[1] + diff_p1p0[2] + diff_p1p0[3], lim2);
1988 
1989  if (str_p + str_q <= 2)
1990  return;
1991 
1992  msum = (mode1 + mode2 + str_q + str_p) >> 1;
1993  if (str_q == 1 || str_p == 1) {
1994  maxprod = 384;
1995  weak = 1;
1996  } else {
1997  maxprod = 256;
1998  weak = 0;
1999  }
2000 
2001  for (int y = 0; y < 4; y++) {
2002  int diff_p0q0 = dst[0] - dst[-step];
2003  int result = (lim1 * FFABS(diff_p0q0)) & -128;
2004  if (diff_p0q0 && result <= maxprod) {
2005  int diff_q1q2 = dst[-2*step] - dst[-3*step];
2006  int diff_p1p2 = dst[step] - dst[2*step];
2007  int delta;
2008  if (weak) {
2009  delta = CLIP_SYMM((diff_p0q0 + 1) >> 1, msum >> 1);
2010  } else {
2011  int diff_strg = (dst[-2*step] - dst[step] + 4 * diff_p0q0 + 4) >> 3;
2012  delta = CLIP_SYMM(diff_strg, msum);
2013  }
2014  dst[-step] = av_clip_uint8(dst[-step] + delta);
2015  dst[0] = av_clip_uint8(dst[0] - delta);
2016  if (str_p != 1 && FFABS(diff_q1q2) <= (lim2 >> 2)) {
2017  int diff = (diff_q1q0[y] + diff_q1q2 - delta) >> 1;
2018  int delta_q1 = weak ? CLIP_SYMM(diff, mode1 >> 1) : CLIP_SYMM(diff, mode1);
2019  dst[-2 * step] = av_clip_uint8(dst[-2*step] - delta_q1);
2020  }
2021  if (str_q != 1 && FFABS(diff_p1p2) <= (lim2 >> 2)) {
2022  int diff = (diff_p1p0[y] + diff_p1p2 + delta) >> 1;
2023  int delta_p1 = weak ? CLIP_SYMM(diff, mode2 >> 1) : CLIP_SYMM(diff, mode2);
2024  dst[step] = av_clip_uint8(dst[step] - delta_p1);
2025  }
2026  }
2027  dst += stride;
2028  }
2029 }
2030 
2031 static void filter_chroma_edge(uint8_t * dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
2032 {
2033  int diff_q = 4 * FFABS(dst[-2*step] - dst[-step]);
2034  int diff_p = 4 * FFABS(dst[ step] - dst[0]);
2035  int str_q = STRENGTH(diff_q, lim2);
2036  int str_p = STRENGTH(diff_p, lim2);
2037  int msum, maxprod, weak;
2038 
2039  if (str_p + str_q <= 2)
2040  return;
2041 
2042  msum = (mode1 + mode2 + str_q + str_p) >> 1;
2043  if (str_q == 1 || str_p == 1) {
2044  maxprod = 384;
2045  weak = 1;
2046  } else {
2047  maxprod = 256;
2048  weak = 0;
2049  }
2050 
2051  for (int y = 0; y < 2; y++) {
2052  int diff_pq = dst[0] - dst[-step];
2053  int result = (lim1 * FFABS(diff_pq)) & -128;
2054  if (diff_pq && result <= maxprod) {
2055  int delta;
2056  if (weak) {
2057  delta = CLIP_SYMM((diff_pq + 1) >> 1, msum >> 1);
2058  } else {
2059  int diff_strg = (dst[-2*step] - dst[step] + 4 * diff_pq + 4) >> 3;
2060  delta = CLIP_SYMM(diff_strg, msum);
2061  }
2062  dst[-step] = av_clip_uint8(dst[-step] + delta);
2063  dst[ 0 ] = av_clip_uint8(dst[ 0 ] - delta);
2064  }
2065  dst += stride;
2066  }
2067 }
2068 
2069 static void deblock_edge_ver(AVFrame * frame, int xpos, int ypos, int dblk_l, int dblk_r, int deblock_chroma)
2070 {
2071  int qp_l = dblk_l >> 2;
2072  int str_l = dblk_l & 3;
2073  int qp_r = dblk_r >> 2;
2074  int str_r = dblk_r & 3;
2075  const uint8_t * dl_l = rv60_deblock_limits[qp_l];
2076  const uint8_t * dl_r = rv60_deblock_limits[qp_r];
2077  int mode_l = str_l ? dl_l[str_l - 1] : 0;
2078  int mode_r = str_r ? dl_r[str_r - 1] : 0;
2079  int lim1 = dl_r[2];
2080  int lim2 = dl_r[3] * 4;
2081 
2082  filter_luma_edge(frame->data[0] + ypos * frame->linesize[0] + xpos, 1, frame->linesize[0], mode_l, mode_r, lim1, lim2);
2083  if ((str_l | str_r) >= 2 && deblock_chroma)
2084  for (int plane = 1; plane < 3; plane++)
2085  filter_chroma_edge(frame->data[plane] + (ypos >> 1) * frame->linesize[plane] + (xpos >> 1), 1, frame->linesize[plane], mode_l, mode_r, lim1, lim2);
2086 }
2087 
2088 static void deblock_edge_hor(AVFrame * frame, int xpos, int ypos, int dblk_t, int dblk_d, int deblock_chroma)
2089 {
2090  int qp_t = dblk_t >> 2;
2091  int str_t = dblk_t & 3;
2092  int qp_d = dblk_d >> 2;
2093  int str_d = dblk_d & 3;
2094  const uint8_t * dl_t = rv60_deblock_limits[qp_t];
2095  const uint8_t * dl_d = rv60_deblock_limits[qp_d];
2096  int mode_t = str_t ? dl_t[str_t - 1] : 0;
2097  int mode_d = str_d ? dl_d[str_d - 1] : 0;
2098  int lim1 = dl_d[2];
2099  int lim2 = dl_d[3] * 4;
2100 
2101  filter_luma_edge(frame->data[0] + ypos * frame->linesize[0] + xpos, frame->linesize[0], 1, mode_t, mode_d, lim1, lim2);
2102  if ((str_t | str_d) >= 2 && deblock_chroma)
2103  for (int plane = 1; plane < 3; plane++)
2104  filter_chroma_edge(frame->data[plane] + (ypos >> 1) * frame->linesize[plane] + (xpos >> 1), frame->linesize[plane], 1, mode_t, mode_d, lim1, lim2);
2105 }
2106 
2107 static void deblock8x8(const RV60Context * s, AVFrame * frame, int xpos, int ypos, int dblkpos)
2108 {
2109  if (xpos > 0) {
2110  if (ypos > 0) {
2111  int str_l = s->left_str[dblkpos - s->dblk_stride - 1];
2112  int str_r = s->left_str[dblkpos - s->dblk_stride];
2113  if ((str_l | str_r) & 3)
2114  deblock_edge_ver(frame, xpos, ypos - 4, str_l, str_r, s->deblock_chroma);
2115  }
2116  {
2117  int str_l = s->left_str[dblkpos - 1];
2118  int str_r = s->left_str[dblkpos];
2119  if ((str_l | str_r) & 3)
2120  deblock_edge_ver(frame, xpos, ypos, str_l, str_r, s->deblock_chroma);
2121  }
2122  if (ypos + 8 >= s->aheight) {
2123  int str_l = s->left_str[dblkpos + s->dblk_stride - 1];
2124  int str_r = s->left_str[dblkpos + s->dblk_stride];
2125  if ((str_l | str_r) & 3)
2126  deblock_edge_ver(frame, xpos, ypos + 4, str_l, str_r, s->deblock_chroma);
2127  }
2128  }
2129  if (ypos > 0) {
2130  if (xpos > 0) {
2131  int str_t = s->top_str[dblkpos - s->dblk_stride - 1];
2132  int str_d = s->top_str[dblkpos - 1];
2133  if ((str_t | str_d) & 3)
2134  deblock_edge_hor(frame, xpos - 4, ypos, str_t, str_d, s->deblock_chroma);
2135  }
2136  {
2137  int str_t = s->top_str[dblkpos - s->dblk_stride];
2138  int str_d = s->top_str[dblkpos];
2139  if ((str_t | str_d) & 3)
2140  deblock_edge_hor(frame, xpos, ypos, str_t, str_d, s->deblock_chroma);
2141  }
2142  if (xpos + 8 >= s->awidth) {
2143  int str_t = s->top_str[dblkpos - s->dblk_stride + 1];
2144  int str_d = s->top_str[dblkpos + 1];
2145  if ((str_t | str_d) & 3)
2146  deblock_edge_hor(frame, xpos + 4, ypos, str_t, str_d, s->deblock_chroma);
2147  }
2148  }
2149 }
2150 
2151 static void deblock(const RV60Context * s, AVFrame * frame, int xpos, int ypos, int size, int dpos)
2152 {
2153  for (int x = 0; x < size >> 3; x++)
2154  deblock8x8(s, frame, xpos + x * 8, ypos, dpos + x * 2);
2155 
2156  for (int y = 1; y < size >> 3; y++)
2157  deblock8x8(s, frame, xpos, ypos + y * 8, dpos + y * 2 * s->dblk_stride);
2158 }
2159 
2160 static void deblock_cu_r(RV60Context * s, AVFrame * frame, ThreadContext * thread, int xpos, int ypos, int log_size, int qp)
2161 {
2162  int pu_pos, tsize, ntiles;
2163  enum CUType cu_type;
2164 
2165  if (xpos >= s->awidth || ypos >= s->aheight)
2166  return;
2167 
2168  if (thread->cu_split[thread->cu_split_pos++]) {
2169  int hsize = 1 << (log_size - 1);
2170  log_size--;
2171  deblock_cu_r(s, frame, thread, xpos, ypos, log_size, qp);
2172  deblock_cu_r(s, frame, thread, xpos + hsize, ypos, log_size, qp);
2173  deblock_cu_r(s, frame, thread, xpos, ypos + hsize, log_size, qp);
2174  deblock_cu_r(s, frame, thread, xpos + hsize, ypos + hsize, log_size, qp);
2175  return;
2176  }
2177 
2178  pu_pos = (ypos >> 3) * s->pu_stride + (xpos >> 3);
2179  cu_type = s->pu_info[pu_pos].cu_type;
2180  switch (log_size) {
2181  case 3: tsize = 3; break;
2182  case 4: tsize = cu_type && s->pu_info[pu_pos].pu_type ? 3 : 4; break;
2183  case 5:
2184  case 6: tsize = 4; break;
2185  }
2186  ntiles = 1 << (log_size - tsize);
2187 
2188  for (int ty = 0; ty < ntiles; ty++)
2189  for (int tx = 0; tx < ntiles; tx++) {
2190  int x = xpos + (tx << tsize);
2191  int y = ypos + (ty << tsize);
2192  int cu_pos = ((y & 63) >> 3) * 8 + ((x & 63) >> 3);
2193 
2194  if (cu_type == CU_INTRA)
2195  deblock_set_strength(s, x, y, 1 << tsize, qp, 2);
2196  else if (cu_type != CU_SKIP && thread->coded_blk[cu_pos])
2197  deblock_set_strength(s, x, y, 1 << tsize, qp, 1);
2198  else {
2199  deblock_set_strength(s, x, y, 1 << tsize, qp, 0);
2200  derive_deblock_strength(s, x, y, 1 << (tsize - 2));
2201  }
2202 
2203  deblock(s, frame, x, y, 1 << tsize, deblock_get_pos(s, x, y));
2204  }
2205 }
2206 
2207 static int read_qp_offset(GetBitContext *gb, int qp_off_type)
2208 {
2209  int val;
2210 
2211  switch (qp_off_type) {
2212  case 0:
2213  return 0;
2214  case 1:
2215  val = read_code012(gb);
2216  return val != 2 ? val : -1;
2217  default:
2218  if (!get_bits1(gb))
2219  return 0;
2220  val = get_bits(gb, 2);
2221  if (!(val & 2))
2222  return val + 1;
2223  else
2224  return -((val & 1) + 1);
2225  }
2226 }
2227 
2228 static int calc_sel_qp(int osvquant, int qp)
2229 {
2230  switch (osvquant) {
2231  case 0: return qp;
2232  case 1: return qp <= 25 ? qp + 5 : qp;
2233  default:
2234  if (qp <= 18)
2235  return qp + 10;
2236  else if (qp <= 25)
2237  return qp + 5;
2238  else
2239  return qp;
2240  }
2241 }
2242 
2243 static int decode_slice(AVCodecContext *avctx, void *tdata, int cu_y, int threadnr)
2244 {
2245  RV60Context *s = avctx->priv_data;
2246  AVFrame * frame = tdata;
2247  ThreadContext thread;
2248  GetBitContext gb;
2249  int qp, sel_qp, ret;
2250 
2251  thread.avg_data[0] = thread.avg_buffer;
2252  thread.avg_data[1] = thread.avg_buffer + 64*64;
2253  thread.avg_data[2] = thread.avg_buffer + 64*64 + 32*32;
2254  thread.avg_linesize[0] = 64;
2255  thread.avg_linesize[1] = 32;
2256  thread.avg_linesize[2] = 32;
2257 
2258  if ((ret = init_get_bits8(&gb, s->slice[cu_y].data, s->slice[cu_y].data_size)) < 0)
2259  return ret;
2260 
2261  for (int cu_x = 0; cu_x < s->cu_width; cu_x++) {
2262  if ((s->avctx->active_thread_type & FF_THREAD_SLICE) && cu_y)
2263  ff_thread_progress_await(&s->progress[cu_y - 1], cu_x + 2);
2264 
2265  qp = s->qp + read_qp_offset(&gb, s->qp_off_type);
2266  if (qp < 0) {
2268  break;
2269  }
2270  sel_qp = calc_sel_qp(s->osvquant, qp);
2271 
2272  memset(thread.coded_blk, 0, sizeof(thread.coded_blk));
2273  thread.cu_split_pos = 0;
2274 
2275  if ((ret = decode_cu_r(s, frame, &thread, &gb, cu_x << 6, cu_y << 6, 6, qp, sel_qp)) < 0)
2276  break;
2277 
2278  if (s->deblock) {
2279  thread.cu_split_pos = 0;
2280  deblock_cu_r(s, frame, &thread, cu_x << 6, cu_y << 6, 6, qp);
2281  }
2282 
2283  if (s->avctx->active_thread_type & FF_THREAD_SLICE)
2284  ff_thread_progress_report(&s->progress[cu_y], cu_x + 1);
2285  }
2286 
2287  if (s->avctx->active_thread_type & FF_THREAD_SLICE)
2288  ff_thread_progress_report(&s->progress[cu_y], INT_MAX);
2289 
2290  return ret;
2291 }
2292 
2294  int * got_frame, AVPacket * avpkt)
2295 {
2296  RV60Context *s = avctx->priv_data;
2297  GetBitContext gb;
2298  int ret, header_size, width, height, ofs;
2299 
2300  if (avpkt->size == 0) {
2301  if (s->last_frame[NEXT_PIC]->data[0]) {
2302  av_frame_move_ref(frame, s->last_frame[NEXT_PIC]);
2303  *got_frame = 1;
2304  }
2305  return 0;
2306  }
2307 
2308  if (avpkt->size < 9)
2309  return AVERROR_INVALIDDATA;
2310 
2311  header_size = avpkt->data[0] * 8 + 9;
2312  if (avpkt->size < header_size)
2313  return AVERROR_INVALIDDATA;
2314 
2315  if ((ret = init_get_bits8(&gb, avpkt->data + header_size, avpkt->size - header_size)) < 0)
2316  return ret;
2317 
2318  if ((ret = read_frame_header(s, &gb, &width, &height)) < 0)
2319  return ret;
2320 
2321  if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
2322  avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
2323  avctx->skip_frame >= AVDISCARD_ALL)
2324  return avpkt->size;
2325 
2326  if (s->pict_type != AV_PICTURE_TYPE_B)
2327  FFSWAP(AVFrame *, s->last_frame[NEXT_PIC], s->last_frame[LAST_PIC]);
2328 
2329  if ((s->pict_type == AV_PICTURE_TYPE_P && !s->last_frame[LAST_PIC]->data[0]) ||
2330  (s->pict_type == AV_PICTURE_TYPE_B && (!s->last_frame[LAST_PIC]->data[0] || !s->last_frame[NEXT_PIC]->data[0]))) {
2331  av_log(s->avctx, AV_LOG_ERROR, "missing reference frame\n");
2332  return AVERROR_INVALIDDATA;
2333  }
2334 
2335  s->last_frame[CUR_PIC]->pict_type = s->pict_type;
2336  if (s->pict_type == AV_PICTURE_TYPE_I)
2337  s->last_frame[CUR_PIC]->flags |= AV_FRAME_FLAG_KEY;
2338 
2340  return ret;
2341 
2342  if (!s->last_frame[CUR_PIC]->data[0])
2343  if ((ret = ff_get_buffer(avctx, s->last_frame[CUR_PIC], 0)) < 0)
2344  return ret;
2345 
2346  if ((ret = read_slice_sizes(s, &gb)) < 0)
2347  return ret;
2348 
2349  ofs = get_bits_count(&gb) / 8;
2350 
2351  for (int i = 0; i < s->cu_height; i++) {
2352  if (ofs >= avpkt->size - header_size)
2353  return AVERROR_INVALIDDATA;
2354  s->slice[i].data = avpkt->data + header_size + ofs;
2355  s->slice[i].data_size = FFMIN(s->slice[i].size, avpkt->size - header_size - ofs);
2356  if (s->slice[i].size > INT32_MAX - ofs)
2357  return AVERROR_INVALIDDATA;
2358  ofs += s->slice[i].size;
2359  }
2360 
2361  ret = progress_init(s, s->cu_height);
2362  if (ret < 0)
2363  return ret;
2364 
2365  s->avctx->execute2(s->avctx, decode_slice, s->last_frame[CUR_PIC], NULL, s->cu_height);
2366 
2367  ret = 0;
2368  if (s->pict_type == AV_PICTURE_TYPE_B)
2369  av_frame_move_ref(frame, s->last_frame[CUR_PIC]);
2370  else if (s->last_frame[LAST_PIC]->data[0])
2371  ret = av_frame_ref(frame, s->last_frame[LAST_PIC]);
2372  if (ret < 0)
2373  return ret;
2374 
2375  if (frame->data[0])
2376  *got_frame = 1;
2377 
2378  if (s->pict_type != AV_PICTURE_TYPE_B) {
2379  av_frame_unref(s->last_frame[NEXT_PIC]);
2380  FFSWAP(AVFrame *, s->last_frame[CUR_PIC], s->last_frame[NEXT_PIC]);
2381  }
2382 
2383  if (s->pict_type != AV_PICTURE_TYPE_B) {
2384  s->ref_pts[0] = s->ref_pts[1];
2385  s->ref_pts[1] = avpkt->pts;
2386 
2387  s->ref_ts[0] = s->ref_ts[1];
2388  s->ref_ts[1] = s->ts;
2389 
2390  if (s->ref_pts[1] > s->ref_pts[0] && s->ref_ts[1] > s->ref_ts[0])
2391  s->ts_scale = (s->ref_pts[1] - s->ref_pts[0]) / (s->ref_ts[1] - s->ref_ts[0]);
2392  } else {
2393  frame->pts = s->ref_pts[0] + (s->ts - s->ref_ts[0]) * s->ts_scale;
2394  }
2395 
2396  return avpkt->size;
2397 }
2398 
2399 static void rv60_flush(AVCodecContext *avctx)
2400 {
2401  RV60Context *s = avctx->priv_data;
2402 
2403  for (int i = 0; i < 3; i++)
2404  av_frame_unref(s->last_frame[i]);
2405 }
2406 
2408 {
2409  RV60Context *s = avctx->priv_data;
2410 
2411  for (int i = 0; i < 3; i++)
2412  av_frame_free(&s->last_frame[i]);
2413 
2414  av_freep(&s->slice);
2415  av_freep(&s->pu_info);
2416  av_freep(&s->blk_info);
2417  av_freep(&s->top_str);
2418  av_freep(&s->left_str);
2419 
2420  for (int i = 0; i < s->nb_progress; i++)
2421  ff_thread_progress_destroy(&s->progress[i]);
2422  av_freep(&s->progress);
2423 
2424  return 0;
2425 }
2426 
2428  .p.name = "rv60",
2429  CODEC_LONG_NAME("RealVideo 6.0"),
2430  .p.type = AVMEDIA_TYPE_VIDEO,
2431  .p.id = AV_CODEC_ID_RV60,
2432  .priv_data_size = sizeof(RV60Context),
2436  .flush = rv60_flush,
2438  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
2439 };
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:875
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:1975
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:1444
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:463
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:2399
pu_is_intra
static int pu_is_intra(const PUInfo *pu)
Definition: rv60dec.c:758
threadprogress.h
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:1938
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:2151
CUContext::xpos
int xpos
Definition: rv60dec.c:471
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:658
IntraPredContext::has_t
int has_t
Definition: rv60dec.c:464
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:1192
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:419
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:1590
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:1257
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:250
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:2069
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:427
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:465
mvinfo_matches_forward
static int mvinfo_matches_forward(const MVInfo *a, const MVInfo *b)
Definition: rv60dec.c:993
RV60Context::dblk_stride
int dblk_stride
Definition: rv60dec.c:220
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:1329
AVPacket::data
uint8_t * data
Definition: packet.h:552
filter_weak
static void filter_weak(uint8_t *dst, const uint8_t *src, int size)
Definition: rv60dec.c:599
b
#define b
Definition: input.c:42
ff_rv60_decoder
const FFCodec ff_rv60_decoder
Definition: rv60dec.c:2427
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:470
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:1504
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:1526
ipm_compar
static int ipm_compar(const void *a, const void *b)
Definition: rv60dec.c:763
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:1916
IntraPredContext::has_l
int has_l
Definition: rv60dec.c:466
CUContext::pu_pos
int pu_pos
Definition: rv60dec.c:473
deblock_get_left_strength
static int deblock_get_left_strength(const RV60Context *s, int pos)
Definition: rv60dec.c:1943
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:492
ThreadContext::avg_buffer
uint8_t avg_buffer[64 *64+32 *32 *2]
Definition: rv60dec.c:164
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:379
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:333
Slice::data_size
int data_size
Definition: rv60dec.c:155
IntraPredContext::has_ld
int has_ld
Definition: rv60dec.c:467
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:436
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
state
static struct @512 state
CoeffVLCs
Definition: rv60dec.c:87
GetBitContext
Definition: get_bits.h:109
deblock_set_top_strength
static void deblock_set_top_strength(RV60Context *s, int pos, int strength)
Definition: rv60dec.c:1948
get_skip_mv_index
static int get_skip_mv_index(enum MVRefEnum mvref)
Definition: rv60dec.c:859
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:2088
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:902
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:536
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:1958
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:474
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:539
quant
static int quant(int v, int q)
Definition: rv60dec.c:1422
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:642
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:2243
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
TRANSFORM_16X16
@ TRANSFORM_16X16
Definition: rv60dec.c:79
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:768
Dimensions::w
int w
Definition: rv60dec.c:899
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:1042
mv_is_forward
static int mv_is_forward(enum MVRefEnum mvref)
Definition: rv60dec.c:983
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:978
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:1024
deblock8x8
static void deblock8x8(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int dblkpos)
Definition: rv60dec.c:2107
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:344
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:232
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:1482
ipred_init
static void ipred_init(IntraPredContext *i)
Definition: rv60dec.c:485
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:1003
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:1657
NULL
#define NULL
Definition: coverity.c:32
CUContext::ypos
int ypos
Definition: rv60dec.c:472
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:944
RV60Context::pu_info
PUInfo * pu_info
Definition: rv60dec.c:215
table_data
static VLCElem table_data[129148]
Definition: rv60dec.c:98
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:386
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:392
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:939
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:1463
has_top_block
static int has_top_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
Definition: rv60dec.c:431
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:480
IntraPredContext::t
uint8_t t[129]
Definition: rv60dec.c:462
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:646
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:1264
AVOnce
#define AVOnce
Definition: thread.h:202
TRANSFORM_8X8
@ TRANSFORM_8X8
Definition: rv60dec.c:80
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:567
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:1198
CUContext::imode_param
int imode_param[4]
Definition: rv60dec.c:479
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:231
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:553
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:607
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:2293
pu_type_num_parts
static int pu_type_num_parts(enum PUType pu_type)
Definition: rv60dec.c:949
add_if_valid
static void add_if_valid(unique_list_mvinfo *skip_cand, const MVInfo *mvi)
Definition: rv60dec.c:869
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:1288
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:2031
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:2407
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:478
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:617
RV60Context::progress
struct ThreadProgress * progress
Definition: rv60dec.c:227
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:411
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:2160
TRANSFORM_NONE
@ TRANSFORM_NONE
Definition: rv60dec.c:78
calc_sel_qp
static int calc_sel_qp(int osvquant, int qp)
Definition: rv60dec.c:2228
unary.h
read_intra_mode
static int read_intra_mode(GetBitContext *gb, int *param)
Definition: rv60dec.c:420
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:1626
STRENGTH
#define STRENGTH(el, lim)
Definition: rv60dec.c:1972
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:1550
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:545
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:451
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:441
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:1404
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:638
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:1427
CUContext::cu_type
enum CUType cu_type
Definition: rv60dec.c:476
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:988
reconstruct_intra
static int reconstruct_intra(const RV60Context *s, const CUContext *cu, int size, int sub)
Definition: rv60dec.c:796
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:482
mvinfo_matches_backward
static int mvinfo_matches_backward(const MVInfo *a, const MVInfo *b)
Definition: rv60dec.c:998
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:265
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:555
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:1651
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:1973
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:958
RV60Context::aheight
int aheight
Definition: rv60dec.c:208
TRANSFORM_4X4
@ TRANSFORM_4X4
Definition: rv60dec.c:81
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:1921
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:1953
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:2207
read_code012
static int read_code012(GetBitContext *gb)
Definition: rv60dec.c:337
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:1322
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:1414
AVPacket
This structure stores compressed data.
Definition: packet.h:529
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:1397
IntraPredContext
Definition: rv60dec.c:461
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:1556
width
#define width
Definition: dsp.h:89
CUContext::pu_type
enum PUType pu_type
Definition: rv60dec.c:477
MVREF_SKIP0
@ MVREF_SKIP0
Definition: rv60dec.c:69
AVDISCARD_NONREF
@ AVDISCARD_NONREF
discard all non reference
Definition: defs.h:228
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:1134
src
#define src
Definition: vp8dsp.c:248
Dimensions
Definition: rv60dec.c:898
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