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