@@ -24,189 +24,14 @@ | |||
#include "libavutil/imgutils.h" | |||
#include "avcodec.h" | |||
#include "vp56.h" | |||
#include "vp8.h" | |||
#include "vp8data.h" | |||
#include "vp8dsp.h" | |||
#include "h264pred.h" | |||
#include "rectangle.h" | |||
#if ARCH_ARM | |||
# include "arm/vp8.h" | |||
#endif | |||
typedef struct { | |||
uint8_t filter_level; | |||
uint8_t inner_limit; | |||
uint8_t inner_filter; | |||
} VP8FilterStrength; | |||
typedef struct { | |||
uint8_t skip; | |||
// todo: make it possible to check for at least (i4x4 or split_mv) | |||
// in one op. are others needed? | |||
uint8_t mode; | |||
uint8_t ref_frame; | |||
uint8_t partitioning; | |||
VP56mv mv; | |||
VP56mv bmv[16]; | |||
} VP8Macroblock; | |||
typedef struct { | |||
AVCodecContext *avctx; | |||
DSPContext dsp; | |||
VP8DSPContext vp8dsp; | |||
H264PredContext hpc; | |||
vp8_mc_func put_pixels_tab[3][3][3]; | |||
AVFrame frames[4]; | |||
AVFrame *framep[4]; | |||
uint8_t *edge_emu_buffer; | |||
VP56RangeCoder c; ///< header context, includes mb modes and motion vectors | |||
int profile; | |||
int mb_width; /* number of horizontal MB */ | |||
int mb_height; /* number of vertical MB */ | |||
int linesize; | |||
int uvlinesize; | |||
int keyframe; | |||
int invisible; | |||
int update_last; ///< update VP56_FRAME_PREVIOUS with the current one | |||
int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so | |||
int update_altref; | |||
int deblock_filter; | |||
/** | |||
* If this flag is not set, all the probability updates | |||
* are discarded after this frame is decoded. | |||
*/ | |||
int update_probabilities; | |||
/** | |||
* All coefficients are contained in separate arith coding contexts. | |||
* There can be 1, 2, 4, or 8 of these after the header context. | |||
*/ | |||
int num_coeff_partitions; | |||
VP56RangeCoder coeff_partition[8]; | |||
VP8Macroblock *macroblocks; | |||
VP8Macroblock *macroblocks_base; | |||
VP8FilterStrength *filter_strength; | |||
uint8_t *intra4x4_pred_mode_top; | |||
uint8_t intra4x4_pred_mode_left[4]; | |||
uint8_t *segmentation_map; | |||
/** | |||
* Cache of the top row needed for intra prediction | |||
* 16 for luma, 8 for each chroma plane | |||
*/ | |||
uint8_t (*top_border)[16+8+8]; | |||
/** | |||
* For coeff decode, we need to know whether the above block had non-zero | |||
* coefficients. This means for each macroblock, we need data for 4 luma | |||
* blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9 | |||
* per macroblock. We keep the last row in top_nnz. | |||
*/ | |||
uint8_t (*top_nnz)[9]; | |||
DECLARE_ALIGNED(8, uint8_t, left_nnz)[9]; | |||
/** | |||
* This is the index plus one of the last non-zero coeff | |||
* for each of the blocks in the current macroblock. | |||
* So, 0 -> no coeffs | |||
* 1 -> dc-only (special transform) | |||
* 2+-> full transform | |||
*/ | |||
DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; | |||
DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16]; | |||
DECLARE_ALIGNED(16, DCTELEM, block_dc)[16]; | |||
uint8_t intra4x4_pred_mode_mb[16]; | |||
int chroma_pred_mode; ///< 8x8c pred mode of the current macroblock | |||
int segment; ///< segment of the current macroblock | |||
VP56mv mv_min; | |||
VP56mv mv_max; | |||
int mbskip_enabled; | |||
int sign_bias[4]; ///< one state [0, 1] per ref frame type | |||
int ref_count[3]; | |||
/** | |||
* Base parameters for segmentation, i.e. per-macroblock parameters. | |||
* These must be kept unchanged even if segmentation is not used for | |||
* a frame, since the values persist between interframes. | |||
*/ | |||
struct { | |||
int enabled; | |||
int absolute_vals; | |||
int update_map; | |||
int8_t base_quant[4]; | |||
int8_t filter_level[4]; ///< base loop filter level | |||
} segmentation; | |||
/** | |||
* Macroblocks can have one of 4 different quants in a frame when | |||
* segmentation is enabled. | |||
* If segmentation is disabled, only the first segment's values are used. | |||
*/ | |||
struct { | |||
// [0] - DC qmul [1] - AC qmul | |||
int16_t luma_qmul[2]; | |||
int16_t luma_dc_qmul[2]; ///< luma dc-only block quant | |||
int16_t chroma_qmul[2]; | |||
} qmat[4]; | |||
struct { | |||
int simple; | |||
int level; | |||
int sharpness; | |||
} filter; | |||
struct { | |||
int enabled; ///< whether each mb can have a different strength based on mode/ref | |||
/** | |||
* filter strength adjustment for the following macroblock modes: | |||
* [0-3] - i16x16 (always zero) | |||
* [4] - i4x4 | |||
* [5] - zero mv | |||
* [6] - inter modes except for zero or split mv | |||
* [7] - split mv | |||
* i16x16 modes never have any adjustment | |||
*/ | |||
int8_t mode[VP8_MVMODE_SPLIT+1]; | |||
/** | |||
* filter strength adjustment for macroblocks that reference: | |||
* [0] - intra / VP56_FRAME_CURRENT | |||
* [1] - VP56_FRAME_PREVIOUS | |||
* [2] - VP56_FRAME_GOLDEN | |||
* [3] - altref / VP56_FRAME_GOLDEN2 | |||
*/ | |||
int8_t ref[4]; | |||
} lf_delta; | |||
/** | |||
* These are all of the updatable probabilities for binary decisions. | |||
* They are only implictly reset on keyframes, making it quite likely | |||
* for an interframe to desync if a prior frame's header was corrupt | |||
* or missing outright! | |||
*/ | |||
struct { | |||
uint8_t segmentid[3]; | |||
uint8_t mbskip; | |||
uint8_t intra; | |||
uint8_t last; | |||
uint8_t golden; | |||
uint8_t pred16x16[4]; | |||
uint8_t pred8x8c[3]; | |||
/* Padded to allow overreads */ | |||
uint8_t token[4][17][3][NUM_DCT_TOKENS-1]; | |||
uint8_t mvc[2][19]; | |||
} prob[2]; | |||
} VP8Context; | |||
static void vp8_decode_flush(AVCodecContext *avctx) | |||
{ | |||
VP8Context *s = avctx->priv_data; | |||
@@ -0,0 +1,242 @@ | |||
/** | |||
* VP8 compatible video decoder | |||
* | |||
* Copyright (C) 2010 David Conrad | |||
* Copyright (C) 2010 Ronald S. Bultje | |||
* Copyright (C) 2010 Jason Garrett-Glaser | |||
* | |||
* This file is part of FFmpeg. | |||
* | |||
* FFmpeg is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 2.1 of the License, or (at your option) any later version. | |||
* | |||
* FFmpeg is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public | |||
* License along with FFmpeg; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#ifndef AVCODEC_VP8_H | |||
#define AVCODEC_VP8_H | |||
#include "vp56.h" | |||
#include "vp56data.h" | |||
#include "vp8dsp.h" | |||
#include "h264pred.h" | |||
#define VP8_MAX_QUANT 127 | |||
enum dct_token { | |||
DCT_0, | |||
DCT_1, | |||
DCT_2, | |||
DCT_3, | |||
DCT_4, | |||
DCT_CAT1, | |||
DCT_CAT2, | |||
DCT_CAT3, | |||
DCT_CAT4, | |||
DCT_CAT5, | |||
DCT_CAT6, | |||
DCT_EOB, | |||
NUM_DCT_TOKENS | |||
}; | |||
// used to signal 4x4 intra pred in luma MBs | |||
#define MODE_I4x4 4 | |||
enum inter_mvmode { | |||
VP8_MVMODE_ZERO = MODE_I4x4 + 1, | |||
VP8_MVMODE_MV, | |||
VP8_MVMODE_SPLIT | |||
}; | |||
enum inter_splitmvmode { | |||
VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical) | |||
VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal) | |||
VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each | |||
VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each | |||
VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs | |||
}; | |||
typedef struct { | |||
uint8_t filter_level; | |||
uint8_t inner_limit; | |||
uint8_t inner_filter; | |||
} VP8FilterStrength; | |||
typedef struct { | |||
uint8_t skip; | |||
// todo: make it possible to check for at least (i4x4 or split_mv) | |||
// in one op. are others needed? | |||
uint8_t mode; | |||
uint8_t ref_frame; | |||
uint8_t partitioning; | |||
VP56mv mv; | |||
VP56mv bmv[16]; | |||
} VP8Macroblock; | |||
typedef struct { | |||
AVCodecContext *avctx; | |||
DSPContext dsp; | |||
VP8DSPContext vp8dsp; | |||
H264PredContext hpc; | |||
vp8_mc_func put_pixels_tab[3][3][3]; | |||
AVFrame frames[4]; | |||
AVFrame *framep[4]; | |||
uint8_t *edge_emu_buffer; | |||
VP56RangeCoder c; ///< header context, includes mb modes and motion vectors | |||
int profile; | |||
int mb_width; /* number of horizontal MB */ | |||
int mb_height; /* number of vertical MB */ | |||
int linesize; | |||
int uvlinesize; | |||
int keyframe; | |||
int invisible; | |||
int update_last; ///< update VP56_FRAME_PREVIOUS with the current one | |||
int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so | |||
int update_altref; | |||
int deblock_filter; | |||
/** | |||
* If this flag is not set, all the probability updates | |||
* are discarded after this frame is decoded. | |||
*/ | |||
int update_probabilities; | |||
/** | |||
* All coefficients are contained in separate arith coding contexts. | |||
* There can be 1, 2, 4, or 8 of these after the header context. | |||
*/ | |||
int num_coeff_partitions; | |||
VP56RangeCoder coeff_partition[8]; | |||
VP8Macroblock *macroblocks; | |||
VP8Macroblock *macroblocks_base; | |||
VP8FilterStrength *filter_strength; | |||
uint8_t *intra4x4_pred_mode_top; | |||
uint8_t intra4x4_pred_mode_left[4]; | |||
uint8_t *segmentation_map; | |||
/** | |||
* Cache of the top row needed for intra prediction | |||
* 16 for luma, 8 for each chroma plane | |||
*/ | |||
uint8_t (*top_border)[16+8+8]; | |||
/** | |||
* For coeff decode, we need to know whether the above block had non-zero | |||
* coefficients. This means for each macroblock, we need data for 4 luma | |||
* blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9 | |||
* per macroblock. We keep the last row in top_nnz. | |||
*/ | |||
uint8_t (*top_nnz)[9]; | |||
DECLARE_ALIGNED(8, uint8_t, left_nnz)[9]; | |||
/** | |||
* This is the index plus one of the last non-zero coeff | |||
* for each of the blocks in the current macroblock. | |||
* So, 0 -> no coeffs | |||
* 1 -> dc-only (special transform) | |||
* 2+-> full transform | |||
*/ | |||
DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; | |||
DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16]; | |||
DECLARE_ALIGNED(16, DCTELEM, block_dc)[16]; | |||
uint8_t intra4x4_pred_mode_mb[16]; | |||
int chroma_pred_mode; ///< 8x8c pred mode of the current macroblock | |||
int segment; ///< segment of the current macroblock | |||
VP56mv mv_min; | |||
VP56mv mv_max; | |||
int mbskip_enabled; | |||
int sign_bias[4]; ///< one state [0, 1] per ref frame type | |||
int ref_count[3]; | |||
/** | |||
* Base parameters for segmentation, i.e. per-macroblock parameters. | |||
* These must be kept unchanged even if segmentation is not used for | |||
* a frame, since the values persist between interframes. | |||
*/ | |||
struct { | |||
int enabled; | |||
int absolute_vals; | |||
int update_map; | |||
int8_t base_quant[4]; | |||
int8_t filter_level[4]; ///< base loop filter level | |||
} segmentation; | |||
/** | |||
* Macroblocks can have one of 4 different quants in a frame when | |||
* segmentation is enabled. | |||
* If segmentation is disabled, only the first segment's values are used. | |||
*/ | |||
struct { | |||
// [0] - DC qmul [1] - AC qmul | |||
int16_t luma_qmul[2]; | |||
int16_t luma_dc_qmul[2]; ///< luma dc-only block quant | |||
int16_t chroma_qmul[2]; | |||
} qmat[4]; | |||
struct { | |||
int simple; | |||
int level; | |||
int sharpness; | |||
} filter; | |||
struct { | |||
int enabled; ///< whether each mb can have a different strength based on mode/ref | |||
/** | |||
* filter strength adjustment for the following macroblock modes: | |||
* [0-3] - i16x16 (always zero) | |||
* [4] - i4x4 | |||
* [5] - zero mv | |||
* [6] - inter modes except for zero or split mv | |||
* [7] - split mv | |||
* i16x16 modes never have any adjustment | |||
*/ | |||
int8_t mode[VP8_MVMODE_SPLIT+1]; | |||
/** | |||
* filter strength adjustment for macroblocks that reference: | |||
* [0] - intra / VP56_FRAME_CURRENT | |||
* [1] - VP56_FRAME_PREVIOUS | |||
* [2] - VP56_FRAME_GOLDEN | |||
* [3] - altref / VP56_FRAME_GOLDEN2 | |||
*/ | |||
int8_t ref[4]; | |||
} lf_delta; | |||
/** | |||
* These are all of the updatable probabilities for binary decisions. | |||
* They are only implictly reset on keyframes, making it quite likely | |||
* for an interframe to desync if a prior frame's header was corrupt | |||
* or missing outright! | |||
*/ | |||
struct { | |||
uint8_t segmentid[3]; | |||
uint8_t mbskip; | |||
uint8_t intra; | |||
uint8_t last; | |||
uint8_t golden; | |||
uint8_t pred16x16[4]; | |||
uint8_t pred8x8c[3]; | |||
/* Padded to allow overreads */ | |||
uint8_t token[4][17][3][NUM_DCT_TOKENS-1]; | |||
uint8_t mvc[2][19]; | |||
} prob[2]; | |||
} VP8Context; | |||
#endif |
@@ -21,46 +21,12 @@ | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
// TODO: move these #define and enum to a better header... | |||
#define VP8_MAX_QUANT 127 | |||
enum dct_token { | |||
DCT_0, | |||
DCT_1, | |||
DCT_2, | |||
DCT_3, | |||
DCT_4, | |||
DCT_CAT1, | |||
DCT_CAT2, | |||
DCT_CAT3, | |||
DCT_CAT4, | |||
DCT_CAT5, | |||
DCT_CAT6, | |||
DCT_EOB, | |||
NUM_DCT_TOKENS | |||
}; | |||
#ifndef AVCODEC_VP8DATA_H | |||
#define AVCODEC_VP8DATA_H | |||
#include "vp8.h" | |||
#include "h264pred.h" | |||
// used to signal 4x4 intra pred in luma MBs | |||
#define MODE_I4x4 4 | |||
enum inter_mvmode { | |||
VP8_MVMODE_ZERO = MODE_I4x4 + 1, | |||
VP8_MVMODE_MV, | |||
VP8_MVMODE_SPLIT | |||
}; | |||
enum inter_splitmvmode { | |||
VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical) | |||
VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal) | |||
VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each | |||
VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each | |||
VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs | |||
}; | |||
static const uint8_t vp8_pred4x4_mode[] = | |||
{ | |||
[DC_PRED8x8] = DC_PRED, | |||
@@ -718,3 +684,5 @@ static const uint8_t vp8_mv_default_prob[2][19] = { | |||
204, 170, 119, 235, 140, 230, 228, | |||
128, 130, 130, 74, 148, 180, 203, 236, 254, 254 } | |||
}; | |||
#endif |