@ -4,6 +4,7 @@
* Copyright ( C ) 2010 David Conrad
* Copyright ( C ) 2010 David Conrad
* Copyright ( C ) 2010 Ronald S . Bultje
* Copyright ( C ) 2010 Ronald S . Bultje
* Copyright ( C ) 2010 Jason Garrett - Glaser
* Copyright ( C ) 2010 Jason Garrett - Glaser
* Copyright ( C ) 2012 Daniel Kang
*
*
* This file is part of FFmpeg .
* This file is part of FFmpeg .
*
*
@ -29,6 +30,11 @@
# include "vp56data.h"
# include "vp56data.h"
# include "vp8dsp.h"
# include "vp8dsp.h"
# include "h264pred.h"
# include "h264pred.h"
# if HAVE_PTHREADS
# include <pthread.h>
# elif HAVE_W32THREADS
# include "w32pthreads.h"
# endif
# define VP8_MAX_QUANT 127
# define VP8_MAX_QUANT 127
@ -79,15 +85,51 @@ typedef struct {
uint8_t mode ;
uint8_t mode ;
uint8_t ref_frame ;
uint8_t ref_frame ;
uint8_t partitioning ;
uint8_t partitioning ;
uint8_t chroma_pred_mode ;
uint8_t segment ;
uint8_t intra4x4_pred_mode_mb [ 16 ] ;
uint8_t intra4x4_pred_mode_top [ 4 ] ;
VP56mv mv ;
VP56mv mv ;
VP56mv bmv [ 16 ] ;
VP56mv bmv [ 16 ] ;
} VP8Macroblock ;
} VP8Macroblock ;
typedef struct {
typedef struct {
# if HAVE_THREADS
pthread_mutex_t lock ;
pthread_cond_t cond ;
# endif
int thread_nr ;
int thread_mb_pos ; // (mb_y << 16) | (mb_x & 0xFFFF)
int wait_mb_pos ; // What the current thread is waiting on.
uint8_t * edge_emu_buffer ;
/**
* 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 .
*/
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 ] ;
VP8FilterStrength * filter_strength ;
} VP8ThreadData ;
# define MAX_THREADS 8
typedef struct {
VP8ThreadData * thread_data ;
AVCodecContext * avctx ;
AVCodecContext * avctx ;
AVFrame * framep [ 4 ] ;
AVFrame * framep [ 4 ] ;
AVFrame * next_framep [ 4 ] ;
AVFrame * next_framep [ 4 ] ;
uint8_t * edge_emu_buffer ;
AVFrame * curframe ;
AVFrame * prev_frame ;
uint16_t mb_width ; /* number of horizontal MB */
uint16_t mb_width ; /* number of horizontal MB */
uint16_t mb_height ; /* number of vertical MB */
uint16_t mb_height ; /* number of vertical MB */
@ -97,8 +139,6 @@ typedef struct {
uint8_t keyframe ;
uint8_t keyframe ;
uint8_t deblock_filter ;
uint8_t deblock_filter ;
uint8_t mbskip_enabled ;
uint8_t mbskip_enabled ;
uint8_t segment ; ///< segment of the current macroblock
uint8_t chroma_pred_mode ; ///< 8x8c pred mode of the current macroblock
uint8_t profile ;
uint8_t profile ;
VP56mv mv_min ;
VP56mv mv_min ;
VP56mv mv_max ;
VP56mv mv_max ;
@ -126,7 +166,6 @@ typedef struct {
} filter ;
} filter ;
VP8Macroblock * macroblocks ;
VP8Macroblock * macroblocks ;
VP8FilterStrength * filter_strength ;
uint8_t * intra4x4_pred_mode_top ;
uint8_t * intra4x4_pred_mode_top ;
uint8_t intra4x4_pred_mode_left [ 4 ] ;
uint8_t intra4x4_pred_mode_left [ 4 ] ;
@ -167,33 +206,10 @@ typedef struct {
int8_t ref [ 4 ] ;
int8_t ref [ 4 ] ;
} lf_delta ;
} lf_delta ;
/**
* Cache of the top row needed for intra prediction
* 16 for luma , 8 for each chroma plane
*/
uint8_t ( * top_border ) [ 16 + 8 + 8 ] ;
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 ] ;
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 ] ;
VP56RangeCoder c ; ///< header context, includes mb modes and motion vectors
VP56RangeCoder c ; ///< header context, includes mb modes and motion vectors
DECLARE_ALIGNED ( 16 , DCTELEM , block ) [ 6 ] [ 4 ] [ 16 ] ;
DECLARE_ALIGNED ( 16 , DCTELEM , block_dc ) [ 16 ] ;
uint8_t intra4x4_pred_mode_mb [ 16 ] ;
/**
/**
* These are all of the updatable probabilities for binary decisions .
* These are all of the updatable probabilities for binary decisions .
@ -246,6 +262,13 @@ typedef struct {
uint8_t * segmentation_maps [ 5 ] ;
uint8_t * segmentation_maps [ 5 ] ;
int num_maps_to_be_freed ;
int num_maps_to_be_freed ;
int maps_are_invalid ;
int maps_are_invalid ;
int num_jobs ;
/**
* This describes the macroblock memory layout .
* 0 - > Only width + height * 2 + 1 macroblocks allocated ( frame / single thread ) .
* 1 - > Macroblocks for entire frame alloced ( sliced thread ) .
*/
int mb_layout ;
} VP8Context ;
} VP8Context ;
# endif /* AVCODEC_VP8_H */
# endif /* AVCODEC_VP8_H */