FFmpeg  4.4.7
vp9.c
Go to the documentation of this file.
1 /*
2  * VP9 compatible video decoder
3  *
4  * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
5  * Copyright (C) 2013 Clément Bœsch <u pkh me>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "avcodec.h"
25 #include "get_bits.h"
26 #include "hwconfig.h"
27 #include "internal.h"
28 #include "profiles.h"
29 #include "thread.h"
30 #include "videodsp.h"
31 #include "vp56.h"
32 #include "vp9.h"
33 #include "vp9data.h"
34 #include "vp9dec.h"
35 #include "libavutil/avassert.h"
36 #include "libavutil/pixdesc.h"
38 
39 #define VP9_SYNCCODE 0x498342
40 
41 #if HAVE_THREADS
42 static void vp9_free_entries(AVCodecContext *avctx) {
43  VP9Context *s = avctx->priv_data;
44 
45  if (avctx->active_thread_type & FF_THREAD_SLICE) {
46  pthread_mutex_destroy(&s->progress_mutex);
47  pthread_cond_destroy(&s->progress_cond);
48  av_freep(&s->entries);
49  }
50 }
51 
52 static int vp9_alloc_entries(AVCodecContext *avctx, int n) {
53  VP9Context *s = avctx->priv_data;
54  int i;
55 
56  if (avctx->active_thread_type & FF_THREAD_SLICE) {
57  if (s->entries)
58  av_freep(&s->entries);
59 
60  s->entries = av_malloc_array(n, sizeof(atomic_int));
61 
62  if (!s->entries) {
63  av_freep(&s->entries);
64  return AVERROR(ENOMEM);
65  }
66 
67  for (i = 0; i < n; i++)
68  atomic_init(&s->entries[i], 0);
69 
70  pthread_mutex_init(&s->progress_mutex, NULL);
71  pthread_cond_init(&s->progress_cond, NULL);
72  }
73  return 0;
74 }
75 
76 static void vp9_report_tile_progress(VP9Context *s, int field, int n) {
77  pthread_mutex_lock(&s->progress_mutex);
78  atomic_fetch_add_explicit(&s->entries[field], n, memory_order_release);
79  pthread_cond_signal(&s->progress_cond);
80  pthread_mutex_unlock(&s->progress_mutex);
81 }
82 
83 static void vp9_await_tile_progress(VP9Context *s, int field, int n) {
84  if (atomic_load_explicit(&s->entries[field], memory_order_acquire) >= n)
85  return;
86 
87  pthread_mutex_lock(&s->progress_mutex);
88  while (atomic_load_explicit(&s->entries[field], memory_order_relaxed) != n)
89  pthread_cond_wait(&s->progress_cond, &s->progress_mutex);
90  pthread_mutex_unlock(&s->progress_mutex);
91 }
92 #else
93 static void vp9_free_entries(AVCodecContext *avctx) {}
94 static int vp9_alloc_entries(AVCodecContext *avctx, int n) { return 0; }
95 #endif
96 
98 {
99  av_freep(&td->b_base);
100  av_freep(&td->block_base);
101  av_freep(&td->block_structure);
102 }
103 
105 {
106  ff_thread_release_buffer(avctx, &f->tf);
107  av_buffer_unref(&f->extradata);
108  av_buffer_unref(&f->hwaccel_priv_buf);
109  f->segmentation_map = NULL;
110  f->hwaccel_picture_private = NULL;
111 }
112 
114 {
115  VP9Context *s = avctx->priv_data;
116  int ret, sz;
117 
118  ret = ff_thread_get_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF);
119  if (ret < 0)
120  return ret;
121 
122  sz = 64 * s->sb_cols * s->sb_rows;
123  if (sz != s->frame_extradata_pool_size) {
124  av_buffer_pool_uninit(&s->frame_extradata_pool);
125  s->frame_extradata_pool = av_buffer_pool_init(sz * (1 + sizeof(VP9mvrefPair)), NULL);
126  if (!s->frame_extradata_pool) {
127  s->frame_extradata_pool_size = 0;
128  goto fail;
129  }
130  s->frame_extradata_pool_size = sz;
131  }
132  f->extradata = av_buffer_pool_get(s->frame_extradata_pool);
133  if (!f->extradata) {
134  goto fail;
135  }
136  memset(f->extradata->data, 0, f->extradata->size);
137 
138  f->segmentation_map = f->extradata->data;
139  f->mv = (VP9mvrefPair *) (f->extradata->data + sz);
140 
141  if (avctx->hwaccel) {
142  const AVHWAccel *hwaccel = avctx->hwaccel;
143  av_assert0(!f->hwaccel_picture_private);
144  if (hwaccel->frame_priv_data_size) {
145  f->hwaccel_priv_buf = av_buffer_allocz(hwaccel->frame_priv_data_size);
146  if (!f->hwaccel_priv_buf)
147  goto fail;
148  f->hwaccel_picture_private = f->hwaccel_priv_buf->data;
149  }
150  }
151 
152  return 0;
153 
154 fail:
155  vp9_frame_unref(avctx, f);
156  return AVERROR(ENOMEM);
157 }
158 
160 {
161  int ret;
162 
163  ret = ff_thread_ref_frame(&dst->tf, &src->tf);
164  if (ret < 0)
165  return ret;
166 
167  dst->extradata = av_buffer_ref(src->extradata);
168  if (!dst->extradata)
169  goto fail;
170 
171  dst->segmentation_map = src->segmentation_map;
172  dst->mv = src->mv;
173  dst->uses_2pass = src->uses_2pass;
174 
175  if (src->hwaccel_picture_private) {
176  dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
177  if (!dst->hwaccel_priv_buf)
178  goto fail;
180  }
181 
182  return 0;
183 
184 fail:
185  vp9_frame_unref(avctx, dst);
186  return AVERROR(ENOMEM);
187 }
188 
189 static int update_size(AVCodecContext *avctx, int w, int h)
190 {
191 #define HWACCEL_MAX (CONFIG_VP9_DXVA2_HWACCEL + \
192  CONFIG_VP9_D3D11VA_HWACCEL * 2 + \
193  CONFIG_VP9_NVDEC_HWACCEL + \
194  CONFIG_VP9_VAAPI_HWACCEL + \
195  CONFIG_VP9_VDPAU_HWACCEL)
196  enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts;
197  VP9Context *s = avctx->priv_data;
198  uint8_t *p;
199  int bytesperpixel = s->bytesperpixel, ret, cols, rows;
200  int lflvl_len, i;
201  int changed = 0;
202 
203  av_assert0(w > 0 && h > 0);
204 
205  if (!(s->pix_fmt == s->gf_fmt && w == s->w && h == s->h)) {
206  changed = 1;
207  if ((ret = ff_set_dimensions(avctx, w, h)) < 0)
208  return ret;
209 
210  switch (s->pix_fmt) {
211  case AV_PIX_FMT_YUV420P:
213 #if CONFIG_VP9_DXVA2_HWACCEL
214  *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
215 #endif
216 #if CONFIG_VP9_D3D11VA_HWACCEL
217  *fmtp++ = AV_PIX_FMT_D3D11VA_VLD;
218  *fmtp++ = AV_PIX_FMT_D3D11;
219 #endif
220 #if CONFIG_VP9_NVDEC_HWACCEL
221  *fmtp++ = AV_PIX_FMT_CUDA;
222 #endif
223 #if CONFIG_VP9_VAAPI_HWACCEL
224  *fmtp++ = AV_PIX_FMT_VAAPI;
225 #endif
226 #if CONFIG_VP9_VDPAU_HWACCEL
227  *fmtp++ = AV_PIX_FMT_VDPAU;
228 #endif
229  break;
231 #if CONFIG_VP9_NVDEC_HWACCEL
232  *fmtp++ = AV_PIX_FMT_CUDA;
233 #endif
234 #if CONFIG_VP9_VAAPI_HWACCEL
235  *fmtp++ = AV_PIX_FMT_VAAPI;
236 #endif
237 #if CONFIG_VP9_VDPAU_HWACCEL
238  *fmtp++ = AV_PIX_FMT_VDPAU;
239 #endif
240  break;
241  }
242 
243  *fmtp++ = s->pix_fmt;
244  *fmtp = AV_PIX_FMT_NONE;
245 
246  ret = ff_thread_get_format(avctx, pix_fmts);
247  if (ret < 0) {
248  ff_set_dimensions(avctx, s->w, s->h);
249  return ret;
250  }
251 
252  avctx->pix_fmt = ret;
253  s->gf_fmt = s->pix_fmt;
254  s->w = w;
255  s->h = h;
256  }
257 
258  cols = (w + 7) >> 3;
259  rows = (h + 7) >> 3;
260 
261  if (s->intra_pred_data[0] && cols == s->cols && rows == s->rows && s->pix_fmt == s->last_fmt)
262  return changed;
263 
264  s->last_fmt = s->pix_fmt;
265  s->sb_cols = (w + 63) >> 6;
266  s->sb_rows = (h + 63) >> 6;
267  s->cols = (w + 7) >> 3;
268  s->rows = (h + 7) >> 3;
269  lflvl_len = avctx->active_thread_type == FF_THREAD_SLICE ? s->sb_rows : 1;
270 
271 #define assign(var, type, n) var = (type) p; p += s->sb_cols * (n) * sizeof(*var)
272  av_freep(&s->intra_pred_data[0]);
273  // FIXME we slightly over-allocate here for subsampled chroma, but a little
274  // bit of padding shouldn't affect performance...
275  p = av_malloc(s->sb_cols * (128 + 192 * bytesperpixel +
276  lflvl_len * sizeof(*s->lflvl) + 16 * sizeof(*s->above_mv_ctx)));
277  if (!p)
278  return AVERROR(ENOMEM);
279  assign(s->intra_pred_data[0], uint8_t *, 64 * bytesperpixel);
280  assign(s->intra_pred_data[1], uint8_t *, 64 * bytesperpixel);
281  assign(s->intra_pred_data[2], uint8_t *, 64 * bytesperpixel);
282  assign(s->above_y_nnz_ctx, uint8_t *, 16);
283  assign(s->above_mode_ctx, uint8_t *, 16);
284  assign(s->above_mv_ctx, VP56mv(*)[2], 16);
285  assign(s->above_uv_nnz_ctx[0], uint8_t *, 16);
286  assign(s->above_uv_nnz_ctx[1], uint8_t *, 16);
287  assign(s->above_partition_ctx, uint8_t *, 8);
288  assign(s->above_skip_ctx, uint8_t *, 8);
289  assign(s->above_txfm_ctx, uint8_t *, 8);
290  assign(s->above_segpred_ctx, uint8_t *, 8);
291  assign(s->above_intra_ctx, uint8_t *, 8);
292  assign(s->above_comp_ctx, uint8_t *, 8);
293  assign(s->above_ref_ctx, uint8_t *, 8);
294  assign(s->above_filter_ctx, uint8_t *, 8);
295  assign(s->lflvl, VP9Filter *, lflvl_len);
296 #undef assign
297 
298  if (s->td) {
299  for (i = 0; i < s->active_tile_cols; i++)
300  vp9_tile_data_free(&s->td[i]);
301  }
302 
303  if (s->s.h.bpp != s->last_bpp) {
304  ff_vp9dsp_init(&s->dsp, s->s.h.bpp, avctx->flags & AV_CODEC_FLAG_BITEXACT);
305  ff_videodsp_init(&s->vdsp, s->s.h.bpp);
306  s->last_bpp = s->s.h.bpp;
307  changed = 1;
308  }
309 
310  return changed;
311 }
312 
314 {
315  int i;
316  VP9Context *s = avctx->priv_data;
317  int chroma_blocks, chroma_eobs, bytesperpixel = s->bytesperpixel;
318  VP9TileData *td = &s->td[0];
319 
320  if (td->b_base && td->block_base && s->block_alloc_using_2pass == s->s.frames[CUR_FRAME].uses_2pass)
321  return 0;
322 
324  chroma_blocks = 64 * 64 >> (s->ss_h + s->ss_v);
325  chroma_eobs = 16 * 16 >> (s->ss_h + s->ss_v);
326  if (s->s.frames[CUR_FRAME].uses_2pass) {
327  int sbs = s->sb_cols * s->sb_rows;
328 
329  td->b_base = av_malloc_array(s->cols * s->rows, sizeof(VP9Block));
330  td->block_base = av_mallocz(((64 * 64 + 2 * chroma_blocks) * bytesperpixel * sizeof(int16_t) +
331  16 * 16 + 2 * chroma_eobs) * sbs);
332  if (!td->b_base || !td->block_base)
333  return AVERROR(ENOMEM);
334  td->uvblock_base[0] = td->block_base + sbs * 64 * 64 * bytesperpixel;
335  td->uvblock_base[1] = td->uvblock_base[0] + sbs * chroma_blocks * bytesperpixel;
336  td->eob_base = (uint8_t *) (td->uvblock_base[1] + sbs * chroma_blocks * bytesperpixel);
337  td->uveob_base[0] = td->eob_base + 16 * 16 * sbs;
338  td->uveob_base[1] = td->uveob_base[0] + chroma_eobs * sbs;
339 
341  td->block_structure = av_malloc_array(s->cols * s->rows, sizeof(*td->block_structure));
342  if (!td->block_structure)
343  return AVERROR(ENOMEM);
344  }
345  } else {
346  for (i = 1; i < s->active_tile_cols; i++)
347  vp9_tile_data_free(&s->td[i]);
348 
349  for (i = 0; i < s->active_tile_cols; i++) {
350  s->td[i].b_base = av_malloc(sizeof(VP9Block));
351  s->td[i].block_base = av_mallocz((64 * 64 + 2 * chroma_blocks) * bytesperpixel * sizeof(int16_t) +
352  16 * 16 + 2 * chroma_eobs);
353  if (!s->td[i].b_base || !s->td[i].block_base)
354  return AVERROR(ENOMEM);
355  s->td[i].uvblock_base[0] = s->td[i].block_base + 64 * 64 * bytesperpixel;
356  s->td[i].uvblock_base[1] = s->td[i].uvblock_base[0] + chroma_blocks * bytesperpixel;
357  s->td[i].eob_base = (uint8_t *) (s->td[i].uvblock_base[1] + chroma_blocks * bytesperpixel);
358  s->td[i].uveob_base[0] = s->td[i].eob_base + 16 * 16;
359  s->td[i].uveob_base[1] = s->td[i].uveob_base[0] + chroma_eobs;
360 
362  s->td[i].block_structure = av_malloc_array(s->cols * s->rows, sizeof(*td->block_structure));
363  if (!s->td[i].block_structure)
364  return AVERROR(ENOMEM);
365  }
366  }
367  }
368  s->block_alloc_using_2pass = s->s.frames[CUR_FRAME].uses_2pass;
369 
370  return 0;
371 }
372 
373 // The sign bit is at the end, not the start, of a bit sequence
375 {
376  int v = get_bits(gb, n);
377  return get_bits1(gb) ? -v : v;
378 }
379 
380 static av_always_inline int inv_recenter_nonneg(int v, int m)
381 {
382  if (v > 2 * m)
383  return v;
384  if (v & 1)
385  return m - ((v + 1) >> 1);
386  return m + (v >> 1);
387 }
388 
389 // differential forward probability updates
390 static int update_prob(VP56RangeCoder *c, int p)
391 {
392  static const uint8_t inv_map_table[255] = {
393  7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176,
394  189, 202, 215, 228, 241, 254, 1, 2, 3, 4, 5, 6, 8, 9,
395  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24,
396  25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39,
397  40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54,
398  55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
399  70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
400  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 100,
401  101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115,
402  116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130,
403  131, 132, 133, 134, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145,
404  146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
405  161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
406  177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 190, 191,
407  192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, 206,
408  207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221,
409  222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236,
410  237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
411  252, 253, 253,
412  };
413  int d;
414 
415  /* This code is trying to do a differential probability update. For a
416  * current probability A in the range [1, 255], the difference to a new
417  * probability of any value can be expressed differentially as 1-A, 255-A
418  * where some part of this (absolute range) exists both in positive as
419  * well as the negative part, whereas another part only exists in one
420  * half. We're trying to code this shared part differentially, i.e.
421  * times two where the value of the lowest bit specifies the sign, and
422  * the single part is then coded on top of this. This absolute difference
423  * then again has a value of [0, 254], but a bigger value in this range
424  * indicates that we're further away from the original value A, so we
425  * can code this as a VLC code, since higher values are increasingly
426  * unlikely. The first 20 values in inv_map_table[] allow 'cheap, rough'
427  * updates vs. the 'fine, exact' updates further down the range, which
428  * adds one extra dimension to this differential update model. */
429 
430  if (!vp8_rac_get(c)) {
431  d = vp8_rac_get_uint(c, 4) + 0;
432  } else if (!vp8_rac_get(c)) {
433  d = vp8_rac_get_uint(c, 4) + 16;
434  } else if (!vp8_rac_get(c)) {
435  d = vp8_rac_get_uint(c, 5) + 32;
436  } else {
437  d = vp8_rac_get_uint(c, 7);
438  if (d >= 65)
439  d = (d << 1) - 65 + vp8_rac_get(c);
440  d += 64;
441  av_assert2(d < FF_ARRAY_ELEMS(inv_map_table));
442  }
443 
444  return p <= 128 ? 1 + inv_recenter_nonneg(inv_map_table[d], p - 1) :
445  255 - inv_recenter_nonneg(inv_map_table[d], 255 - p);
446 }
447 
449 {
450  static const enum AVColorSpace colorspaces[8] = {
453  };
454  VP9Context *s = avctx->priv_data;
455  int bits = avctx->profile <= 1 ? 0 : 1 + get_bits1(&s->gb); // 0:8, 1:10, 2:12
456 
457  s->bpp_index = bits;
458  s->s.h.bpp = 8 + bits * 2;
459  s->bytesperpixel = (7 + s->s.h.bpp) >> 3;
460  avctx->colorspace = colorspaces[get_bits(&s->gb, 3)];
461  if (avctx->colorspace == AVCOL_SPC_RGB) { // RGB = profile 1
462  static const enum AVPixelFormat pix_fmt_rgb[3] = {
464  };
465  s->ss_h = s->ss_v = 0;
466  avctx->color_range = AVCOL_RANGE_JPEG;
467  s->pix_fmt = pix_fmt_rgb[bits];
468  if (avctx->profile & 1) {
469  if (get_bits1(&s->gb)) {
470  av_log(avctx, AV_LOG_ERROR, "Reserved bit set in RGB\n");
471  return AVERROR_INVALIDDATA;
472  }
473  } else {
474  av_log(avctx, AV_LOG_ERROR, "RGB not supported in profile %d\n",
475  avctx->profile);
476  return AVERROR_INVALIDDATA;
477  }
478  } else {
479  static const enum AVPixelFormat pix_fmt_for_ss[3][2 /* v */][2 /* h */] = {
486  };
488  if (avctx->profile & 1) {
489  s->ss_h = get_bits1(&s->gb);
490  s->ss_v = get_bits1(&s->gb);
491  s->pix_fmt = pix_fmt_for_ss[bits][s->ss_v][s->ss_h];
492  if (s->pix_fmt == AV_PIX_FMT_YUV420P) {
493  av_log(avctx, AV_LOG_ERROR, "YUV 4:2:0 not supported in profile %d\n",
494  avctx->profile);
495  return AVERROR_INVALIDDATA;
496  } else if (get_bits1(&s->gb)) {
497  av_log(avctx, AV_LOG_ERROR, "Profile %d color details reserved bit set\n",
498  avctx->profile);
499  return AVERROR_INVALIDDATA;
500  }
501  } else {
502  s->ss_h = s->ss_v = 1;
503  s->pix_fmt = pix_fmt_for_ss[bits][1][1];
504  }
505  }
506 
507  return 0;
508 }
509 
511  const uint8_t *data, int size, int *ref)
512 {
513  VP9Context *s = avctx->priv_data;
514  int c, i, j, k, l, m, n, w, h, max, size2, ret, sharp;
515  int last_invisible;
516  const uint8_t *data2;
517  int changed;
518 
519  /* general header */
520  if ((ret = init_get_bits8(&s->gb, data, size)) < 0) {
521  av_log(avctx, AV_LOG_ERROR, "Failed to initialize bitstream reader\n");
522  return ret;
523  }
524  if (get_bits(&s->gb, 2) != 0x2) { // frame marker
525  av_log(avctx, AV_LOG_ERROR, "Invalid frame marker\n");
526  return AVERROR_INVALIDDATA;
527  }
528  avctx->profile = get_bits1(&s->gb);
529  avctx->profile |= get_bits1(&s->gb) << 1;
530  if (avctx->profile == 3) avctx->profile += get_bits1(&s->gb);
531  if (avctx->profile > 3) {
532  av_log(avctx, AV_LOG_ERROR, "Profile %d is not yet supported\n", avctx->profile);
533  return AVERROR_INVALIDDATA;
534  }
535  s->s.h.profile = avctx->profile;
536  if (get_bits1(&s->gb)) {
537  *ref = get_bits(&s->gb, 3);
538  return 0;
539  }
540 
541  s->last_keyframe = s->s.h.keyframe;
542  s->s.h.keyframe = !get_bits1(&s->gb);
543 
544  last_invisible = s->s.h.invisible;
545  s->s.h.invisible = !get_bits1(&s->gb);
546  s->s.h.errorres = get_bits1(&s->gb);
547  s->s.h.use_last_frame_mvs = !s->s.h.errorres && !last_invisible;
548 
549  if (s->s.h.keyframe) {
550  if (get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
551  av_log(avctx, AV_LOG_ERROR, "Invalid sync code\n");
552  return AVERROR_INVALIDDATA;
553  }
554  if ((ret = read_colorspace_details(avctx)) < 0)
555  return ret;
556  // for profile 1, here follows the subsampling bits
557  s->s.h.refreshrefmask = 0xff;
558  w = get_bits(&s->gb, 16) + 1;
559  h = get_bits(&s->gb, 16) + 1;
560  if (get_bits1(&s->gb)) // display size
561  skip_bits(&s->gb, 32);
562  } else {
563  s->s.h.intraonly = s->s.h.invisible ? get_bits1(&s->gb) : 0;
564  s->s.h.resetctx = s->s.h.errorres ? 0 : get_bits(&s->gb, 2);
565  if (s->s.h.intraonly) {
566  if (get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
567  av_log(avctx, AV_LOG_ERROR, "Invalid sync code\n");
568  return AVERROR_INVALIDDATA;
569  }
570  if (avctx->profile >= 1) {
571  if ((ret = read_colorspace_details(avctx)) < 0)
572  return ret;
573  } else {
574  s->ss_h = s->ss_v = 1;
575  s->s.h.bpp = 8;
576  s->bpp_index = 0;
577  s->bytesperpixel = 1;
578  s->pix_fmt = AV_PIX_FMT_YUV420P;
579  avctx->colorspace = AVCOL_SPC_BT470BG;
580  avctx->color_range = AVCOL_RANGE_MPEG;
581  }
582  s->s.h.refreshrefmask = get_bits(&s->gb, 8);
583  w = get_bits(&s->gb, 16) + 1;
584  h = get_bits(&s->gb, 16) + 1;
585  if (get_bits1(&s->gb)) // display size
586  skip_bits(&s->gb, 32);
587  } else {
588  s->s.h.refreshrefmask = get_bits(&s->gb, 8);
589  s->s.h.refidx[0] = get_bits(&s->gb, 3);
590  s->s.h.signbias[0] = get_bits1(&s->gb) && !s->s.h.errorres;
591  s->s.h.refidx[1] = get_bits(&s->gb, 3);
592  s->s.h.signbias[1] = get_bits1(&s->gb) && !s->s.h.errorres;
593  s->s.h.refidx[2] = get_bits(&s->gb, 3);
594  s->s.h.signbias[2] = get_bits1(&s->gb) && !s->s.h.errorres;
595  if (!s->s.refs[s->s.h.refidx[0]].f->buf[0] ||
596  !s->s.refs[s->s.h.refidx[1]].f->buf[0] ||
597  !s->s.refs[s->s.h.refidx[2]].f->buf[0]) {
598  av_log(avctx, AV_LOG_ERROR, "Not all references are available\n");
599  return AVERROR_INVALIDDATA;
600  }
601  if (get_bits1(&s->gb)) {
602  w = s->s.refs[s->s.h.refidx[0]].f->width;
603  h = s->s.refs[s->s.h.refidx[0]].f->height;
604  } else if (get_bits1(&s->gb)) {
605  w = s->s.refs[s->s.h.refidx[1]].f->width;
606  h = s->s.refs[s->s.h.refidx[1]].f->height;
607  } else if (get_bits1(&s->gb)) {
608  w = s->s.refs[s->s.h.refidx[2]].f->width;
609  h = s->s.refs[s->s.h.refidx[2]].f->height;
610  } else {
611  w = get_bits(&s->gb, 16) + 1;
612  h = get_bits(&s->gb, 16) + 1;
613  }
614  // Note that in this code, "CUR_FRAME" is actually before we
615  // have formally allocated a frame, and thus actually represents
616  // the _last_ frame
617  s->s.h.use_last_frame_mvs &= s->s.frames[CUR_FRAME].tf.f->width == w &&
618  s->s.frames[CUR_FRAME].tf.f->height == h;
619  if (get_bits1(&s->gb)) // display size
620  skip_bits(&s->gb, 32);
621  s->s.h.highprecisionmvs = get_bits1(&s->gb);
622  s->s.h.filtermode = get_bits1(&s->gb) ? FILTER_SWITCHABLE :
623  get_bits(&s->gb, 2);
624  s->s.h.allowcompinter = s->s.h.signbias[0] != s->s.h.signbias[1] ||
625  s->s.h.signbias[0] != s->s.h.signbias[2];
626  if (s->s.h.allowcompinter) {
627  if (s->s.h.signbias[0] == s->s.h.signbias[1]) {
628  s->s.h.fixcompref = 2;
629  s->s.h.varcompref[0] = 0;
630  s->s.h.varcompref[1] = 1;
631  } else if (s->s.h.signbias[0] == s->s.h.signbias[2]) {
632  s->s.h.fixcompref = 1;
633  s->s.h.varcompref[0] = 0;
634  s->s.h.varcompref[1] = 2;
635  } else {
636  s->s.h.fixcompref = 0;
637  s->s.h.varcompref[0] = 1;
638  s->s.h.varcompref[1] = 2;
639  }
640  }
641  }
642  }
643  s->s.h.refreshctx = s->s.h.errorres ? 0 : get_bits1(&s->gb);
644  s->s.h.parallelmode = s->s.h.errorres ? 1 : get_bits1(&s->gb);
645  s->s.h.framectxid = c = get_bits(&s->gb, 2);
646  if (s->s.h.keyframe || s->s.h.intraonly)
647  s->s.h.framectxid = 0; // BUG: libvpx ignores this field in keyframes
648 
649  /* loopfilter header data */
650  if (s->s.h.keyframe || s->s.h.errorres || s->s.h.intraonly) {
651  // reset loopfilter defaults
652  s->s.h.lf_delta.ref[0] = 1;
653  s->s.h.lf_delta.ref[1] = 0;
654  s->s.h.lf_delta.ref[2] = -1;
655  s->s.h.lf_delta.ref[3] = -1;
656  s->s.h.lf_delta.mode[0] = 0;
657  s->s.h.lf_delta.mode[1] = 0;
658  memset(s->s.h.segmentation.feat, 0, sizeof(s->s.h.segmentation.feat));
659  }
660  s->s.h.filter.level = get_bits(&s->gb, 6);
661  sharp = get_bits(&s->gb, 3);
662  // if sharpness changed, reinit lim/mblim LUTs. if it didn't change, keep
663  // the old cache values since they are still valid
664  if (s->s.h.filter.sharpness != sharp) {
665  for (i = 1; i <= 63; i++) {
666  int limit = i;
667 
668  if (sharp > 0) {
669  limit >>= (sharp + 3) >> 2;
670  limit = FFMIN(limit, 9 - sharp);
671  }
672  limit = FFMAX(limit, 1);
673 
674  s->filter_lut.lim_lut[i] = limit;
675  s->filter_lut.mblim_lut[i] = 2 * (i + 2) + limit;
676  }
677  }
678  s->s.h.filter.sharpness = sharp;
679  if ((s->s.h.lf_delta.enabled = get_bits1(&s->gb))) {
680  if ((s->s.h.lf_delta.updated = get_bits1(&s->gb))) {
681  for (i = 0; i < 4; i++)
682  if (get_bits1(&s->gb))
683  s->s.h.lf_delta.ref[i] = get_sbits_inv(&s->gb, 6);
684  for (i = 0; i < 2; i++)
685  if (get_bits1(&s->gb))
686  s->s.h.lf_delta.mode[i] = get_sbits_inv(&s->gb, 6);
687  }
688  }
689 
690  /* quantization header data */
691  s->s.h.yac_qi = get_bits(&s->gb, 8);
692  s->s.h.ydc_qdelta = get_bits1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
693  s->s.h.uvdc_qdelta = get_bits1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
694  s->s.h.uvac_qdelta = get_bits1(&s->gb) ? get_sbits_inv(&s->gb, 4) : 0;
695  s->s.h.lossless = s->s.h.yac_qi == 0 && s->s.h.ydc_qdelta == 0 &&
696  s->s.h.uvdc_qdelta == 0 && s->s.h.uvac_qdelta == 0;
697  if (s->s.h.lossless)
699 
700  /* segmentation header info */
701  if ((s->s.h.segmentation.enabled = get_bits1(&s->gb))) {
702  if ((s->s.h.segmentation.update_map = get_bits1(&s->gb))) {
703  for (i = 0; i < 7; i++)
704  s->s.h.segmentation.prob[i] = get_bits1(&s->gb) ?
705  get_bits(&s->gb, 8) : 255;
706  if ((s->s.h.segmentation.temporal = get_bits1(&s->gb)))
707  for (i = 0; i < 3; i++)
708  s->s.h.segmentation.pred_prob[i] = get_bits1(&s->gb) ?
709  get_bits(&s->gb, 8) : 255;
710  }
711 
712  if (get_bits1(&s->gb)) {
713  s->s.h.segmentation.absolute_vals = get_bits1(&s->gb);
714  for (i = 0; i < 8; i++) {
715  if ((s->s.h.segmentation.feat[i].q_enabled = get_bits1(&s->gb)))
716  s->s.h.segmentation.feat[i].q_val = get_sbits_inv(&s->gb, 8);
717  if ((s->s.h.segmentation.feat[i].lf_enabled = get_bits1(&s->gb)))
718  s->s.h.segmentation.feat[i].lf_val = get_sbits_inv(&s->gb, 6);
719  if ((s->s.h.segmentation.feat[i].ref_enabled = get_bits1(&s->gb)))
720  s->s.h.segmentation.feat[i].ref_val = get_bits(&s->gb, 2);
721  s->s.h.segmentation.feat[i].skip_enabled = get_bits1(&s->gb);
722  }
723  }
724  } else {
725  // Reset fields under segmentation switch if segmentation is disabled.
726  // This is necessary because some hwaccels don't ignore these fields
727  // if segmentation is disabled.
728  s->s.h.segmentation.temporal = 0;
729  s->s.h.segmentation.update_map = 0;
730  }
731 
732  // set qmul[] based on Y/UV, AC/DC and segmentation Q idx deltas
733  for (i = 0; i < (s->s.h.segmentation.enabled ? 8 : 1); i++) {
734  int qyac, qydc, quvac, quvdc, lflvl, sh;
735 
736  if (s->s.h.segmentation.enabled && s->s.h.segmentation.feat[i].q_enabled) {
737  if (s->s.h.segmentation.absolute_vals)
738  qyac = av_clip_uintp2(s->s.h.segmentation.feat[i].q_val, 8);
739  else
740  qyac = av_clip_uintp2(s->s.h.yac_qi + s->s.h.segmentation.feat[i].q_val, 8);
741  } else {
742  qyac = s->s.h.yac_qi;
743  }
744  qydc = av_clip_uintp2(qyac + s->s.h.ydc_qdelta, 8);
745  quvdc = av_clip_uintp2(qyac + s->s.h.uvdc_qdelta, 8);
746  quvac = av_clip_uintp2(qyac + s->s.h.uvac_qdelta, 8);
747  qyac = av_clip_uintp2(qyac, 8);
748 
749  s->s.h.segmentation.feat[i].qmul[0][0] = ff_vp9_dc_qlookup[s->bpp_index][qydc];
750  s->s.h.segmentation.feat[i].qmul[0][1] = ff_vp9_ac_qlookup[s->bpp_index][qyac];
751  s->s.h.segmentation.feat[i].qmul[1][0] = ff_vp9_dc_qlookup[s->bpp_index][quvdc];
752  s->s.h.segmentation.feat[i].qmul[1][1] = ff_vp9_ac_qlookup[s->bpp_index][quvac];
753 
754  sh = s->s.h.filter.level >= 32;
755  if (s->s.h.segmentation.enabled && s->s.h.segmentation.feat[i].lf_enabled) {
756  if (s->s.h.segmentation.absolute_vals)
757  lflvl = av_clip_uintp2(s->s.h.segmentation.feat[i].lf_val, 6);
758  else
759  lflvl = av_clip_uintp2(s->s.h.filter.level + s->s.h.segmentation.feat[i].lf_val, 6);
760  } else {
761  lflvl = s->s.h.filter.level;
762  }
763  if (s->s.h.lf_delta.enabled) {
764  s->s.h.segmentation.feat[i].lflvl[0][0] =
765  s->s.h.segmentation.feat[i].lflvl[0][1] =
766  av_clip_uintp2(lflvl + (s->s.h.lf_delta.ref[0] * (1 << sh)), 6);
767  for (j = 1; j < 4; j++) {
768  s->s.h.segmentation.feat[i].lflvl[j][0] =
769  av_clip_uintp2(lflvl + ((s->s.h.lf_delta.ref[j] +
770  s->s.h.lf_delta.mode[0]) * (1 << sh)), 6);
771  s->s.h.segmentation.feat[i].lflvl[j][1] =
772  av_clip_uintp2(lflvl + ((s->s.h.lf_delta.ref[j] +
773  s->s.h.lf_delta.mode[1]) * (1 << sh)), 6);
774  }
775  } else {
776  memset(s->s.h.segmentation.feat[i].lflvl, lflvl,
777  sizeof(s->s.h.segmentation.feat[i].lflvl));
778  }
779  }
780 
781  /* tiling info */
782  if ((changed = update_size(avctx, w, h)) < 0) {
783  av_log(avctx, AV_LOG_ERROR, "Failed to initialize decoder for %dx%d @ %d\n",
784  w, h, s->pix_fmt);
785  return changed;
786  }
787  for (s->s.h.tiling.log2_tile_cols = 0;
788  s->sb_cols > (64 << s->s.h.tiling.log2_tile_cols);
789  s->s.h.tiling.log2_tile_cols++) ;
790  for (max = 0; (s->sb_cols >> max) >= 4; max++) ;
791  max = FFMAX(0, max - 1);
792  while (max > s->s.h.tiling.log2_tile_cols) {
793  if (get_bits1(&s->gb))
794  s->s.h.tiling.log2_tile_cols++;
795  else
796  break;
797  }
798  s->s.h.tiling.log2_tile_rows = decode012(&s->gb);
799  s->s.h.tiling.tile_rows = 1 << s->s.h.tiling.log2_tile_rows;
800  if (s->s.h.tiling.tile_cols != (1 << s->s.h.tiling.log2_tile_cols) || changed) {
801  int n_range_coders;
802  VP56RangeCoder *rc;
803 
804  if (s->td) {
805  for (i = 0; i < s->active_tile_cols; i++)
806  vp9_tile_data_free(&s->td[i]);
807  av_free(s->td);
808  }
809 
810  s->s.h.tiling.tile_cols = 1 << s->s.h.tiling.log2_tile_cols;
811  vp9_free_entries(avctx);
812  s->active_tile_cols = avctx->active_thread_type == FF_THREAD_SLICE ?
813  s->s.h.tiling.tile_cols : 1;
814  vp9_alloc_entries(avctx, s->sb_rows);
815  if (avctx->active_thread_type == FF_THREAD_SLICE) {
816  n_range_coders = 4; // max_tile_rows
817  } else {
818  n_range_coders = s->s.h.tiling.tile_cols;
819  }
820  s->td = av_mallocz_array(s->active_tile_cols, sizeof(VP9TileData) +
821  n_range_coders * sizeof(VP56RangeCoder));
822  if (!s->td)
823  return AVERROR(ENOMEM);
824  rc = (VP56RangeCoder *) &s->td[s->active_tile_cols];
825  for (i = 0; i < s->active_tile_cols; i++) {
826  s->td[i].s = s;
827  s->td[i].c_b = rc;
828  rc += n_range_coders;
829  }
830  }
831 
832  /* check reference frames */
833  if (!s->s.h.keyframe && !s->s.h.intraonly) {
834  int valid_ref_frame = 0;
835  for (i = 0; i < 3; i++) {
836  AVFrame *ref = s->s.refs[s->s.h.refidx[i]].f;
837  int refw = ref->width, refh = ref->height;
838 
839  if (ref->format != avctx->pix_fmt) {
840  av_log(avctx, AV_LOG_ERROR,
841  "Ref pixfmt (%s) did not match current frame (%s)",
842  av_get_pix_fmt_name(ref->format),
843  av_get_pix_fmt_name(avctx->pix_fmt));
844  return AVERROR_INVALIDDATA;
845  } else if (refw == w && refh == h) {
846  s->mvscale[i][0] = s->mvscale[i][1] = 0;
847  } else {
848  /* Check to make sure at least one of frames that */
849  /* this frame references has valid dimensions */
850  if (w * 2 < refw || h * 2 < refh || w > 16 * refw || h > 16 * refh) {
851  av_log(avctx, AV_LOG_WARNING,
852  "Invalid ref frame dimensions %dx%d for frame size %dx%d\n",
853  refw, refh, w, h);
854  s->mvscale[i][0] = s->mvscale[i][1] = REF_INVALID_SCALE;
855  continue;
856  }
857  s->mvscale[i][0] = (refw << 14) / w;
858  s->mvscale[i][1] = (refh << 14) / h;
859  s->mvstep[i][0] = 16 * s->mvscale[i][0] >> 14;
860  s->mvstep[i][1] = 16 * s->mvscale[i][1] >> 14;
861  }
862  valid_ref_frame++;
863  }
864  if (!valid_ref_frame) {
865  av_log(avctx, AV_LOG_ERROR, "No valid reference frame is found, bitstream not supported\n");
866  return AVERROR_INVALIDDATA;
867  }
868  }
869 
870  if (s->s.h.keyframe || s->s.h.errorres || (s->s.h.intraonly && s->s.h.resetctx == 3)) {
871  s->prob_ctx[0].p = s->prob_ctx[1].p = s->prob_ctx[2].p =
872  s->prob_ctx[3].p = ff_vp9_default_probs;
873  memcpy(s->prob_ctx[0].coef, ff_vp9_default_coef_probs,
874  sizeof(ff_vp9_default_coef_probs));
875  memcpy(s->prob_ctx[1].coef, ff_vp9_default_coef_probs,
876  sizeof(ff_vp9_default_coef_probs));
877  memcpy(s->prob_ctx[2].coef, ff_vp9_default_coef_probs,
878  sizeof(ff_vp9_default_coef_probs));
879  memcpy(s->prob_ctx[3].coef, ff_vp9_default_coef_probs,
880  sizeof(ff_vp9_default_coef_probs));
881  } else if (s->s.h.intraonly && s->s.h.resetctx == 2) {
882  s->prob_ctx[c].p = ff_vp9_default_probs;
883  memcpy(s->prob_ctx[c].coef, ff_vp9_default_coef_probs,
884  sizeof(ff_vp9_default_coef_probs));
885  }
886 
887  // next 16 bits is size of the rest of the header (arith-coded)
888  s->s.h.compressed_header_size = size2 = get_bits(&s->gb, 16);
889  s->s.h.uncompressed_header_size = (get_bits_count(&s->gb) + 7) / 8;
890 
891  data2 = align_get_bits(&s->gb);
892  if (size2 > size - (data2 - data)) {
893  av_log(avctx, AV_LOG_ERROR, "Invalid compressed header size\n");
894  return AVERROR_INVALIDDATA;
895  }
896  ret = ff_vp56_init_range_decoder(&s->c, data2, size2);
897  if (ret < 0)
898  return ret;
899 
900  if (vp56_rac_get_prob_branchy(&s->c, 128)) { // marker bit
901  av_log(avctx, AV_LOG_ERROR, "Marker bit was set\n");
902  return AVERROR_INVALIDDATA;
903  }
904 
905  for (i = 0; i < s->active_tile_cols; i++) {
906  if (s->s.h.keyframe || s->s.h.intraonly) {
907  memset(s->td[i].counts.coef, 0, sizeof(s->td[0].counts.coef));
908  memset(s->td[i].counts.eob, 0, sizeof(s->td[0].counts.eob));
909  } else {
910  memset(&s->td[i].counts, 0, sizeof(s->td[0].counts));
911  }
912  s->td[i].nb_block_structure = 0;
913  }
914 
915  /* FIXME is it faster to not copy here, but do it down in the fw updates
916  * as explicit copies if the fw update is missing (and skip the copy upon
917  * fw update)? */
918  s->prob.p = s->prob_ctx[c].p;
919 
920  // txfm updates
921  if (s->s.h.lossless) {
922  s->s.h.txfmmode = TX_4X4;
923  } else {
924  s->s.h.txfmmode = vp8_rac_get_uint(&s->c, 2);
925  if (s->s.h.txfmmode == 3)
926  s->s.h.txfmmode += vp8_rac_get(&s->c);
927 
928  if (s->s.h.txfmmode == TX_SWITCHABLE) {
929  for (i = 0; i < 2; i++)
930  if (vp56_rac_get_prob_branchy(&s->c, 252))
931  s->prob.p.tx8p[i] = update_prob(&s->c, s->prob.p.tx8p[i]);
932  for (i = 0; i < 2; i++)
933  for (j = 0; j < 2; j++)
934  if (vp56_rac_get_prob_branchy(&s->c, 252))
935  s->prob.p.tx16p[i][j] =
936  update_prob(&s->c, s->prob.p.tx16p[i][j]);
937  for (i = 0; i < 2; i++)
938  for (j = 0; j < 3; j++)
939  if (vp56_rac_get_prob_branchy(&s->c, 252))
940  s->prob.p.tx32p[i][j] =
941  update_prob(&s->c, s->prob.p.tx32p[i][j]);
942  }
943  }
944 
945  // coef updates
946  for (i = 0; i < 4; i++) {
947  uint8_t (*ref)[2][6][6][3] = s->prob_ctx[c].coef[i];
948  if (vp8_rac_get(&s->c)) {
949  for (j = 0; j < 2; j++)
950  for (k = 0; k < 2; k++)
951  for (l = 0; l < 6; l++)
952  for (m = 0; m < 6; m++) {
953  uint8_t *p = s->prob.coef[i][j][k][l][m];
954  uint8_t *r = ref[j][k][l][m];
955  if (m >= 3 && l == 0) // dc only has 3 pt
956  break;
957  for (n = 0; n < 3; n++) {
958  if (vp56_rac_get_prob_branchy(&s->c, 252))
959  p[n] = update_prob(&s->c, r[n]);
960  else
961  p[n] = r[n];
962  }
963  memcpy(&p[3], ff_vp9_model_pareto8[p[2]], 8);
964  }
965  } else {
966  for (j = 0; j < 2; j++)
967  for (k = 0; k < 2; k++)
968  for (l = 0; l < 6; l++)
969  for (m = 0; m < 6; m++) {
970  uint8_t *p = s->prob.coef[i][j][k][l][m];
971  uint8_t *r = ref[j][k][l][m];
972  if (m > 3 && l == 0) // dc only has 3 pt
973  break;
974  memcpy(p, r, 3);
975  memcpy(&p[3], ff_vp9_model_pareto8[p[2]], 8);
976  }
977  }
978  if (s->s.h.txfmmode == i)
979  break;
980  }
981 
982  // mode updates
983  for (i = 0; i < 3; i++)
984  if (vp56_rac_get_prob_branchy(&s->c, 252))
985  s->prob.p.skip[i] = update_prob(&s->c, s->prob.p.skip[i]);
986  if (!s->s.h.keyframe && !s->s.h.intraonly) {
987  for (i = 0; i < 7; i++)
988  for (j = 0; j < 3; j++)
989  if (vp56_rac_get_prob_branchy(&s->c, 252))
990  s->prob.p.mv_mode[i][j] =
991  update_prob(&s->c, s->prob.p.mv_mode[i][j]);
992 
993  if (s->s.h.filtermode == FILTER_SWITCHABLE)
994  for (i = 0; i < 4; i++)
995  for (j = 0; j < 2; j++)
996  if (vp56_rac_get_prob_branchy(&s->c, 252))
997  s->prob.p.filter[i][j] =
998  update_prob(&s->c, s->prob.p.filter[i][j]);
999 
1000  for (i = 0; i < 4; i++)
1001  if (vp56_rac_get_prob_branchy(&s->c, 252))
1002  s->prob.p.intra[i] = update_prob(&s->c, s->prob.p.intra[i]);
1003 
1004  if (s->s.h.allowcompinter) {
1005  s->s.h.comppredmode = vp8_rac_get(&s->c);
1006  if (s->s.h.comppredmode)
1007  s->s.h.comppredmode += vp8_rac_get(&s->c);
1008  if (s->s.h.comppredmode == PRED_SWITCHABLE)
1009  for (i = 0; i < 5; i++)
1010  if (vp56_rac_get_prob_branchy(&s->c, 252))
1011  s->prob.p.comp[i] =
1012  update_prob(&s->c, s->prob.p.comp[i]);
1013  } else {
1014  s->s.h.comppredmode = PRED_SINGLEREF;
1015  }
1016 
1017  if (s->s.h.comppredmode != PRED_COMPREF) {
1018  for (i = 0; i < 5; i++) {
1019  if (vp56_rac_get_prob_branchy(&s->c, 252))
1020  s->prob.p.single_ref[i][0] =
1021  update_prob(&s->c, s->prob.p.single_ref[i][0]);
1022  if (vp56_rac_get_prob_branchy(&s->c, 252))
1023  s->prob.p.single_ref[i][1] =
1024  update_prob(&s->c, s->prob.p.single_ref[i][1]);
1025  }
1026  }
1027 
1028  if (s->s.h.comppredmode != PRED_SINGLEREF) {
1029  for (i = 0; i < 5; i++)
1030  if (vp56_rac_get_prob_branchy(&s->c, 252))
1031  s->prob.p.comp_ref[i] =
1032  update_prob(&s->c, s->prob.p.comp_ref[i]);
1033  }
1034 
1035  for (i = 0; i < 4; i++)
1036  for (j = 0; j < 9; j++)
1037  if (vp56_rac_get_prob_branchy(&s->c, 252))
1038  s->prob.p.y_mode[i][j] =
1039  update_prob(&s->c, s->prob.p.y_mode[i][j]);
1040 
1041  for (i = 0; i < 4; i++)
1042  for (j = 0; j < 4; j++)
1043  for (k = 0; k < 3; k++)
1044  if (vp56_rac_get_prob_branchy(&s->c, 252))
1045  s->prob.p.partition[3 - i][j][k] =
1046  update_prob(&s->c,
1047  s->prob.p.partition[3 - i][j][k]);
1048 
1049  // mv fields don't use the update_prob subexp model for some reason
1050  for (i = 0; i < 3; i++)
1051  if (vp56_rac_get_prob_branchy(&s->c, 252))
1052  s->prob.p.mv_joint[i] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1053 
1054  for (i = 0; i < 2; i++) {
1055  if (vp56_rac_get_prob_branchy(&s->c, 252))
1056  s->prob.p.mv_comp[i].sign =
1057  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1058 
1059  for (j = 0; j < 10; j++)
1060  if (vp56_rac_get_prob_branchy(&s->c, 252))
1061  s->prob.p.mv_comp[i].classes[j] =
1062  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1063 
1064  if (vp56_rac_get_prob_branchy(&s->c, 252))
1065  s->prob.p.mv_comp[i].class0 =
1066  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1067 
1068  for (j = 0; j < 10; j++)
1069  if (vp56_rac_get_prob_branchy(&s->c, 252))
1070  s->prob.p.mv_comp[i].bits[j] =
1071  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1072  }
1073 
1074  for (i = 0; i < 2; i++) {
1075  for (j = 0; j < 2; j++)
1076  for (k = 0; k < 3; k++)
1077  if (vp56_rac_get_prob_branchy(&s->c, 252))
1078  s->prob.p.mv_comp[i].class0_fp[j][k] =
1079  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1080 
1081  for (j = 0; j < 3; j++)
1082  if (vp56_rac_get_prob_branchy(&s->c, 252))
1083  s->prob.p.mv_comp[i].fp[j] =
1084  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1085  }
1086 
1087  if (s->s.h.highprecisionmvs) {
1088  for (i = 0; i < 2; i++) {
1089  if (vp56_rac_get_prob_branchy(&s->c, 252))
1090  s->prob.p.mv_comp[i].class0_hp =
1091  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1092 
1093  if (vp56_rac_get_prob_branchy(&s->c, 252))
1094  s->prob.p.mv_comp[i].hp =
1095  (vp8_rac_get_uint(&s->c, 7) << 1) | 1;
1096  }
1097  }
1098  }
1099 
1100  return (data2 - data) + size2;
1101 }
1102 
1103 static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl,
1104  ptrdiff_t yoff, ptrdiff_t uvoff, enum BlockLevel bl)
1105 {
1106  const VP9Context *s = td->s;
1107  int c = ((s->above_partition_ctx[col] >> (3 - bl)) & 1) |
1108  (((td->left_partition_ctx[row & 0x7] >> (3 - bl)) & 1) << 1);
1109  const uint8_t *p = s->s.h.keyframe || s->s.h.intraonly ? ff_vp9_default_kf_partition_probs[bl][c] :
1110  s->prob.p.partition[bl][c];
1111  enum BlockPartition bp;
1112  ptrdiff_t hbs = 4 >> bl;
1113  AVFrame *f = s->s.frames[CUR_FRAME].tf.f;
1114  ptrdiff_t y_stride = f->linesize[0], uv_stride = f->linesize[1];
1115  int bytesperpixel = s->bytesperpixel;
1116 
1117  if (bl == BL_8X8) {
1119  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1120  } else if (col + hbs < s->cols) { // FIXME why not <=?
1121  if (row + hbs < s->rows) { // FIXME why not <=?
1123  switch (bp) {
1124  case PARTITION_NONE:
1125  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1126  break;
1127  case PARTITION_H:
1128  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1129  yoff += hbs * 8 * y_stride;
1130  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1131  ff_vp9_decode_block(td, row + hbs, col, lflvl, yoff, uvoff, bl, bp);
1132  break;
1133  case PARTITION_V:
1134  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1135  yoff += hbs * 8 * bytesperpixel;
1136  uvoff += hbs * 8 * bytesperpixel >> s->ss_h;
1137  ff_vp9_decode_block(td, row, col + hbs, lflvl, yoff, uvoff, bl, bp);
1138  break;
1139  case PARTITION_SPLIT:
1140  decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1);
1141  decode_sb(td, row, col + hbs, lflvl,
1142  yoff + 8 * hbs * bytesperpixel,
1143  uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
1144  yoff += hbs * 8 * y_stride;
1145  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1146  decode_sb(td, row + hbs, col, lflvl, yoff, uvoff, bl + 1);
1147  decode_sb(td, row + hbs, col + hbs, lflvl,
1148  yoff + 8 * hbs * bytesperpixel,
1149  uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
1150  break;
1151  default:
1152  av_assert0(0);
1153  }
1154  } else if (vp56_rac_get_prob_branchy(td->c, p[1])) {
1155  bp = PARTITION_SPLIT;
1156  decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1);
1157  decode_sb(td, row, col + hbs, lflvl,
1158  yoff + 8 * hbs * bytesperpixel,
1159  uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
1160  } else {
1161  bp = PARTITION_H;
1162  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1163  }
1164  } else if (row + hbs < s->rows) { // FIXME why not <=?
1165  if (vp56_rac_get_prob_branchy(td->c, p[2])) {
1166  bp = PARTITION_SPLIT;
1167  decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1);
1168  yoff += hbs * 8 * y_stride;
1169  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1170  decode_sb(td, row + hbs, col, lflvl, yoff, uvoff, bl + 1);
1171  } else {
1172  bp = PARTITION_V;
1173  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp);
1174  }
1175  } else {
1176  bp = PARTITION_SPLIT;
1177  decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1);
1178  }
1179  td->counts.partition[bl][c][bp]++;
1180 }
1181 
1182 static void decode_sb_mem(VP9TileData *td, int row, int col, VP9Filter *lflvl,
1183  ptrdiff_t yoff, ptrdiff_t uvoff, enum BlockLevel bl)
1184 {
1185  const VP9Context *s = td->s;
1186  VP9Block *b = td->b;
1187  ptrdiff_t hbs = 4 >> bl;
1188  AVFrame *f = s->s.frames[CUR_FRAME].tf.f;
1189  ptrdiff_t y_stride = f->linesize[0], uv_stride = f->linesize[1];
1190  int bytesperpixel = s->bytesperpixel;
1191 
1192  if (bl == BL_8X8) {
1193  av_assert2(b->bl == BL_8X8);
1194  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, b->bl, b->bp);
1195  } else if (td->b->bl == bl) {
1196  ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, b->bl, b->bp);
1197  if (b->bp == PARTITION_H && row + hbs < s->rows) {
1198  yoff += hbs * 8 * y_stride;
1199  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1200  ff_vp9_decode_block(td, row + hbs, col, lflvl, yoff, uvoff, b->bl, b->bp);
1201  } else if (b->bp == PARTITION_V && col + hbs < s->cols) {
1202  yoff += hbs * 8 * bytesperpixel;
1203  uvoff += hbs * 8 * bytesperpixel >> s->ss_h;
1204  ff_vp9_decode_block(td, row, col + hbs, lflvl, yoff, uvoff, b->bl, b->bp);
1205  }
1206  } else {
1207  decode_sb_mem(td, row, col, lflvl, yoff, uvoff, bl + 1);
1208  if (col + hbs < s->cols) { // FIXME why not <=?
1209  if (row + hbs < s->rows) {
1210  decode_sb_mem(td, row, col + hbs, lflvl, yoff + 8 * hbs * bytesperpixel,
1211  uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
1212  yoff += hbs * 8 * y_stride;
1213  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1214  decode_sb_mem(td, row + hbs, col, lflvl, yoff, uvoff, bl + 1);
1215  decode_sb_mem(td, row + hbs, col + hbs, lflvl,
1216  yoff + 8 * hbs * bytesperpixel,
1217  uvoff + (8 * hbs * bytesperpixel >> s->ss_h), bl + 1);
1218  } else {
1219  yoff += hbs * 8 * bytesperpixel;
1220  uvoff += hbs * 8 * bytesperpixel >> s->ss_h;
1221  decode_sb_mem(td, row, col + hbs, lflvl, yoff, uvoff, bl + 1);
1222  }
1223  } else if (row + hbs < s->rows) {
1224  yoff += hbs * 8 * y_stride;
1225  uvoff += hbs * 8 * uv_stride >> s->ss_v;
1226  decode_sb_mem(td, row + hbs, col, lflvl, yoff, uvoff, bl + 1);
1227  }
1228  }
1229 }
1230 
1231 static void set_tile_offset(int *start, int *end, int idx, int log2_n, int n)
1232 {
1233  int sb_start = ( idx * n) >> log2_n;
1234  int sb_end = ((idx + 1) * n) >> log2_n;
1235  *start = FFMIN(sb_start, n) << 3;
1236  *end = FFMIN(sb_end, n) << 3;
1237 }
1238 
1240 {
1241  int i;
1242 
1243  av_freep(&s->intra_pred_data[0]);
1244  for (i = 0; i < s->active_tile_cols; i++)
1245  vp9_tile_data_free(&s->td[i]);
1246 }
1247 
1249 {
1250  VP9Context *s = avctx->priv_data;
1251  int i;
1252 
1253  for (i = 0; i < 3; i++) {
1254  vp9_frame_unref(avctx, &s->s.frames[i]);
1255  av_frame_free(&s->s.frames[i].tf.f);
1256  }
1257  av_buffer_pool_uninit(&s->frame_extradata_pool);
1258  for (i = 0; i < 8; i++) {
1259  ff_thread_release_buffer(avctx, &s->s.refs[i]);
1260  av_frame_free(&s->s.refs[i].f);
1261  ff_thread_release_buffer(avctx, &s->next_refs[i]);
1262  av_frame_free(&s->next_refs[i].f);
1263  }
1264 
1265  free_buffers(s);
1266  vp9_free_entries(avctx);
1267  av_freep(&s->td);
1268  return 0;
1269 }
1270 
1271 static int decode_tiles(AVCodecContext *avctx,
1272  const uint8_t *data, int size)
1273 {
1274  VP9Context *s = avctx->priv_data;
1275  VP9TileData *td = &s->td[0];
1276  int row, col, tile_row, tile_col, ret;
1277  int bytesperpixel;
1278  int tile_row_start, tile_row_end, tile_col_start, tile_col_end;
1279  AVFrame *f;
1280  ptrdiff_t yoff, uvoff, ls_y, ls_uv;
1281 
1282  f = s->s.frames[CUR_FRAME].tf.f;
1283  ls_y = f->linesize[0];
1284  ls_uv =f->linesize[1];
1285  bytesperpixel = s->bytesperpixel;
1286 
1287  yoff = uvoff = 0;
1288  for (tile_row = 0; tile_row < s->s.h.tiling.tile_rows; tile_row++) {
1289  set_tile_offset(&tile_row_start, &tile_row_end,
1290  tile_row, s->s.h.tiling.log2_tile_rows, s->sb_rows);
1291 
1292  for (tile_col = 0; tile_col < s->s.h.tiling.tile_cols; tile_col++) {
1293  int64_t tile_size;
1294 
1295  if (tile_col == s->s.h.tiling.tile_cols - 1 &&
1296  tile_row == s->s.h.tiling.tile_rows - 1) {
1297  tile_size = size;
1298  } else {
1299  tile_size = AV_RB32(data);
1300  data += 4;
1301  size -= 4;
1302  }
1303  if (tile_size > size) {
1304  ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0);
1305  return AVERROR_INVALIDDATA;
1306  }
1307  ret = ff_vp56_init_range_decoder(&td->c_b[tile_col], data, tile_size);
1308  if (ret < 0)
1309  return ret;
1310  if (vp56_rac_get_prob_branchy(&td->c_b[tile_col], 128)) { // marker bit
1311  ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0);
1312  return AVERROR_INVALIDDATA;
1313  }
1314  data += tile_size;
1315  size -= tile_size;
1316  }
1317 
1318  for (row = tile_row_start; row < tile_row_end;
1319  row += 8, yoff += ls_y * 64, uvoff += ls_uv * 64 >> s->ss_v) {
1320  VP9Filter *lflvl_ptr = s->lflvl;
1321  ptrdiff_t yoff2 = yoff, uvoff2 = uvoff;
1322 
1323  for (tile_col = 0; tile_col < s->s.h.tiling.tile_cols; tile_col++) {
1324  set_tile_offset(&tile_col_start, &tile_col_end,
1325  tile_col, s->s.h.tiling.log2_tile_cols, s->sb_cols);
1326  td->tile_col_start = tile_col_start;
1327  if (s->pass != 2) {
1328  memset(td->left_partition_ctx, 0, 8);
1329  memset(td->left_skip_ctx, 0, 8);
1330  if (s->s.h.keyframe || s->s.h.intraonly) {
1331  memset(td->left_mode_ctx, DC_PRED, 16);
1332  } else {
1333  memset(td->left_mode_ctx, NEARESTMV, 8);
1334  }
1335  memset(td->left_y_nnz_ctx, 0, 16);
1336  memset(td->left_uv_nnz_ctx, 0, 32);
1337  memset(td->left_segpred_ctx, 0, 8);
1338 
1339  td->c = &td->c_b[tile_col];
1340  }
1341 
1342  for (col = tile_col_start;
1343  col < tile_col_end;
1344  col += 8, yoff2 += 64 * bytesperpixel,
1345  uvoff2 += 64 * bytesperpixel >> s->ss_h, lflvl_ptr++) {
1346  // FIXME integrate with lf code (i.e. zero after each
1347  // use, similar to invtxfm coefficients, or similar)
1348  if (s->pass != 1) {
1349  memset(lflvl_ptr->mask, 0, sizeof(lflvl_ptr->mask));
1350  }
1351 
1352  if (s->pass == 2) {
1353  decode_sb_mem(td, row, col, lflvl_ptr,
1354  yoff2, uvoff2, BL_64X64);
1355  } else {
1356  if (vpX_rac_is_end(td->c)) {
1357  return AVERROR_INVALIDDATA;
1358  }
1359  decode_sb(td, row, col, lflvl_ptr,
1360  yoff2, uvoff2, BL_64X64);
1361  }
1362  }
1363  }
1364 
1365  if (s->pass == 1)
1366  continue;
1367 
1368  // backup pre-loopfilter reconstruction data for intra
1369  // prediction of next row of sb64s
1370  if (row + 8 < s->rows) {
1371  memcpy(s->intra_pred_data[0],
1372  f->data[0] + yoff + 63 * ls_y,
1373  8 * s->cols * bytesperpixel);
1374  memcpy(s->intra_pred_data[1],
1375  f->data[1] + uvoff + ((64 >> s->ss_v) - 1) * ls_uv,
1376  8 * s->cols * bytesperpixel >> s->ss_h);
1377  memcpy(s->intra_pred_data[2],
1378  f->data[2] + uvoff + ((64 >> s->ss_v) - 1) * ls_uv,
1379  8 * s->cols * bytesperpixel >> s->ss_h);
1380  }
1381 
1382  // loopfilter one row
1383  if (s->s.h.filter.level) {
1384  yoff2 = yoff;
1385  uvoff2 = uvoff;
1386  lflvl_ptr = s->lflvl;
1387  for (col = 0; col < s->cols;
1388  col += 8, yoff2 += 64 * bytesperpixel,
1389  uvoff2 += 64 * bytesperpixel >> s->ss_h, lflvl_ptr++) {
1390  ff_vp9_loopfilter_sb(avctx, lflvl_ptr, row, col,
1391  yoff2, uvoff2);
1392  }
1393  }
1394 
1395  // FIXME maybe we can make this more finegrained by running the
1396  // loopfilter per-block instead of after each sbrow
1397  // In fact that would also make intra pred left preparation easier?
1398  ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, row >> 3, 0);
1399  }
1400  }
1401  return 0;
1402 }
1403 
1404 #if HAVE_THREADS
1405 static av_always_inline
1406 int decode_tiles_mt(AVCodecContext *avctx, void *tdata, int jobnr,
1407  int threadnr)
1408 {
1409  VP9Context *s = avctx->priv_data;
1410  VP9TileData *td = &s->td[jobnr];
1411  ptrdiff_t uvoff, yoff, ls_y, ls_uv;
1412  int bytesperpixel = s->bytesperpixel, row, col, tile_row;
1413  unsigned tile_cols_len;
1414  int tile_row_start, tile_row_end, tile_col_start, tile_col_end;
1415  VP9Filter *lflvl_ptr_base;
1416  AVFrame *f;
1417 
1418  f = s->s.frames[CUR_FRAME].tf.f;
1419  ls_y = f->linesize[0];
1420  ls_uv =f->linesize[1];
1421 
1422  set_tile_offset(&tile_col_start, &tile_col_end,
1423  jobnr, s->s.h.tiling.log2_tile_cols, s->sb_cols);
1424  td->tile_col_start = tile_col_start;
1425  uvoff = (64 * bytesperpixel >> s->ss_h)*(tile_col_start >> 3);
1426  yoff = (64 * bytesperpixel)*(tile_col_start >> 3);
1427  lflvl_ptr_base = s->lflvl+(tile_col_start >> 3);
1428 
1429  for (tile_row = 0; tile_row < s->s.h.tiling.tile_rows; tile_row++) {
1430  set_tile_offset(&tile_row_start, &tile_row_end,
1431  tile_row, s->s.h.tiling.log2_tile_rows, s->sb_rows);
1432 
1433  td->c = &td->c_b[tile_row];
1434  for (row = tile_row_start; row < tile_row_end;
1435  row += 8, yoff += ls_y * 64, uvoff += ls_uv * 64 >> s->ss_v) {
1436  ptrdiff_t yoff2 = yoff, uvoff2 = uvoff;
1437  VP9Filter *lflvl_ptr = lflvl_ptr_base+s->sb_cols*(row >> 3);
1438 
1439  memset(td->left_partition_ctx, 0, 8);
1440  memset(td->left_skip_ctx, 0, 8);
1441  if (s->s.h.keyframe || s->s.h.intraonly) {
1442  memset(td->left_mode_ctx, DC_PRED, 16);
1443  } else {
1444  memset(td->left_mode_ctx, NEARESTMV, 8);
1445  }
1446  memset(td->left_y_nnz_ctx, 0, 16);
1447  memset(td->left_uv_nnz_ctx, 0, 32);
1448  memset(td->left_segpred_ctx, 0, 8);
1449 
1450  for (col = tile_col_start;
1451  col < tile_col_end;
1452  col += 8, yoff2 += 64 * bytesperpixel,
1453  uvoff2 += 64 * bytesperpixel >> s->ss_h, lflvl_ptr++) {
1454  // FIXME integrate with lf code (i.e. zero after each
1455  // use, similar to invtxfm coefficients, or similar)
1456  memset(lflvl_ptr->mask, 0, sizeof(lflvl_ptr->mask));
1457  decode_sb(td, row, col, lflvl_ptr,
1458  yoff2, uvoff2, BL_64X64);
1459  }
1460 
1461  // backup pre-loopfilter reconstruction data for intra
1462  // prediction of next row of sb64s
1463  tile_cols_len = tile_col_end - tile_col_start;
1464  if (row + 8 < s->rows) {
1465  memcpy(s->intra_pred_data[0] + (tile_col_start * 8 * bytesperpixel),
1466  f->data[0] + yoff + 63 * ls_y,
1467  8 * tile_cols_len * bytesperpixel);
1468  memcpy(s->intra_pred_data[1] + (tile_col_start * 8 * bytesperpixel >> s->ss_h),
1469  f->data[1] + uvoff + ((64 >> s->ss_v) - 1) * ls_uv,
1470  8 * tile_cols_len * bytesperpixel >> s->ss_h);
1471  memcpy(s->intra_pred_data[2] + (tile_col_start * 8 * bytesperpixel >> s->ss_h),
1472  f->data[2] + uvoff + ((64 >> s->ss_v) - 1) * ls_uv,
1473  8 * tile_cols_len * bytesperpixel >> s->ss_h);
1474  }
1475 
1476  vp9_report_tile_progress(s, row >> 3, 1);
1477  }
1478  }
1479  return 0;
1480 }
1481 
1482 static av_always_inline
1483 int loopfilter_proc(AVCodecContext *avctx)
1484 {
1485  VP9Context *s = avctx->priv_data;
1486  ptrdiff_t uvoff, yoff, ls_y, ls_uv;
1487  VP9Filter *lflvl_ptr;
1488  int bytesperpixel = s->bytesperpixel, col, i;
1489  AVFrame *f;
1490 
1491  f = s->s.frames[CUR_FRAME].tf.f;
1492  ls_y = f->linesize[0];
1493  ls_uv =f->linesize[1];
1494 
1495  for (i = 0; i < s->sb_rows; i++) {
1496  vp9_await_tile_progress(s, i, s->s.h.tiling.tile_cols);
1497 
1498  if (s->s.h.filter.level) {
1499  yoff = (ls_y * 64)*i;
1500  uvoff = (ls_uv * 64 >> s->ss_v)*i;
1501  lflvl_ptr = s->lflvl+s->sb_cols*i;
1502  for (col = 0; col < s->cols;
1503  col += 8, yoff += 64 * bytesperpixel,
1504  uvoff += 64 * bytesperpixel >> s->ss_h, lflvl_ptr++) {
1505  ff_vp9_loopfilter_sb(avctx, lflvl_ptr, i << 3, col,
1506  yoff, uvoff);
1507  }
1508  }
1509  }
1510  return 0;
1511 }
1512 #endif
1513 
1515 {
1516  AVVideoEncParams *par;
1517  unsigned int tile, nb_blocks = 0;
1518 
1519  if (s->s.h.segmentation.enabled) {
1520  for (tile = 0; tile < s->active_tile_cols; tile++)
1521  nb_blocks += s->td[tile].nb_block_structure;
1522  }
1523 
1525  AV_VIDEO_ENC_PARAMS_VP9, nb_blocks);
1526  if (!par)
1527  return AVERROR(ENOMEM);
1528 
1529  par->qp = s->s.h.yac_qi;
1530  par->delta_qp[0][0] = s->s.h.ydc_qdelta;
1531  par->delta_qp[1][0] = s->s.h.uvdc_qdelta;
1532  par->delta_qp[2][0] = s->s.h.uvdc_qdelta;
1533  par->delta_qp[1][1] = s->s.h.uvac_qdelta;
1534  par->delta_qp[2][1] = s->s.h.uvac_qdelta;
1535 
1536  if (nb_blocks) {
1537  unsigned int block = 0;
1538  unsigned int tile, block_tile;
1539 
1540  for (tile = 0; tile < s->active_tile_cols; tile++) {
1541  VP9TileData *td = &s->td[tile];
1542 
1543  for (block_tile = 0; block_tile < td->nb_block_structure; block_tile++) {
1545  unsigned int row = td->block_structure[block_tile].row;
1546  unsigned int col = td->block_structure[block_tile].col;
1547  uint8_t seg_id = frame->segmentation_map[row * 8 * s->sb_cols + col];
1548 
1549  b->src_x = col * 8;
1550  b->src_y = row * 8;
1551  b->w = 1 << (3 + td->block_structure[block_tile].block_size_idx_x);
1552  b->h = 1 << (3 + td->block_structure[block_tile].block_size_idx_y);
1553 
1554  if (s->s.h.segmentation.feat[seg_id].q_enabled) {
1555  b->delta_qp = s->s.h.segmentation.feat[seg_id].q_val;
1556  if (s->s.h.segmentation.absolute_vals)
1557  b->delta_qp -= par->qp;
1558  }
1559  }
1560  }
1561  }
1562 
1563  return 0;
1564 }
1565 
1566 static int vp9_decode_frame(AVCodecContext *avctx, void *frame,
1567  int *got_frame, AVPacket *pkt)
1568 {
1569  const uint8_t *data = pkt->data;
1570  int size = pkt->size;
1571  VP9Context *s = avctx->priv_data;
1572  int ret, i, j, ref;
1573  int retain_segmap_ref = s->s.frames[REF_FRAME_SEGMAP].segmentation_map &&
1574  (!s->s.h.segmentation.enabled || !s->s.h.segmentation.update_map);
1575  AVFrame *f;
1576 
1577  if ((ret = decode_frame_header(avctx, data, size, &ref)) < 0) {
1578  return ret;
1579  } else if (ret == 0) {
1580  if (!s->s.refs[ref].f->buf[0]) {
1581  av_log(avctx, AV_LOG_ERROR, "Requested reference %d not available\n", ref);
1582  return AVERROR_INVALIDDATA;
1583  }
1584  ff_thread_await_progress(&s->s.refs[ref], INT_MAX, 0);
1585 
1586  if ((ret = av_frame_ref(frame, s->s.refs[ref].f)) < 0)
1587  return ret;
1588  ((AVFrame *)frame)->pts = pkt->pts;
1589 #if FF_API_PKT_PTS
1591  ((AVFrame *)frame)->pkt_pts = pkt->pts;
1593 #endif
1594  ((AVFrame *)frame)->pkt_dts = pkt->dts;
1595  for (i = 0; i < 8; i++) {
1596  if (s->next_refs[i].f->buf[0])
1597  ff_thread_release_buffer(avctx, &s->next_refs[i]);
1598  if (s->s.refs[i].f->buf[0] &&
1599  (ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.refs[i])) < 0)
1600  return ret;
1601  }
1602  *got_frame = 1;
1603  return pkt->size;
1604  }
1605  data += ret;
1606  size -= ret;
1607 
1608  if (!retain_segmap_ref || s->s.h.keyframe || s->s.h.intraonly) {
1609  if (s->s.frames[REF_FRAME_SEGMAP].tf.f->buf[0])
1610  vp9_frame_unref(avctx, &s->s.frames[REF_FRAME_SEGMAP]);
1611  if (!s->s.h.keyframe && !s->s.h.intraonly && !s->s.h.errorres && s->s.frames[CUR_FRAME].tf.f->buf[0] &&
1612  (ret = vp9_frame_ref(avctx, &s->s.frames[REF_FRAME_SEGMAP], &s->s.frames[CUR_FRAME])) < 0)
1613  return ret;
1614  }
1615  if (s->s.frames[REF_FRAME_MVPAIR].tf.f->buf[0])
1616  vp9_frame_unref(avctx, &s->s.frames[REF_FRAME_MVPAIR]);
1617  if (!s->s.h.intraonly && !s->s.h.keyframe && !s->s.h.errorres && s->s.frames[CUR_FRAME].tf.f->buf[0] &&
1618  (ret = vp9_frame_ref(avctx, &s->s.frames[REF_FRAME_MVPAIR], &s->s.frames[CUR_FRAME])) < 0)
1619  return ret;
1620  if (s->s.frames[CUR_FRAME].tf.f->buf[0])
1621  vp9_frame_unref(avctx, &s->s.frames[CUR_FRAME]);
1622  if ((ret = vp9_frame_alloc(avctx, &s->s.frames[CUR_FRAME])) < 0)
1623  return ret;
1624  f = s->s.frames[CUR_FRAME].tf.f;
1625  f->key_frame = s->s.h.keyframe;
1626  f->pict_type = (s->s.h.keyframe || s->s.h.intraonly) ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
1627 
1628  if (s->s.frames[REF_FRAME_SEGMAP].tf.f->buf[0] &&
1629  (s->s.frames[REF_FRAME_MVPAIR].tf.f->width != s->s.frames[CUR_FRAME].tf.f->width ||
1630  s->s.frames[REF_FRAME_MVPAIR].tf.f->height != s->s.frames[CUR_FRAME].tf.f->height)) {
1631  vp9_frame_unref(avctx, &s->s.frames[REF_FRAME_SEGMAP]);
1632  }
1633 
1634  // ref frame setup
1635  for (i = 0; i < 8; i++) {
1636  if (s->next_refs[i].f->buf[0])
1637  ff_thread_release_buffer(avctx, &s->next_refs[i]);
1638  if (s->s.h.refreshrefmask & (1 << i)) {
1639  ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.frames[CUR_FRAME].tf);
1640  } else if (s->s.refs[i].f->buf[0]) {
1641  ret = ff_thread_ref_frame(&s->next_refs[i], &s->s.refs[i]);
1642  }
1643  if (ret < 0)
1644  return ret;
1645  }
1646 
1647  if (avctx->hwaccel) {
1648  ret = avctx->hwaccel->start_frame(avctx, NULL, 0);
1649  if (ret < 0)
1650  return ret;
1651  ret = avctx->hwaccel->decode_slice(avctx, pkt->data, pkt->size);
1652  if (ret < 0)
1653  return ret;
1654  ret = avctx->hwaccel->end_frame(avctx);
1655  if (ret < 0)
1656  return ret;
1657  goto finish;
1658  }
1659 
1660  // main tile decode loop
1661  memset(s->above_partition_ctx, 0, s->cols);
1662  memset(s->above_skip_ctx, 0, s->cols);
1663  if (s->s.h.keyframe || s->s.h.intraonly) {
1664  memset(s->above_mode_ctx, DC_PRED, s->cols * 2);
1665  } else {
1666  memset(s->above_mode_ctx, NEARESTMV, s->cols);
1667  }
1668  memset(s->above_y_nnz_ctx, 0, s->sb_cols * 16);
1669  memset(s->above_uv_nnz_ctx[0], 0, s->sb_cols * 16 >> s->ss_h);
1670  memset(s->above_uv_nnz_ctx[1], 0, s->sb_cols * 16 >> s->ss_h);
1671  memset(s->above_segpred_ctx, 0, s->cols);
1672  s->pass = s->s.frames[CUR_FRAME].uses_2pass =
1673  avctx->active_thread_type == FF_THREAD_FRAME && s->s.h.refreshctx && !s->s.h.parallelmode;
1674  if ((ret = update_block_buffers(avctx)) < 0) {
1675  av_log(avctx, AV_LOG_ERROR,
1676  "Failed to allocate block buffers\n");
1677  return ret;
1678  }
1679  if (s->s.h.refreshctx && s->s.h.parallelmode) {
1680  int j, k, l, m;
1681 
1682  for (i = 0; i < 4; i++) {
1683  for (j = 0; j < 2; j++)
1684  for (k = 0; k < 2; k++)
1685  for (l = 0; l < 6; l++)
1686  for (m = 0; m < 6; m++)
1687  memcpy(s->prob_ctx[s->s.h.framectxid].coef[i][j][k][l][m],
1688  s->prob.coef[i][j][k][l][m], 3);
1689  if (s->s.h.txfmmode == i)
1690  break;
1691  }
1692  s->prob_ctx[s->s.h.framectxid].p = s->prob.p;
1693  ff_thread_finish_setup(avctx);
1694  } else if (!s->s.h.refreshctx) {
1695  ff_thread_finish_setup(avctx);
1696  }
1697 
1698 #if HAVE_THREADS
1699  if (avctx->active_thread_type & FF_THREAD_SLICE) {
1700  for (i = 0; i < s->sb_rows; i++)
1701  atomic_store(&s->entries[i], 0);
1702  }
1703 #endif
1704 
1705  do {
1706  for (i = 0; i < s->active_tile_cols; i++) {
1707  s->td[i].b = s->td[i].b_base;
1708  s->td[i].block = s->td[i].block_base;
1709  s->td[i].uvblock[0] = s->td[i].uvblock_base[0];
1710  s->td[i].uvblock[1] = s->td[i].uvblock_base[1];
1711  s->td[i].eob = s->td[i].eob_base;
1712  s->td[i].uveob[0] = s->td[i].uveob_base[0];
1713  s->td[i].uveob[1] = s->td[i].uveob_base[1];
1714  s->td[i].error_info = 0;
1715  }
1716 
1717 #if HAVE_THREADS
1718  if (avctx->active_thread_type == FF_THREAD_SLICE) {
1719  int tile_row, tile_col;
1720 
1721  av_assert1(!s->pass);
1722 
1723  for (tile_row = 0; tile_row < s->s.h.tiling.tile_rows; tile_row++) {
1724  for (tile_col = 0; tile_col < s->s.h.tiling.tile_cols; tile_col++) {
1725  int64_t tile_size;
1726 
1727  if (tile_col == s->s.h.tiling.tile_cols - 1 &&
1728  tile_row == s->s.h.tiling.tile_rows - 1) {
1729  tile_size = size;
1730  } else {
1731  tile_size = AV_RB32(data);
1732  data += 4;
1733  size -= 4;
1734  }
1735  if (tile_size > size)
1736  return AVERROR_INVALIDDATA;
1737  ret = ff_vp56_init_range_decoder(&s->td[tile_col].c_b[tile_row], data, tile_size);
1738  if (ret < 0)
1739  return ret;
1740  if (vp56_rac_get_prob_branchy(&s->td[tile_col].c_b[tile_row], 128)) // marker bit
1741  return AVERROR_INVALIDDATA;
1742  data += tile_size;
1743  size -= tile_size;
1744  }
1745  }
1746 
1747  ff_slice_thread_execute_with_mainfunc(avctx, decode_tiles_mt, loopfilter_proc, s->td, NULL, s->s.h.tiling.tile_cols);
1748  } else
1749 #endif
1750  {
1751  ret = decode_tiles(avctx, data, size);
1752  if (ret < 0)
1753  goto fail;
1754  }
1755 
1756  // Sum all counts fields into td[0].counts for tile threading
1757  if (avctx->active_thread_type == FF_THREAD_SLICE)
1758  for (i = 1; i < s->s.h.tiling.tile_cols; i++)
1759  for (j = 0; j < sizeof(s->td[i].counts) / sizeof(unsigned); j++)
1760  ((unsigned *)&s->td[0].counts)[j] += ((unsigned *)&s->td[i].counts)[j];
1761 
1762  if (s->pass < 2 && s->s.h.refreshctx && !s->s.h.parallelmode) {
1764  ff_thread_finish_setup(avctx);
1765  }
1766  } while (s->pass++ == 1);
1767 
1768  if (s->td->error_info < 0) {
1769  av_log(avctx, AV_LOG_ERROR, "Failed to decode tile data\n");
1770  s->td->error_info = 0;
1771  ret = AVERROR_INVALIDDATA;
1772  goto fail;
1773  }
1775  ret = vp9_export_enc_params(s, &s->s.frames[CUR_FRAME]);
1776  if (ret < 0)
1777  goto fail;
1778  }
1779 
1780 finish:
1781  ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0);
1782  // ref frame setup
1783  for (i = 0; i < 8; i++) {
1784  if (s->s.refs[i].f->buf[0])
1785  ff_thread_release_buffer(avctx, &s->s.refs[i]);
1786  if (s->next_refs[i].f->buf[0] &&
1787  (ret = ff_thread_ref_frame(&s->s.refs[i], &s->next_refs[i])) < 0)
1788  return ret;
1789  }
1790 
1791  if (!s->s.h.invisible) {
1792  if ((ret = av_frame_ref(frame, s->s.frames[CUR_FRAME].tf.f)) < 0)
1793  return ret;
1794  *got_frame = 1;
1795  }
1796 
1797  return pkt->size;
1798 fail:
1799  ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0);
1800  return ret;
1801 }
1802 
1804 {
1805  VP9Context *s = avctx->priv_data;
1806  int i;
1807 
1808  for (i = 0; i < 3; i++)
1809  vp9_frame_unref(avctx, &s->s.frames[i]);
1810  for (i = 0; i < 8; i++)
1811  ff_thread_release_buffer(avctx, &s->s.refs[i]);
1812 }
1813 
1814 static int init_frames(AVCodecContext *avctx)
1815 {
1816  VP9Context *s = avctx->priv_data;
1817  int i;
1818 
1819  for (i = 0; i < 3; i++) {
1820  s->s.frames[i].tf.f = av_frame_alloc();
1821  if (!s->s.frames[i].tf.f) {
1822  vp9_decode_free(avctx);
1823  av_log(avctx, AV_LOG_ERROR, "Failed to allocate frame buffer %d\n", i);
1824  return AVERROR(ENOMEM);
1825  }
1826  }
1827  for (i = 0; i < 8; i++) {
1828  s->s.refs[i].f = av_frame_alloc();
1829  s->next_refs[i].f = av_frame_alloc();
1830  if (!s->s.refs[i].f || !s->next_refs[i].f) {
1831  vp9_decode_free(avctx);
1832  av_log(avctx, AV_LOG_ERROR, "Failed to allocate frame buffer %d\n", i);
1833  return AVERROR(ENOMEM);
1834  }
1835  }
1836 
1837  return 0;
1838 }
1839 
1841 {
1842  VP9Context *s = avctx->priv_data;
1843 
1844  s->last_bpp = 0;
1845  s->s.h.filter.sharpness = -1;
1846 
1847  return init_frames(avctx);
1848 }
1849 
1850 #if HAVE_THREADS
1851 static int vp9_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
1852 {
1853  int i, ret;
1854  VP9Context *s = dst->priv_data, *ssrc = src->priv_data;
1855 
1856  for (i = 0; i < 3; i++) {
1857  if (s->s.frames[i].tf.f->buf[0])
1858  vp9_frame_unref(dst, &s->s.frames[i]);
1859  if (ssrc->s.frames[i].tf.f->buf[0]) {
1860  if ((ret = vp9_frame_ref(dst, &s->s.frames[i], &ssrc->s.frames[i])) < 0)
1861  return ret;
1862  }
1863  }
1864  for (i = 0; i < 8; i++) {
1865  if (s->s.refs[i].f->buf[0])
1866  ff_thread_release_buffer(dst, &s->s.refs[i]);
1867  if (ssrc->next_refs[i].f->buf[0]) {
1868  if ((ret = ff_thread_ref_frame(&s->s.refs[i], &ssrc->next_refs[i])) < 0)
1869  return ret;
1870  }
1871  }
1872 
1873  s->s.h.invisible = ssrc->s.h.invisible;
1874  s->s.h.keyframe = ssrc->s.h.keyframe;
1875  s->s.h.intraonly = ssrc->s.h.intraonly;
1876  s->ss_v = ssrc->ss_v;
1877  s->ss_h = ssrc->ss_h;
1878  s->s.h.segmentation.enabled = ssrc->s.h.segmentation.enabled;
1879  s->s.h.segmentation.update_map = ssrc->s.h.segmentation.update_map;
1880  s->s.h.segmentation.absolute_vals = ssrc->s.h.segmentation.absolute_vals;
1881  s->bytesperpixel = ssrc->bytesperpixel;
1882  s->gf_fmt = ssrc->gf_fmt;
1883  s->w = ssrc->w;
1884  s->h = ssrc->h;
1885  s->s.h.bpp = ssrc->s.h.bpp;
1886  s->bpp_index = ssrc->bpp_index;
1887  s->pix_fmt = ssrc->pix_fmt;
1888  memcpy(&s->prob_ctx, &ssrc->prob_ctx, sizeof(s->prob_ctx));
1889  memcpy(&s->s.h.lf_delta, &ssrc->s.h.lf_delta, sizeof(s->s.h.lf_delta));
1890  memcpy(&s->s.h.segmentation.feat, &ssrc->s.h.segmentation.feat,
1891  sizeof(s->s.h.segmentation.feat));
1892 
1893  return 0;
1894 }
1895 #endif
1896 
1898  .name = "vp9",
1899  .long_name = NULL_IF_CONFIG_SMALL("Google VP9"),
1900  .type = AVMEDIA_TYPE_VIDEO,
1901  .id = AV_CODEC_ID_VP9,
1902  .priv_data_size = sizeof(VP9Context),
1903  .init = vp9_decode_init,
1904  .close = vp9_decode_free,
1907  .caps_internal = FF_CODEC_CAP_SLICE_THREAD_HAS_MF |
1910  .update_thread_context = ONLY_IF_THREADS_ENABLED(vp9_decode_update_thread_context),
1912  .bsfs = "vp9_superframe_split",
1913  .hw_configs = (const AVCodecHWConfigInternal *const []) {
1914 #if CONFIG_VP9_DXVA2_HWACCEL
1915  HWACCEL_DXVA2(vp9),
1916 #endif
1917 #if CONFIG_VP9_D3D11VA_HWACCEL
1918  HWACCEL_D3D11VA(vp9),
1919 #endif
1920 #if CONFIG_VP9_D3D11VA2_HWACCEL
1921  HWACCEL_D3D11VA2(vp9),
1922 #endif
1923 #if CONFIG_VP9_NVDEC_HWACCEL
1924  HWACCEL_NVDEC(vp9),
1925 #endif
1926 #if CONFIG_VP9_VAAPI_HWACCEL
1927  HWACCEL_VAAPI(vp9),
1928 #endif
1929 #if CONFIG_VP9_VDPAU_HWACCEL
1930  HWACCEL_VDPAU(vp9),
1931 #endif
1932  NULL
1933  },
1934 };
static void flush(AVCodecContext *avctx)
#define av_always_inline
Definition: attributes.h:45
#define av_cold
Definition: attributes.h:88
uint8_t
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
Libavcodec external API header.
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1788
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1789
#define FF_CODEC_PROPERTY_LOSSLESS
Definition: avcodec.h:2188
#define AV_RB32
Definition: intreadwrite.h:130
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
#define s(width, name)
Definition: cbs_vp9.c:257
#define f(width, name)
Definition: cbs_vp9.c:255
#define fail()
Definition: checkasm.h:133
#define FFMIN(a, b)
Definition: common.h:105
#define FFMAX(a, b)
Definition: common.h:103
#define av_clip_uintp2
Definition: common.h:146
#define NULL
Definition: coverity.c:32
long long int64_t
Definition: coverity.c:34
#define max(a, b)
Definition: cuda_runtime.h:33
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
static AVFrame * frame
#define atomic_store(object, desired)
Definition: stdatomic.h:85
#define atomic_fetch_add_explicit(object, operand, order)
Definition: stdatomic.h:149
intptr_t atomic_int
Definition: stdatomic.h:55
#define atomic_load_explicit(object, order)
Definition: stdatomic.h:96
#define atomic_init(obj, value)
Definition: stdatomic.h:33
#define pthread_mutex_lock(a)
Definition: ffprobe.c:63
#define pthread_mutex_unlock(a)
Definition: ffprobe.c:67
bitstream reader API header.
static int decode012(GetBitContext *gb)
Definition: get_bits.h:831
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:467
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:219
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:693
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:333
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:514
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:112
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:108
#define AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS
Decoding only.
Definition: avcodec.h:412
@ AV_CODEC_ID_VP9
Definition: codec_id.h:217
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:125
AVBufferRef * av_buffer_allocz(buffer_size_t size)
Same as av_buffer_alloc(), except the returned buffer will be initialized to zero.
Definition: buffer.c:83
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:93
AVBufferPool * av_buffer_pool_init(buffer_size_t size, AVBufferRef *(*alloc)(buffer_size_t size))
Allocate and initialize a buffer pool.
Definition: buffer.c:269
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:379
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:314
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define AVERROR(e)
Definition: error.h:43
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:443
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:203
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:190
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
Definition: mem.c:190
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
@ AV_PICTURE_TYPE_P
Predicted.
Definition: avutil.h:275
for(j=16;j >0;--j)
#define HWACCEL_DXVA2(codec)
Definition: hwconfig.h:67
#define HWACCEL_VDPAU(codec)
Definition: hwconfig.h:75
#define HWACCEL_NVDEC(codec)
Definition: hwconfig.h:71
#define HWACCEL_VAAPI(codec)
Definition: hwconfig.h:73
#define HWACCEL_D3D11VA(codec)
Definition: hwconfig.h:79
#define HWACCEL_D3D11VA2(codec)
Definition: hwconfig.h:69
int i
Definition: input.c:407
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
Definition: internal.h:76
#define FF_CODEC_CAP_SLICE_THREAD_HAS_MF
Codec initializes slice-based threading with a main function.
Definition: internal.h:71
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:84
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
Definition: utils.c:943
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:38
av_cold void ff_vp9dsp_init(VP9DSPContext *dsp, int bpp, int bitexact)
Definition: vp9dsp.c:86
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:83
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:84
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
Definition: internal.h:156
static enum AVPixelFormat pix_fmt_rgb[3]
Definition: libdav1d.c:60
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:309
uint8_t w
Definition: llviddspenc.c:39
const char data[16]
Definition: mxf.c:142
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
Definition: os2threads.h:152
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
Definition: os2threads.h:144
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
Definition: os2threads.h:104
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
Definition: os2threads.h:133
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
Definition: os2threads.h:192
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
Definition: os2threads.h:112
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2489
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:406
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:399
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:405
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:569
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:586
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:403
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:404
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:415
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:400
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:416
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:99
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition: pixfmt.h:137
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:235
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:313
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition: pixfmt.h:229
@ AV_PIX_FMT_VAAPI
Definition: pixfmt.h:122
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:168
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:197
#define AV_PIX_FMT_YUV440P10
Definition: pixfmt.h:401
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:402
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:512
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
Definition: pixfmt.h:514
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition: pixfmt.h:518
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB)
Definition: pixfmt.h:513
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:523
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:515
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
Definition: pixfmt.h:519
@ AVCOL_SPC_SMPTE240M
functionally identical to above
Definition: pixfmt.h:520
@ AVCOL_SPC_RESERVED
Definition: pixfmt.h:516
const AVProfile ff_vp9_profiles[]
Definition: profiles.c:139
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
FF_ENABLE_DEPRECATION_WARNINGS int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.
FF_DISABLE_DEPRECATION_WARNINGS enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Wrapper around get_format() for frame-multithreaded codecs.
int ff_slice_thread_execute_with_mainfunc(AVCodecContext *avctx, action_func2 *func2, main_func *mainfunc, void *arg, int *ret, int job_count)
#define td
Definition: regdef.h:70
#define FF_ARRAY_ELEMS(a)
uint8_t * data
The data buffer.
Definition: buffer.h:92
main external API structure.
Definition: avcodec.h:536
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:746
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:1171
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition: avcodec.h:1684
int active_thread_type
Which multithreading methods are in use by the codec.
Definition: avcodec.h:1796
int profile
profile
Definition: avcodec.h:1862
unsigned properties
Properties of the stream that gets decoded.
Definition: avcodec.h:2187
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition: avcodec.h:2350
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:1164
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:616
void * priv_data
Definition: avcodec.h:563
AVCodec.
Definition: codec.h:197
const char * name
Name of the codec implementation.
Definition: codec.h:204
This structure describes decoded (raw) audio or video data.
Definition: frame.h:318
int(* start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Called at the beginning of each frame or field picture.
Definition: avcodec.h:2504
int(* decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Callback for each slice.
Definition: avcodec.h:2532
int(* end_frame)(AVCodecContext *avctx)
Called at the end of each frame or field picture.
Definition: avcodec.h:2543
int frame_priv_data_size
Size of per-frame hardware accelerator private data.
Definition: avcodec.h:2552
This structure stores compressed data.
Definition: packet.h:346
int size
Definition: packet.h:370
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:362
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:368
uint8_t * data
Definition: packet.h:369
Data structure for storing block-level encoding information.
Video encoding parameters for a given frame.
int32_t delta_qp[4][2]
Quantisation parameter offset from the base (per-frame) qp for a given plane (first index) and AC/DC ...
int32_t qp
Base quantisation parameter for the frame.
Definition: vp56.h:68
uint8_t mask[2][2][8][4]
Definition: vp9dec.h:79
AVBufferRef * extradata
Definition: vp9shared.h:61
AVBufferRef * hwaccel_priv_buf
Definition: vp9shared.h:66
int uses_2pass
Definition: vp9shared.h:64
void * hwaccel_picture_private
Definition: vp9shared.h:67
uint8_t * segmentation_map
Definition: vp9shared.h:62
ThreadFrame tf
Definition: vp9shared.h:60
VP9mvrefPair * mv
Definition: vp9shared.h:63
#define av_free(p)
#define av_malloc_array(a, b)
#define av_freep(p)
#define av_malloc(s)
#define av_log(a,...)
#define src
Definition: vp8dsp.c:255
static int16_t block[64]
Definition: dct.c:116
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
AVPacket * pkt
Definition: movenc.c:59
static void finish(void)
Definition: movenc.c:342
int size
const char * b
Definition: vf_curves.c:118
const char * r
Definition: vf_curves.c:116
AVVideoEncParams * av_video_enc_params_create_side_data(AVFrame *frame, enum AVVideoEncParamsType type, unsigned int nb_blocks)
Allocates memory for AVEncodeInfoFrame plus an array of.
static av_always_inline AVVideoBlockParams * av_video_enc_params_block(AVVideoEncParams *par, unsigned int idx)
@ AV_VIDEO_ENC_PARAMS_VP9
VP9 stores:
Core video DSP helper functions.
uint8_t bits
Definition: vp3data.h:141
VP5 and VP6 compatible video decoder (common features)
int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: vp56rac.c:40
static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob)
Definition: vp56.h:287
static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t(*tree)[2], const uint8_t *probs)
Definition: vp56.h:396
static av_always_inline int vp8_rac_get(VP56RangeCoder *c)
Definition: vp56.h:324
static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c)
vp5689 returns 1 if the end of the stream has been reached, 0 otherwise.
Definition: vp56.h:239
static int vp8_rac_get_uint(VP56RangeCoder *c, int bits)
Definition: vp56.h:340
static void vp9_tile_data_free(VP9TileData *td)
Definition: vp9.c:97
static int read_colorspace_details(AVCodecContext *avctx)
Definition: vp9.c:448
static int vp9_frame_alloc(AVCodecContext *avctx, VP9Frame *f)
Definition: vp9.c:113
static void vp9_frame_unref(AVCodecContext *avctx, VP9Frame *f)
Definition: vp9.c:104
static int update_size(AVCodecContext *avctx, int w, int h)
Definition: vp9.c:189
static void decode_sb_mem(VP9TileData *td, int row, int col, VP9Filter *lflvl, ptrdiff_t yoff, ptrdiff_t uvoff, enum BlockLevel bl)
Definition: vp9.c:1182
static int update_prob(VP56RangeCoder *c, int p)
Definition: vp9.c:390
#define VP9_SYNCCODE
Definition: vp9.c:39
static int init_frames(AVCodecContext *avctx)
Definition: vp9.c:1814
static int decode_frame_header(AVCodecContext *avctx, const uint8_t *data, int size, int *ref)
Definition: vp9.c:510
static int vp9_frame_ref(AVCodecContext *avctx, VP9Frame *dst, VP9Frame *src)
Definition: vp9.c:159
static void vp9_free_entries(AVCodecContext *avctx)
Definition: vp9.c:93
static av_cold int vp9_decode_init(AVCodecContext *avctx)
Definition: vp9.c:1840
static void free_buffers(VP9Context *s)
Definition: vp9.c:1239
static int vp9_alloc_entries(AVCodecContext *avctx, int n)
Definition: vp9.c:94
AVCodec ff_vp9_decoder
Definition: vp9.c:1897
static av_always_inline int inv_recenter_nonneg(int v, int m)
Definition: vp9.c:380
#define HWACCEL_MAX
static av_always_inline int get_sbits_inv(GetBitContext *gb, int n)
Definition: vp9.c:374
static void vp9_decode_flush(AVCodecContext *avctx)
Definition: vp9.c:1803
static void set_tile_offset(int *start, int *end, int idx, int log2_n, int n)
Definition: vp9.c:1231
static int decode_tiles(AVCodecContext *avctx, const uint8_t *data, int size)
Definition: vp9.c:1271
static int vp9_export_enc_params(VP9Context *s, VP9Frame *frame)
Definition: vp9.c:1514
static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl, ptrdiff_t yoff, ptrdiff_t uvoff, enum BlockLevel bl)
Definition: vp9.c:1103
static av_cold int vp9_decode_free(AVCodecContext *avctx)
Definition: vp9.c:1248
static int update_block_buffers(AVCodecContext *avctx)
Definition: vp9.c:313
static int vp9_decode_frame(AVCodecContext *avctx, void *frame, int *got_frame, AVPacket *pkt)
Definition: vp9.c:1566
#define assign(var, type, n)
@ FILTER_SWITCHABLE
Definition: vp9.h:70
@ DC_PRED
Definition: vp9.h:48
@ TX_4X4
Definition: vp9.h:28
@ TX_SWITCHABLE
Definition: vp9.h:33
void ff_vp9_decode_block(VP9TileData *td, int row, int col, VP9Filter *lflvl, ptrdiff_t yoff, ptrdiff_t uvoff, enum BlockLevel bl, enum BlockPartition bp)
Definition: vp9block.c:1263
const ProbContext ff_vp9_default_probs
Definition: vp9data.c:1435
const int16_t ff_vp9_ac_qlookup[3][256]
Definition: vp9data.c:334
const uint8_t ff_vp9_default_kf_partition_probs[4][4][3]
Definition: vp9data.c:41
const int16_t ff_vp9_dc_qlookup[3][256]
Definition: vp9data.c:231
const uint8_t ff_vp9_default_coef_probs[4][2][2][6][6][3]
Definition: vp9data.c:1540
const uint8_t ff_vp9_model_pareto8[256][8]
Definition: vp9data.c:1176
const int8_t ff_vp9_partition_tree[3][2]
Definition: vp9data.c:35
#define REF_INVALID_SCALE
Definition: vp9dec.h:40
void ff_vp9_loopfilter_sb(AVCodecContext *avctx, VP9Filter *lflvl, int row, int col, ptrdiff_t yoff, ptrdiff_t uvoff)
Definition: vp9lpf.c:178
void ff_vp9_adapt_probs(VP9Context *s)
Definition: vp9prob.c:46
#define REF_FRAME_MVPAIR
Definition: vp9shared.h:164
#define REF_FRAME_SEGMAP
Definition: vp9shared.h:165
@ PRED_SWITCHABLE
Definition: vp9shared.h:51
@ PRED_SINGLEREF
Definition: vp9shared.h:49
@ PRED_COMPREF
Definition: vp9shared.h:50
BlockLevel
Definition: vp9shared.h:70
@ BL_64X64
Definition: vp9shared.h:71
@ BL_8X8
Definition: vp9shared.h:74
#define CUR_FRAME
Definition: vp9shared.h:163
@ NEARESTMV
Definition: vp9shared.h:42
BlockPartition
Definition: vp9shared.h:34
@ PARTITION_SPLIT
Definition: vp9shared.h:38
@ PARTITION_H
Definition: vp9shared.h:36
@ PARTITION_NONE
Definition: vp9shared.h:35
@ PARTITION_V
Definition: vp9shared.h:37
static double c[64]