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