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