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