1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (C) 2007 Marco Gerards <marco@gnu.org> 3cabdff1aSopenharmony_ci * Copyright (C) 2009 David Conrad 4cabdff1aSopenharmony_ci * Copyright (C) 2011 Jordi Ortiz 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * Dirac Decoder 26cabdff1aSopenharmony_ci * @author Marco Gerards <marco@gnu.org>, David Conrad, Jordi Ortiz <nenjordi@gmail.com> 27cabdff1aSopenharmony_ci */ 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 30cabdff1aSopenharmony_ci#include "libavutil/pixdesc.h" 31cabdff1aSopenharmony_ci#include "libavutil/thread.h" 32cabdff1aSopenharmony_ci#include "avcodec.h" 33cabdff1aSopenharmony_ci#include "get_bits.h" 34cabdff1aSopenharmony_ci#include "bytestream.h" 35cabdff1aSopenharmony_ci#include "codec_internal.h" 36cabdff1aSopenharmony_ci#include "internal.h" 37cabdff1aSopenharmony_ci#include "golomb.h" 38cabdff1aSopenharmony_ci#include "dirac_arith.h" 39cabdff1aSopenharmony_ci#include "dirac_vlc.h" 40cabdff1aSopenharmony_ci#include "mpeg12data.h" 41cabdff1aSopenharmony_ci#include "mpegpicture.h" 42cabdff1aSopenharmony_ci#include "mpegvideoencdsp.h" 43cabdff1aSopenharmony_ci#include "dirac_dwt.h" 44cabdff1aSopenharmony_ci#include "dirac.h" 45cabdff1aSopenharmony_ci#include "diractab.h" 46cabdff1aSopenharmony_ci#include "diracdsp.h" 47cabdff1aSopenharmony_ci#include "videodsp.h" 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci/** 50cabdff1aSopenharmony_ci * The spec limits this to 3 for frame coding, but in practice can be as high as 6 51cabdff1aSopenharmony_ci */ 52cabdff1aSopenharmony_ci#define MAX_REFERENCE_FRAMES 8 53cabdff1aSopenharmony_ci#define MAX_DELAY 5 /* limit for main profile for frame coding (TODO: field coding) */ 54cabdff1aSopenharmony_ci#define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1) 55cabdff1aSopenharmony_ci#define MAX_QUANT 255 /* max quant for VC-2 */ 56cabdff1aSopenharmony_ci#define MAX_BLOCKSIZE 32 /* maximum xblen/yblen we support */ 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci/** 59cabdff1aSopenharmony_ci * DiracBlock->ref flags, if set then the block does MC from the given ref 60cabdff1aSopenharmony_ci */ 61cabdff1aSopenharmony_ci#define DIRAC_REF_MASK_REF1 1 62cabdff1aSopenharmony_ci#define DIRAC_REF_MASK_REF2 2 63cabdff1aSopenharmony_ci#define DIRAC_REF_MASK_GLOBAL 4 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci/** 66cabdff1aSopenharmony_ci * Value of Picture.reference when Picture is not a reference picture, but 67cabdff1aSopenharmony_ci * is held for delayed output. 68cabdff1aSopenharmony_ci */ 69cabdff1aSopenharmony_ci#define DELAYED_PIC_REF 4 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci#define CALC_PADDING(size, depth) \ 72cabdff1aSopenharmony_ci (((size + (1 << depth) - 1) >> depth) << depth) 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci#define DIVRNDUP(a, b) (((a) + (b) - 1) / (b)) 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_citypedef struct { 77cabdff1aSopenharmony_ci AVFrame *avframe; 78cabdff1aSopenharmony_ci int interpolated[3]; /* 1 if hpel[] is valid */ 79cabdff1aSopenharmony_ci uint8_t *hpel[3][4]; 80cabdff1aSopenharmony_ci uint8_t *hpel_base[3][4]; 81cabdff1aSopenharmony_ci int reference; 82cabdff1aSopenharmony_ci} DiracFrame; 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_citypedef struct { 85cabdff1aSopenharmony_ci union { 86cabdff1aSopenharmony_ci int16_t mv[2][2]; 87cabdff1aSopenharmony_ci int16_t dc[3]; 88cabdff1aSopenharmony_ci } u; /* anonymous unions aren't in C99 :( */ 89cabdff1aSopenharmony_ci uint8_t ref; 90cabdff1aSopenharmony_ci} DiracBlock; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_citypedef struct SubBand { 93cabdff1aSopenharmony_ci int level; 94cabdff1aSopenharmony_ci int orientation; 95cabdff1aSopenharmony_ci int stride; /* in bytes */ 96cabdff1aSopenharmony_ci int width; 97cabdff1aSopenharmony_ci int height; 98cabdff1aSopenharmony_ci int pshift; 99cabdff1aSopenharmony_ci int quant; 100cabdff1aSopenharmony_ci uint8_t *ibuf; 101cabdff1aSopenharmony_ci struct SubBand *parent; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci /* for low delay */ 104cabdff1aSopenharmony_ci unsigned length; 105cabdff1aSopenharmony_ci const uint8_t *coeff_data; 106cabdff1aSopenharmony_ci} SubBand; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_citypedef struct Plane { 109cabdff1aSopenharmony_ci DWTPlane idwt; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci int width; 112cabdff1aSopenharmony_ci int height; 113cabdff1aSopenharmony_ci ptrdiff_t stride; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci /* block length */ 116cabdff1aSopenharmony_ci uint8_t xblen; 117cabdff1aSopenharmony_ci uint8_t yblen; 118cabdff1aSopenharmony_ci /* block separation (block n+1 starts after this many pixels in block n) */ 119cabdff1aSopenharmony_ci uint8_t xbsep; 120cabdff1aSopenharmony_ci uint8_t ybsep; 121cabdff1aSopenharmony_ci /* amount of overspill on each edge (half of the overlap between blocks) */ 122cabdff1aSopenharmony_ci uint8_t xoffset; 123cabdff1aSopenharmony_ci uint8_t yoffset; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci SubBand band[MAX_DWT_LEVELS][4]; 126cabdff1aSopenharmony_ci} Plane; 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci/* Used by Low Delay and High Quality profiles */ 129cabdff1aSopenharmony_citypedef struct DiracSlice { 130cabdff1aSopenharmony_ci GetBitContext gb; 131cabdff1aSopenharmony_ci int slice_x; 132cabdff1aSopenharmony_ci int slice_y; 133cabdff1aSopenharmony_ci int bytes; 134cabdff1aSopenharmony_ci} DiracSlice; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_citypedef struct DiracContext { 137cabdff1aSopenharmony_ci AVCodecContext *avctx; 138cabdff1aSopenharmony_ci MpegvideoEncDSPContext mpvencdsp; 139cabdff1aSopenharmony_ci VideoDSPContext vdsp; 140cabdff1aSopenharmony_ci DiracDSPContext diracdsp; 141cabdff1aSopenharmony_ci DiracVersionInfo version; 142cabdff1aSopenharmony_ci GetBitContext gb; 143cabdff1aSopenharmony_ci AVDiracSeqHeader seq; 144cabdff1aSopenharmony_ci int seen_sequence_header; 145cabdff1aSopenharmony_ci int64_t frame_number; /* number of the next frame to display */ 146cabdff1aSopenharmony_ci Plane plane[3]; 147cabdff1aSopenharmony_ci int chroma_x_shift; 148cabdff1aSopenharmony_ci int chroma_y_shift; 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci int bit_depth; /* bit depth */ 151cabdff1aSopenharmony_ci int pshift; /* pixel shift = bit_depth > 8 */ 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ci int zero_res; /* zero residue flag */ 154cabdff1aSopenharmony_ci int is_arith; /* whether coeffs use arith or golomb coding */ 155cabdff1aSopenharmony_ci int core_syntax; /* use core syntax only */ 156cabdff1aSopenharmony_ci int low_delay; /* use the low delay syntax */ 157cabdff1aSopenharmony_ci int hq_picture; /* high quality picture, enables low_delay */ 158cabdff1aSopenharmony_ci int ld_picture; /* use low delay picture, turns on low_delay */ 159cabdff1aSopenharmony_ci int dc_prediction; /* has dc prediction */ 160cabdff1aSopenharmony_ci int globalmc_flag; /* use global motion compensation */ 161cabdff1aSopenharmony_ci int num_refs; /* number of reference pictures */ 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci /* wavelet decoding */ 164cabdff1aSopenharmony_ci unsigned wavelet_depth; /* depth of the IDWT */ 165cabdff1aSopenharmony_ci unsigned wavelet_idx; 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci /** 168cabdff1aSopenharmony_ci * schroedinger older than 1.0.8 doesn't store 169cabdff1aSopenharmony_ci * quant delta if only one codebook exists in a band 170cabdff1aSopenharmony_ci */ 171cabdff1aSopenharmony_ci unsigned old_delta_quant; 172cabdff1aSopenharmony_ci unsigned codeblock_mode; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci unsigned num_x; /* number of horizontal slices */ 175cabdff1aSopenharmony_ci unsigned num_y; /* number of vertical slices */ 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci uint8_t *thread_buf; /* Per-thread buffer for coefficient storage */ 178cabdff1aSopenharmony_ci int threads_num_buf; /* Current # of buffers allocated */ 179cabdff1aSopenharmony_ci int thread_buf_size; /* Each thread has a buffer this size */ 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci DiracSlice *slice_params_buf; 182cabdff1aSopenharmony_ci int slice_params_num_buf; 183cabdff1aSopenharmony_ci 184cabdff1aSopenharmony_ci struct { 185cabdff1aSopenharmony_ci unsigned width; 186cabdff1aSopenharmony_ci unsigned height; 187cabdff1aSopenharmony_ci } codeblock[MAX_DWT_LEVELS+1]; 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci struct { 190cabdff1aSopenharmony_ci AVRational bytes; /* average bytes per slice */ 191cabdff1aSopenharmony_ci uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */ 192cabdff1aSopenharmony_ci } lowdelay; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci struct { 195cabdff1aSopenharmony_ci unsigned prefix_bytes; 196cabdff1aSopenharmony_ci uint64_t size_scaler; 197cabdff1aSopenharmony_ci } highquality; 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci struct { 200cabdff1aSopenharmony_ci int pan_tilt[2]; /* pan/tilt vector */ 201cabdff1aSopenharmony_ci int zrs[2][2]; /* zoom/rotate/shear matrix */ 202cabdff1aSopenharmony_ci int perspective[2]; /* perspective vector */ 203cabdff1aSopenharmony_ci unsigned zrs_exp; 204cabdff1aSopenharmony_ci unsigned perspective_exp; 205cabdff1aSopenharmony_ci } globalmc[2]; 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci /* motion compensation */ 208cabdff1aSopenharmony_ci uint8_t mv_precision; /* [DIRAC_STD] REFS_WT_PRECISION */ 209cabdff1aSopenharmony_ci int16_t weight[2]; /* [DIRAC_STD] REF1_WT and REF2_WT */ 210cabdff1aSopenharmony_ci unsigned weight_log2denom; /* [DIRAC_STD] REFS_WT_PRECISION */ 211cabdff1aSopenharmony_ci 212cabdff1aSopenharmony_ci int blwidth; /* number of blocks (horizontally) */ 213cabdff1aSopenharmony_ci int blheight; /* number of blocks (vertically) */ 214cabdff1aSopenharmony_ci int sbwidth; /* number of superblocks (horizontally) */ 215cabdff1aSopenharmony_ci int sbheight; /* number of superblocks (vertically) */ 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci uint8_t *sbsplit; 218cabdff1aSopenharmony_ci DiracBlock *blmotion; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci uint8_t *edge_emu_buffer[4]; 221cabdff1aSopenharmony_ci uint8_t *edge_emu_buffer_base; 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci uint16_t *mctmp; /* buffer holding the MC data multiplied by OBMC weights */ 224cabdff1aSopenharmony_ci uint8_t *mcscratch; 225cabdff1aSopenharmony_ci int buffer_stride; 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, uint8_t, obmc_weight)[3][MAX_BLOCKSIZE*MAX_BLOCKSIZE]; 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci void (*put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h); 230cabdff1aSopenharmony_ci void (*avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h); 231cabdff1aSopenharmony_ci void (*add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen); 232cabdff1aSopenharmony_ci dirac_weight_func weight_func; 233cabdff1aSopenharmony_ci dirac_biweight_func biweight_func; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci DiracFrame *current_picture; 236cabdff1aSopenharmony_ci DiracFrame *ref_pics[2]; 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci DiracFrame *ref_frames[MAX_REFERENCE_FRAMES+1]; 239cabdff1aSopenharmony_ci DiracFrame *delay_frames[MAX_DELAY+1]; 240cabdff1aSopenharmony_ci DiracFrame all_frames[MAX_FRAMES]; 241cabdff1aSopenharmony_ci} DiracContext; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_cienum dirac_subband { 244cabdff1aSopenharmony_ci subband_ll = 0, 245cabdff1aSopenharmony_ci subband_hl = 1, 246cabdff1aSopenharmony_ci subband_lh = 2, 247cabdff1aSopenharmony_ci subband_hh = 3, 248cabdff1aSopenharmony_ci subband_nb, 249cabdff1aSopenharmony_ci}; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci/* magic number division by 3 from schroedinger */ 252cabdff1aSopenharmony_cistatic inline int divide3(int x) 253cabdff1aSopenharmony_ci{ 254cabdff1aSopenharmony_ci return (int)((x+1U)*21845 + 10922) >> 16; 255cabdff1aSopenharmony_ci} 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_cistatic DiracFrame *remove_frame(DiracFrame *framelist[], int picnum) 258cabdff1aSopenharmony_ci{ 259cabdff1aSopenharmony_ci DiracFrame *remove_pic = NULL; 260cabdff1aSopenharmony_ci int i, remove_idx = -1; 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci for (i = 0; framelist[i]; i++) 263cabdff1aSopenharmony_ci if (framelist[i]->avframe->display_picture_number == picnum) { 264cabdff1aSopenharmony_ci remove_pic = framelist[i]; 265cabdff1aSopenharmony_ci remove_idx = i; 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci if (remove_pic) 269cabdff1aSopenharmony_ci for (i = remove_idx; framelist[i]; i++) 270cabdff1aSopenharmony_ci framelist[i] = framelist[i+1]; 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci return remove_pic; 273cabdff1aSopenharmony_ci} 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_cistatic int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame) 276cabdff1aSopenharmony_ci{ 277cabdff1aSopenharmony_ci int i; 278cabdff1aSopenharmony_ci for (i = 0; i < maxframes; i++) 279cabdff1aSopenharmony_ci if (!framelist[i]) { 280cabdff1aSopenharmony_ci framelist[i] = frame; 281cabdff1aSopenharmony_ci return 0; 282cabdff1aSopenharmony_ci } 283cabdff1aSopenharmony_ci return -1; 284cabdff1aSopenharmony_ci} 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_cistatic int alloc_sequence_buffers(DiracContext *s) 287cabdff1aSopenharmony_ci{ 288cabdff1aSopenharmony_ci int sbwidth = DIVRNDUP(s->seq.width, 4); 289cabdff1aSopenharmony_ci int sbheight = DIVRNDUP(s->seq.height, 4); 290cabdff1aSopenharmony_ci int i, w, h, top_padding; 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci /* todo: think more about this / use or set Plane here */ 293cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 294cabdff1aSopenharmony_ci int max_xblen = MAX_BLOCKSIZE >> (i ? s->chroma_x_shift : 0); 295cabdff1aSopenharmony_ci int max_yblen = MAX_BLOCKSIZE >> (i ? s->chroma_y_shift : 0); 296cabdff1aSopenharmony_ci w = s->seq.width >> (i ? s->chroma_x_shift : 0); 297cabdff1aSopenharmony_ci h = s->seq.height >> (i ? s->chroma_y_shift : 0); 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci /* we allocate the max we support here since num decompositions can 300cabdff1aSopenharmony_ci * change from frame to frame. Stride is aligned to 16 for SIMD, and 301cabdff1aSopenharmony_ci * 1<<MAX_DWT_LEVELS top padding to avoid if(y>0) in arith decoding 302cabdff1aSopenharmony_ci * MAX_BLOCKSIZE padding for MC: blocks can spill up to half of that 303cabdff1aSopenharmony_ci * on each side */ 304cabdff1aSopenharmony_ci top_padding = FFMAX(1<<MAX_DWT_LEVELS, max_yblen/2); 305cabdff1aSopenharmony_ci w = FFALIGN(CALC_PADDING(w, MAX_DWT_LEVELS), 8); /* FIXME: Should this be 16 for SSE??? */ 306cabdff1aSopenharmony_ci h = top_padding + CALC_PADDING(h, MAX_DWT_LEVELS) + max_yblen/2; 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci s->plane[i].idwt.buf_base = av_calloc(w + max_xblen, h * (2 << s->pshift)); 309cabdff1aSopenharmony_ci s->plane[i].idwt.tmp = av_malloc_array((w+16), 2 << s->pshift); 310cabdff1aSopenharmony_ci s->plane[i].idwt.buf = s->plane[i].idwt.buf_base + (top_padding*w)*(2 << s->pshift); 311cabdff1aSopenharmony_ci if (!s->plane[i].idwt.buf_base || !s->plane[i].idwt.tmp) 312cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 313cabdff1aSopenharmony_ci } 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci /* fixme: allocate using real stride here */ 316cabdff1aSopenharmony_ci s->sbsplit = av_malloc_array(sbwidth, sbheight); 317cabdff1aSopenharmony_ci s->blmotion = av_malloc_array(sbwidth, sbheight * 16 * sizeof(*s->blmotion)); 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (!s->sbsplit || !s->blmotion) 320cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 321cabdff1aSopenharmony_ci return 0; 322cabdff1aSopenharmony_ci} 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_cistatic int alloc_buffers(DiracContext *s, int stride) 325cabdff1aSopenharmony_ci{ 326cabdff1aSopenharmony_ci int w = s->seq.width; 327cabdff1aSopenharmony_ci int h = s->seq.height; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci av_assert0(stride >= w); 330cabdff1aSopenharmony_ci stride += 64; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci if (s->buffer_stride >= stride) 333cabdff1aSopenharmony_ci return 0; 334cabdff1aSopenharmony_ci s->buffer_stride = 0; 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ci av_freep(&s->edge_emu_buffer_base); 337cabdff1aSopenharmony_ci memset(s->edge_emu_buffer, 0, sizeof(s->edge_emu_buffer)); 338cabdff1aSopenharmony_ci av_freep(&s->mctmp); 339cabdff1aSopenharmony_ci av_freep(&s->mcscratch); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci s->edge_emu_buffer_base = av_malloc_array(stride, MAX_BLOCKSIZE); 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci s->mctmp = av_malloc_array((stride+MAX_BLOCKSIZE), (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp)); 344cabdff1aSopenharmony_ci s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE); 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch) 347cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 348cabdff1aSopenharmony_ci 349cabdff1aSopenharmony_ci s->buffer_stride = stride; 350cabdff1aSopenharmony_ci return 0; 351cabdff1aSopenharmony_ci} 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_cistatic void free_sequence_buffers(DiracContext *s) 354cabdff1aSopenharmony_ci{ 355cabdff1aSopenharmony_ci int i, j, k; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci for (i = 0; i < MAX_FRAMES; i++) { 358cabdff1aSopenharmony_ci if (s->all_frames[i].avframe->data[0]) { 359cabdff1aSopenharmony_ci av_frame_unref(s->all_frames[i].avframe); 360cabdff1aSopenharmony_ci memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated)); 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci for (j = 0; j < 3; j++) 364cabdff1aSopenharmony_ci for (k = 1; k < 4; k++) 365cabdff1aSopenharmony_ci av_freep(&s->all_frames[i].hpel_base[j][k]); 366cabdff1aSopenharmony_ci } 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci memset(s->ref_frames, 0, sizeof(s->ref_frames)); 369cabdff1aSopenharmony_ci memset(s->delay_frames, 0, sizeof(s->delay_frames)); 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 372cabdff1aSopenharmony_ci av_freep(&s->plane[i].idwt.buf_base); 373cabdff1aSopenharmony_ci av_freep(&s->plane[i].idwt.tmp); 374cabdff1aSopenharmony_ci } 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci s->buffer_stride = 0; 377cabdff1aSopenharmony_ci av_freep(&s->sbsplit); 378cabdff1aSopenharmony_ci av_freep(&s->blmotion); 379cabdff1aSopenharmony_ci av_freep(&s->edge_emu_buffer_base); 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci av_freep(&s->mctmp); 382cabdff1aSopenharmony_ci av_freep(&s->mcscratch); 383cabdff1aSopenharmony_ci} 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_cistatic AVOnce dirac_arith_init = AV_ONCE_INIT; 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_cistatic av_cold int dirac_decode_init(AVCodecContext *avctx) 388cabdff1aSopenharmony_ci{ 389cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 390cabdff1aSopenharmony_ci int i, ret; 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ci s->avctx = avctx; 393cabdff1aSopenharmony_ci s->frame_number = -1; 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci s->thread_buf = NULL; 396cabdff1aSopenharmony_ci s->threads_num_buf = -1; 397cabdff1aSopenharmony_ci s->thread_buf_size = -1; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci ff_diracdsp_init(&s->diracdsp); 400cabdff1aSopenharmony_ci ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx); 401cabdff1aSopenharmony_ci ff_videodsp_init(&s->vdsp, 8); 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci for (i = 0; i < MAX_FRAMES; i++) { 404cabdff1aSopenharmony_ci s->all_frames[i].avframe = av_frame_alloc(); 405cabdff1aSopenharmony_ci if (!s->all_frames[i].avframe) { 406cabdff1aSopenharmony_ci while (i > 0) 407cabdff1aSopenharmony_ci av_frame_free(&s->all_frames[--i].avframe); 408cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 409cabdff1aSopenharmony_ci } 410cabdff1aSopenharmony_ci } 411cabdff1aSopenharmony_ci ret = ff_thread_once(&dirac_arith_init, ff_dirac_init_arith_tables); 412cabdff1aSopenharmony_ci if (ret != 0) 413cabdff1aSopenharmony_ci return AVERROR_UNKNOWN; 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci return 0; 416cabdff1aSopenharmony_ci} 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_cistatic void dirac_decode_flush(AVCodecContext *avctx) 419cabdff1aSopenharmony_ci{ 420cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 421cabdff1aSopenharmony_ci free_sequence_buffers(s); 422cabdff1aSopenharmony_ci s->seen_sequence_header = 0; 423cabdff1aSopenharmony_ci s->frame_number = -1; 424cabdff1aSopenharmony_ci} 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_cistatic av_cold int dirac_decode_end(AVCodecContext *avctx) 427cabdff1aSopenharmony_ci{ 428cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 429cabdff1aSopenharmony_ci int i; 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_ci dirac_decode_flush(avctx); 432cabdff1aSopenharmony_ci for (i = 0; i < MAX_FRAMES; i++) 433cabdff1aSopenharmony_ci av_frame_free(&s->all_frames[i].avframe); 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci av_freep(&s->thread_buf); 436cabdff1aSopenharmony_ci av_freep(&s->slice_params_buf); 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci return 0; 439cabdff1aSopenharmony_ci} 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_cistatic inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset) 442cabdff1aSopenharmony_ci{ 443cabdff1aSopenharmony_ci int coeff = dirac_get_se_golomb(gb); 444cabdff1aSopenharmony_ci const unsigned sign = FFSIGN(coeff); 445cabdff1aSopenharmony_ci if (coeff) 446cabdff1aSopenharmony_ci coeff = sign*((sign * coeff * qfactor + qoffset) >> 2); 447cabdff1aSopenharmony_ci return coeff; 448cabdff1aSopenharmony_ci} 449cabdff1aSopenharmony_ci 450cabdff1aSopenharmony_ci#define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0)) 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ci#define UNPACK_ARITH(n, type) \ 453cabdff1aSopenharmony_ci static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \ 454cabdff1aSopenharmony_ci SubBand *b, type *buf, int x, int y) \ 455cabdff1aSopenharmony_ci { \ 456cabdff1aSopenharmony_ci int sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \ 457cabdff1aSopenharmony_ci unsigned coeff; \ 458cabdff1aSopenharmony_ci const int mstride = -(b->stride >> (1+b->pshift)); \ 459cabdff1aSopenharmony_ci if (b->parent) { \ 460cabdff1aSopenharmony_ci const type *pbuf = (type *)b->parent->ibuf; \ 461cabdff1aSopenharmony_ci const int stride = b->parent->stride >> (1+b->parent->pshift); \ 462cabdff1aSopenharmony_ci pred_ctx += !!pbuf[stride * (y>>1) + (x>>1)] << 1; \ 463cabdff1aSopenharmony_ci } \ 464cabdff1aSopenharmony_ci if (b->orientation == subband_hl) \ 465cabdff1aSopenharmony_ci sign_pred = buf[mstride]; \ 466cabdff1aSopenharmony_ci if (x) { \ 467cabdff1aSopenharmony_ci pred_ctx += !(buf[-1] | buf[mstride] | buf[-1 + mstride]); \ 468cabdff1aSopenharmony_ci if (b->orientation == subband_lh) \ 469cabdff1aSopenharmony_ci sign_pred = buf[-1]; \ 470cabdff1aSopenharmony_ci } else { \ 471cabdff1aSopenharmony_ci pred_ctx += !buf[mstride]; \ 472cabdff1aSopenharmony_ci } \ 473cabdff1aSopenharmony_ci coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA); \ 474cabdff1aSopenharmony_ci if (coeff) { \ 475cabdff1aSopenharmony_ci coeff = (coeff * qfactor + qoffset) >> 2; \ 476cabdff1aSopenharmony_ci sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred)); \ 477cabdff1aSopenharmony_ci coeff = (coeff ^ -sign) + sign; \ 478cabdff1aSopenharmony_ci } \ 479cabdff1aSopenharmony_ci *buf = coeff; \ 480cabdff1aSopenharmony_ci } \ 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ciUNPACK_ARITH(8, int16_t) 483cabdff1aSopenharmony_ciUNPACK_ARITH(10, int32_t) 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_ci/** 486cabdff1aSopenharmony_ci * Decode the coeffs in the rectangle defined by left, right, top, bottom 487cabdff1aSopenharmony_ci * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock() 488cabdff1aSopenharmony_ci */ 489cabdff1aSopenharmony_cistatic inline int codeblock(DiracContext *s, SubBand *b, 490cabdff1aSopenharmony_ci GetBitContext *gb, DiracArith *c, 491cabdff1aSopenharmony_ci int left, int right, int top, int bottom, 492cabdff1aSopenharmony_ci int blockcnt_one, int is_arith) 493cabdff1aSopenharmony_ci{ 494cabdff1aSopenharmony_ci int x, y, zero_block; 495cabdff1aSopenharmony_ci int qoffset, qfactor; 496cabdff1aSopenharmony_ci uint8_t *buf; 497cabdff1aSopenharmony_ci 498cabdff1aSopenharmony_ci /* check for any coded coefficients in this codeblock */ 499cabdff1aSopenharmony_ci if (!blockcnt_one) { 500cabdff1aSopenharmony_ci if (is_arith) 501cabdff1aSopenharmony_ci zero_block = dirac_get_arith_bit(c, CTX_ZERO_BLOCK); 502cabdff1aSopenharmony_ci else 503cabdff1aSopenharmony_ci zero_block = get_bits1(gb); 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci if (zero_block) 506cabdff1aSopenharmony_ci return 0; 507cabdff1aSopenharmony_ci } 508cabdff1aSopenharmony_ci 509cabdff1aSopenharmony_ci if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) { 510cabdff1aSopenharmony_ci int quant; 511cabdff1aSopenharmony_ci if (is_arith) 512cabdff1aSopenharmony_ci quant = dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA); 513cabdff1aSopenharmony_ci else 514cabdff1aSopenharmony_ci quant = dirac_get_se_golomb(gb); 515cabdff1aSopenharmony_ci if (quant > INT_MAX - b->quant || b->quant + quant < 0) { 516cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n"); 517cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 518cabdff1aSopenharmony_ci } 519cabdff1aSopenharmony_ci b->quant += quant; 520cabdff1aSopenharmony_ci } 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) { 523cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported quant %d\n", b->quant); 524cabdff1aSopenharmony_ci b->quant = 0; 525cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 526cabdff1aSopenharmony_ci } 527cabdff1aSopenharmony_ci 528cabdff1aSopenharmony_ci qfactor = ff_dirac_qscale_tab[b->quant]; 529cabdff1aSopenharmony_ci /* TODO: context pointer? */ 530cabdff1aSopenharmony_ci if (!s->num_refs) 531cabdff1aSopenharmony_ci qoffset = ff_dirac_qoffset_intra_tab[b->quant] + 2; 532cabdff1aSopenharmony_ci else 533cabdff1aSopenharmony_ci qoffset = ff_dirac_qoffset_inter_tab[b->quant] + 2; 534cabdff1aSopenharmony_ci 535cabdff1aSopenharmony_ci buf = b->ibuf + top * b->stride; 536cabdff1aSopenharmony_ci if (is_arith) { 537cabdff1aSopenharmony_ci for (y = top; y < bottom; y++) { 538cabdff1aSopenharmony_ci if (c->error) 539cabdff1aSopenharmony_ci return c->error; 540cabdff1aSopenharmony_ci for (x = left; x < right; x++) { 541cabdff1aSopenharmony_ci if (b->pshift) { 542cabdff1aSopenharmony_ci coeff_unpack_arith_10(c, qfactor, qoffset, b, (int32_t*)(buf)+x, x, y); 543cabdff1aSopenharmony_ci } else { 544cabdff1aSopenharmony_ci coeff_unpack_arith_8(c, qfactor, qoffset, b, (int16_t*)(buf)+x, x, y); 545cabdff1aSopenharmony_ci } 546cabdff1aSopenharmony_ci } 547cabdff1aSopenharmony_ci buf += b->stride; 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci } else { 550cabdff1aSopenharmony_ci for (y = top; y < bottom; y++) { 551cabdff1aSopenharmony_ci if (get_bits_left(gb) < 1) 552cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 553cabdff1aSopenharmony_ci for (x = left; x < right; x++) { 554cabdff1aSopenharmony_ci int val = coeff_unpack_golomb(gb, qfactor, qoffset); 555cabdff1aSopenharmony_ci if (b->pshift) { 556cabdff1aSopenharmony_ci AV_WN32(&buf[4*x], val); 557cabdff1aSopenharmony_ci } else { 558cabdff1aSopenharmony_ci AV_WN16(&buf[2*x], val); 559cabdff1aSopenharmony_ci } 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci buf += b->stride; 562cabdff1aSopenharmony_ci } 563cabdff1aSopenharmony_ci } 564cabdff1aSopenharmony_ci return 0; 565cabdff1aSopenharmony_ci} 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci/** 568cabdff1aSopenharmony_ci * Dirac Specification -> 569cabdff1aSopenharmony_ci * 13.3 intra_dc_prediction(band) 570cabdff1aSopenharmony_ci */ 571cabdff1aSopenharmony_ci#define INTRA_DC_PRED(n, type) \ 572cabdff1aSopenharmony_ci static inline void intra_dc_prediction_##n(SubBand *b) \ 573cabdff1aSopenharmony_ci { \ 574cabdff1aSopenharmony_ci type *buf = (type*)b->ibuf; \ 575cabdff1aSopenharmony_ci int x, y; \ 576cabdff1aSopenharmony_ci \ 577cabdff1aSopenharmony_ci for (x = 1; x < b->width; x++) \ 578cabdff1aSopenharmony_ci buf[x] += buf[x-1]; \ 579cabdff1aSopenharmony_ci buf += (b->stride >> (1+b->pshift)); \ 580cabdff1aSopenharmony_ci \ 581cabdff1aSopenharmony_ci for (y = 1; y < b->height; y++) { \ 582cabdff1aSopenharmony_ci buf[0] += buf[-(b->stride >> (1+b->pshift))]; \ 583cabdff1aSopenharmony_ci \ 584cabdff1aSopenharmony_ci for (x = 1; x < b->width; x++) { \ 585cabdff1aSopenharmony_ci int pred = buf[x - 1] + buf[x - (b->stride >> (1+b->pshift))] + buf[x - (b->stride >> (1+b->pshift))-1]; \ 586cabdff1aSopenharmony_ci buf[x] += divide3(pred); \ 587cabdff1aSopenharmony_ci } \ 588cabdff1aSopenharmony_ci buf += (b->stride >> (1+b->pshift)); \ 589cabdff1aSopenharmony_ci } \ 590cabdff1aSopenharmony_ci } \ 591cabdff1aSopenharmony_ci 592cabdff1aSopenharmony_ciINTRA_DC_PRED(8, int16_t) 593cabdff1aSopenharmony_ciINTRA_DC_PRED(10, uint32_t) 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_ci/** 596cabdff1aSopenharmony_ci * Dirac Specification -> 597cabdff1aSopenharmony_ci * 13.4.2 Non-skipped subbands. subband_coeffs() 598cabdff1aSopenharmony_ci */ 599cabdff1aSopenharmony_cistatic av_always_inline int decode_subband_internal(DiracContext *s, SubBand *b, int is_arith) 600cabdff1aSopenharmony_ci{ 601cabdff1aSopenharmony_ci int cb_x, cb_y, left, right, top, bottom; 602cabdff1aSopenharmony_ci DiracArith c; 603cabdff1aSopenharmony_ci GetBitContext gb; 604cabdff1aSopenharmony_ci int cb_width = s->codeblock[b->level + (b->orientation != subband_ll)].width; 605cabdff1aSopenharmony_ci int cb_height = s->codeblock[b->level + (b->orientation != subband_ll)].height; 606cabdff1aSopenharmony_ci int blockcnt_one = (cb_width + cb_height) == 2; 607cabdff1aSopenharmony_ci int ret; 608cabdff1aSopenharmony_ci 609cabdff1aSopenharmony_ci if (!b->length) 610cabdff1aSopenharmony_ci return 0; 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci init_get_bits8(&gb, b->coeff_data, b->length); 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci if (is_arith) 615cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(&c, &gb, b->length); 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci top = 0; 618cabdff1aSopenharmony_ci for (cb_y = 0; cb_y < cb_height; cb_y++) { 619cabdff1aSopenharmony_ci bottom = (b->height * (cb_y+1LL)) / cb_height; 620cabdff1aSopenharmony_ci left = 0; 621cabdff1aSopenharmony_ci for (cb_x = 0; cb_x < cb_width; cb_x++) { 622cabdff1aSopenharmony_ci right = (b->width * (cb_x+1LL)) / cb_width; 623cabdff1aSopenharmony_ci ret = codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith); 624cabdff1aSopenharmony_ci if (ret < 0) 625cabdff1aSopenharmony_ci return ret; 626cabdff1aSopenharmony_ci left = right; 627cabdff1aSopenharmony_ci } 628cabdff1aSopenharmony_ci top = bottom; 629cabdff1aSopenharmony_ci } 630cabdff1aSopenharmony_ci 631cabdff1aSopenharmony_ci if (b->orientation == subband_ll && s->num_refs == 0) { 632cabdff1aSopenharmony_ci if (s->pshift) { 633cabdff1aSopenharmony_ci intra_dc_prediction_10(b); 634cabdff1aSopenharmony_ci } else { 635cabdff1aSopenharmony_ci intra_dc_prediction_8(b); 636cabdff1aSopenharmony_ci } 637cabdff1aSopenharmony_ci } 638cabdff1aSopenharmony_ci return 0; 639cabdff1aSopenharmony_ci} 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_cistatic int decode_subband_arith(AVCodecContext *avctx, void *b) 642cabdff1aSopenharmony_ci{ 643cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 644cabdff1aSopenharmony_ci return decode_subband_internal(s, b, 1); 645cabdff1aSopenharmony_ci} 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_cistatic int decode_subband_golomb(AVCodecContext *avctx, void *arg) 648cabdff1aSopenharmony_ci{ 649cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 650cabdff1aSopenharmony_ci SubBand **b = arg; 651cabdff1aSopenharmony_ci return decode_subband_internal(s, *b, 0); 652cabdff1aSopenharmony_ci} 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_ci/** 655cabdff1aSopenharmony_ci * Dirac Specification -> 656cabdff1aSopenharmony_ci * [DIRAC_STD] 13.4.1 core_transform_data() 657cabdff1aSopenharmony_ci */ 658cabdff1aSopenharmony_cistatic int decode_component(DiracContext *s, int comp) 659cabdff1aSopenharmony_ci{ 660cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 661cabdff1aSopenharmony_ci SubBand *bands[3*MAX_DWT_LEVELS+1]; 662cabdff1aSopenharmony_ci enum dirac_subband orientation; 663cabdff1aSopenharmony_ci int level, num_bands = 0; 664cabdff1aSopenharmony_ci int ret[3*MAX_DWT_LEVELS+1]; 665cabdff1aSopenharmony_ci int i; 666cabdff1aSopenharmony_ci int damaged_count = 0; 667cabdff1aSopenharmony_ci 668cabdff1aSopenharmony_ci /* Unpack all subbands at all levels. */ 669cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) { 670cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 671cabdff1aSopenharmony_ci SubBand *b = &s->plane[comp].band[level][orientation]; 672cabdff1aSopenharmony_ci bands[num_bands++] = b; 673cabdff1aSopenharmony_ci 674cabdff1aSopenharmony_ci align_get_bits(&s->gb); 675cabdff1aSopenharmony_ci /* [DIRAC_STD] 13.4.2 subband() */ 676cabdff1aSopenharmony_ci b->length = get_interleaved_ue_golomb(&s->gb); 677cabdff1aSopenharmony_ci if (b->length) { 678cabdff1aSopenharmony_ci b->quant = get_interleaved_ue_golomb(&s->gb); 679cabdff1aSopenharmony_ci if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) { 680cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported quant %d\n", b->quant); 681cabdff1aSopenharmony_ci b->quant = 0; 682cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 683cabdff1aSopenharmony_ci } 684cabdff1aSopenharmony_ci align_get_bits(&s->gb); 685cabdff1aSopenharmony_ci b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8; 686cabdff1aSopenharmony_ci if (b->length > FFMAX(get_bits_left(&s->gb)/8, 0)) { 687cabdff1aSopenharmony_ci b->length = FFMAX(get_bits_left(&s->gb)/8, 0); 688cabdff1aSopenharmony_ci damaged_count ++; 689cabdff1aSopenharmony_ci } 690cabdff1aSopenharmony_ci skip_bits_long(&s->gb, b->length*8); 691cabdff1aSopenharmony_ci } 692cabdff1aSopenharmony_ci } 693cabdff1aSopenharmony_ci /* arithmetic coding has inter-level dependencies, so we can only execute one level at a time */ 694cabdff1aSopenharmony_ci if (s->is_arith) 695cabdff1aSopenharmony_ci avctx->execute(avctx, decode_subband_arith, &s->plane[comp].band[level][!!level], 696cabdff1aSopenharmony_ci ret + 3*level + !!level, 4-!!level, sizeof(SubBand)); 697cabdff1aSopenharmony_ci } 698cabdff1aSopenharmony_ci /* golomb coding has no inter-level dependencies, so we can execute all subbands in parallel */ 699cabdff1aSopenharmony_ci if (!s->is_arith) 700cabdff1aSopenharmony_ci avctx->execute(avctx, decode_subband_golomb, bands, ret, num_bands, sizeof(SubBand*)); 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci for (i = 0; i < s->wavelet_depth * 3 + 1; i++) { 703cabdff1aSopenharmony_ci if (ret[i] < 0) 704cabdff1aSopenharmony_ci damaged_count++; 705cabdff1aSopenharmony_ci } 706cabdff1aSopenharmony_ci if (damaged_count > (s->wavelet_depth * 3 + 1) /2) 707cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 708cabdff1aSopenharmony_ci 709cabdff1aSopenharmony_ci return 0; 710cabdff1aSopenharmony_ci} 711cabdff1aSopenharmony_ci 712cabdff1aSopenharmony_ci#define PARSE_VALUES(type, x, gb, ebits, buf1, buf2) \ 713cabdff1aSopenharmony_ci type *buf = (type *)buf1; \ 714cabdff1aSopenharmony_ci buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \ 715cabdff1aSopenharmony_ci if (get_bits_count(gb) >= ebits) \ 716cabdff1aSopenharmony_ci return; \ 717cabdff1aSopenharmony_ci if (buf2) { \ 718cabdff1aSopenharmony_ci buf = (type *)buf2; \ 719cabdff1aSopenharmony_ci buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \ 720cabdff1aSopenharmony_ci if (get_bits_count(gb) >= ebits) \ 721cabdff1aSopenharmony_ci return; \ 722cabdff1aSopenharmony_ci } \ 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_cistatic void decode_subband(DiracContext *s, GetBitContext *gb, int quant, 725cabdff1aSopenharmony_ci int slice_x, int slice_y, int bits_end, 726cabdff1aSopenharmony_ci SubBand *b1, SubBand *b2) 727cabdff1aSopenharmony_ci{ 728cabdff1aSopenharmony_ci int left = b1->width * slice_x / s->num_x; 729cabdff1aSopenharmony_ci int right = b1->width *(slice_x+1) / s->num_x; 730cabdff1aSopenharmony_ci int top = b1->height * slice_y / s->num_y; 731cabdff1aSopenharmony_ci int bottom = b1->height *(slice_y+1) / s->num_y; 732cabdff1aSopenharmony_ci 733cabdff1aSopenharmony_ci int qfactor, qoffset; 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci uint8_t *buf1 = b1->ibuf + top * b1->stride; 736cabdff1aSopenharmony_ci uint8_t *buf2 = b2 ? b2->ibuf + top * b2->stride: NULL; 737cabdff1aSopenharmony_ci int x, y; 738cabdff1aSopenharmony_ci 739cabdff1aSopenharmony_ci if (quant > (DIRAC_MAX_QUANT_INDEX - 1)) { 740cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported quant %d\n", quant); 741cabdff1aSopenharmony_ci return; 742cabdff1aSopenharmony_ci } 743cabdff1aSopenharmony_ci qfactor = ff_dirac_qscale_tab[quant]; 744cabdff1aSopenharmony_ci qoffset = ff_dirac_qoffset_intra_tab[quant] + 2; 745cabdff1aSopenharmony_ci /* we have to constantly check for overread since the spec explicitly 746cabdff1aSopenharmony_ci requires this, with the meaning that all remaining coeffs are set to 0 */ 747cabdff1aSopenharmony_ci if (get_bits_count(gb) >= bits_end) 748cabdff1aSopenharmony_ci return; 749cabdff1aSopenharmony_ci 750cabdff1aSopenharmony_ci if (s->pshift) { 751cabdff1aSopenharmony_ci for (y = top; y < bottom; y++) { 752cabdff1aSopenharmony_ci for (x = left; x < right; x++) { 753cabdff1aSopenharmony_ci PARSE_VALUES(int32_t, x, gb, bits_end, buf1, buf2); 754cabdff1aSopenharmony_ci } 755cabdff1aSopenharmony_ci buf1 += b1->stride; 756cabdff1aSopenharmony_ci if (buf2) 757cabdff1aSopenharmony_ci buf2 += b2->stride; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci else { 761cabdff1aSopenharmony_ci for (y = top; y < bottom; y++) { 762cabdff1aSopenharmony_ci for (x = left; x < right; x++) { 763cabdff1aSopenharmony_ci PARSE_VALUES(int16_t, x, gb, bits_end, buf1, buf2); 764cabdff1aSopenharmony_ci } 765cabdff1aSopenharmony_ci buf1 += b1->stride; 766cabdff1aSopenharmony_ci if (buf2) 767cabdff1aSopenharmony_ci buf2 += b2->stride; 768cabdff1aSopenharmony_ci } 769cabdff1aSopenharmony_ci } 770cabdff1aSopenharmony_ci} 771cabdff1aSopenharmony_ci 772cabdff1aSopenharmony_ci/** 773cabdff1aSopenharmony_ci * Dirac Specification -> 774cabdff1aSopenharmony_ci * 13.5.2 Slices. slice(sx,sy) 775cabdff1aSopenharmony_ci */ 776cabdff1aSopenharmony_cistatic int decode_lowdelay_slice(AVCodecContext *avctx, void *arg) 777cabdff1aSopenharmony_ci{ 778cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 779cabdff1aSopenharmony_ci DiracSlice *slice = arg; 780cabdff1aSopenharmony_ci GetBitContext *gb = &slice->gb; 781cabdff1aSopenharmony_ci enum dirac_subband orientation; 782cabdff1aSopenharmony_ci int level, quant, chroma_bits, chroma_end; 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci int quant_base = get_bits(gb, 7); /*[DIRAC_STD] qindex */ 785cabdff1aSopenharmony_ci int length_bits = av_log2(8 * slice->bytes)+1; 786cabdff1aSopenharmony_ci int luma_bits = get_bits_long(gb, length_bits); 787cabdff1aSopenharmony_ci int luma_end = get_bits_count(gb) + FFMIN(luma_bits, get_bits_left(gb)); 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ci /* [DIRAC_STD] 13.5.5.2 luma_slice_band */ 790cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) 791cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 792cabdff1aSopenharmony_ci quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0); 793cabdff1aSopenharmony_ci decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end, 794cabdff1aSopenharmony_ci &s->plane[0].band[level][orientation], NULL); 795cabdff1aSopenharmony_ci } 796cabdff1aSopenharmony_ci 797cabdff1aSopenharmony_ci /* consume any unused bits from luma */ 798cabdff1aSopenharmony_ci skip_bits_long(gb, get_bits_count(gb) - luma_end); 799cabdff1aSopenharmony_ci 800cabdff1aSopenharmony_ci chroma_bits = 8*slice->bytes - 7 - length_bits - luma_bits; 801cabdff1aSopenharmony_ci chroma_end = get_bits_count(gb) + FFMIN(chroma_bits, get_bits_left(gb)); 802cabdff1aSopenharmony_ci /* [DIRAC_STD] 13.5.5.3 chroma_slice_band */ 803cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) 804cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 805cabdff1aSopenharmony_ci quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0); 806cabdff1aSopenharmony_ci decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end, 807cabdff1aSopenharmony_ci &s->plane[1].band[level][orientation], 808cabdff1aSopenharmony_ci &s->plane[2].band[level][orientation]); 809cabdff1aSopenharmony_ci } 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci return 0; 812cabdff1aSopenharmony_ci} 813cabdff1aSopenharmony_ci 814cabdff1aSopenharmony_citypedef struct SliceCoeffs { 815cabdff1aSopenharmony_ci int left; 816cabdff1aSopenharmony_ci int top; 817cabdff1aSopenharmony_ci int tot_h; 818cabdff1aSopenharmony_ci int tot_v; 819cabdff1aSopenharmony_ci int tot; 820cabdff1aSopenharmony_ci} SliceCoeffs; 821cabdff1aSopenharmony_ci 822cabdff1aSopenharmony_cistatic int subband_coeffs(DiracContext *s, int x, int y, int p, 823cabdff1aSopenharmony_ci SliceCoeffs c[MAX_DWT_LEVELS]) 824cabdff1aSopenharmony_ci{ 825cabdff1aSopenharmony_ci int level, coef = 0; 826cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) { 827cabdff1aSopenharmony_ci SliceCoeffs *o = &c[level]; 828cabdff1aSopenharmony_ci SubBand *b = &s->plane[p].band[level][3]; /* orientation doens't matter */ 829cabdff1aSopenharmony_ci o->top = b->height * y / s->num_y; 830cabdff1aSopenharmony_ci o->left = b->width * x / s->num_x; 831cabdff1aSopenharmony_ci o->tot_h = ((b->width * (x + 1)) / s->num_x) - o->left; 832cabdff1aSopenharmony_ci o->tot_v = ((b->height * (y + 1)) / s->num_y) - o->top; 833cabdff1aSopenharmony_ci o->tot = o->tot_h*o->tot_v; 834cabdff1aSopenharmony_ci coef += o->tot * (4 - !!level); 835cabdff1aSopenharmony_ci } 836cabdff1aSopenharmony_ci return coef; 837cabdff1aSopenharmony_ci} 838cabdff1aSopenharmony_ci 839cabdff1aSopenharmony_ci/** 840cabdff1aSopenharmony_ci * VC-2 Specification -> 841cabdff1aSopenharmony_ci * 13.5.3 hq_slice(sx,sy) 842cabdff1aSopenharmony_ci */ 843cabdff1aSopenharmony_cistatic int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf) 844cabdff1aSopenharmony_ci{ 845cabdff1aSopenharmony_ci int i, level, orientation, quant_idx; 846cabdff1aSopenharmony_ci int qfactor[MAX_DWT_LEVELS][4], qoffset[MAX_DWT_LEVELS][4]; 847cabdff1aSopenharmony_ci GetBitContext *gb = &slice->gb; 848cabdff1aSopenharmony_ci SliceCoeffs coeffs_num[MAX_DWT_LEVELS]; 849cabdff1aSopenharmony_ci 850cabdff1aSopenharmony_ci skip_bits_long(gb, 8*s->highquality.prefix_bytes); 851cabdff1aSopenharmony_ci quant_idx = get_bits(gb, 8); 852cabdff1aSopenharmony_ci 853cabdff1aSopenharmony_ci if (quant_idx > DIRAC_MAX_QUANT_INDEX - 1) { 854cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid quantization index - %i\n", quant_idx); 855cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 856cabdff1aSopenharmony_ci } 857cabdff1aSopenharmony_ci 858cabdff1aSopenharmony_ci /* Slice quantization (slice_quantizers() in the specs) */ 859cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) { 860cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 861cabdff1aSopenharmony_ci const int quant = FFMAX(quant_idx - s->lowdelay.quant[level][orientation], 0); 862cabdff1aSopenharmony_ci qfactor[level][orientation] = ff_dirac_qscale_tab[quant]; 863cabdff1aSopenharmony_ci qoffset[level][orientation] = ff_dirac_qoffset_intra_tab[quant] + 2; 864cabdff1aSopenharmony_ci } 865cabdff1aSopenharmony_ci } 866cabdff1aSopenharmony_ci 867cabdff1aSopenharmony_ci /* Luma + 2 Chroma planes */ 868cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 869cabdff1aSopenharmony_ci int coef_num, coef_par, off = 0; 870cabdff1aSopenharmony_ci int64_t length = s->highquality.size_scaler*get_bits(gb, 8); 871cabdff1aSopenharmony_ci int64_t bits_end = get_bits_count(gb) + 8*length; 872cabdff1aSopenharmony_ci const uint8_t *addr = align_get_bits(gb); 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_ci if (length*8 > get_bits_left(gb)) { 875cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "end too far away\n"); 876cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 877cabdff1aSopenharmony_ci } 878cabdff1aSopenharmony_ci 879cabdff1aSopenharmony_ci coef_num = subband_coeffs(s, slice->slice_x, slice->slice_y, i, coeffs_num); 880cabdff1aSopenharmony_ci 881cabdff1aSopenharmony_ci if (s->pshift) 882cabdff1aSopenharmony_ci coef_par = ff_dirac_golomb_read_32bit(addr, length, 883cabdff1aSopenharmony_ci tmp_buf, coef_num); 884cabdff1aSopenharmony_ci else 885cabdff1aSopenharmony_ci coef_par = ff_dirac_golomb_read_16bit(addr, length, 886cabdff1aSopenharmony_ci tmp_buf, coef_num); 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_ci if (coef_num > coef_par) { 889cabdff1aSopenharmony_ci const int start_b = coef_par * (1 << (s->pshift + 1)); 890cabdff1aSopenharmony_ci const int end_b = coef_num * (1 << (s->pshift + 1)); 891cabdff1aSopenharmony_ci memset(&tmp_buf[start_b], 0, end_b - start_b); 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci 894cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) { 895cabdff1aSopenharmony_ci const SliceCoeffs *c = &coeffs_num[level]; 896cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 897cabdff1aSopenharmony_ci const SubBand *b1 = &s->plane[i].band[level][orientation]; 898cabdff1aSopenharmony_ci uint8_t *buf = b1->ibuf + c->top * b1->stride + (c->left << (s->pshift + 1)); 899cabdff1aSopenharmony_ci 900cabdff1aSopenharmony_ci /* Change to c->tot_h <= 4 for AVX2 dequantization */ 901cabdff1aSopenharmony_ci const int qfunc = s->pshift + 2*(c->tot_h <= 2); 902cabdff1aSopenharmony_ci s->diracdsp.dequant_subband[qfunc](&tmp_buf[off], buf, b1->stride, 903cabdff1aSopenharmony_ci qfactor[level][orientation], 904cabdff1aSopenharmony_ci qoffset[level][orientation], 905cabdff1aSopenharmony_ci c->tot_v, c->tot_h); 906cabdff1aSopenharmony_ci 907cabdff1aSopenharmony_ci off += c->tot << (s->pshift + 1); 908cabdff1aSopenharmony_ci } 909cabdff1aSopenharmony_ci } 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci skip_bits_long(gb, bits_end - get_bits_count(gb)); 912cabdff1aSopenharmony_ci } 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci return 0; 915cabdff1aSopenharmony_ci} 916cabdff1aSopenharmony_ci 917cabdff1aSopenharmony_cistatic int decode_hq_slice_row(AVCodecContext *avctx, void *arg, int jobnr, int threadnr) 918cabdff1aSopenharmony_ci{ 919cabdff1aSopenharmony_ci int i; 920cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 921cabdff1aSopenharmony_ci DiracSlice *slices = ((DiracSlice *)arg) + s->num_x*jobnr; 922cabdff1aSopenharmony_ci uint8_t *thread_buf = &s->thread_buf[s->thread_buf_size*threadnr]; 923cabdff1aSopenharmony_ci for (i = 0; i < s->num_x; i++) 924cabdff1aSopenharmony_ci decode_hq_slice(s, &slices[i], thread_buf); 925cabdff1aSopenharmony_ci return 0; 926cabdff1aSopenharmony_ci} 927cabdff1aSopenharmony_ci 928cabdff1aSopenharmony_ci/** 929cabdff1aSopenharmony_ci * Dirac Specification -> 930cabdff1aSopenharmony_ci * 13.5.1 low_delay_transform_data() 931cabdff1aSopenharmony_ci */ 932cabdff1aSopenharmony_cistatic int decode_lowdelay(DiracContext *s) 933cabdff1aSopenharmony_ci{ 934cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 935cabdff1aSopenharmony_ci int slice_x, slice_y, bufsize; 936cabdff1aSopenharmony_ci int64_t coef_buf_size, bytes = 0; 937cabdff1aSopenharmony_ci const uint8_t *buf; 938cabdff1aSopenharmony_ci DiracSlice *slices; 939cabdff1aSopenharmony_ci SliceCoeffs tmp[MAX_DWT_LEVELS]; 940cabdff1aSopenharmony_ci int slice_num = 0; 941cabdff1aSopenharmony_ci 942cabdff1aSopenharmony_ci if (s->slice_params_num_buf != (s->num_x * s->num_y)) { 943cabdff1aSopenharmony_ci s->slice_params_buf = av_realloc_f(s->slice_params_buf, s->num_x * s->num_y, sizeof(DiracSlice)); 944cabdff1aSopenharmony_ci if (!s->slice_params_buf) { 945cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "slice params buffer allocation failure\n"); 946cabdff1aSopenharmony_ci s->slice_params_num_buf = 0; 947cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 948cabdff1aSopenharmony_ci } 949cabdff1aSopenharmony_ci s->slice_params_num_buf = s->num_x * s->num_y; 950cabdff1aSopenharmony_ci } 951cabdff1aSopenharmony_ci slices = s->slice_params_buf; 952cabdff1aSopenharmony_ci 953cabdff1aSopenharmony_ci /* 8 becacuse that's how much the golomb reader could overread junk data 954cabdff1aSopenharmony_ci * from another plane/slice at most, and 512 because SIMD */ 955cabdff1aSopenharmony_ci coef_buf_size = subband_coeffs(s, s->num_x - 1, s->num_y - 1, 0, tmp) + 8; 956cabdff1aSopenharmony_ci coef_buf_size = (coef_buf_size << (1 + s->pshift)) + 512; 957cabdff1aSopenharmony_ci 958cabdff1aSopenharmony_ci if (s->threads_num_buf != avctx->thread_count || 959cabdff1aSopenharmony_ci s->thread_buf_size != coef_buf_size) { 960cabdff1aSopenharmony_ci s->threads_num_buf = avctx->thread_count; 961cabdff1aSopenharmony_ci s->thread_buf_size = coef_buf_size; 962cabdff1aSopenharmony_ci s->thread_buf = av_realloc_f(s->thread_buf, avctx->thread_count, s->thread_buf_size); 963cabdff1aSopenharmony_ci if (!s->thread_buf) { 964cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "thread buffer allocation failure\n"); 965cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci } 968cabdff1aSopenharmony_ci 969cabdff1aSopenharmony_ci align_get_bits(&s->gb); 970cabdff1aSopenharmony_ci /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */ 971cabdff1aSopenharmony_ci buf = s->gb.buffer + get_bits_count(&s->gb)/8; 972cabdff1aSopenharmony_ci bufsize = get_bits_left(&s->gb); 973cabdff1aSopenharmony_ci 974cabdff1aSopenharmony_ci if (s->hq_picture) { 975cabdff1aSopenharmony_ci int i; 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) { 978cabdff1aSopenharmony_ci for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) { 979cabdff1aSopenharmony_ci bytes = s->highquality.prefix_bytes + 1; 980cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 981cabdff1aSopenharmony_ci if (bytes <= bufsize/8) 982cabdff1aSopenharmony_ci bytes += buf[bytes] * s->highquality.size_scaler + 1; 983cabdff1aSopenharmony_ci } 984cabdff1aSopenharmony_ci if (bytes >= INT_MAX || bytes*8 > bufsize) { 985cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "too many bytes\n"); 986cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 987cabdff1aSopenharmony_ci } 988cabdff1aSopenharmony_ci 989cabdff1aSopenharmony_ci slices[slice_num].bytes = bytes; 990cabdff1aSopenharmony_ci slices[slice_num].slice_x = slice_x; 991cabdff1aSopenharmony_ci slices[slice_num].slice_y = slice_y; 992cabdff1aSopenharmony_ci init_get_bits(&slices[slice_num].gb, buf, bufsize); 993cabdff1aSopenharmony_ci slice_num++; 994cabdff1aSopenharmony_ci 995cabdff1aSopenharmony_ci buf += bytes; 996cabdff1aSopenharmony_ci if (bufsize/8 >= bytes) 997cabdff1aSopenharmony_ci bufsize -= bytes*8; 998cabdff1aSopenharmony_ci else 999cabdff1aSopenharmony_ci bufsize = 0; 1000cabdff1aSopenharmony_ci } 1001cabdff1aSopenharmony_ci } 1002cabdff1aSopenharmony_ci 1003cabdff1aSopenharmony_ci if (s->num_x*s->num_y != slice_num) { 1004cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "too few slices\n"); 1005cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1006cabdff1aSopenharmony_ci } 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci avctx->execute2(avctx, decode_hq_slice_row, slices, NULL, s->num_y); 1009cabdff1aSopenharmony_ci } else { 1010cabdff1aSopenharmony_ci for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) { 1011cabdff1aSopenharmony_ci for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) { 1012cabdff1aSopenharmony_ci bytes = (slice_num+1) * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den 1013cabdff1aSopenharmony_ci - slice_num * (int64_t)s->lowdelay.bytes.num / s->lowdelay.bytes.den; 1014cabdff1aSopenharmony_ci if (bytes >= INT_MAX || bytes*8 > bufsize) { 1015cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "too many bytes\n"); 1016cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1017cabdff1aSopenharmony_ci } 1018cabdff1aSopenharmony_ci slices[slice_num].bytes = bytes; 1019cabdff1aSopenharmony_ci slices[slice_num].slice_x = slice_x; 1020cabdff1aSopenharmony_ci slices[slice_num].slice_y = slice_y; 1021cabdff1aSopenharmony_ci init_get_bits(&slices[slice_num].gb, buf, bufsize); 1022cabdff1aSopenharmony_ci slice_num++; 1023cabdff1aSopenharmony_ci 1024cabdff1aSopenharmony_ci buf += bytes; 1025cabdff1aSopenharmony_ci if (bufsize/8 >= bytes) 1026cabdff1aSopenharmony_ci bufsize -= bytes*8; 1027cabdff1aSopenharmony_ci else 1028cabdff1aSopenharmony_ci bufsize = 0; 1029cabdff1aSopenharmony_ci } 1030cabdff1aSopenharmony_ci } 1031cabdff1aSopenharmony_ci avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num, 1032cabdff1aSopenharmony_ci sizeof(DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */ 1033cabdff1aSopenharmony_ci } 1034cabdff1aSopenharmony_ci 1035cabdff1aSopenharmony_ci if (s->dc_prediction) { 1036cabdff1aSopenharmony_ci if (s->pshift) { 1037cabdff1aSopenharmony_ci intra_dc_prediction_10(&s->plane[0].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */ 1038cabdff1aSopenharmony_ci intra_dc_prediction_10(&s->plane[1].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */ 1039cabdff1aSopenharmony_ci intra_dc_prediction_10(&s->plane[2].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */ 1040cabdff1aSopenharmony_ci } else { 1041cabdff1aSopenharmony_ci intra_dc_prediction_8(&s->plane[0].band[0][0]); 1042cabdff1aSopenharmony_ci intra_dc_prediction_8(&s->plane[1].band[0][0]); 1043cabdff1aSopenharmony_ci intra_dc_prediction_8(&s->plane[2].band[0][0]); 1044cabdff1aSopenharmony_ci } 1045cabdff1aSopenharmony_ci } 1046cabdff1aSopenharmony_ci 1047cabdff1aSopenharmony_ci return 0; 1048cabdff1aSopenharmony_ci} 1049cabdff1aSopenharmony_ci 1050cabdff1aSopenharmony_cistatic void init_planes(DiracContext *s) 1051cabdff1aSopenharmony_ci{ 1052cabdff1aSopenharmony_ci int i, w, h, level, orientation; 1053cabdff1aSopenharmony_ci 1054cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 1055cabdff1aSopenharmony_ci Plane *p = &s->plane[i]; 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_ci p->width = s->seq.width >> (i ? s->chroma_x_shift : 0); 1058cabdff1aSopenharmony_ci p->height = s->seq.height >> (i ? s->chroma_y_shift : 0); 1059cabdff1aSopenharmony_ci p->idwt.width = w = CALC_PADDING(p->width , s->wavelet_depth); 1060cabdff1aSopenharmony_ci p->idwt.height = h = CALC_PADDING(p->height, s->wavelet_depth); 1061cabdff1aSopenharmony_ci p->idwt.stride = FFALIGN(p->idwt.width, 8) << (1 + s->pshift); 1062cabdff1aSopenharmony_ci 1063cabdff1aSopenharmony_ci for (level = s->wavelet_depth-1; level >= 0; level--) { 1064cabdff1aSopenharmony_ci w = w>>1; 1065cabdff1aSopenharmony_ci h = h>>1; 1066cabdff1aSopenharmony_ci for (orientation = !!level; orientation < 4; orientation++) { 1067cabdff1aSopenharmony_ci SubBand *b = &p->band[level][orientation]; 1068cabdff1aSopenharmony_ci 1069cabdff1aSopenharmony_ci b->pshift = s->pshift; 1070cabdff1aSopenharmony_ci b->ibuf = p->idwt.buf; 1071cabdff1aSopenharmony_ci b->level = level; 1072cabdff1aSopenharmony_ci b->stride = p->idwt.stride << (s->wavelet_depth - level); 1073cabdff1aSopenharmony_ci b->width = w; 1074cabdff1aSopenharmony_ci b->height = h; 1075cabdff1aSopenharmony_ci b->orientation = orientation; 1076cabdff1aSopenharmony_ci 1077cabdff1aSopenharmony_ci if (orientation & 1) 1078cabdff1aSopenharmony_ci b->ibuf += w << (1+b->pshift); 1079cabdff1aSopenharmony_ci if (orientation > 1) 1080cabdff1aSopenharmony_ci b->ibuf += (b->stride>>1); 1081cabdff1aSopenharmony_ci 1082cabdff1aSopenharmony_ci if (level) 1083cabdff1aSopenharmony_ci b->parent = &p->band[level-1][orientation]; 1084cabdff1aSopenharmony_ci } 1085cabdff1aSopenharmony_ci } 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci if (i > 0) { 1088cabdff1aSopenharmony_ci p->xblen = s->plane[0].xblen >> s->chroma_x_shift; 1089cabdff1aSopenharmony_ci p->yblen = s->plane[0].yblen >> s->chroma_y_shift; 1090cabdff1aSopenharmony_ci p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift; 1091cabdff1aSopenharmony_ci p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift; 1092cabdff1aSopenharmony_ci } 1093cabdff1aSopenharmony_ci 1094cabdff1aSopenharmony_ci p->xoffset = (p->xblen - p->xbsep)/2; 1095cabdff1aSopenharmony_ci p->yoffset = (p->yblen - p->ybsep)/2; 1096cabdff1aSopenharmony_ci } 1097cabdff1aSopenharmony_ci} 1098cabdff1aSopenharmony_ci 1099cabdff1aSopenharmony_ci/** 1100cabdff1aSopenharmony_ci * Unpack the motion compensation parameters 1101cabdff1aSopenharmony_ci * Dirac Specification -> 1102cabdff1aSopenharmony_ci * 11.2 Picture prediction data. picture_prediction() 1103cabdff1aSopenharmony_ci */ 1104cabdff1aSopenharmony_cistatic int dirac_unpack_prediction_parameters(DiracContext *s) 1105cabdff1aSopenharmony_ci{ 1106cabdff1aSopenharmony_ci static const uint8_t default_blen[] = { 4, 12, 16, 24 }; 1107cabdff1aSopenharmony_ci 1108cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 1109cabdff1aSopenharmony_ci unsigned idx, ref; 1110cabdff1aSopenharmony_ci 1111cabdff1aSopenharmony_ci align_get_bits(gb); 1112cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */ 1113cabdff1aSopenharmony_ci /* Luma and Chroma are equal. 11.2.3 */ 1114cabdff1aSopenharmony_ci idx = get_interleaved_ue_golomb(gb); /* [DIRAC_STD] index */ 1115cabdff1aSopenharmony_ci 1116cabdff1aSopenharmony_ci if (idx > 4) { 1117cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n"); 1118cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1119cabdff1aSopenharmony_ci } 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci if (idx == 0) { 1122cabdff1aSopenharmony_ci s->plane[0].xblen = get_interleaved_ue_golomb(gb); 1123cabdff1aSopenharmony_ci s->plane[0].yblen = get_interleaved_ue_golomb(gb); 1124cabdff1aSopenharmony_ci s->plane[0].xbsep = get_interleaved_ue_golomb(gb); 1125cabdff1aSopenharmony_ci s->plane[0].ybsep = get_interleaved_ue_golomb(gb); 1126cabdff1aSopenharmony_ci } else { 1127cabdff1aSopenharmony_ci /*[DIRAC_STD] preset_block_params(index). Table 11.1 */ 1128cabdff1aSopenharmony_ci s->plane[0].xblen = default_blen[idx-1]; 1129cabdff1aSopenharmony_ci s->plane[0].yblen = default_blen[idx-1]; 1130cabdff1aSopenharmony_ci s->plane[0].xbsep = 4 * idx; 1131cabdff1aSopenharmony_ci s->plane[0].ybsep = 4 * idx; 1132cabdff1aSopenharmony_ci } 1133cabdff1aSopenharmony_ci /*[DIRAC_STD] 11.2.4 motion_data_dimensions() 1134cabdff1aSopenharmony_ci Calculated in function dirac_unpack_block_motion_data */ 1135cabdff1aSopenharmony_ci 1136cabdff1aSopenharmony_ci if (s->plane[0].xblen % (1 << s->chroma_x_shift) != 0 || 1137cabdff1aSopenharmony_ci s->plane[0].yblen % (1 << s->chroma_y_shift) != 0 || 1138cabdff1aSopenharmony_ci !s->plane[0].xblen || !s->plane[0].yblen) { 1139cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1140cabdff1aSopenharmony_ci "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n", 1141cabdff1aSopenharmony_ci s->plane[0].xblen, s->plane[0].yblen, s->chroma_x_shift, s->chroma_y_shift); 1142cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1143cabdff1aSopenharmony_ci } 1144cabdff1aSopenharmony_ci if (!s->plane[0].xbsep || !s->plane[0].ybsep || s->plane[0].xbsep < s->plane[0].xblen/2 || s->plane[0].ybsep < s->plane[0].yblen/2) { 1145cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n"); 1146cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1147cabdff1aSopenharmony_ci } 1148cabdff1aSopenharmony_ci if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) { 1149cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n"); 1150cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1151cabdff1aSopenharmony_ci } 1152cabdff1aSopenharmony_ci if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) { 1153cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n"); 1154cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 1155cabdff1aSopenharmony_ci } 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision() 1158cabdff1aSopenharmony_ci Read motion vector precision */ 1159cabdff1aSopenharmony_ci s->mv_precision = get_interleaved_ue_golomb(gb); 1160cabdff1aSopenharmony_ci if (s->mv_precision > 3) { 1161cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n"); 1162cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1163cabdff1aSopenharmony_ci } 1164cabdff1aSopenharmony_ci 1165cabdff1aSopenharmony_ci /*[DIRAC_STD] 11.2.6 Global motion. global_motion() 1166cabdff1aSopenharmony_ci Read the global motion compensation parameters */ 1167cabdff1aSopenharmony_ci s->globalmc_flag = get_bits1(gb); 1168cabdff1aSopenharmony_ci if (s->globalmc_flag) { 1169cabdff1aSopenharmony_ci memset(s->globalmc, 0, sizeof(s->globalmc)); 1170cabdff1aSopenharmony_ci /* [DIRAC_STD] pan_tilt(gparams) */ 1171cabdff1aSopenharmony_ci for (ref = 0; ref < s->num_refs; ref++) { 1172cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1173cabdff1aSopenharmony_ci s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb); 1174cabdff1aSopenharmony_ci s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb); 1175cabdff1aSopenharmony_ci } 1176cabdff1aSopenharmony_ci /* [DIRAC_STD] zoom_rotate_shear(gparams) 1177cabdff1aSopenharmony_ci zoom/rotation/shear parameters */ 1178cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1179cabdff1aSopenharmony_ci s->globalmc[ref].zrs_exp = get_interleaved_ue_golomb(gb); 1180cabdff1aSopenharmony_ci s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb); 1181cabdff1aSopenharmony_ci s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb); 1182cabdff1aSopenharmony_ci s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb); 1183cabdff1aSopenharmony_ci s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb); 1184cabdff1aSopenharmony_ci } else { 1185cabdff1aSopenharmony_ci s->globalmc[ref].zrs[0][0] = 1; 1186cabdff1aSopenharmony_ci s->globalmc[ref].zrs[1][1] = 1; 1187cabdff1aSopenharmony_ci } 1188cabdff1aSopenharmony_ci /* [DIRAC_STD] perspective(gparams) */ 1189cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1190cabdff1aSopenharmony_ci s->globalmc[ref].perspective_exp = get_interleaved_ue_golomb(gb); 1191cabdff1aSopenharmony_ci s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb); 1192cabdff1aSopenharmony_ci s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb); 1193cabdff1aSopenharmony_ci } 1194cabdff1aSopenharmony_ci if (s->globalmc[ref].perspective_exp + (uint64_t)s->globalmc[ref].zrs_exp > 30) { 1195cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1196cabdff1aSopenharmony_ci } 1197cabdff1aSopenharmony_ci 1198cabdff1aSopenharmony_ci } 1199cabdff1aSopenharmony_ci } 1200cabdff1aSopenharmony_ci 1201cabdff1aSopenharmony_ci /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode() 1202cabdff1aSopenharmony_ci Picture prediction mode, not currently used. */ 1203cabdff1aSopenharmony_ci if (get_interleaved_ue_golomb(gb)) { 1204cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n"); 1205cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1206cabdff1aSopenharmony_ci } 1207cabdff1aSopenharmony_ci 1208cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights() 1209cabdff1aSopenharmony_ci just data read, weight calculation will be done later on. */ 1210cabdff1aSopenharmony_ci s->weight_log2denom = 1; 1211cabdff1aSopenharmony_ci s->weight[0] = 1; 1212cabdff1aSopenharmony_ci s->weight[1] = 1; 1213cabdff1aSopenharmony_ci 1214cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1215cabdff1aSopenharmony_ci s->weight_log2denom = get_interleaved_ue_golomb(gb); 1216cabdff1aSopenharmony_ci if (s->weight_log2denom < 1 || s->weight_log2denom > 8) { 1217cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "weight_log2denom unsupported or invalid\n"); 1218cabdff1aSopenharmony_ci s->weight_log2denom = 1; 1219cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1220cabdff1aSopenharmony_ci } 1221cabdff1aSopenharmony_ci s->weight[0] = dirac_get_se_golomb(gb); 1222cabdff1aSopenharmony_ci if (s->num_refs == 2) 1223cabdff1aSopenharmony_ci s->weight[1] = dirac_get_se_golomb(gb); 1224cabdff1aSopenharmony_ci } 1225cabdff1aSopenharmony_ci return 0; 1226cabdff1aSopenharmony_ci} 1227cabdff1aSopenharmony_ci 1228cabdff1aSopenharmony_ci/** 1229cabdff1aSopenharmony_ci * Dirac Specification -> 1230cabdff1aSopenharmony_ci * 11.3 Wavelet transform data. wavelet_transform() 1231cabdff1aSopenharmony_ci */ 1232cabdff1aSopenharmony_cistatic int dirac_unpack_idwt_params(DiracContext *s) 1233cabdff1aSopenharmony_ci{ 1234cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 1235cabdff1aSopenharmony_ci int i, level; 1236cabdff1aSopenharmony_ci unsigned tmp; 1237cabdff1aSopenharmony_ci 1238cabdff1aSopenharmony_ci#define CHECKEDREAD(dst, cond, errmsg) \ 1239cabdff1aSopenharmony_ci tmp = get_interleaved_ue_golomb(gb); \ 1240cabdff1aSopenharmony_ci if (cond) { \ 1241cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, errmsg); \ 1242cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; \ 1243cabdff1aSopenharmony_ci }\ 1244cabdff1aSopenharmony_ci dst = tmp; 1245cabdff1aSopenharmony_ci 1246cabdff1aSopenharmony_ci align_get_bits(gb); 1247cabdff1aSopenharmony_ci 1248cabdff1aSopenharmony_ci s->zero_res = s->num_refs ? get_bits1(gb) : 0; 1249cabdff1aSopenharmony_ci if (s->zero_res) 1250cabdff1aSopenharmony_ci return 0; 1251cabdff1aSopenharmony_ci 1252cabdff1aSopenharmony_ci /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */ 1253cabdff1aSopenharmony_ci CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n") 1254cabdff1aSopenharmony_ci 1255cabdff1aSopenharmony_ci CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n") 1256cabdff1aSopenharmony_ci 1257cabdff1aSopenharmony_ci if (!s->low_delay) { 1258cabdff1aSopenharmony_ci /* Codeblock parameters (core syntax only) */ 1259cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1260cabdff1aSopenharmony_ci for (i = 0; i <= s->wavelet_depth; i++) { 1261cabdff1aSopenharmony_ci CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n") 1262cabdff1aSopenharmony_ci CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n") 1263cabdff1aSopenharmony_ci } 1264cabdff1aSopenharmony_ci 1265cabdff1aSopenharmony_ci CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n") 1266cabdff1aSopenharmony_ci } 1267cabdff1aSopenharmony_ci else { 1268cabdff1aSopenharmony_ci for (i = 0; i <= s->wavelet_depth; i++) 1269cabdff1aSopenharmony_ci s->codeblock[i].width = s->codeblock[i].height = 1; 1270cabdff1aSopenharmony_ci } 1271cabdff1aSopenharmony_ci } 1272cabdff1aSopenharmony_ci else { 1273cabdff1aSopenharmony_ci s->num_x = get_interleaved_ue_golomb(gb); 1274cabdff1aSopenharmony_ci s->num_y = get_interleaved_ue_golomb(gb); 1275cabdff1aSopenharmony_ci if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX || 1276cabdff1aSopenharmony_ci s->num_x * (uint64_t)s->avctx->width > INT_MAX || 1277cabdff1aSopenharmony_ci s->num_y * (uint64_t)s->avctx->height > INT_MAX || 1278cabdff1aSopenharmony_ci s->num_x > s->avctx->width || 1279cabdff1aSopenharmony_ci s->num_y > s->avctx->height 1280cabdff1aSopenharmony_ci ) { 1281cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n"); 1282cabdff1aSopenharmony_ci s->num_x = s->num_y = 0; 1283cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1284cabdff1aSopenharmony_ci } 1285cabdff1aSopenharmony_ci if (s->ld_picture) { 1286cabdff1aSopenharmony_ci s->lowdelay.bytes.num = get_interleaved_ue_golomb(gb); 1287cabdff1aSopenharmony_ci s->lowdelay.bytes.den = get_interleaved_ue_golomb(gb); 1288cabdff1aSopenharmony_ci if (s->lowdelay.bytes.den <= 0) { 1289cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n"); 1290cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1291cabdff1aSopenharmony_ci } 1292cabdff1aSopenharmony_ci } else if (s->hq_picture) { 1293cabdff1aSopenharmony_ci s->highquality.prefix_bytes = get_interleaved_ue_golomb(gb); 1294cabdff1aSopenharmony_ci s->highquality.size_scaler = get_interleaved_ue_golomb(gb); 1295cabdff1aSopenharmony_ci if (s->highquality.prefix_bytes >= INT_MAX / 8) { 1296cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_ERROR,"too many prefix bytes\n"); 1297cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1298cabdff1aSopenharmony_ci } 1299cabdff1aSopenharmony_ci } 1300cabdff1aSopenharmony_ci 1301cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */ 1302cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1303cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n"); 1304cabdff1aSopenharmony_ci /* custom quantization matrix */ 1305cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) { 1306cabdff1aSopenharmony_ci for (i = !!level; i < 4; i++) { 1307cabdff1aSopenharmony_ci s->lowdelay.quant[level][i] = get_interleaved_ue_golomb(gb); 1308cabdff1aSopenharmony_ci } 1309cabdff1aSopenharmony_ci } 1310cabdff1aSopenharmony_ci } else { 1311cabdff1aSopenharmony_ci if (s->wavelet_depth > 4) { 1312cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth); 1313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1314cabdff1aSopenharmony_ci } 1315cabdff1aSopenharmony_ci /* default quantization matrix */ 1316cabdff1aSopenharmony_ci for (level = 0; level < s->wavelet_depth; level++) 1317cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 1318cabdff1aSopenharmony_ci s->lowdelay.quant[level][i] = ff_dirac_default_qmat[s->wavelet_idx][level][i]; 1319cabdff1aSopenharmony_ci /* haar with no shift differs for different depths */ 1320cabdff1aSopenharmony_ci if (s->wavelet_idx == 3) 1321cabdff1aSopenharmony_ci s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level); 1322cabdff1aSopenharmony_ci } 1323cabdff1aSopenharmony_ci } 1324cabdff1aSopenharmony_ci } 1325cabdff1aSopenharmony_ci return 0; 1326cabdff1aSopenharmony_ci} 1327cabdff1aSopenharmony_ci 1328cabdff1aSopenharmony_cistatic inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y) 1329cabdff1aSopenharmony_ci{ 1330cabdff1aSopenharmony_ci static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 }; 1331cabdff1aSopenharmony_ci 1332cabdff1aSopenharmony_ci if (!(x|y)) 1333cabdff1aSopenharmony_ci return 0; 1334cabdff1aSopenharmony_ci else if (!y) 1335cabdff1aSopenharmony_ci return sbsplit[-1]; 1336cabdff1aSopenharmony_ci else if (!x) 1337cabdff1aSopenharmony_ci return sbsplit[-stride]; 1338cabdff1aSopenharmony_ci 1339cabdff1aSopenharmony_ci return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]]; 1340cabdff1aSopenharmony_ci} 1341cabdff1aSopenharmony_ci 1342cabdff1aSopenharmony_cistatic inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask) 1343cabdff1aSopenharmony_ci{ 1344cabdff1aSopenharmony_ci int pred; 1345cabdff1aSopenharmony_ci 1346cabdff1aSopenharmony_ci if (!(x|y)) 1347cabdff1aSopenharmony_ci return 0; 1348cabdff1aSopenharmony_ci else if (!y) 1349cabdff1aSopenharmony_ci return block[-1].ref & refmask; 1350cabdff1aSopenharmony_ci else if (!x) 1351cabdff1aSopenharmony_ci return block[-stride].ref & refmask; 1352cabdff1aSopenharmony_ci 1353cabdff1aSopenharmony_ci /* return the majority */ 1354cabdff1aSopenharmony_ci pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask); 1355cabdff1aSopenharmony_ci return (pred >> 1) & refmask; 1356cabdff1aSopenharmony_ci} 1357cabdff1aSopenharmony_ci 1358cabdff1aSopenharmony_cistatic inline void pred_block_dc(DiracBlock *block, int stride, int x, int y) 1359cabdff1aSopenharmony_ci{ 1360cabdff1aSopenharmony_ci int i, n = 0; 1361cabdff1aSopenharmony_ci 1362cabdff1aSopenharmony_ci memset(block->u.dc, 0, sizeof(block->u.dc)); 1363cabdff1aSopenharmony_ci 1364cabdff1aSopenharmony_ci if (x && !(block[-1].ref & 3)) { 1365cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1366cabdff1aSopenharmony_ci block->u.dc[i] += block[-1].u.dc[i]; 1367cabdff1aSopenharmony_ci n++; 1368cabdff1aSopenharmony_ci } 1369cabdff1aSopenharmony_ci 1370cabdff1aSopenharmony_ci if (y && !(block[-stride].ref & 3)) { 1371cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1372cabdff1aSopenharmony_ci block->u.dc[i] += block[-stride].u.dc[i]; 1373cabdff1aSopenharmony_ci n++; 1374cabdff1aSopenharmony_ci } 1375cabdff1aSopenharmony_ci 1376cabdff1aSopenharmony_ci if (x && y && !(block[-1-stride].ref & 3)) { 1377cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1378cabdff1aSopenharmony_ci block->u.dc[i] += block[-1-stride].u.dc[i]; 1379cabdff1aSopenharmony_ci n++; 1380cabdff1aSopenharmony_ci } 1381cabdff1aSopenharmony_ci 1382cabdff1aSopenharmony_ci if (n == 2) { 1383cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1384cabdff1aSopenharmony_ci block->u.dc[i] = (block->u.dc[i]+1)>>1; 1385cabdff1aSopenharmony_ci } else if (n == 3) { 1386cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1387cabdff1aSopenharmony_ci block->u.dc[i] = divide3(block->u.dc[i]); 1388cabdff1aSopenharmony_ci } 1389cabdff1aSopenharmony_ci} 1390cabdff1aSopenharmony_ci 1391cabdff1aSopenharmony_cistatic inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref) 1392cabdff1aSopenharmony_ci{ 1393cabdff1aSopenharmony_ci int16_t *pred[3]; 1394cabdff1aSopenharmony_ci int refmask = ref+1; 1395cabdff1aSopenharmony_ci int mask = refmask | DIRAC_REF_MASK_GLOBAL; /* exclude gmc blocks */ 1396cabdff1aSopenharmony_ci int n = 0; 1397cabdff1aSopenharmony_ci 1398cabdff1aSopenharmony_ci if (x && (block[-1].ref & mask) == refmask) 1399cabdff1aSopenharmony_ci pred[n++] = block[-1].u.mv[ref]; 1400cabdff1aSopenharmony_ci 1401cabdff1aSopenharmony_ci if (y && (block[-stride].ref & mask) == refmask) 1402cabdff1aSopenharmony_ci pred[n++] = block[-stride].u.mv[ref]; 1403cabdff1aSopenharmony_ci 1404cabdff1aSopenharmony_ci if (x && y && (block[-stride-1].ref & mask) == refmask) 1405cabdff1aSopenharmony_ci pred[n++] = block[-stride-1].u.mv[ref]; 1406cabdff1aSopenharmony_ci 1407cabdff1aSopenharmony_ci switch (n) { 1408cabdff1aSopenharmony_ci case 0: 1409cabdff1aSopenharmony_ci block->u.mv[ref][0] = 0; 1410cabdff1aSopenharmony_ci block->u.mv[ref][1] = 0; 1411cabdff1aSopenharmony_ci break; 1412cabdff1aSopenharmony_ci case 1: 1413cabdff1aSopenharmony_ci block->u.mv[ref][0] = pred[0][0]; 1414cabdff1aSopenharmony_ci block->u.mv[ref][1] = pred[0][1]; 1415cabdff1aSopenharmony_ci break; 1416cabdff1aSopenharmony_ci case 2: 1417cabdff1aSopenharmony_ci block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1; 1418cabdff1aSopenharmony_ci block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1; 1419cabdff1aSopenharmony_ci break; 1420cabdff1aSopenharmony_ci case 3: 1421cabdff1aSopenharmony_ci block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]); 1422cabdff1aSopenharmony_ci block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]); 1423cabdff1aSopenharmony_ci break; 1424cabdff1aSopenharmony_ci } 1425cabdff1aSopenharmony_ci} 1426cabdff1aSopenharmony_ci 1427cabdff1aSopenharmony_cistatic void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref) 1428cabdff1aSopenharmony_ci{ 1429cabdff1aSopenharmony_ci int ez = s->globalmc[ref].zrs_exp; 1430cabdff1aSopenharmony_ci int ep = s->globalmc[ref].perspective_exp; 1431cabdff1aSopenharmony_ci int (*A)[2] = s->globalmc[ref].zrs; 1432cabdff1aSopenharmony_ci int *b = s->globalmc[ref].pan_tilt; 1433cabdff1aSopenharmony_ci int *c = s->globalmc[ref].perspective; 1434cabdff1aSopenharmony_ci 1435cabdff1aSopenharmony_ci int64_t m = (1<<ep) - (c[0]*(int64_t)x + c[1]*(int64_t)y); 1436cabdff1aSopenharmony_ci int64_t mx = m * (uint64_t)((A[0][0] * (int64_t)x + A[0][1]*(int64_t)y) + (1LL<<ez) * b[0]); 1437cabdff1aSopenharmony_ci int64_t my = m * (uint64_t)((A[1][0] * (int64_t)x + A[1][1]*(int64_t)y) + (1LL<<ez) * b[1]); 1438cabdff1aSopenharmony_ci 1439cabdff1aSopenharmony_ci block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep); 1440cabdff1aSopenharmony_ci block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep); 1441cabdff1aSopenharmony_ci} 1442cabdff1aSopenharmony_ci 1443cabdff1aSopenharmony_cistatic void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block, 1444cabdff1aSopenharmony_ci int stride, int x, int y) 1445cabdff1aSopenharmony_ci{ 1446cabdff1aSopenharmony_ci int i; 1447cabdff1aSopenharmony_ci 1448cabdff1aSopenharmony_ci block->ref = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1); 1449cabdff1aSopenharmony_ci block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1); 1450cabdff1aSopenharmony_ci 1451cabdff1aSopenharmony_ci if (s->num_refs == 2) { 1452cabdff1aSopenharmony_ci block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2); 1453cabdff1aSopenharmony_ci block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1; 1454cabdff1aSopenharmony_ci } 1455cabdff1aSopenharmony_ci 1456cabdff1aSopenharmony_ci if (!block->ref) { 1457cabdff1aSopenharmony_ci pred_block_dc(block, stride, x, y); 1458cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1459cabdff1aSopenharmony_ci block->u.dc[i] += (unsigned)dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA); 1460cabdff1aSopenharmony_ci return; 1461cabdff1aSopenharmony_ci } 1462cabdff1aSopenharmony_ci 1463cabdff1aSopenharmony_ci if (s->globalmc_flag) { 1464cabdff1aSopenharmony_ci block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL); 1465cabdff1aSopenharmony_ci block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2; 1466cabdff1aSopenharmony_ci } 1467cabdff1aSopenharmony_ci 1468cabdff1aSopenharmony_ci for (i = 0; i < s->num_refs; i++) 1469cabdff1aSopenharmony_ci if (block->ref & (i+1)) { 1470cabdff1aSopenharmony_ci if (block->ref & DIRAC_REF_MASK_GLOBAL) { 1471cabdff1aSopenharmony_ci global_mv(s, block, x, y, i); 1472cabdff1aSopenharmony_ci } else { 1473cabdff1aSopenharmony_ci pred_mv(block, stride, x, y, i); 1474cabdff1aSopenharmony_ci block->u.mv[i][0] += (unsigned)dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA); 1475cabdff1aSopenharmony_ci block->u.mv[i][1] += (unsigned)dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA); 1476cabdff1aSopenharmony_ci } 1477cabdff1aSopenharmony_ci } 1478cabdff1aSopenharmony_ci} 1479cabdff1aSopenharmony_ci 1480cabdff1aSopenharmony_ci/** 1481cabdff1aSopenharmony_ci * Copies the current block to the other blocks covered by the current superblock split mode 1482cabdff1aSopenharmony_ci */ 1483cabdff1aSopenharmony_cistatic void propagate_block_data(DiracBlock *block, int stride, int size) 1484cabdff1aSopenharmony_ci{ 1485cabdff1aSopenharmony_ci int x, y; 1486cabdff1aSopenharmony_ci DiracBlock *dst = block; 1487cabdff1aSopenharmony_ci 1488cabdff1aSopenharmony_ci for (x = 1; x < size; x++) 1489cabdff1aSopenharmony_ci dst[x] = *block; 1490cabdff1aSopenharmony_ci 1491cabdff1aSopenharmony_ci for (y = 1; y < size; y++) { 1492cabdff1aSopenharmony_ci dst += stride; 1493cabdff1aSopenharmony_ci for (x = 0; x < size; x++) 1494cabdff1aSopenharmony_ci dst[x] = *block; 1495cabdff1aSopenharmony_ci } 1496cabdff1aSopenharmony_ci} 1497cabdff1aSopenharmony_ci 1498cabdff1aSopenharmony_ci/** 1499cabdff1aSopenharmony_ci * Dirac Specification -> 1500cabdff1aSopenharmony_ci * 12. Block motion data syntax 1501cabdff1aSopenharmony_ci */ 1502cabdff1aSopenharmony_cistatic int dirac_unpack_block_motion_data(DiracContext *s) 1503cabdff1aSopenharmony_ci{ 1504cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 1505cabdff1aSopenharmony_ci uint8_t *sbsplit = s->sbsplit; 1506cabdff1aSopenharmony_ci int i, x, y, q, p; 1507cabdff1aSopenharmony_ci DiracArith arith[8]; 1508cabdff1aSopenharmony_ci 1509cabdff1aSopenharmony_ci align_get_bits(gb); 1510cabdff1aSopenharmony_ci 1511cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */ 1512cabdff1aSopenharmony_ci s->sbwidth = DIVRNDUP(s->seq.width, 4*s->plane[0].xbsep); 1513cabdff1aSopenharmony_ci s->sbheight = DIVRNDUP(s->seq.height, 4*s->plane[0].ybsep); 1514cabdff1aSopenharmony_ci s->blwidth = 4 * s->sbwidth; 1515cabdff1aSopenharmony_ci s->blheight = 4 * s->sbheight; 1516cabdff1aSopenharmony_ci 1517cabdff1aSopenharmony_ci /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes() 1518cabdff1aSopenharmony_ci decode superblock split modes */ 1519cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(arith, gb, get_interleaved_ue_golomb(gb)); /* get_interleaved_ue_golomb(gb) is the length */ 1520cabdff1aSopenharmony_ci for (y = 0; y < s->sbheight; y++) { 1521cabdff1aSopenharmony_ci for (x = 0; x < s->sbwidth; x++) { 1522cabdff1aSopenharmony_ci unsigned int split = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA); 1523cabdff1aSopenharmony_ci if (split > 2) 1524cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1525cabdff1aSopenharmony_ci sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3; 1526cabdff1aSopenharmony_ci } 1527cabdff1aSopenharmony_ci sbsplit += s->sbwidth; 1528cabdff1aSopenharmony_ci } 1529cabdff1aSopenharmony_ci 1530cabdff1aSopenharmony_ci /* setup arith decoding */ 1531cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(arith, gb, get_interleaved_ue_golomb(gb)); 1532cabdff1aSopenharmony_ci for (i = 0; i < s->num_refs; i++) { 1533cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, get_interleaved_ue_golomb(gb)); 1534cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, get_interleaved_ue_golomb(gb)); 1535cabdff1aSopenharmony_ci } 1536cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) 1537cabdff1aSopenharmony_ci ff_dirac_init_arith_decoder(arith+1+i, gb, get_interleaved_ue_golomb(gb)); 1538cabdff1aSopenharmony_ci 1539cabdff1aSopenharmony_ci for (y = 0; y < s->sbheight; y++) 1540cabdff1aSopenharmony_ci for (x = 0; x < s->sbwidth; x++) { 1541cabdff1aSopenharmony_ci int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x]; 1542cabdff1aSopenharmony_ci int step = 4 >> s->sbsplit[y * s->sbwidth + x]; 1543cabdff1aSopenharmony_ci 1544cabdff1aSopenharmony_ci for (q = 0; q < blkcnt; q++) 1545cabdff1aSopenharmony_ci for (p = 0; p < blkcnt; p++) { 1546cabdff1aSopenharmony_ci int bx = 4 * x + p*step; 1547cabdff1aSopenharmony_ci int by = 4 * y + q*step; 1548cabdff1aSopenharmony_ci DiracBlock *block = &s->blmotion[by*s->blwidth + bx]; 1549cabdff1aSopenharmony_ci decode_block_params(s, arith, block, s->blwidth, bx, by); 1550cabdff1aSopenharmony_ci propagate_block_data(block, s->blwidth, step); 1551cabdff1aSopenharmony_ci } 1552cabdff1aSopenharmony_ci } 1553cabdff1aSopenharmony_ci 1554cabdff1aSopenharmony_ci for (i = 0; i < 4 + 2*s->num_refs; i++) { 1555cabdff1aSopenharmony_ci if (arith[i].error) 1556cabdff1aSopenharmony_ci return arith[i].error; 1557cabdff1aSopenharmony_ci } 1558cabdff1aSopenharmony_ci 1559cabdff1aSopenharmony_ci return 0; 1560cabdff1aSopenharmony_ci} 1561cabdff1aSopenharmony_ci 1562cabdff1aSopenharmony_cistatic int weight(int i, int blen, int offset) 1563cabdff1aSopenharmony_ci{ 1564cabdff1aSopenharmony_ci#define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \ 1565cabdff1aSopenharmony_ci (1 + (6*(i) + offset - 1) / (2*offset - 1)) 1566cabdff1aSopenharmony_ci 1567cabdff1aSopenharmony_ci if (i < 2*offset) 1568cabdff1aSopenharmony_ci return ROLLOFF(i); 1569cabdff1aSopenharmony_ci else if (i > blen-1 - 2*offset) 1570cabdff1aSopenharmony_ci return ROLLOFF(blen-1 - i); 1571cabdff1aSopenharmony_ci return 8; 1572cabdff1aSopenharmony_ci} 1573cabdff1aSopenharmony_ci 1574cabdff1aSopenharmony_cistatic void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride, 1575cabdff1aSopenharmony_ci int left, int right, int wy) 1576cabdff1aSopenharmony_ci{ 1577cabdff1aSopenharmony_ci int x; 1578cabdff1aSopenharmony_ci for (x = 0; left && x < p->xblen >> 1; x++) 1579cabdff1aSopenharmony_ci obmc_weight[x] = wy*8; 1580cabdff1aSopenharmony_ci for (; x < p->xblen >> right; x++) 1581cabdff1aSopenharmony_ci obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset); 1582cabdff1aSopenharmony_ci for (; x < p->xblen; x++) 1583cabdff1aSopenharmony_ci obmc_weight[x] = wy*8; 1584cabdff1aSopenharmony_ci for (; x < stride; x++) 1585cabdff1aSopenharmony_ci obmc_weight[x] = 0; 1586cabdff1aSopenharmony_ci} 1587cabdff1aSopenharmony_ci 1588cabdff1aSopenharmony_cistatic void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride, 1589cabdff1aSopenharmony_ci int left, int right, int top, int bottom) 1590cabdff1aSopenharmony_ci{ 1591cabdff1aSopenharmony_ci int y; 1592cabdff1aSopenharmony_ci for (y = 0; top && y < p->yblen >> 1; y++) { 1593cabdff1aSopenharmony_ci init_obmc_weight_row(p, obmc_weight, stride, left, right, 8); 1594cabdff1aSopenharmony_ci obmc_weight += stride; 1595cabdff1aSopenharmony_ci } 1596cabdff1aSopenharmony_ci for (; y < p->yblen >> bottom; y++) { 1597cabdff1aSopenharmony_ci int wy = weight(y, p->yblen, p->yoffset); 1598cabdff1aSopenharmony_ci init_obmc_weight_row(p, obmc_weight, stride, left, right, wy); 1599cabdff1aSopenharmony_ci obmc_weight += stride; 1600cabdff1aSopenharmony_ci } 1601cabdff1aSopenharmony_ci for (; y < p->yblen; y++) { 1602cabdff1aSopenharmony_ci init_obmc_weight_row(p, obmc_weight, stride, left, right, 8); 1603cabdff1aSopenharmony_ci obmc_weight += stride; 1604cabdff1aSopenharmony_ci } 1605cabdff1aSopenharmony_ci} 1606cabdff1aSopenharmony_ci 1607cabdff1aSopenharmony_cistatic void init_obmc_weights(DiracContext *s, Plane *p, int by) 1608cabdff1aSopenharmony_ci{ 1609cabdff1aSopenharmony_ci int top = !by; 1610cabdff1aSopenharmony_ci int bottom = by == s->blheight-1; 1611cabdff1aSopenharmony_ci 1612cabdff1aSopenharmony_ci /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */ 1613cabdff1aSopenharmony_ci if (top || bottom || by == 1) { 1614cabdff1aSopenharmony_ci init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom); 1615cabdff1aSopenharmony_ci init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom); 1616cabdff1aSopenharmony_ci init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom); 1617cabdff1aSopenharmony_ci } 1618cabdff1aSopenharmony_ci} 1619cabdff1aSopenharmony_ci 1620cabdff1aSopenharmony_cistatic const uint8_t epel_weights[4][4][4] = { 1621cabdff1aSopenharmony_ci {{ 16, 0, 0, 0 }, 1622cabdff1aSopenharmony_ci { 12, 4, 0, 0 }, 1623cabdff1aSopenharmony_ci { 8, 8, 0, 0 }, 1624cabdff1aSopenharmony_ci { 4, 12, 0, 0 }}, 1625cabdff1aSopenharmony_ci {{ 12, 0, 4, 0 }, 1626cabdff1aSopenharmony_ci { 9, 3, 3, 1 }, 1627cabdff1aSopenharmony_ci { 6, 6, 2, 2 }, 1628cabdff1aSopenharmony_ci { 3, 9, 1, 3 }}, 1629cabdff1aSopenharmony_ci {{ 8, 0, 8, 0 }, 1630cabdff1aSopenharmony_ci { 6, 2, 6, 2 }, 1631cabdff1aSopenharmony_ci { 4, 4, 4, 4 }, 1632cabdff1aSopenharmony_ci { 2, 6, 2, 6 }}, 1633cabdff1aSopenharmony_ci {{ 4, 0, 12, 0 }, 1634cabdff1aSopenharmony_ci { 3, 1, 9, 3 }, 1635cabdff1aSopenharmony_ci { 2, 2, 6, 6 }, 1636cabdff1aSopenharmony_ci { 1, 3, 3, 9 }} 1637cabdff1aSopenharmony_ci}; 1638cabdff1aSopenharmony_ci 1639cabdff1aSopenharmony_ci/** 1640cabdff1aSopenharmony_ci * For block x,y, determine which of the hpel planes to do bilinear 1641cabdff1aSopenharmony_ci * interpolation from and set src[] to the location in each hpel plane 1642cabdff1aSopenharmony_ci * to MC from. 1643cabdff1aSopenharmony_ci * 1644cabdff1aSopenharmony_ci * @return the index of the put_dirac_pixels_tab function to use 1645cabdff1aSopenharmony_ci * 0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel 1646cabdff1aSopenharmony_ci */ 1647cabdff1aSopenharmony_cistatic int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5], 1648cabdff1aSopenharmony_ci int x, int y, int ref, int plane) 1649cabdff1aSopenharmony_ci{ 1650cabdff1aSopenharmony_ci Plane *p = &s->plane[plane]; 1651cabdff1aSopenharmony_ci uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane]; 1652cabdff1aSopenharmony_ci int motion_x = block->u.mv[ref][0]; 1653cabdff1aSopenharmony_ci int motion_y = block->u.mv[ref][1]; 1654cabdff1aSopenharmony_ci int mx, my, i, epel, nplanes = 0; 1655cabdff1aSopenharmony_ci 1656cabdff1aSopenharmony_ci if (plane) { 1657cabdff1aSopenharmony_ci motion_x >>= s->chroma_x_shift; 1658cabdff1aSopenharmony_ci motion_y >>= s->chroma_y_shift; 1659cabdff1aSopenharmony_ci } 1660cabdff1aSopenharmony_ci 1661cabdff1aSopenharmony_ci mx = motion_x & ~(-1U << s->mv_precision); 1662cabdff1aSopenharmony_ci my = motion_y & ~(-1U << s->mv_precision); 1663cabdff1aSopenharmony_ci motion_x >>= s->mv_precision; 1664cabdff1aSopenharmony_ci motion_y >>= s->mv_precision; 1665cabdff1aSopenharmony_ci /* normalize subpel coordinates to epel */ 1666cabdff1aSopenharmony_ci /* TODO: template this function? */ 1667cabdff1aSopenharmony_ci mx <<= 3 - s->mv_precision; 1668cabdff1aSopenharmony_ci my <<= 3 - s->mv_precision; 1669cabdff1aSopenharmony_ci 1670cabdff1aSopenharmony_ci x += motion_x; 1671cabdff1aSopenharmony_ci y += motion_y; 1672cabdff1aSopenharmony_ci epel = (mx|my)&1; 1673cabdff1aSopenharmony_ci 1674cabdff1aSopenharmony_ci /* hpel position */ 1675cabdff1aSopenharmony_ci if (!((mx|my)&3)) { 1676cabdff1aSopenharmony_ci nplanes = 1; 1677cabdff1aSopenharmony_ci src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x; 1678cabdff1aSopenharmony_ci } else { 1679cabdff1aSopenharmony_ci /* qpel or epel */ 1680cabdff1aSopenharmony_ci nplanes = 4; 1681cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 1682cabdff1aSopenharmony_ci src[i] = ref_hpel[i] + y*p->stride + x; 1683cabdff1aSopenharmony_ci 1684cabdff1aSopenharmony_ci /* if we're interpolating in the right/bottom halves, adjust the planes as needed 1685cabdff1aSopenharmony_ci we increment x/y because the edge changes for half of the pixels */ 1686cabdff1aSopenharmony_ci if (mx > 4) { 1687cabdff1aSopenharmony_ci src[0] += 1; 1688cabdff1aSopenharmony_ci src[2] += 1; 1689cabdff1aSopenharmony_ci x++; 1690cabdff1aSopenharmony_ci } 1691cabdff1aSopenharmony_ci if (my > 4) { 1692cabdff1aSopenharmony_ci src[0] += p->stride; 1693cabdff1aSopenharmony_ci src[1] += p->stride; 1694cabdff1aSopenharmony_ci y++; 1695cabdff1aSopenharmony_ci } 1696cabdff1aSopenharmony_ci 1697cabdff1aSopenharmony_ci /* hpel planes are: 1698cabdff1aSopenharmony_ci [0]: F [1]: H 1699cabdff1aSopenharmony_ci [2]: V [3]: C */ 1700cabdff1aSopenharmony_ci if (!epel) { 1701cabdff1aSopenharmony_ci /* check if we really only need 2 planes since either mx or my is 1702cabdff1aSopenharmony_ci a hpel position. (epel weights of 0 handle this there) */ 1703cabdff1aSopenharmony_ci if (!(mx&3)) { 1704cabdff1aSopenharmony_ci /* mx == 0: average [0] and [2] 1705cabdff1aSopenharmony_ci mx == 4: average [1] and [3] */ 1706cabdff1aSopenharmony_ci src[!mx] = src[2 + !!mx]; 1707cabdff1aSopenharmony_ci nplanes = 2; 1708cabdff1aSopenharmony_ci } else if (!(my&3)) { 1709cabdff1aSopenharmony_ci src[0] = src[(my>>1) ]; 1710cabdff1aSopenharmony_ci src[1] = src[(my>>1)+1]; 1711cabdff1aSopenharmony_ci nplanes = 2; 1712cabdff1aSopenharmony_ci } 1713cabdff1aSopenharmony_ci } else { 1714cabdff1aSopenharmony_ci /* adjust the ordering if needed so the weights work */ 1715cabdff1aSopenharmony_ci if (mx > 4) { 1716cabdff1aSopenharmony_ci FFSWAP(const uint8_t *, src[0], src[1]); 1717cabdff1aSopenharmony_ci FFSWAP(const uint8_t *, src[2], src[3]); 1718cabdff1aSopenharmony_ci } 1719cabdff1aSopenharmony_ci if (my > 4) { 1720cabdff1aSopenharmony_ci FFSWAP(const uint8_t *, src[0], src[2]); 1721cabdff1aSopenharmony_ci FFSWAP(const uint8_t *, src[1], src[3]); 1722cabdff1aSopenharmony_ci } 1723cabdff1aSopenharmony_ci src[4] = epel_weights[my&3][mx&3]; 1724cabdff1aSopenharmony_ci } 1725cabdff1aSopenharmony_ci } 1726cabdff1aSopenharmony_ci 1727cabdff1aSopenharmony_ci /* fixme: v/h _edge_pos */ 1728cabdff1aSopenharmony_ci if (x + p->xblen > p->width +EDGE_WIDTH/2 || 1729cabdff1aSopenharmony_ci y + p->yblen > p->height+EDGE_WIDTH/2 || 1730cabdff1aSopenharmony_ci x < 0 || y < 0) { 1731cabdff1aSopenharmony_ci for (i = 0; i < nplanes; i++) { 1732cabdff1aSopenharmony_ci s->vdsp.emulated_edge_mc(s->edge_emu_buffer[i], src[i], 1733cabdff1aSopenharmony_ci p->stride, p->stride, 1734cabdff1aSopenharmony_ci p->xblen, p->yblen, x, y, 1735cabdff1aSopenharmony_ci p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2); 1736cabdff1aSopenharmony_ci src[i] = s->edge_emu_buffer[i]; 1737cabdff1aSopenharmony_ci } 1738cabdff1aSopenharmony_ci } 1739cabdff1aSopenharmony_ci return (nplanes>>1) + epel; 1740cabdff1aSopenharmony_ci} 1741cabdff1aSopenharmony_ci 1742cabdff1aSopenharmony_cistatic void add_dc(uint16_t *dst, int dc, int stride, 1743cabdff1aSopenharmony_ci uint8_t *obmc_weight, int xblen, int yblen) 1744cabdff1aSopenharmony_ci{ 1745cabdff1aSopenharmony_ci int x, y; 1746cabdff1aSopenharmony_ci dc += 128; 1747cabdff1aSopenharmony_ci 1748cabdff1aSopenharmony_ci for (y = 0; y < yblen; y++) { 1749cabdff1aSopenharmony_ci for (x = 0; x < xblen; x += 2) { 1750cabdff1aSopenharmony_ci dst[x ] += dc * obmc_weight[x ]; 1751cabdff1aSopenharmony_ci dst[x+1] += dc * obmc_weight[x+1]; 1752cabdff1aSopenharmony_ci } 1753cabdff1aSopenharmony_ci dst += stride; 1754cabdff1aSopenharmony_ci obmc_weight += MAX_BLOCKSIZE; 1755cabdff1aSopenharmony_ci } 1756cabdff1aSopenharmony_ci} 1757cabdff1aSopenharmony_ci 1758cabdff1aSopenharmony_cistatic void block_mc(DiracContext *s, DiracBlock *block, 1759cabdff1aSopenharmony_ci uint16_t *mctmp, uint8_t *obmc_weight, 1760cabdff1aSopenharmony_ci int plane, int dstx, int dsty) 1761cabdff1aSopenharmony_ci{ 1762cabdff1aSopenharmony_ci Plane *p = &s->plane[plane]; 1763cabdff1aSopenharmony_ci const uint8_t *src[5]; 1764cabdff1aSopenharmony_ci int idx; 1765cabdff1aSopenharmony_ci 1766cabdff1aSopenharmony_ci switch (block->ref&3) { 1767cabdff1aSopenharmony_ci case 0: /* DC */ 1768cabdff1aSopenharmony_ci add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen); 1769cabdff1aSopenharmony_ci return; 1770cabdff1aSopenharmony_ci case 1: 1771cabdff1aSopenharmony_ci case 2: 1772cabdff1aSopenharmony_ci idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane); 1773cabdff1aSopenharmony_ci s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen); 1774cabdff1aSopenharmony_ci if (s->weight_func) 1775cabdff1aSopenharmony_ci s->weight_func(s->mcscratch, p->stride, s->weight_log2denom, 1776cabdff1aSopenharmony_ci s->weight[0] + s->weight[1], p->yblen); 1777cabdff1aSopenharmony_ci break; 1778cabdff1aSopenharmony_ci case 3: 1779cabdff1aSopenharmony_ci idx = mc_subpel(s, block, src, dstx, dsty, 0, plane); 1780cabdff1aSopenharmony_ci s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen); 1781cabdff1aSopenharmony_ci idx = mc_subpel(s, block, src, dstx, dsty, 1, plane); 1782cabdff1aSopenharmony_ci if (s->biweight_func) { 1783cabdff1aSopenharmony_ci /* fixme: +32 is a quick hack */ 1784cabdff1aSopenharmony_ci s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen); 1785cabdff1aSopenharmony_ci s->biweight_func(s->mcscratch, s->mcscratch+32, p->stride, s->weight_log2denom, 1786cabdff1aSopenharmony_ci s->weight[0], s->weight[1], p->yblen); 1787cabdff1aSopenharmony_ci } else 1788cabdff1aSopenharmony_ci s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen); 1789cabdff1aSopenharmony_ci break; 1790cabdff1aSopenharmony_ci } 1791cabdff1aSopenharmony_ci s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen); 1792cabdff1aSopenharmony_ci} 1793cabdff1aSopenharmony_ci 1794cabdff1aSopenharmony_cistatic void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty) 1795cabdff1aSopenharmony_ci{ 1796cabdff1aSopenharmony_ci Plane *p = &s->plane[plane]; 1797cabdff1aSopenharmony_ci int x, dstx = p->xbsep - p->xoffset; 1798cabdff1aSopenharmony_ci 1799cabdff1aSopenharmony_ci block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty); 1800cabdff1aSopenharmony_ci mctmp += p->xbsep; 1801cabdff1aSopenharmony_ci 1802cabdff1aSopenharmony_ci for (x = 1; x < s->blwidth-1; x++) { 1803cabdff1aSopenharmony_ci block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty); 1804cabdff1aSopenharmony_ci dstx += p->xbsep; 1805cabdff1aSopenharmony_ci mctmp += p->xbsep; 1806cabdff1aSopenharmony_ci } 1807cabdff1aSopenharmony_ci block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty); 1808cabdff1aSopenharmony_ci} 1809cabdff1aSopenharmony_ci 1810cabdff1aSopenharmony_cistatic void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen) 1811cabdff1aSopenharmony_ci{ 1812cabdff1aSopenharmony_ci int idx = 0; 1813cabdff1aSopenharmony_ci if (xblen > 8) 1814cabdff1aSopenharmony_ci idx = 1; 1815cabdff1aSopenharmony_ci if (xblen > 16) 1816cabdff1aSopenharmony_ci idx = 2; 1817cabdff1aSopenharmony_ci 1818cabdff1aSopenharmony_ci memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab)); 1819cabdff1aSopenharmony_ci memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab)); 1820cabdff1aSopenharmony_ci s->add_obmc = s->diracdsp.add_dirac_obmc[idx]; 1821cabdff1aSopenharmony_ci if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) { 1822cabdff1aSopenharmony_ci s->weight_func = s->diracdsp.weight_dirac_pixels_tab[idx]; 1823cabdff1aSopenharmony_ci s->biweight_func = s->diracdsp.biweight_dirac_pixels_tab[idx]; 1824cabdff1aSopenharmony_ci } else { 1825cabdff1aSopenharmony_ci s->weight_func = NULL; 1826cabdff1aSopenharmony_ci s->biweight_func = NULL; 1827cabdff1aSopenharmony_ci } 1828cabdff1aSopenharmony_ci} 1829cabdff1aSopenharmony_ci 1830cabdff1aSopenharmony_cistatic int interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height) 1831cabdff1aSopenharmony_ci{ 1832cabdff1aSopenharmony_ci /* chroma allocates an edge of 8 when subsampled 1833cabdff1aSopenharmony_ci which for 4:2:2 means an h edge of 16 and v edge of 8 1834cabdff1aSopenharmony_ci just use 8 for everything for the moment */ 1835cabdff1aSopenharmony_ci int i, edge = EDGE_WIDTH/2; 1836cabdff1aSopenharmony_ci 1837cabdff1aSopenharmony_ci ref->hpel[plane][0] = ref->avframe->data[plane]; 1838cabdff1aSopenharmony_ci s->mpvencdsp.draw_edges(ref->hpel[plane][0], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); /* EDGE_TOP | EDGE_BOTTOM values just copied to make it build, this needs to be ensured */ 1839cabdff1aSopenharmony_ci 1840cabdff1aSopenharmony_ci /* no need for hpel if we only have fpel vectors */ 1841cabdff1aSopenharmony_ci if (!s->mv_precision) 1842cabdff1aSopenharmony_ci return 0; 1843cabdff1aSopenharmony_ci 1844cabdff1aSopenharmony_ci for (i = 1; i < 4; i++) { 1845cabdff1aSopenharmony_ci if (!ref->hpel_base[plane][i]) 1846cabdff1aSopenharmony_ci ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe->linesize[plane] + 32); 1847cabdff1aSopenharmony_ci if (!ref->hpel_base[plane][i]) { 1848cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1849cabdff1aSopenharmony_ci } 1850cabdff1aSopenharmony_ci /* we need to be 16-byte aligned even for chroma */ 1851cabdff1aSopenharmony_ci ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe->linesize[plane] + 16; 1852cabdff1aSopenharmony_ci } 1853cabdff1aSopenharmony_ci 1854cabdff1aSopenharmony_ci if (!ref->interpolated[plane]) { 1855cabdff1aSopenharmony_ci s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2], 1856cabdff1aSopenharmony_ci ref->hpel[plane][3], ref->hpel[plane][0], 1857cabdff1aSopenharmony_ci ref->avframe->linesize[plane], width, height); 1858cabdff1aSopenharmony_ci s->mpvencdsp.draw_edges(ref->hpel[plane][1], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); 1859cabdff1aSopenharmony_ci s->mpvencdsp.draw_edges(ref->hpel[plane][2], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); 1860cabdff1aSopenharmony_ci s->mpvencdsp.draw_edges(ref->hpel[plane][3], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); 1861cabdff1aSopenharmony_ci } 1862cabdff1aSopenharmony_ci ref->interpolated[plane] = 1; 1863cabdff1aSopenharmony_ci 1864cabdff1aSopenharmony_ci return 0; 1865cabdff1aSopenharmony_ci} 1866cabdff1aSopenharmony_ci 1867cabdff1aSopenharmony_ci/** 1868cabdff1aSopenharmony_ci * Dirac Specification -> 1869cabdff1aSopenharmony_ci * 13.0 Transform data syntax. transform_data() 1870cabdff1aSopenharmony_ci */ 1871cabdff1aSopenharmony_cistatic int dirac_decode_frame_internal(DiracContext *s) 1872cabdff1aSopenharmony_ci{ 1873cabdff1aSopenharmony_ci DWTContext d; 1874cabdff1aSopenharmony_ci int y, i, comp, dsty; 1875cabdff1aSopenharmony_ci int ret; 1876cabdff1aSopenharmony_ci 1877cabdff1aSopenharmony_ci if (s->low_delay) { 1878cabdff1aSopenharmony_ci /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */ 1879cabdff1aSopenharmony_ci if (!s->hq_picture) { 1880cabdff1aSopenharmony_ci for (comp = 0; comp < 3; comp++) { 1881cabdff1aSopenharmony_ci Plane *p = &s->plane[comp]; 1882cabdff1aSopenharmony_ci memset(p->idwt.buf, 0, p->idwt.stride * p->idwt.height); 1883cabdff1aSopenharmony_ci } 1884cabdff1aSopenharmony_ci } 1885cabdff1aSopenharmony_ci if (!s->zero_res) { 1886cabdff1aSopenharmony_ci if ((ret = decode_lowdelay(s)) < 0) 1887cabdff1aSopenharmony_ci return ret; 1888cabdff1aSopenharmony_ci } 1889cabdff1aSopenharmony_ci } 1890cabdff1aSopenharmony_ci 1891cabdff1aSopenharmony_ci for (comp = 0; comp < 3; comp++) { 1892cabdff1aSopenharmony_ci Plane *p = &s->plane[comp]; 1893cabdff1aSopenharmony_ci uint8_t *frame = s->current_picture->avframe->data[comp]; 1894cabdff1aSopenharmony_ci 1895cabdff1aSopenharmony_ci /* FIXME: small resolutions */ 1896cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) 1897cabdff1aSopenharmony_ci s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16); 1898cabdff1aSopenharmony_ci 1899cabdff1aSopenharmony_ci if (!s->zero_res && !s->low_delay) 1900cabdff1aSopenharmony_ci { 1901cabdff1aSopenharmony_ci memset(p->idwt.buf, 0, p->idwt.stride * p->idwt.height); 1902cabdff1aSopenharmony_ci ret = decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */ 1903cabdff1aSopenharmony_ci if (ret < 0) 1904cabdff1aSopenharmony_ci return ret; 1905cabdff1aSopenharmony_ci } 1906cabdff1aSopenharmony_ci ret = ff_spatial_idwt_init(&d, &p->idwt, s->wavelet_idx+2, 1907cabdff1aSopenharmony_ci s->wavelet_depth, s->bit_depth); 1908cabdff1aSopenharmony_ci if (ret < 0) 1909cabdff1aSopenharmony_ci return ret; 1910cabdff1aSopenharmony_ci 1911cabdff1aSopenharmony_ci if (!s->num_refs) { /* intra */ 1912cabdff1aSopenharmony_ci for (y = 0; y < p->height; y += 16) { 1913cabdff1aSopenharmony_ci int idx = (s->bit_depth - 8) >> 1; 1914cabdff1aSopenharmony_ci ff_spatial_idwt_slice2(&d, y+16); /* decode */ 1915cabdff1aSopenharmony_ci s->diracdsp.put_signed_rect_clamped[idx](frame + y*p->stride, 1916cabdff1aSopenharmony_ci p->stride, 1917cabdff1aSopenharmony_ci p->idwt.buf + y*p->idwt.stride, 1918cabdff1aSopenharmony_ci p->idwt.stride, p->width, 16); 1919cabdff1aSopenharmony_ci } 1920cabdff1aSopenharmony_ci } else { /* inter */ 1921cabdff1aSopenharmony_ci int rowheight = p->ybsep*p->stride; 1922cabdff1aSopenharmony_ci 1923cabdff1aSopenharmony_ci select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen); 1924cabdff1aSopenharmony_ci 1925cabdff1aSopenharmony_ci for (i = 0; i < s->num_refs; i++) { 1926cabdff1aSopenharmony_ci int ret = interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height); 1927cabdff1aSopenharmony_ci if (ret < 0) 1928cabdff1aSopenharmony_ci return ret; 1929cabdff1aSopenharmony_ci } 1930cabdff1aSopenharmony_ci 1931cabdff1aSopenharmony_ci memset(s->mctmp, 0, 4*p->yoffset*p->stride); 1932cabdff1aSopenharmony_ci 1933cabdff1aSopenharmony_ci dsty = -p->yoffset; 1934cabdff1aSopenharmony_ci for (y = 0; y < s->blheight; y++) { 1935cabdff1aSopenharmony_ci int h = 0, 1936cabdff1aSopenharmony_ci start = FFMAX(dsty, 0); 1937cabdff1aSopenharmony_ci uint16_t *mctmp = s->mctmp + y*rowheight; 1938cabdff1aSopenharmony_ci DiracBlock *blocks = s->blmotion + y*s->blwidth; 1939cabdff1aSopenharmony_ci 1940cabdff1aSopenharmony_ci init_obmc_weights(s, p, y); 1941cabdff1aSopenharmony_ci 1942cabdff1aSopenharmony_ci if (y == s->blheight-1 || start+p->ybsep > p->height) 1943cabdff1aSopenharmony_ci h = p->height - start; 1944cabdff1aSopenharmony_ci else 1945cabdff1aSopenharmony_ci h = p->ybsep - (start - dsty); 1946cabdff1aSopenharmony_ci if (h < 0) 1947cabdff1aSopenharmony_ci break; 1948cabdff1aSopenharmony_ci 1949cabdff1aSopenharmony_ci memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight); 1950cabdff1aSopenharmony_ci mc_row(s, blocks, mctmp, comp, dsty); 1951cabdff1aSopenharmony_ci 1952cabdff1aSopenharmony_ci mctmp += (start - dsty)*p->stride + p->xoffset; 1953cabdff1aSopenharmony_ci ff_spatial_idwt_slice2(&d, start + h); /* decode */ 1954cabdff1aSopenharmony_ci /* NOTE: add_rect_clamped hasn't been templated hence the shifts. 1955cabdff1aSopenharmony_ci * idwt.stride is passed as pixels, not in bytes as in the rest of the decoder */ 1956cabdff1aSopenharmony_ci s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride, 1957cabdff1aSopenharmony_ci (int16_t*)(p->idwt.buf) + start*(p->idwt.stride >> 1), (p->idwt.stride >> 1), p->width, h); 1958cabdff1aSopenharmony_ci 1959cabdff1aSopenharmony_ci dsty += p->ybsep; 1960cabdff1aSopenharmony_ci } 1961cabdff1aSopenharmony_ci } 1962cabdff1aSopenharmony_ci } 1963cabdff1aSopenharmony_ci 1964cabdff1aSopenharmony_ci 1965cabdff1aSopenharmony_ci return 0; 1966cabdff1aSopenharmony_ci} 1967cabdff1aSopenharmony_ci 1968cabdff1aSopenharmony_cistatic int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags) 1969cabdff1aSopenharmony_ci{ 1970cabdff1aSopenharmony_ci int ret, i; 1971cabdff1aSopenharmony_ci int chroma_x_shift, chroma_y_shift; 1972cabdff1aSopenharmony_ci ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &chroma_x_shift, 1973cabdff1aSopenharmony_ci &chroma_y_shift); 1974cabdff1aSopenharmony_ci if (ret < 0) 1975cabdff1aSopenharmony_ci return ret; 1976cabdff1aSopenharmony_ci 1977cabdff1aSopenharmony_ci f->width = avctx->width + 2 * EDGE_WIDTH; 1978cabdff1aSopenharmony_ci f->height = avctx->height + 2 * EDGE_WIDTH + 2; 1979cabdff1aSopenharmony_ci ret = ff_get_buffer(avctx, f, flags); 1980cabdff1aSopenharmony_ci if (ret < 0) 1981cabdff1aSopenharmony_ci return ret; 1982cabdff1aSopenharmony_ci 1983cabdff1aSopenharmony_ci for (i = 0; f->data[i]; i++) { 1984cabdff1aSopenharmony_ci int offset = (EDGE_WIDTH >> (i && i<3 ? chroma_y_shift : 0)) * 1985cabdff1aSopenharmony_ci f->linesize[i] + 32; 1986cabdff1aSopenharmony_ci f->data[i] += offset; 1987cabdff1aSopenharmony_ci } 1988cabdff1aSopenharmony_ci f->width = avctx->width; 1989cabdff1aSopenharmony_ci f->height = avctx->height; 1990cabdff1aSopenharmony_ci 1991cabdff1aSopenharmony_ci return 0; 1992cabdff1aSopenharmony_ci} 1993cabdff1aSopenharmony_ci 1994cabdff1aSopenharmony_ci/** 1995cabdff1aSopenharmony_ci * Dirac Specification -> 1996cabdff1aSopenharmony_ci * 11.1.1 Picture Header. picture_header() 1997cabdff1aSopenharmony_ci */ 1998cabdff1aSopenharmony_cistatic int dirac_decode_picture_header(DiracContext *s) 1999cabdff1aSopenharmony_ci{ 2000cabdff1aSopenharmony_ci unsigned retire, picnum; 2001cabdff1aSopenharmony_ci int i, j, ret; 2002cabdff1aSopenharmony_ci int64_t refdist, refnum; 2003cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 2004cabdff1aSopenharmony_ci 2005cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */ 2006cabdff1aSopenharmony_ci picnum = s->current_picture->avframe->display_picture_number = get_bits_long(gb, 32); 2007cabdff1aSopenharmony_ci 2008cabdff1aSopenharmony_ci 2009cabdff1aSopenharmony_ci av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum); 2010cabdff1aSopenharmony_ci 2011cabdff1aSopenharmony_ci /* if this is the first keyframe after a sequence header, start our 2012cabdff1aSopenharmony_ci reordering from here */ 2013cabdff1aSopenharmony_ci if (s->frame_number < 0) 2014cabdff1aSopenharmony_ci s->frame_number = picnum; 2015cabdff1aSopenharmony_ci 2016cabdff1aSopenharmony_ci s->ref_pics[0] = s->ref_pics[1] = NULL; 2017cabdff1aSopenharmony_ci for (i = 0; i < s->num_refs; i++) { 2018cabdff1aSopenharmony_ci refnum = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF; 2019cabdff1aSopenharmony_ci refdist = INT64_MAX; 2020cabdff1aSopenharmony_ci 2021cabdff1aSopenharmony_ci /* find the closest reference to the one we want */ 2022cabdff1aSopenharmony_ci /* Jordi: this is needed if the referenced picture hasn't yet arrived */ 2023cabdff1aSopenharmony_ci for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++) 2024cabdff1aSopenharmony_ci if (s->ref_frames[j] 2025cabdff1aSopenharmony_ci && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) { 2026cabdff1aSopenharmony_ci s->ref_pics[i] = s->ref_frames[j]; 2027cabdff1aSopenharmony_ci refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum); 2028cabdff1aSopenharmony_ci } 2029cabdff1aSopenharmony_ci 2030cabdff1aSopenharmony_ci if (!s->ref_pics[i] || refdist) 2031cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n"); 2032cabdff1aSopenharmony_ci 2033cabdff1aSopenharmony_ci /* if there were no references at all, allocate one */ 2034cabdff1aSopenharmony_ci if (!s->ref_pics[i]) 2035cabdff1aSopenharmony_ci for (j = 0; j < MAX_FRAMES; j++) 2036cabdff1aSopenharmony_ci if (!s->all_frames[j].avframe->data[0]) { 2037cabdff1aSopenharmony_ci s->ref_pics[i] = &s->all_frames[j]; 2038cabdff1aSopenharmony_ci ret = get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF); 2039cabdff1aSopenharmony_ci if (ret < 0) 2040cabdff1aSopenharmony_ci return ret; 2041cabdff1aSopenharmony_ci break; 2042cabdff1aSopenharmony_ci } 2043cabdff1aSopenharmony_ci 2044cabdff1aSopenharmony_ci if (!s->ref_pics[i]) { 2045cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Reference could not be allocated\n"); 2046cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2047cabdff1aSopenharmony_ci } 2048cabdff1aSopenharmony_ci 2049cabdff1aSopenharmony_ci } 2050cabdff1aSopenharmony_ci 2051cabdff1aSopenharmony_ci /* retire the reference frames that are not used anymore */ 2052cabdff1aSopenharmony_ci if (s->current_picture->reference) { 2053cabdff1aSopenharmony_ci retire = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF; 2054cabdff1aSopenharmony_ci if (retire != picnum) { 2055cabdff1aSopenharmony_ci DiracFrame *retire_pic = remove_frame(s->ref_frames, retire); 2056cabdff1aSopenharmony_ci 2057cabdff1aSopenharmony_ci if (retire_pic) 2058cabdff1aSopenharmony_ci retire_pic->reference &= DELAYED_PIC_REF; 2059cabdff1aSopenharmony_ci else 2060cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n"); 2061cabdff1aSopenharmony_ci } 2062cabdff1aSopenharmony_ci 2063cabdff1aSopenharmony_ci /* if reference array is full, remove the oldest as per the spec */ 2064cabdff1aSopenharmony_ci while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) { 2065cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n"); 2066cabdff1aSopenharmony_ci remove_frame(s->ref_frames, s->ref_frames[0]->avframe->display_picture_number)->reference &= DELAYED_PIC_REF; 2067cabdff1aSopenharmony_ci } 2068cabdff1aSopenharmony_ci } 2069cabdff1aSopenharmony_ci 2070cabdff1aSopenharmony_ci if (s->num_refs) { 2071cabdff1aSopenharmony_ci ret = dirac_unpack_prediction_parameters(s); /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */ 2072cabdff1aSopenharmony_ci if (ret < 0) 2073cabdff1aSopenharmony_ci return ret; 2074cabdff1aSopenharmony_ci ret = dirac_unpack_block_motion_data(s); /* [DIRAC_STD] 12. Block motion data syntax */ 2075cabdff1aSopenharmony_ci if (ret < 0) 2076cabdff1aSopenharmony_ci return ret; 2077cabdff1aSopenharmony_ci } 2078cabdff1aSopenharmony_ci ret = dirac_unpack_idwt_params(s); /* [DIRAC_STD] 11.3 Wavelet transform data */ 2079cabdff1aSopenharmony_ci if (ret < 0) 2080cabdff1aSopenharmony_ci return ret; 2081cabdff1aSopenharmony_ci 2082cabdff1aSopenharmony_ci init_planes(s); 2083cabdff1aSopenharmony_ci return 0; 2084cabdff1aSopenharmony_ci} 2085cabdff1aSopenharmony_ci 2086cabdff1aSopenharmony_cistatic int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame) 2087cabdff1aSopenharmony_ci{ 2088cabdff1aSopenharmony_ci DiracFrame *out = s->delay_frames[0]; 2089cabdff1aSopenharmony_ci int i, out_idx = 0; 2090cabdff1aSopenharmony_ci int ret; 2091cabdff1aSopenharmony_ci 2092cabdff1aSopenharmony_ci /* find frame with lowest picture number */ 2093cabdff1aSopenharmony_ci for (i = 1; s->delay_frames[i]; i++) 2094cabdff1aSopenharmony_ci if (s->delay_frames[i]->avframe->display_picture_number < out->avframe->display_picture_number) { 2095cabdff1aSopenharmony_ci out = s->delay_frames[i]; 2096cabdff1aSopenharmony_ci out_idx = i; 2097cabdff1aSopenharmony_ci } 2098cabdff1aSopenharmony_ci 2099cabdff1aSopenharmony_ci for (i = out_idx; s->delay_frames[i]; i++) 2100cabdff1aSopenharmony_ci s->delay_frames[i] = s->delay_frames[i+1]; 2101cabdff1aSopenharmony_ci 2102cabdff1aSopenharmony_ci if (out) { 2103cabdff1aSopenharmony_ci out->reference ^= DELAYED_PIC_REF; 2104cabdff1aSopenharmony_ci if((ret = av_frame_ref(picture, out->avframe)) < 0) 2105cabdff1aSopenharmony_ci return ret; 2106cabdff1aSopenharmony_ci *got_frame = 1; 2107cabdff1aSopenharmony_ci } 2108cabdff1aSopenharmony_ci 2109cabdff1aSopenharmony_ci return 0; 2110cabdff1aSopenharmony_ci} 2111cabdff1aSopenharmony_ci 2112cabdff1aSopenharmony_ci/** 2113cabdff1aSopenharmony_ci * Dirac Specification -> 2114cabdff1aSopenharmony_ci * 9.6 Parse Info Header Syntax. parse_info() 2115cabdff1aSopenharmony_ci * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size 2116cabdff1aSopenharmony_ci */ 2117cabdff1aSopenharmony_ci#define DATA_UNIT_HEADER_SIZE 13 2118cabdff1aSopenharmony_ci 2119cabdff1aSopenharmony_ci/* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 2120cabdff1aSopenharmony_ci inside the function parse_sequence() */ 2121cabdff1aSopenharmony_cistatic int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size) 2122cabdff1aSopenharmony_ci{ 2123cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 2124cabdff1aSopenharmony_ci DiracFrame *pic = NULL; 2125cabdff1aSopenharmony_ci AVDiracSeqHeader *dsh; 2126cabdff1aSopenharmony_ci int ret, i; 2127cabdff1aSopenharmony_ci uint8_t parse_code; 2128cabdff1aSopenharmony_ci unsigned tmp; 2129cabdff1aSopenharmony_ci 2130cabdff1aSopenharmony_ci if (size < DATA_UNIT_HEADER_SIZE) 2131cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2132cabdff1aSopenharmony_ci 2133cabdff1aSopenharmony_ci parse_code = buf[4]; 2134cabdff1aSopenharmony_ci 2135cabdff1aSopenharmony_ci init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE)); 2136cabdff1aSopenharmony_ci 2137cabdff1aSopenharmony_ci if (parse_code == DIRAC_PCODE_SEQ_HEADER) { 2138cabdff1aSopenharmony_ci if (s->seen_sequence_header) 2139cabdff1aSopenharmony_ci return 0; 2140cabdff1aSopenharmony_ci 2141cabdff1aSopenharmony_ci /* [DIRAC_STD] 10. Sequence header */ 2142cabdff1aSopenharmony_ci ret = av_dirac_parse_sequence_header(&dsh, buf + DATA_UNIT_HEADER_SIZE, size - DATA_UNIT_HEADER_SIZE, avctx); 2143cabdff1aSopenharmony_ci if (ret < 0) { 2144cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "error parsing sequence header"); 2145cabdff1aSopenharmony_ci return ret; 2146cabdff1aSopenharmony_ci } 2147cabdff1aSopenharmony_ci 2148cabdff1aSopenharmony_ci if (CALC_PADDING((int64_t)dsh->width, MAX_DWT_LEVELS) * CALC_PADDING((int64_t)dsh->height, MAX_DWT_LEVELS) * 5LL > avctx->max_pixels) 2149cabdff1aSopenharmony_ci ret = AVERROR(ERANGE); 2150cabdff1aSopenharmony_ci if (ret >= 0) 2151cabdff1aSopenharmony_ci ret = ff_set_dimensions(avctx, dsh->width, dsh->height); 2152cabdff1aSopenharmony_ci if (ret < 0) { 2153cabdff1aSopenharmony_ci av_freep(&dsh); 2154cabdff1aSopenharmony_ci return ret; 2155cabdff1aSopenharmony_ci } 2156cabdff1aSopenharmony_ci 2157cabdff1aSopenharmony_ci ff_set_sar(avctx, dsh->sample_aspect_ratio); 2158cabdff1aSopenharmony_ci avctx->pix_fmt = dsh->pix_fmt; 2159cabdff1aSopenharmony_ci avctx->color_range = dsh->color_range; 2160cabdff1aSopenharmony_ci avctx->color_trc = dsh->color_trc; 2161cabdff1aSopenharmony_ci avctx->color_primaries = dsh->color_primaries; 2162cabdff1aSopenharmony_ci avctx->colorspace = dsh->colorspace; 2163cabdff1aSopenharmony_ci avctx->profile = dsh->profile; 2164cabdff1aSopenharmony_ci avctx->level = dsh->level; 2165cabdff1aSopenharmony_ci avctx->framerate = dsh->framerate; 2166cabdff1aSopenharmony_ci s->bit_depth = dsh->bit_depth; 2167cabdff1aSopenharmony_ci s->version.major = dsh->version.major; 2168cabdff1aSopenharmony_ci s->version.minor = dsh->version.minor; 2169cabdff1aSopenharmony_ci s->seq = *dsh; 2170cabdff1aSopenharmony_ci av_freep(&dsh); 2171cabdff1aSopenharmony_ci 2172cabdff1aSopenharmony_ci s->pshift = s->bit_depth > 8; 2173cabdff1aSopenharmony_ci 2174cabdff1aSopenharmony_ci ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, 2175cabdff1aSopenharmony_ci &s->chroma_x_shift, 2176cabdff1aSopenharmony_ci &s->chroma_y_shift); 2177cabdff1aSopenharmony_ci if (ret < 0) 2178cabdff1aSopenharmony_ci return ret; 2179cabdff1aSopenharmony_ci 2180cabdff1aSopenharmony_ci ret = alloc_sequence_buffers(s); 2181cabdff1aSopenharmony_ci if (ret < 0) 2182cabdff1aSopenharmony_ci return ret; 2183cabdff1aSopenharmony_ci 2184cabdff1aSopenharmony_ci s->seen_sequence_header = 1; 2185cabdff1aSopenharmony_ci } else if (parse_code == DIRAC_PCODE_END_SEQ) { /* [DIRAC_STD] End of Sequence */ 2186cabdff1aSopenharmony_ci free_sequence_buffers(s); 2187cabdff1aSopenharmony_ci s->seen_sequence_header = 0; 2188cabdff1aSopenharmony_ci } else if (parse_code == DIRAC_PCODE_AUX) { 2189cabdff1aSopenharmony_ci if (buf[13] == 1) { /* encoder implementation/version */ 2190cabdff1aSopenharmony_ci int ver[3]; 2191cabdff1aSopenharmony_ci /* versions older than 1.0.8 don't store quant delta for 2192cabdff1aSopenharmony_ci subbands with only one codeblock */ 2193cabdff1aSopenharmony_ci if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3) 2194cabdff1aSopenharmony_ci if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7) 2195cabdff1aSopenharmony_ci s->old_delta_quant = 1; 2196cabdff1aSopenharmony_ci } 2197cabdff1aSopenharmony_ci } else if (parse_code & 0x8) { /* picture data unit */ 2198cabdff1aSopenharmony_ci if (!s->seen_sequence_header) { 2199cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n"); 2200cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2201cabdff1aSopenharmony_ci } 2202cabdff1aSopenharmony_ci 2203cabdff1aSopenharmony_ci /* find an unused frame */ 2204cabdff1aSopenharmony_ci for (i = 0; i < MAX_FRAMES; i++) 2205cabdff1aSopenharmony_ci if (s->all_frames[i].avframe->data[0] == NULL) 2206cabdff1aSopenharmony_ci pic = &s->all_frames[i]; 2207cabdff1aSopenharmony_ci if (!pic) { 2208cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "framelist full\n"); 2209cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2210cabdff1aSopenharmony_ci } 2211cabdff1aSopenharmony_ci 2212cabdff1aSopenharmony_ci av_frame_unref(pic->avframe); 2213cabdff1aSopenharmony_ci 2214cabdff1aSopenharmony_ci /* [DIRAC_STD] Defined in 9.6.1 ... */ 2215cabdff1aSopenharmony_ci tmp = parse_code & 0x03; /* [DIRAC_STD] num_refs() */ 2216cabdff1aSopenharmony_ci if (tmp > 2) { 2217cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n"); 2218cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2219cabdff1aSopenharmony_ci } 2220cabdff1aSopenharmony_ci s->num_refs = tmp; 2221cabdff1aSopenharmony_ci s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */ 2222cabdff1aSopenharmony_ci s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */ 2223cabdff1aSopenharmony_ci s->core_syntax = (parse_code & 0x88) == 0x08; /* [DIRAC_STD] is_core_syntax() */ 2224cabdff1aSopenharmony_ci s->ld_picture = (parse_code & 0xF8) == 0xC8; /* [DIRAC_STD] is_ld_picture() */ 2225cabdff1aSopenharmony_ci s->hq_picture = (parse_code & 0xF8) == 0xE8; /* [DIRAC_STD] is_hq_picture() */ 2226cabdff1aSopenharmony_ci s->dc_prediction = (parse_code & 0x28) == 0x08; /* [DIRAC_STD] using_dc_prediction() */ 2227cabdff1aSopenharmony_ci pic->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */ 2228cabdff1aSopenharmony_ci pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */ 2229cabdff1aSopenharmony_ci pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */ 2230cabdff1aSopenharmony_ci 2231cabdff1aSopenharmony_ci /* VC-2 Low Delay has a different parse code than the Dirac Low Delay */ 2232cabdff1aSopenharmony_ci if (s->version.minor == 2 && parse_code == 0x88) 2233cabdff1aSopenharmony_ci s->ld_picture = 1; 2234cabdff1aSopenharmony_ci 2235cabdff1aSopenharmony_ci if (s->low_delay && !(s->ld_picture || s->hq_picture) ) { 2236cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid low delay flag\n"); 2237cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 2238cabdff1aSopenharmony_ci } 2239cabdff1aSopenharmony_ci 2240cabdff1aSopenharmony_ci if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0) 2241cabdff1aSopenharmony_ci return ret; 2242cabdff1aSopenharmony_ci s->current_picture = pic; 2243cabdff1aSopenharmony_ci s->plane[0].stride = pic->avframe->linesize[0]; 2244cabdff1aSopenharmony_ci s->plane[1].stride = pic->avframe->linesize[1]; 2245cabdff1aSopenharmony_ci s->plane[2].stride = pic->avframe->linesize[2]; 2246cabdff1aSopenharmony_ci 2247cabdff1aSopenharmony_ci if (alloc_buffers(s, FFMAX3(FFABS(s->plane[0].stride), FFABS(s->plane[1].stride), FFABS(s->plane[2].stride))) < 0) 2248cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2249cabdff1aSopenharmony_ci 2250cabdff1aSopenharmony_ci /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */ 2251cabdff1aSopenharmony_ci ret = dirac_decode_picture_header(s); 2252cabdff1aSopenharmony_ci if (ret < 0) 2253cabdff1aSopenharmony_ci return ret; 2254cabdff1aSopenharmony_ci 2255cabdff1aSopenharmony_ci /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */ 2256cabdff1aSopenharmony_ci ret = dirac_decode_frame_internal(s); 2257cabdff1aSopenharmony_ci if (ret < 0) 2258cabdff1aSopenharmony_ci return ret; 2259cabdff1aSopenharmony_ci } 2260cabdff1aSopenharmony_ci return 0; 2261cabdff1aSopenharmony_ci} 2262cabdff1aSopenharmony_ci 2263cabdff1aSopenharmony_cistatic int dirac_decode_frame(AVCodecContext *avctx, AVFrame *picture, 2264cabdff1aSopenharmony_ci int *got_frame, AVPacket *pkt) 2265cabdff1aSopenharmony_ci{ 2266cabdff1aSopenharmony_ci DiracContext *s = avctx->priv_data; 2267cabdff1aSopenharmony_ci const uint8_t *buf = pkt->data; 2268cabdff1aSopenharmony_ci int buf_size = pkt->size; 2269cabdff1aSopenharmony_ci int i, buf_idx = 0; 2270cabdff1aSopenharmony_ci int ret; 2271cabdff1aSopenharmony_ci unsigned data_unit_size; 2272cabdff1aSopenharmony_ci 2273cabdff1aSopenharmony_ci /* release unused frames */ 2274cabdff1aSopenharmony_ci for (i = 0; i < MAX_FRAMES; i++) 2275cabdff1aSopenharmony_ci if (s->all_frames[i].avframe->data[0] && !s->all_frames[i].reference) { 2276cabdff1aSopenharmony_ci av_frame_unref(s->all_frames[i].avframe); 2277cabdff1aSopenharmony_ci memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated)); 2278cabdff1aSopenharmony_ci } 2279cabdff1aSopenharmony_ci 2280cabdff1aSopenharmony_ci s->current_picture = NULL; 2281cabdff1aSopenharmony_ci *got_frame = 0; 2282cabdff1aSopenharmony_ci 2283cabdff1aSopenharmony_ci /* end of stream, so flush delayed pics */ 2284cabdff1aSopenharmony_ci if (buf_size == 0) 2285cabdff1aSopenharmony_ci return get_delayed_pic(s, picture, got_frame); 2286cabdff1aSopenharmony_ci 2287cabdff1aSopenharmony_ci for (;;) { 2288cabdff1aSopenharmony_ci /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6 2289cabdff1aSopenharmony_ci [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646 2290cabdff1aSopenharmony_ci BBCD start code search */ 2291cabdff1aSopenharmony_ci for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) { 2292cabdff1aSopenharmony_ci if (buf[buf_idx ] == 'B' && buf[buf_idx+1] == 'B' && 2293cabdff1aSopenharmony_ci buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D') 2294cabdff1aSopenharmony_ci break; 2295cabdff1aSopenharmony_ci } 2296cabdff1aSopenharmony_ci /* BBCD found or end of data */ 2297cabdff1aSopenharmony_ci if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size) 2298cabdff1aSopenharmony_ci break; 2299cabdff1aSopenharmony_ci 2300cabdff1aSopenharmony_ci data_unit_size = AV_RB32(buf+buf_idx+5); 2301cabdff1aSopenharmony_ci if (data_unit_size > buf_size - buf_idx || !data_unit_size) { 2302cabdff1aSopenharmony_ci if(data_unit_size > buf_size - buf_idx) 2303cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 2304cabdff1aSopenharmony_ci "Data unit with size %d is larger than input buffer, discarding\n", 2305cabdff1aSopenharmony_ci data_unit_size); 2306cabdff1aSopenharmony_ci buf_idx += 4; 2307cabdff1aSopenharmony_ci continue; 2308cabdff1aSopenharmony_ci } 2309cabdff1aSopenharmony_ci /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */ 2310cabdff1aSopenharmony_ci ret = dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size); 2311cabdff1aSopenharmony_ci if (ret < 0) 2312cabdff1aSopenharmony_ci { 2313cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n"); 2314cabdff1aSopenharmony_ci return ret; 2315cabdff1aSopenharmony_ci } 2316cabdff1aSopenharmony_ci buf_idx += data_unit_size; 2317cabdff1aSopenharmony_ci } 2318cabdff1aSopenharmony_ci 2319cabdff1aSopenharmony_ci if (!s->current_picture) 2320cabdff1aSopenharmony_ci return buf_size; 2321cabdff1aSopenharmony_ci 2322cabdff1aSopenharmony_ci if (s->current_picture->avframe->display_picture_number > s->frame_number) { 2323cabdff1aSopenharmony_ci DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number); 2324cabdff1aSopenharmony_ci 2325cabdff1aSopenharmony_ci s->current_picture->reference |= DELAYED_PIC_REF; 2326cabdff1aSopenharmony_ci 2327cabdff1aSopenharmony_ci if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) { 2328cabdff1aSopenharmony_ci int min_num = s->delay_frames[0]->avframe->display_picture_number; 2329cabdff1aSopenharmony_ci /* Too many delayed frames, so we display the frame with the lowest pts */ 2330cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n"); 2331cabdff1aSopenharmony_ci 2332cabdff1aSopenharmony_ci for (i = 1; s->delay_frames[i]; i++) 2333cabdff1aSopenharmony_ci if (s->delay_frames[i]->avframe->display_picture_number < min_num) 2334cabdff1aSopenharmony_ci min_num = s->delay_frames[i]->avframe->display_picture_number; 2335cabdff1aSopenharmony_ci 2336cabdff1aSopenharmony_ci delayed_frame = remove_frame(s->delay_frames, min_num); 2337cabdff1aSopenharmony_ci add_frame(s->delay_frames, MAX_DELAY, s->current_picture); 2338cabdff1aSopenharmony_ci } 2339cabdff1aSopenharmony_ci 2340cabdff1aSopenharmony_ci if (delayed_frame) { 2341cabdff1aSopenharmony_ci delayed_frame->reference ^= DELAYED_PIC_REF; 2342cabdff1aSopenharmony_ci if((ret = av_frame_ref(picture, delayed_frame->avframe)) < 0) 2343cabdff1aSopenharmony_ci return ret; 2344cabdff1aSopenharmony_ci *got_frame = 1; 2345cabdff1aSopenharmony_ci } 2346cabdff1aSopenharmony_ci } else if (s->current_picture->avframe->display_picture_number == s->frame_number) { 2347cabdff1aSopenharmony_ci /* The right frame at the right time :-) */ 2348cabdff1aSopenharmony_ci if((ret = av_frame_ref(picture, s->current_picture->avframe)) < 0) 2349cabdff1aSopenharmony_ci return ret; 2350cabdff1aSopenharmony_ci *got_frame = 1; 2351cabdff1aSopenharmony_ci } 2352cabdff1aSopenharmony_ci 2353cabdff1aSopenharmony_ci if (*got_frame) 2354cabdff1aSopenharmony_ci s->frame_number = picture->display_picture_number + 1LL; 2355cabdff1aSopenharmony_ci 2356cabdff1aSopenharmony_ci return buf_idx; 2357cabdff1aSopenharmony_ci} 2358cabdff1aSopenharmony_ci 2359cabdff1aSopenharmony_ciconst FFCodec ff_dirac_decoder = { 2360cabdff1aSopenharmony_ci .p.name = "dirac", 2361cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"), 2362cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 2363cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_DIRAC, 2364cabdff1aSopenharmony_ci .priv_data_size = sizeof(DiracContext), 2365cabdff1aSopenharmony_ci .init = dirac_decode_init, 2366cabdff1aSopenharmony_ci .close = dirac_decode_end, 2367cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(dirac_decode_frame), 2368cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DR1, 2369cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 2370cabdff1aSopenharmony_ci .flush = dirac_decode_flush, 2371cabdff1aSopenharmony_ci}; 2372