FFmpeg
pred_template.c
Go to the documentation of this file.
1 /*
2  * HEVC video decoder
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
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 "libavutil/pixdesc.h"
24 
25 #include "bit_depth_template.c"
26 #include "pred.h"
27 
28 static void FUNC(ref_filter_3tap)(uint8_t *filtered_left,
29  uint8_t *filtered_top,
30  const uint8_t *left,
31  const uint8_t *top,
32  int size)
33 {
34  pixel *filtered_left_p = (pixel *)filtered_left;
35  pixel *filtered_top_p = (pixel *)filtered_top;
36  const pixel *left_p = (const pixel *)left;
37  const pixel *top_p = (const pixel *)top;
38  int i;
39  int n = 2 * size;
40 
41  filtered_left_p[n - 1] = left_p[n - 1];
42  filtered_top_p[n - 1] = top_p[n - 1];
43  for (i = n - 2; i >= 0; i--)
44  filtered_left_p[i] = (left_p[i + 1] + 2 * left_p[i] + left_p[i - 1] + 2) >> 2;
45  filtered_top_p[-1] =
46  filtered_left_p[-1] = (left_p[0] + 2 * left_p[-1] + top_p[0] + 2) >> 2;
47  for (i = n - 2; i >= 0; i--)
48  filtered_top_p[i] = (top_p[i + 1] + 2 * top_p[i] + top_p[i - 1] + 2) >> 2;
49 }
50 
51 static void FUNC(ref_filter_strong)(uint8_t *filtered_top,
52  uint8_t *left,
53  const uint8_t *top)
54 {
55  pixel *filtered_top_p = (pixel *)filtered_top;
56  pixel *left_p = (pixel *)left;
57  const pixel *top_p = (const pixel *)top;
58  int i;
59 
60  filtered_top_p[-1] = top_p[-1];
61  filtered_top_p[63] = top_p[63];
62  for (i = 0; i < 63; i++)
63  filtered_top_p[i] = ((64 - (i + 1)) * top_p[-1] +
64  (i + 1) * top_p[63] + 32) >> 6;
65  for (i = 0; i < 63; i++)
66  left_p[i] = ((64 - (i + 1)) * left_p[-1] +
67  (i + 1) * left_p[63] + 32) >> 6;
68 }
69 
70 #define POS(x, y) src[(x) + stride * (y)]
71 
73  const HEVCPPS *pps,
74  int x0, int y0,
75  int log2_size, int c_idx)
76 {
77 #define PU(x) \
78  ((x) >> sps->log2_min_pu_size)
79 #define MVF(x, y) \
80  (s->cur_frame->tab_mvf[(x) + (y) * min_pu_width])
81 #define MVF_PU(x, y) \
82  MVF(PU(x0 + ((x) * (1 << hshift))), PU(y0 + ((y) * (1 << vshift))))
83 #define IS_INTRA(x, y) \
84  (MVF_PU(x, y).pred_flag == PF_INTRA)
85 #define MIN_TB_ADDR_ZS(x, y) \
86  pps->min_tb_addr_zs[(y) * (sps->tb_mask+2) + (x)]
87 #define EXTEND(ptr, val, len) \
88 do { \
89  pixel4 pix = PIXEL_SPLAT_X4(val); \
90  for (i = 0; i < (len); i += 4) \
91  AV_WN4P(ptr + i, pix); \
92 } while (0)
93 
94 #define EXTEND_RIGHT_CIP(ptr, start, length) \
95  for (i = start; i < (start) + (length); i += 4) \
96  if (!IS_INTRA(i, -1)) \
97  AV_WN4P(&ptr[i], a); \
98  else \
99  a = PIXEL_SPLAT_X4(ptr[i+3])
100 #define EXTEND_LEFT_CIP(ptr, start, length) \
101  for (i = start; i > (start) - (length); i--) \
102  if (!IS_INTRA(i - 1, -1)) \
103  ptr[i - 1] = ptr[i]
104 #define EXTEND_UP_CIP(ptr, start, length) \
105  for (i = (start); i > (start) - (length); i -= 4) \
106  if (!IS_INTRA(-1, i - 3)) \
107  AV_WN4P(&ptr[i - 3], a); \
108  else \
109  a = PIXEL_SPLAT_X4(ptr[i - 3])
110 #define EXTEND_DOWN_CIP(ptr, start, length) \
111  for (i = start; i < (start) + (length); i += 4) \
112  if (!IS_INTRA(-1, i)) \
113  AV_WN4P(&ptr[i], a); \
114  else \
115  a = PIXEL_SPLAT_X4(ptr[i + 3])
116 
117  const HEVCSPS *const sps = pps->sps;
118  const HEVCContext *const s = lc->parent;
119  int i;
120  int hshift = sps->hshift[c_idx];
121  int vshift = sps->vshift[c_idx];
122  int size = (1 << log2_size);
123  int size_in_luma_h = size << hshift;
124  int size_in_tbs_h = size_in_luma_h >> sps->log2_min_tb_size;
125  int size_in_luma_v = size << vshift;
126  int size_in_tbs_v = size_in_luma_v >> sps->log2_min_tb_size;
127  int x = x0 >> hshift;
128  int y = y0 >> vshift;
129  int x_tb = (x0 >> sps->log2_min_tb_size) & sps->tb_mask;
130  int y_tb = (y0 >> sps->log2_min_tb_size) & sps->tb_mask;
131  int spin = c_idx && !size_in_tbs_v && ((2 * y0) & (1 << sps->log2_min_tb_size));
132 
133  int cur_tb_addr = MIN_TB_ADDR_ZS(x_tb, y_tb);
134 
135  ptrdiff_t stride = s->cur_frame->f->linesize[c_idx] / sizeof(pixel);
136  pixel *src = (pixel*)s->cur_frame->f->data[c_idx] + x + y * stride;
137 
138  int min_pu_width = sps->min_pu_width;
139 
140  enum IntraPredMode mode = c_idx ? lc->tu.intra_pred_mode_c :
141  lc->tu.intra_pred_mode;
142  pixel4 a;
143  // Extra 16 bytes of padding allow NEON 3-tap filter to do
144  // 32-byte loads without reading past the allocation.
145  pixel left_array[2 * MAX_TB_SIZE + 1 + 16];
146  pixel filtered_left_array[2 * MAX_TB_SIZE + 1];
147  pixel top_array[2 * MAX_TB_SIZE + 1 + 16];
148  pixel filtered_top_array[2 * MAX_TB_SIZE + 1];
149 
150  pixel *left = left_array + 1;
151  pixel *top = top_array + 1;
152  pixel *filtered_left = filtered_left_array + 1;
153  pixel *filtered_top = filtered_top_array + 1;
154  int cand_bottom_left = lc->na.cand_bottom_left && cur_tb_addr > MIN_TB_ADDR_ZS( x_tb - 1, (y_tb + size_in_tbs_v + spin) & sps->tb_mask);
155  int cand_left = lc->na.cand_left;
156  int cand_up_left = lc->na.cand_up_left;
157  int cand_up = lc->na.cand_up;
158  int cand_up_right = lc->na.cand_up_right && !spin && cur_tb_addr > MIN_TB_ADDR_ZS((x_tb + size_in_tbs_h) & sps->tb_mask, y_tb - 1);
159 
160  int bottom_left_size = (FFMIN(y0 + 2 * size_in_luma_v, sps->height) -
161  (y0 + size_in_luma_v)) >> vshift;
162  int top_right_size = (FFMIN(x0 + 2 * size_in_luma_h, sps->width) -
163  (x0 + size_in_luma_h)) >> hshift;
164 
165  if (pps->constrained_intra_pred_flag == 1) {
166  int size_in_luma_pu_v = PU(size_in_luma_v);
167  int size_in_luma_pu_h = PU(size_in_luma_h);
168  int on_pu_edge_x = !av_zero_extend(x0, sps->log2_min_pu_size);
169  int on_pu_edge_y = !av_zero_extend(y0, sps->log2_min_pu_size);
170  if (!size_in_luma_pu_h)
171  size_in_luma_pu_h++;
172  if (cand_bottom_left == 1 && on_pu_edge_x) {
173  int x_left_pu = PU(x0 - 1);
174  int y_bottom_pu = PU(y0 + size_in_luma_v);
175  int max = FFMIN(size_in_luma_pu_v, sps->min_pu_height - y_bottom_pu);
176  cand_bottom_left = 0;
177  for (i = 0; i < max; i += 2)
178  cand_bottom_left |= (MVF(x_left_pu, y_bottom_pu + i).pred_flag == PF_INTRA);
179  }
180  if (cand_left == 1 && on_pu_edge_x) {
181  int x_left_pu = PU(x0 - 1);
182  int y_left_pu = PU(y0);
183  int max = FFMIN(size_in_luma_pu_v, sps->min_pu_height - y_left_pu);
184  cand_left = 0;
185  for (i = 0; i < max; i += 2)
186  cand_left |= (MVF(x_left_pu, y_left_pu + i).pred_flag == PF_INTRA);
187  }
188  if (cand_up_left == 1) {
189  int x_left_pu = PU(x0 - 1);
190  int y_top_pu = PU(y0 - 1);
191  cand_up_left = MVF(x_left_pu, y_top_pu).pred_flag == PF_INTRA;
192  }
193  if (cand_up == 1 && on_pu_edge_y) {
194  int x_top_pu = PU(x0);
195  int y_top_pu = PU(y0 - 1);
196  int max = FFMIN(size_in_luma_pu_h, sps->min_pu_width - x_top_pu);
197  cand_up = 0;
198  for (i = 0; i < max; i += 2)
199  cand_up |= (MVF(x_top_pu + i, y_top_pu).pred_flag == PF_INTRA);
200  }
201  if (cand_up_right == 1 && on_pu_edge_y) {
202  int y_top_pu = PU(y0 - 1);
203  int x_right_pu = PU(x0 + size_in_luma_h);
204  int max = FFMIN(size_in_luma_pu_h, sps->min_pu_width - x_right_pu);
205  cand_up_right = 0;
206  for (i = 0; i < max; i += 2)
207  cand_up_right |= (MVF(x_right_pu + i, y_top_pu).pred_flag == PF_INTRA);
208  }
209  memset(left, 128, 2 * MAX_TB_SIZE*sizeof(pixel));
210  memset(top , 128, 2 * MAX_TB_SIZE*sizeof(pixel));
211  top[-1] = 128;
212  }
213  if (cand_up_left) {
214  left[-1] = POS(-1, -1);
215  top[-1] = left[-1];
216  }
217  if (cand_up)
218  memcpy(top, src - stride, size * sizeof(pixel));
219  if (cand_up_right) {
220  memcpy(top + size, src - stride + size, size * sizeof(pixel));
221  EXTEND(top + size + top_right_size, POS(size + top_right_size - 1, -1),
222  size - top_right_size);
223  }
224  if (cand_left)
225  for (i = 0; i < size; i++)
226  left[i] = POS(-1, i);
227  if (cand_bottom_left) {
228  for (i = size; i < size + bottom_left_size; i++)
229  left[i] = POS(-1, i);
230  EXTEND(left + size + bottom_left_size, POS(-1, size + bottom_left_size - 1),
231  size - bottom_left_size);
232  }
233 
234  if (pps->constrained_intra_pred_flag == 1) {
235  if (cand_bottom_left || cand_left || cand_up_left || cand_up || cand_up_right) {
236  int size_max_x = x0 + ((2 * size) << hshift) < sps->width ?
237  2 * size : (sps->width - x0) >> hshift;
238  int size_max_y = y0 + ((2 * size) << vshift) < sps->height ?
239  2 * size : (sps->height - y0) >> vshift;
240  int j = size + (cand_bottom_left? bottom_left_size: 0) -1;
241  if (!cand_up_right) {
242  size_max_x = x0 + ((size) << hshift) < sps->width ?
243  size : (sps->width - x0) >> hshift;
244  }
245  if (!cand_bottom_left) {
246  size_max_y = y0 + (( size) << vshift) < sps->height ?
247  size : (sps->height - y0) >> vshift;
248  }
249  if (cand_bottom_left || cand_left || cand_up_left) {
250  while (j > -1 && !IS_INTRA(-1, j))
251  j--;
252  if (!IS_INTRA(-1, j)) {
253  j = 0;
254  while (j < size_max_x && !IS_INTRA(j, -1))
255  j++;
256  EXTEND_LEFT_CIP(top, j, j + 1);
257  left[-1] = top[-1];
258  }
259  } else {
260  j = 0;
261  while (j < size_max_x && !IS_INTRA(j, -1))
262  j++;
263  if (j > 0) {
264  EXTEND_LEFT_CIP(top, j, j);
265  top[-1] = top[0];
266  }
267  left[-1] = top[-1];
268  }
269  left[-1] = top[-1];
270  if (cand_bottom_left || cand_left) {
271  a = PIXEL_SPLAT_X4(left[-1]);
272  EXTEND_DOWN_CIP(left, 0, size_max_y);
273  }
274  if (!cand_left)
275  EXTEND(left, left[-1], size);
276  if (!cand_bottom_left)
277  EXTEND(left + size, left[size - 1], size);
278  if (x0 != 0 && y0 != 0) {
279  a = PIXEL_SPLAT_X4(left[size_max_y - 1]);
280  EXTEND_UP_CIP(left, size_max_y - 1, size_max_y);
281  if (!IS_INTRA(-1, - 1))
282  left[-1] = left[0];
283  } else if (x0 == 0) {
284  EXTEND(left, 0, size_max_y);
285  } else {
286  a = PIXEL_SPLAT_X4(left[size_max_y - 1]);
287  EXTEND_UP_CIP(left, size_max_y - 1, size_max_y);
288  }
289  top[-1] = left[-1];
290  if (y0 != 0) {
291  a = PIXEL_SPLAT_X4(left[-1]);
292  EXTEND_RIGHT_CIP(top, 0, size_max_x);
293  }
294  }
295  }
296  // Infer the unavailable samples
297  if (!cand_bottom_left) {
298  if (cand_left) {
299  EXTEND(left + size, left[size - 1], size);
300  } else if (cand_up_left) {
301  EXTEND(left, left[-1], 2 * size);
302  cand_left = 1;
303  } else if (cand_up) {
304  left[-1] = top[0];
305  EXTEND(left, left[-1], 2 * size);
306  cand_up_left = 1;
307  cand_left = 1;
308  } else if (cand_up_right) {
309  EXTEND(top, top[size], size);
310  left[-1] = top[size];
311  EXTEND(left, left[-1], 2 * size);
312  cand_up = 1;
313  cand_up_left = 1;
314  cand_left = 1;
315  } else { // No samples available
316  left[-1] = (1 << (BIT_DEPTH - 1));
317  EXTEND(top, left[-1], 2 * size);
318  EXTEND(left, left[-1], 2 * size);
319  }
320  }
321 
322  if (!cand_left)
323  EXTEND(left, left[size], size);
324  if (!cand_up_left) {
325  left[-1] = left[0];
326  }
327  if (!cand_up)
328  EXTEND(top, left[-1], size);
329  if (!cand_up_right)
330  EXTEND(top + size, top[size - 1], size);
331 
332  top[-1] = left[-1];
333 
334  // Filtering process
335  if (!sps->intra_smoothing_disabled && (c_idx == 0 || sps->chroma_format_idc == 3)) {
336  if (mode != INTRA_DC && size != 4){
337  int intra_hor_ver_dist_thresh[] = { 7, 1, 0 };
338  int min_dist_vert_hor = FFMIN(FFABS((int)(mode - 26U)),
339  FFABS((int)(mode - 10U)));
340  if (min_dist_vert_hor > intra_hor_ver_dist_thresh[log2_size - 3]) {
341  int threshold = 1 << (BIT_DEPTH - 5);
342  if (sps->strong_intra_smoothing_enabled && c_idx == 0 &&
343  log2_size == 5 &&
344  FFABS(top[-1] + top[63] - 2 * top[31]) < threshold &&
345  FFABS(left[-1] + left[63] - 2 * left[31]) < threshold) {
346  s->hpc.ref_filter_strong((uint8_t *)filtered_top,
347  (uint8_t *)left,
348  (const uint8_t *)top);
349  top = filtered_top;
350  } else {
351  s->hpc.ref_filter_3tap[log2_size - 3](
352  (uint8_t *)filtered_left, (uint8_t *)filtered_top,
353  (const uint8_t *)left, (const uint8_t *)top, size);
354  left = filtered_left;
355  top = filtered_top;
356  }
357  }
358  }
359  }
360 
361  switch (mode) {
362  case INTRA_PLANAR:
363  s->hpc.pred_planar[log2_size - 2]((uint8_t *)src, (uint8_t *)top,
364  (uint8_t *)left, stride);
365  break;
366  case INTRA_DC:
367  s->hpc.pred_dc((uint8_t *)src, (uint8_t *)top,
368  (uint8_t *)left, stride, log2_size, c_idx);
369  break;
370  default:
371  s->hpc.pred_angular[log2_size - 2]((uint8_t *)src, (uint8_t *)top,
372  (uint8_t *)left, stride, c_idx,
373  mode);
374  break;
375  }
376 }
377 
378 #define INTRA_PRED(size) \
379 static void FUNC(intra_pred_ ## size)(HEVCLocalContext *lc, const HEVCPPS *pps, \
380  int x0, int y0, int c_idx) \
381 { \
382  FUNC(intra_pred)(lc, pps, x0, y0, size, c_idx); \
383 }
384 
385 INTRA_PRED(2)
386 INTRA_PRED(3)
387 INTRA_PRED(4)
388 INTRA_PRED(5)
389 
390 #undef INTRA_PRED
391 
392 static av_always_inline void FUNC(pred_planar)(uint8_t *_src, const uint8_t *_top,
393  const uint8_t *_left, ptrdiff_t stride,
394  int trafo_size)
395 {
396  int x, y;
397  pixel *src = (pixel *)_src;
398  const pixel *top = (const pixel *)_top;
399  const pixel *left = (const pixel *)_left;
400  int size = 1 << trafo_size;
401  for (y = 0; y < size; y++)
402  for (x = 0; x < size; x++)
403  POS(x, y) = ((size - 1 - x) * left[y] + (x + 1) * top[size] +
404  (size - 1 - y) * top[x] + (y + 1) * left[size] + size) >> (trafo_size + 1);
405 }
406 
407 #define PRED_PLANAR(size)\
408 static void FUNC(pred_planar_ ## size)(uint8_t *src, const uint8_t *top, \
409  const uint8_t *left, ptrdiff_t stride) \
410 { \
411  FUNC(pred_planar)(src, top, left, stride, size + 2); \
412 }
413 
414 PRED_PLANAR(0)
415 PRED_PLANAR(1)
416 PRED_PLANAR(2)
417 PRED_PLANAR(3)
418 
419 #undef PRED_PLANAR
420 
421 static void FUNC(pred_dc)(uint8_t *_src, const uint8_t *_top,
422  const uint8_t *_left,
423  ptrdiff_t stride, int log2_size, int c_idx)
424 {
425  int i, j, x, y;
426  int size = (1 << log2_size);
427  pixel *src = (pixel *)_src;
428  const pixel *top = (const pixel *)_top;
429  const pixel *left = (const pixel *)_left;
430  int dc = size;
431  pixel4 a;
432  for (i = 0; i < size; i++)
433  dc += left[i] + top[i];
434 
435  dc >>= log2_size + 1;
436 
437  a = PIXEL_SPLAT_X4(dc);
438 
439  for (i = 0; i < size; i++)
440  for (j = 0; j < size; j+=4)
441  AV_WN4P(&POS(j, i), a);
442 
443  if (c_idx == 0 && size < 32) {
444  POS(0, 0) = (left[0] + 2 * dc + top[0] + 2) >> 2;
445  for (x = 1; x < size; x++)
446  POS(x, 0) = (top[x] + 3 * dc + 2) >> 2;
447  for (y = 1; y < size; y++)
448  POS(0, y) = (left[y] + 3 * dc + 2) >> 2;
449  }
450 }
451 
452 static av_always_inline void FUNC(pred_angular)(uint8_t *_src,
453  const uint8_t *_top,
454  const uint8_t *_left,
455  ptrdiff_t stride, int c_idx,
456  int mode, int size)
457 {
458  int x, y;
459  pixel *src = (pixel *)_src;
460  const pixel *top = (const pixel *)_top;
461  const pixel *left = (const pixel *)_left;
462 
463  static const int intra_pred_angle[] = {
464  32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9, -13, -17, -21, -26, -32,
465  -26, -21, -17, -13, -9, -5, -2, 0, 2, 5, 9, 13, 17, 21, 26, 32
466  };
467  static const int inv_angle[] = {
468  -4096, -1638, -910, -630, -482, -390, -315, -256, -315, -390, -482,
469  -630, -910, -1638, -4096
470  };
471 
472  int angle = intra_pred_angle[mode - 2];
473  pixel ref_array[3 * MAX_TB_SIZE + 4];
474  pixel *ref_tmp = ref_array + size;
475  const pixel *ref;
476  int last = (size * angle) >> 5;
477 
478  if (mode >= 18) {
479  ref = top - 1;
480  if (angle < 0 && last < -1) {
481  for (x = 0; x <= size; x += 4)
482  AV_WN4P(&ref_tmp[x], AV_RN4P(&top[x - 1]));
483  for (x = last; x <= -1; x++)
484  ref_tmp[x] = left[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)];
485  ref = ref_tmp;
486  }
487 
488  for (y = 0; y < size; y++) {
489  int idx = ((y + 1) * angle) >> 5;
490  int fact = ((y + 1) * angle) & 31;
491  if (fact) {
492  for (x = 0; x < size; x += 4) {
493  POS(x , y) = ((32 - fact) * ref[x + idx + 1] +
494  fact * ref[x + idx + 2] + 16) >> 5;
495  POS(x + 1, y) = ((32 - fact) * ref[x + 1 + idx + 1] +
496  fact * ref[x + 1 + idx + 2] + 16) >> 5;
497  POS(x + 2, y) = ((32 - fact) * ref[x + 2 + idx + 1] +
498  fact * ref[x + 2 + idx + 2] + 16) >> 5;
499  POS(x + 3, y) = ((32 - fact) * ref[x + 3 + idx + 1] +
500  fact * ref[x + 3 + idx + 2] + 16) >> 5;
501  }
502  } else {
503  for (x = 0; x < size; x += 4)
504  AV_WN4P(&POS(x, y), AV_RN4P(&ref[x + idx + 1]));
505  }
506  }
507  if (mode == 26 && c_idx == 0 && size < 32) {
508  for (y = 0; y < size; y++)
509  POS(0, y) = av_clip_pixel(top[0] + ((left[y] - left[-1]) >> 1));
510  }
511  } else {
512  ref = left - 1;
513  if (angle < 0 && last < -1) {
514  for (x = 0; x <= size; x += 4)
515  AV_WN4P(&ref_tmp[x], AV_RN4P(&left[x - 1]));
516  for (x = last; x <= -1; x++)
517  ref_tmp[x] = top[-1 + ((x * inv_angle[mode - 11] + 128) >> 8)];
518  ref = ref_tmp;
519  }
520 
521  for (x = 0; x < size; x++) {
522  int idx = ((x + 1) * angle) >> 5;
523  int fact = ((x + 1) * angle) & 31;
524  if (fact) {
525  for (y = 0; y < size; y++) {
526  POS(x, y) = ((32 - fact) * ref[y + idx + 1] +
527  fact * ref[y + idx + 2] + 16) >> 5;
528  }
529  } else {
530  for (y = 0; y < size; y++)
531  POS(x, y) = ref[y + idx + 1];
532  }
533  }
534  if (mode == 10 && c_idx == 0 && size < 32) {
535  for (x = 0; x < size; x += 4) {
536  POS(x, 0) = av_clip_pixel(left[0] + ((top[x ] - top[-1]) >> 1));
537  POS(x + 1, 0) = av_clip_pixel(left[0] + ((top[x + 1] - top[-1]) >> 1));
538  POS(x + 2, 0) = av_clip_pixel(left[0] + ((top[x + 2] - top[-1]) >> 1));
539  POS(x + 3, 0) = av_clip_pixel(left[0] + ((top[x + 3] - top[-1]) >> 1));
540  }
541  }
542  }
543 }
544 
545 static void FUNC(pred_angular_0)(uint8_t *src, const uint8_t *top,
546  const uint8_t *left,
547  ptrdiff_t stride, int c_idx, int mode)
548 {
549  FUNC(pred_angular)(src, top, left, stride, c_idx, mode, 1 << 2);
550 }
551 
552 static void FUNC(pred_angular_1)(uint8_t *src, const uint8_t *top,
553  const uint8_t *left,
554  ptrdiff_t stride, int c_idx, int mode)
555 {
556  FUNC(pred_angular)(src, top, left, stride, c_idx, mode, 1 << 3);
557 }
558 
559 static void FUNC(pred_angular_2)(uint8_t *src, const uint8_t *top,
560  const uint8_t *left,
561  ptrdiff_t stride, int c_idx, int mode)
562 {
563  FUNC(pred_angular)(src, top, left, stride, c_idx, mode, 1 << 4);
564 }
565 
566 static void FUNC(pred_angular_3)(uint8_t *src, const uint8_t *top,
567  const uint8_t *left,
568  ptrdiff_t stride, int c_idx, int mode)
569 {
570  FUNC(pred_angular)(src, top, left, stride, c_idx, mode, 1 << 5);
571 }
572 
573 #undef EXTEND_LEFT_CIP
574 #undef EXTEND_RIGHT_CIP
575 #undef EXTEND_UP_CIP
576 #undef EXTEND_DOWN_CIP
577 #undef IS_INTRA
578 #undef MVF_PU
579 #undef MVF
580 #undef PU
581 #undef EXTEND
582 #undef MIN_TB_ADDR_ZS
583 #undef POS
HEVCLocalContext
Definition: hevcdec.h:391
pred_angular_3
static void FUNC() pred_angular_3(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int mode)
Definition: pred_template.c:566
AV_RN4P
#define AV_RN4P
Definition: bit_depth_template.c:91
mode
Definition: swscale.c:60
pixdesc.h
INTRA_DC
@ INTRA_DC
Definition: hevcdec.h:126
ref_filter_3tap
static void FUNC() ref_filter_3tap(uint8_t *filtered_left, uint8_t *filtered_top, const uint8_t *left, const uint8_t *top, int size)
Definition: pred_template.c:28
max
#define max(a, b)
Definition: cuda_runtime.h:33
PRED_PLANAR
#define PRED_PLANAR(size)
Definition: pred_template.c:407
PF_INTRA
@ PF_INTRA
Definition: hevcdec.h:118
_src
uint8_t ptrdiff_t const uint8_t * _src
Definition: dsp.h:56
pixel4
#define pixel4
Definition: bit_depth_template.c:84
EXTEND_LEFT_CIP
#define EXTEND_LEFT_CIP(ptr, start, length)
ref_filter_strong
static void FUNC() ref_filter_strong(uint8_t *filtered_top, uint8_t *left, const uint8_t *top)
Definition: pred_template.c:51
MIN_TB_ADDR_ZS
#define MIN_TB_ADDR_ZS(x, y)
s
#define s(width, name)
Definition: cbs_vp9.c:198
intra_pred
static av_always_inline void FUNC() intra_pred(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int log2_size, int c_idx)
Definition: pred_template.c:72
EXTEND_DOWN_CIP
#define EXTEND_DOWN_CIP(ptr, start, length)
pred_angular_2
static void FUNC() pred_angular_2(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int mode)
Definition: pred_template.c:559
PIXEL_SPLAT_X4
#define PIXEL_SPLAT_X4(x)
Definition: bit_depth_template.c:96
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
pred_angular
static av_always_inline void FUNC() pred_angular(uint8_t *_src, const uint8_t *_top, const uint8_t *_left, ptrdiff_t stride, int c_idx, int mode, int size)
Definition: pred_template.c:452
POS
#define POS(x, y)
Definition: pred_template.c:70
pixel
uint8_t pixel
Definition: tiny_ssim.c:41
EXTEND_UP_CIP
#define EXTEND_UP_CIP(ptr, start, length)
bit_depth_template.c
EXTEND_RIGHT_CIP
#define EXTEND_RIGHT_CIP(ptr, start, length)
IS_INTRA
#define IS_INTRA(x, y)
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
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
PU
#define PU(x)
INTRA_PLANAR
@ INTRA_PLANAR
Definition: hevcdec.h:125
pred_angular_0
static void FUNC() pred_angular_0(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int mode)
Definition: pred_template.c:545
size
int size
Definition: twinvq_data.h:10344
MVF
#define MVF(x, y)
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
fact
static double fact(double i)
Definition: af_aiir.c:935
av_zero_extend
#define av_zero_extend
Definition: common.h:151
pred_dc
static void FUNC() pred_dc(uint8_t *_src, const uint8_t *_top, const uint8_t *_left, ptrdiff_t stride, int log2_size, int c_idx)
Definition: pred_template.c:421
av_always_inline
#define av_always_inline
Definition: attributes.h:76
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
pred.h
INTRA_PRED
#define INTRA_PRED(size)
Definition: pred_template.c:378
IntraPredMode
IntraPredMode
Definition: hevcdec.h:124
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
av_clip_pixel
#define av_clip_pixel(a)
Definition: bit_depth_template.c:98
left
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 left
Definition: snow.txt:386
U
#define U(x)
Definition: vpx_arith.h:37
pred_angular_1
static void FUNC() pred_angular_1(uint8_t *src, const uint8_t *top, const uint8_t *left, ptrdiff_t stride, int c_idx, int mode)
Definition: pred_template.c:552
FUNC
#define FUNC(a)
Definition: bit_depth_template.c:104
BIT_DEPTH
#define BIT_DEPTH
Definition: dsp_init.c:129
mode
mode
Definition: ebur128.h:83
HEVCContext
Definition: hevcdec.h:490
AV_WN4P
#define AV_WN4P
Definition: bit_depth_template.c:94
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:36
EXTEND
#define EXTEND(ptr, val, len)
HEVCSPS
Definition: ps.h:255
HEVCPPS
Definition: ps.h:374
pred_planar
static av_always_inline void FUNC() pred_planar(uint8_t *_src, const uint8_t *_top, const uint8_t *_left, ptrdiff_t stride, int trafo_size)
Definition: pred_template.c:392
MAX_TB_SIZE
#define MAX_TB_SIZE
Definition: hevcdec.h:47
stride
#define stride
Definition: h264pred_template.c:536
src
#define src
Definition: vp8dsp.c:248