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