00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef AVCODEC_VP8_H
00027 #define AVCODEC_VP8_H
00028
00029 #include "vp56.h"
00030 #include "vp56data.h"
00031 #include "vp8dsp.h"
00032 #include "h264pred.h"
00033 #if HAVE_PTHREADS
00034 #include <pthread.h>
00035 #elif HAVE_W32THREADS
00036 #include "w32pthreads.h"
00037 #elif HAVE_OS2THREADS
00038 #include "os2threads.h"
00039 #endif
00040
00041 #define VP8_MAX_QUANT 127
00042
00043 enum dct_token {
00044 DCT_0,
00045 DCT_1,
00046 DCT_2,
00047 DCT_3,
00048 DCT_4,
00049 DCT_CAT1,
00050 DCT_CAT2,
00051 DCT_CAT3,
00052 DCT_CAT4,
00053 DCT_CAT5,
00054 DCT_CAT6,
00055 DCT_EOB,
00056
00057 NUM_DCT_TOKENS
00058 };
00059
00060
00061 #define MODE_I4x4 4
00062
00063 enum inter_mvmode {
00064 VP8_MVMODE_ZERO = MODE_I4x4 + 1,
00065 VP8_MVMODE_MV,
00066 VP8_MVMODE_SPLIT
00067 };
00068
00069 enum inter_splitmvmode {
00070 VP8_SPLITMVMODE_16x8 = 0,
00071 VP8_SPLITMVMODE_8x16,
00072 VP8_SPLITMVMODE_8x8,
00073 VP8_SPLITMVMODE_4x4,
00074 VP8_SPLITMVMODE_NONE,
00075 };
00076
00077 typedef struct VP8FilterStrength {
00078 uint8_t filter_level;
00079 uint8_t inner_limit;
00080 uint8_t inner_filter;
00081 } VP8FilterStrength;
00082
00083 typedef struct VP8Macroblock {
00084 uint8_t skip;
00085
00086
00087 uint8_t mode;
00088 uint8_t ref_frame;
00089 uint8_t partitioning;
00090 uint8_t chroma_pred_mode;
00091 uint8_t segment;
00092 uint8_t intra4x4_pred_mode_mb[16];
00093 uint8_t intra4x4_pred_mode_top[4];
00094 VP56mv mv;
00095 VP56mv bmv[16];
00096 } VP8Macroblock;
00097
00098 typedef struct VP8ThreadData {
00099 DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16];
00100 DECLARE_ALIGNED(16, DCTELEM, block_dc)[16];
00108 DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
00115 DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
00116 int thread_nr;
00117 #if HAVE_THREADS
00118 pthread_mutex_t lock;
00119 pthread_cond_t cond;
00120 #endif
00121 int thread_mb_pos;
00122 int wait_mb_pos;
00123 uint8_t *edge_emu_buffer;
00124 VP8FilterStrength *filter_strength;
00125 } VP8ThreadData;
00126
00127 #define MAX_THREADS 8
00128 typedef struct VP8Context {
00129 VP8ThreadData *thread_data;
00130 AVCodecContext *avctx;
00131 AVFrame *framep[4];
00132 AVFrame *next_framep[4];
00133 AVFrame *curframe;
00134 AVFrame *prev_frame;
00135
00136 uint16_t mb_width;
00137 uint16_t mb_height;
00138 int linesize;
00139 int uvlinesize;
00140
00141 uint8_t keyframe;
00142 uint8_t deblock_filter;
00143 uint8_t mbskip_enabled;
00144 uint8_t profile;
00145 VP56mv mv_min;
00146 VP56mv mv_max;
00147
00148 int8_t sign_bias[4];
00149 int ref_count[3];
00150
00156 struct {
00157 uint8_t enabled;
00158 uint8_t absolute_vals;
00159 uint8_t update_map;
00160 int8_t base_quant[4];
00161 int8_t filter_level[4];
00162 } segmentation;
00163
00164 struct {
00165 uint8_t simple;
00166 uint8_t level;
00167 uint8_t sharpness;
00168 } filter;
00169
00170 VP8Macroblock *macroblocks;
00171
00172 uint8_t *intra4x4_pred_mode_top;
00173 uint8_t intra4x4_pred_mode_left[4];
00174
00180 struct {
00181
00182 int16_t luma_qmul[2];
00183 int16_t luma_dc_qmul[2];
00184 int16_t chroma_qmul[2];
00185 } qmat[4];
00186
00187 struct {
00188 uint8_t enabled;
00189
00199 int8_t mode[VP8_MVMODE_SPLIT+1];
00200
00208 int8_t ref[4];
00209 } lf_delta;
00210
00211 uint8_t (*top_border)[16+8+8];
00212 uint8_t (*top_nnz)[9];
00213
00214 VP56RangeCoder c;
00215
00222 struct {
00223 uint8_t segmentid[3];
00224 uint8_t mbskip;
00225 uint8_t intra;
00226 uint8_t last;
00227 uint8_t golden;
00228 uint8_t pred16x16[4];
00229 uint8_t pred8x8c[3];
00230 uint8_t token[4][16][3][NUM_DCT_TOKENS-1];
00231 uint8_t mvc[2][19];
00232 } prob[2];
00233
00234 VP8Macroblock *macroblocks_base;
00235 int invisible;
00236 int update_last;
00237 int update_golden;
00238 int update_altref;
00239
00244 int update_probabilities;
00245
00250 int num_coeff_partitions;
00251 VP56RangeCoder coeff_partition[8];
00252 DSPContext dsp;
00253 VP8DSPContext vp8dsp;
00254 H264PredContext hpc;
00255 vp8_mc_func put_pixels_tab[3][3][3];
00256 AVFrame frames[5];
00257
00264 uint8_t *segmentation_maps[5];
00265 int num_maps_to_be_freed;
00266 int maps_are_invalid;
00267 int num_jobs;
00273 int mb_layout;
00274 } VP8Context;
00275
00276 #endif