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