yading@10: /* yading@10: * VP8 compatible video decoder yading@10: * yading@10: * Copyright (C) 2010 David Conrad yading@10: * Copyright (C) 2010 Ronald S. Bultje yading@10: * Copyright (C) 2010 Jason Garrett-Glaser yading@10: * Copyright (C) 2012 Daniel Kang yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #ifndef AVCODEC_VP8_H yading@10: #define AVCODEC_VP8_H yading@10: yading@10: #include "libavutil/buffer.h" yading@10: yading@10: #include "vp56.h" yading@10: #include "vp56data.h" yading@10: #include "vp8dsp.h" yading@10: #include "h264pred.h" yading@10: #include "thread.h" yading@10: #if HAVE_PTHREADS yading@10: #include yading@10: #elif HAVE_W32THREADS yading@10: #include "w32pthreads.h" yading@10: #elif HAVE_OS2THREADS yading@10: #include "os2threads.h" yading@10: #endif yading@10: yading@10: #define VP8_MAX_QUANT 127 yading@10: yading@10: enum dct_token { yading@10: DCT_0, yading@10: DCT_1, yading@10: DCT_2, yading@10: DCT_3, yading@10: DCT_4, yading@10: DCT_CAT1, yading@10: DCT_CAT2, yading@10: DCT_CAT3, yading@10: DCT_CAT4, yading@10: DCT_CAT5, yading@10: DCT_CAT6, yading@10: DCT_EOB, yading@10: yading@10: NUM_DCT_TOKENS yading@10: }; yading@10: yading@10: // used to signal 4x4 intra pred in luma MBs yading@10: #define MODE_I4x4 4 yading@10: yading@10: enum inter_mvmode { yading@10: VP8_MVMODE_ZERO = MODE_I4x4 + 1, yading@10: VP8_MVMODE_MV, yading@10: VP8_MVMODE_SPLIT yading@10: }; yading@10: yading@10: enum inter_splitmvmode { yading@10: VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical) yading@10: VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal) yading@10: VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each yading@10: VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each yading@10: VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs yading@10: }; yading@10: yading@10: typedef struct VP8FilterStrength { yading@10: uint8_t filter_level; yading@10: uint8_t inner_limit; yading@10: uint8_t inner_filter; yading@10: } VP8FilterStrength; yading@10: yading@10: typedef struct VP8Macroblock { yading@10: uint8_t skip; yading@10: // todo: make it possible to check for at least (i4x4 or split_mv) yading@10: // in one op. are others needed? yading@10: uint8_t mode; yading@10: uint8_t ref_frame; yading@10: uint8_t partitioning; yading@10: uint8_t chroma_pred_mode; yading@10: uint8_t segment; yading@10: uint8_t intra4x4_pred_mode_mb[16]; yading@10: uint8_t intra4x4_pred_mode_top[4]; yading@10: VP56mv mv; yading@10: VP56mv bmv[16]; yading@10: } VP8Macroblock; yading@10: yading@10: typedef struct VP8ThreadData { yading@10: DECLARE_ALIGNED(16, int16_t, block)[6][4][16]; yading@10: DECLARE_ALIGNED(16, int16_t, block_dc)[16]; yading@10: /** yading@10: * This is the index plus one of the last non-zero coeff yading@10: * for each of the blocks in the current macroblock. yading@10: * So, 0 -> no coeffs yading@10: * 1 -> dc-only (special transform) yading@10: * 2+-> full transform yading@10: */ yading@10: DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; yading@10: /** yading@10: * For coeff decode, we need to know whether the above block had non-zero yading@10: * coefficients. This means for each macroblock, we need data for 4 luma yading@10: * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9 yading@10: * per macroblock. We keep the last row in top_nnz. yading@10: */ yading@10: DECLARE_ALIGNED(8, uint8_t, left_nnz)[9]; yading@10: int thread_nr; yading@10: #if HAVE_THREADS yading@10: pthread_mutex_t lock; yading@10: pthread_cond_t cond; yading@10: #endif yading@10: int thread_mb_pos; // (mb_y << 16) | (mb_x & 0xFFFF) yading@10: int wait_mb_pos; // What the current thread is waiting on. yading@10: uint8_t *edge_emu_buffer; yading@10: VP8FilterStrength *filter_strength; yading@10: } VP8ThreadData; yading@10: yading@10: typedef struct VP8Frame { yading@10: ThreadFrame tf; yading@10: AVBufferRef *seg_map; yading@10: } VP8Frame; yading@10: yading@10: #define MAX_THREADS 8 yading@10: typedef struct VP8Context { yading@10: VP8ThreadData *thread_data; yading@10: AVCodecContext *avctx; yading@10: VP8Frame *framep[4]; yading@10: VP8Frame *next_framep[4]; yading@10: VP8Frame *curframe; yading@10: VP8Frame *prev_frame; yading@10: yading@10: uint16_t mb_width; /* number of horizontal MB */ yading@10: uint16_t mb_height; /* number of vertical MB */ yading@10: int linesize; yading@10: int uvlinesize; yading@10: yading@10: uint8_t keyframe; yading@10: uint8_t deblock_filter; yading@10: uint8_t mbskip_enabled; yading@10: uint8_t profile; yading@10: VP56mv mv_min; yading@10: VP56mv mv_max; yading@10: yading@10: int8_t sign_bias[4]; ///< one state [0, 1] per ref frame type yading@10: int ref_count[3]; yading@10: yading@10: /** yading@10: * Base parameters for segmentation, i.e. per-macroblock parameters. yading@10: * These must be kept unchanged even if segmentation is not used for yading@10: * a frame, since the values persist between interframes. yading@10: */ yading@10: struct { yading@10: uint8_t enabled; yading@10: uint8_t absolute_vals; yading@10: uint8_t update_map; yading@10: int8_t base_quant[4]; yading@10: int8_t filter_level[4]; ///< base loop filter level yading@10: } segmentation; yading@10: yading@10: struct { yading@10: uint8_t simple; yading@10: uint8_t level; yading@10: uint8_t sharpness; yading@10: } filter; yading@10: yading@10: VP8Macroblock *macroblocks; yading@10: yading@10: uint8_t *intra4x4_pred_mode_top; yading@10: uint8_t intra4x4_pred_mode_left[4]; yading@10: yading@10: /** yading@10: * Macroblocks can have one of 4 different quants in a frame when yading@10: * segmentation is enabled. yading@10: * If segmentation is disabled, only the first segment's values are used. yading@10: */ yading@10: struct { yading@10: // [0] - DC qmul [1] - AC qmul yading@10: int16_t luma_qmul[2]; yading@10: int16_t luma_dc_qmul[2]; ///< luma dc-only block quant yading@10: int16_t chroma_qmul[2]; yading@10: } qmat[4]; yading@10: yading@10: struct { yading@10: uint8_t enabled; ///< whether each mb can have a different strength based on mode/ref yading@10: yading@10: /** yading@10: * filter strength adjustment for the following macroblock modes: yading@10: * [0-3] - i16x16 (always zero) yading@10: * [4] - i4x4 yading@10: * [5] - zero mv yading@10: * [6] - inter modes except for zero or split mv yading@10: * [7] - split mv yading@10: * i16x16 modes never have any adjustment yading@10: */ yading@10: int8_t mode[VP8_MVMODE_SPLIT+1]; yading@10: yading@10: /** yading@10: * filter strength adjustment for macroblocks that reference: yading@10: * [0] - intra / VP56_FRAME_CURRENT yading@10: * [1] - VP56_FRAME_PREVIOUS yading@10: * [2] - VP56_FRAME_GOLDEN yading@10: * [3] - altref / VP56_FRAME_GOLDEN2 yading@10: */ yading@10: int8_t ref[4]; yading@10: } lf_delta; yading@10: yading@10: uint8_t (*top_border)[16+8+8]; yading@10: uint8_t (*top_nnz)[9]; yading@10: yading@10: VP56RangeCoder c; ///< header context, includes mb modes and motion vectors yading@10: yading@10: /** yading@10: * These are all of the updatable probabilities for binary decisions. yading@10: * They are only implictly reset on keyframes, making it quite likely yading@10: * for an interframe to desync if a prior frame's header was corrupt yading@10: * or missing outright! yading@10: */ yading@10: struct { yading@10: uint8_t segmentid[3]; yading@10: uint8_t mbskip; yading@10: uint8_t intra; yading@10: uint8_t last; yading@10: uint8_t golden; yading@10: uint8_t pred16x16[4]; yading@10: uint8_t pred8x8c[3]; yading@10: uint8_t token[4][16][3][NUM_DCT_TOKENS-1]; yading@10: uint8_t mvc[2][19]; yading@10: } prob[2]; yading@10: yading@10: VP8Macroblock *macroblocks_base; yading@10: int invisible; yading@10: int update_last; ///< update VP56_FRAME_PREVIOUS with the current one yading@10: int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so yading@10: int update_altref; yading@10: yading@10: /** yading@10: * If this flag is not set, all the probability updates yading@10: * are discarded after this frame is decoded. yading@10: */ yading@10: int update_probabilities; yading@10: yading@10: /** yading@10: * All coefficients are contained in separate arith coding contexts. yading@10: * There can be 1, 2, 4, or 8 of these after the header context. yading@10: */ yading@10: int num_coeff_partitions; yading@10: VP56RangeCoder coeff_partition[8]; yading@10: VideoDSPContext vdsp; yading@10: VP8DSPContext vp8dsp; yading@10: H264PredContext hpc; yading@10: vp8_mc_func put_pixels_tab[3][3][3]; yading@10: VP8Frame frames[5]; yading@10: yading@10: int num_jobs; yading@10: /** yading@10: * This describes the macroblock memory layout. yading@10: * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread). yading@10: * 1 -> Macroblocks for entire frame alloced (sliced thread). yading@10: */ yading@10: int mb_layout; yading@10: } VP8Context; yading@10: yading@10: #endif /* AVCODEC_VP8_H */