libavcodec/vp8.c File Reference

#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "vp8.h"
#include "vp8data.h"
#include "rectangle.h"
#include "thread.h"

Go to the source code of this file.

Defines

#define MV_EDGE_CHECK(n)
#define XCHG(a, b, xchg)
#define MARGIN   (16 << 2)
#define REBASE(pic)   pic ? pic - &s_src->frames[0] + &s->frames[0] : NULL

Functions

static void free_buffers (VP8Context *s)
 VP8 compatible video decoder.
static void vp8_decode_flush (AVCodecContext *avctx)
static int update_dimensions (VP8Context *s, int width, int height)
static void parse_segment_info (VP8Context *s)
static void update_lf_deltas (VP8Context *s)
static int setup_partitions (VP8Context *s, const uint8_t *buf, int buf_size)
static void get_quants (VP8Context *s)
static VP56Frame ref_to_update (VP8Context *s, int update, VP56Frame ref)
 Determine which buffers golden and altref should be updated with after this frame.
static void update_refs (VP8Context *s)
static int decode_frame_header (VP8Context *s, const uint8_t *buf, int buf_size)
static av_always_inline void clamp_mv (VP8Context *s, VP56mv *dst, const VP56mv *src)
static int read_mv_component (VP56RangeCoder *c, const uint8_t *p)
 Motion vector coding, 17.1.
static av_always_inline const
uint8_t * 
get_submv_prob (uint32_t left, uint32_t top)
static av_always_inline int decode_splitmvs (VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb)
 Split motion vector prediction, 16.4.
static av_always_inline void decode_mvs (VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y)
static av_always_inline void decode_intra4x4_modes (VP8Context *s, VP56RangeCoder *c, int mb_x, int keyframe)
static av_always_inline void decode_mb_mode (VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_t *segment, uint8_t *ref)
static int decode_block_coeffs_internal (VP56RangeCoder *c, DCTELEM block[16], uint8_t probs[16][3][NUM_DCT_TOKENS-1], int i, uint8_t *token_prob, int16_t qmul[2])
static av_always_inline int decode_block_coeffs (VP56RangeCoder *c, DCTELEM block[16], uint8_t probs[16][3][NUM_DCT_TOKENS-1], int i, int zero_nhood, int16_t qmul[2])
static av_always_inline void decode_mb_coeffs (VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, uint8_t t_nnz[9], uint8_t l_nnz[9])
static av_always_inline void backup_mb_border (uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int simple)
static av_always_inline void xchg_mb_border (uint8_t *top_border, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int mb_x, int mb_y, int mb_width, int simple, int xchg)
static av_always_inline int check_dc_pred8x8_mode (int mode, int mb_x, int mb_y)
static av_always_inline int check_tm_pred8x8_mode (int mode, int mb_x, int mb_y)
static av_always_inline int check_intra_pred8x8_mode (int mode, int mb_x, int mb_y)
static av_always_inline int check_intra_pred8x8_mode_emuedge (int mode, int mb_x, int mb_y)
static av_always_inline int check_tm_pred4x4_mode (int mode, int mb_x, int mb_y)
static av_always_inline int check_intra_pred4x4_mode_emuedge (int mode, int mb_x, int mb_y, int *copy_buf)
static av_always_inline void intra_predict (VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, int mb_x, int mb_y)
static av_always_inline void vp8_mc_luma (VP8Context *s, uint8_t *dst, AVFrame *ref, const VP56mv *mv, int x_off, int y_off, int block_w, int block_h, int width, int height, int linesize, vp8_mc_func mc_func[3][3])
 luma MC function
static av_always_inline void vp8_mc_chroma (VP8Context *s, uint8_t *dst1, uint8_t *dst2, AVFrame *ref, const VP56mv *mv, int x_off, int y_off, int block_w, int block_h, int width, int height, int linesize, vp8_mc_func mc_func[3][3])
 chroma MC function
static av_always_inline void vp8_mc_part (VP8Context *s, uint8_t *dst[3], AVFrame *ref_frame, int x_off, int y_off, int bx_off, int by_off, int block_w, int block_h, int width, int height, VP56mv *mv)
static av_always_inline void prefetch_motion (VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, int mb_xy, int ref)
static av_always_inline void inter_predict (VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, int mb_x, int mb_y)
 Apply motion vectors to prediction buffer, chapter 18.
static av_always_inline void idct_mb (VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb)
static av_always_inline void filter_level_for_mb (VP8Context *s, VP8Macroblock *mb, VP8FilterStrength *f)
static av_always_inline void filter_mb (VP8Context *s, uint8_t *dst[3], VP8FilterStrength *f, int mb_x, int mb_y)
static av_always_inline void filter_mb_simple (VP8Context *s, uint8_t *dst, VP8FilterStrength *f, int mb_x, int mb_y)
static void filter_mb_row (VP8Context *s, AVFrame *curframe, int mb_y)
static void filter_mb_row_simple (VP8Context *s, AVFrame *curframe, int mb_y)
static int vp8_decode_frame (AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
static av_cold int vp8_decode_init (AVCodecContext *avctx)
static av_cold int vp8_decode_free (AVCodecContext *avctx)
static av_cold int vp8_decode_init_thread_copy (AVCodecContext *avctx)
static int vp8_decode_update_thread_context (AVCodecContext *dst, const AVCodecContext *src)

Variables

static const uint8_t subpel_idx [3][8]
AVCodec ff_vp8_decoder


Define Documentation

#define MARGIN   (16 << 2)

Referenced by vp8_decode_frame().

#define MV_EDGE_CHECK (  ) 

Value:

{\
        VP8Macroblock *edge = mb_edge[n];\
        int edge_ref = edge->ref_frame;\
        if (edge_ref != VP56_FRAME_CURRENT) {\
            uint32_t mv = AV_RN32A(&edge->mv);\
            if (mv) {\
                if (cur_sign_bias != sign_bias[edge_ref]) {\
                    /* SWAR negate of the values in mv. */\
                    mv = ~mv;\
                    mv = ((mv&0x7fff7fff) + 0x00010001) ^ (mv&0x80008000);\
                }\
                if (!n || mv != AV_RN32A(&near_mv[idx]))\
                    AV_WN32A(&near_mv[++idx], mv);\
                cnt[idx]      += 1 + (n != 2);\
            } else\
                cnt[CNT_ZERO] += 1 + (n != 2);\
        }\
    }

Referenced by decode_mvs().

#define REBASE ( pic   )     pic ? pic - &s_src->frames[0] + &s->frames[0] : NULL

Definition at line 1752 of file vp8.c.

Referenced by vp8_decode_update_thread_context().

#define XCHG ( a,
b,
xchg   ) 

Value:

do {                     \
        if (xchg) AV_SWAP64(b,a);               \
        else      AV_COPY64(b,a);               \
    } while (0)


Function Documentation

static av_always_inline void backup_mb_border ( uint8_t *  top_border,
uint8_t *  src_y,
uint8_t *  src_cb,
uint8_t *  src_cr,
int  linesize,
int  uvlinesize,
int  simple 
) [static]

Definition at line 792 of file vp8.c.

static av_always_inline int check_dc_pred8x8_mode ( int  mode,
int  mb_x,
int  mb_y 
) [static]

Definition at line 834 of file vp8.c.

Referenced by check_intra_pred8x8_mode(), and check_intra_pred8x8_mode_emuedge().

static av_always_inline int check_intra_pred4x4_mode_emuedge ( int  mode,
int  mb_x,
int  mb_y,
int *  copy_buf 
) [static]

Definition at line 890 of file vp8.c.

Referenced by intra_predict().

static av_always_inline int check_intra_pred8x8_mode ( int  mode,
int  mb_x,
int  mb_y 
) [static]

Definition at line 854 of file vp8.c.

Referenced by intra_predict().

static av_always_inline int check_intra_pred8x8_mode_emuedge ( int  mode,
int  mb_x,
int  mb_y 
) [static]

Definition at line 864 of file vp8.c.

Referenced by intra_predict().

static av_always_inline int check_tm_pred4x4_mode ( int  mode,
int  mb_x,
int  mb_y 
) [static]

Definition at line 880 of file vp8.c.

Referenced by check_intra_pred4x4_mode_emuedge().

static av_always_inline int check_tm_pred8x8_mode ( int  mode,
int  mb_x,
int  mb_y 
) [static]

Definition at line 844 of file vp8.c.

Referenced by check_intra_pred8x8_mode_emuedge().

static av_always_inline void clamp_mv ( VP8Context s,
VP56mv dst,
const VP56mv src 
) [static]

Definition at line 363 of file vp8.c.

Referenced by decode_mvs().

static av_always_inline int decode_block_coeffs ( VP56RangeCoder c,
DCTELEM  block[16],
uint8_t  probs[16][3][NUM_DCT_TOKENS-1],
int  i,
int  zero_nhood,
int16_t  qmul[2] 
) [static]

Parameters:
c arithmetic bitstream reader context
block destination for block coefficients
probs probabilities to use when reading trees from the bitstream
i initial coeff index, 0 unless a separate DC block is coded
zero_nhood the initial prediction context for number of surrounding all-zero blocks (only left/top, so 0-2)
qmul array holding the dc/ac dequant factor at position 0/1
Returns:
0 if no coeffs were decoded otherwise, the index of the last coeff decoded plus one

Definition at line 720 of file vp8.c.

Referenced by decode_mb_coeffs().

static int decode_block_coeffs_internal ( VP56RangeCoder c,
DCTELEM  block[16],
uint8_t  probs[16][3][NUM_DCT_TOKENS-1],
int  i,
uint8_t *  token_prob,
int16_t  qmul[2] 
) [static]

Parameters:
c arithmetic bitstream reader context
block destination for block coefficients
probs probabilities to use when reading trees from the bitstream
i initial coeff index, 0 unless a separate DC block is coded
qmul array holding the dc/ac dequant factor at position 0/1
Returns:
0 if no coeffs were decoded otherwise, the index of the last coeff decoded plus one

Definition at line 654 of file vp8.c.

Referenced by decode_block_coeffs().

static int decode_frame_header ( VP8Context s,
const uint8_t *  buf,
int  buf_size 
) [static]

Definition at line 226 of file vp8.c.

Referenced by decode_frame(), and vp8_decode_frame().

static av_always_inline void decode_intra4x4_modes ( VP8Context s,
VP56RangeCoder c,
int  mb_x,
int  keyframe 
) [static]

Definition at line 569 of file vp8.c.

Referenced by decode_mb_mode().

static av_always_inline void decode_mb_coeffs ( VP8Context s,
VP56RangeCoder c,
VP8Macroblock mb,
uint8_t  t_nnz[9],
uint8_t  l_nnz[9] 
) [static]

Definition at line 731 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void decode_mb_mode ( VP8Context s,
VP8Macroblock mb,
int  mb_x,
int  mb_y,
uint8_t *  segment,
uint8_t *  ref 
) [static]

Definition at line 594 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void decode_mvs ( VP8Context s,
VP8Macroblock mb,
int  mb_x,
int  mb_y 
) [static]

Definition at line 479 of file vp8.c.

Referenced by decode_mb_mode().

static av_always_inline int decode_splitmvs ( VP8Context s,
VP56RangeCoder c,
VP8Macroblock mb 
) [static]

Split motion vector prediction, 16.4.

Returns:
the number of motion vectors parsed (2, 4 or 16)

Definition at line 415 of file vp8.c.

Referenced by decode_mvs().

static av_always_inline void filter_level_for_mb ( VP8Context s,
VP8Macroblock mb,
VP8FilterStrength f 
) [static]

Definition at line 1348 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void filter_mb ( VP8Context s,
uint8_t *  dst[3],
VP8FilterStrength f,
int  mb_x,
int  mb_y 
) [static]

Definition at line 1378 of file vp8.c.

Referenced by filter_mb_row().

static void filter_mb_row ( VP8Context s,
AVFrame curframe,
int  mb_y 
) [static]

Definition at line 1479 of file vp8.c.

Referenced by vp8_decode_frame().

static void filter_mb_row_simple ( VP8Context s,
AVFrame curframe,
int  mb_y 
) [static]

Definition at line 1498 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void filter_mb_simple ( VP8Context s,
uint8_t *  dst,
VP8FilterStrength f,
int  mb_x,
int  mb_y 
) [static]

Definition at line 1448 of file vp8.c.

Referenced by filter_mb_row_simple().

static void free_buffers ( VP8Context s  )  [static]

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

Definition at line 36 of file vp8.c.

Referenced by vp8_decode_flush(), and vp8_decode_update_thread_context().

static void get_quants ( VP8Context s  )  [static]

Definition at line 154 of file vp8.c.

Referenced by decode_frame_header().

static av_always_inline const uint8_t* get_submv_prob ( uint32_t  left,
uint32_t  top 
) [static]

Definition at line 401 of file vp8.c.

Referenced by decode_splitmvs().

static av_always_inline void idct_mb ( VP8Context s,
uint8_t *  dst[3],
VP8Macroblock mb 
) [static]

Definition at line 1296 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void inter_predict ( VP8Context s,
uint8_t *  dst[3],
VP8Macroblock mb,
int  mb_x,
int  mb_y 
) [static]

Apply motion vectors to prediction buffer, chapter 18.

Definition at line 1216 of file vp8.c.

Referenced by vp8_decode_frame().

static av_always_inline void intra_predict ( VP8Context s,
uint8_t *  dst[3],
VP8Macroblock mb,
int  mb_x,
int  mb_y 
) [static]

Definition at line 924 of file vp8.c.

Referenced by vp8_decode_frame().

static void parse_segment_info ( VP8Context s  )  [static]

Definition at line 95 of file vp8.c.

Referenced by decode_frame_header().

static av_always_inline void prefetch_motion ( VP8Context s,
VP8Macroblock mb,
int  mb_x,
int  mb_y,
int  mb_xy,
int  ref 
) [static]

Definition at line 1194 of file vp8.c.

static int read_mv_component ( VP56RangeCoder c,
const uint8_t *  p 
) [static]

Motion vector coding, 17.1.

Definition at line 372 of file vp8.c.

Referenced by decode_mvs(), and decode_splitmvs().

static VP56Frame ref_to_update ( VP8Context s,
int  update,
VP56Frame  ref 
) [static]

Determine which buffers golden and altref should be updated with after this frame.

The spec isn't clear here, so I'm going by my understanding of what libvpx does

Intra frames update all 3 references Inter frames update VP56_FRAME_PREVIOUS if the update_last flag is set If the update (golden|altref) flag is set, it's updated with the current frame if update_last is set, and VP56_FRAME_PREVIOUS otherwise. If the flag is not set, the number read means: 0: no update 1: VP56_FRAME_PREVIOUS 2: update golden with altref, or update altref with golden

Definition at line 199 of file vp8.c.

Referenced by update_refs().

static int setup_partitions ( VP8Context s,
const uint8_t *  buf,
int  buf_size 
) [static]

Definition at line 128 of file vp8.c.

Referenced by decode_frame_header().

static int update_dimensions ( VP8Context s,
int  width,
int  height 
) [static]

Definition at line 64 of file vp8.c.

Referenced by decode_frame_header().

static void update_lf_deltas ( VP8Context s  )  [static]

Definition at line 116 of file vp8.c.

Referenced by decode_frame_header().

static void update_refs ( VP8Context s  )  [static]

Definition at line 215 of file vp8.c.

Referenced by decode_frame_header().

static void vp8_decode_flush ( AVCodecContext avctx  )  [static]

Definition at line 49 of file vp8.c.

Referenced by update_dimensions(), and vp8_decode_free().

static int vp8_decode_frame ( AVCodecContext avctx,
void *  data,
int *  data_size,
AVPacket avpkt 
) [static]

Definition at line 1511 of file vp8.c.

static av_cold int vp8_decode_free ( AVCodecContext avctx  )  [static]

Definition at line 1737 of file vp8.c.

static av_cold int vp8_decode_init ( AVCodecContext avctx  )  [static]

Definition at line 1723 of file vp8.c.

static av_cold int vp8_decode_init_thread_copy ( AVCodecContext avctx  )  [static]

Definition at line 1743 of file vp8.c.

static int vp8_decode_update_thread_context ( AVCodecContext dst,
const AVCodecContext src 
) [static]

Definition at line 1755 of file vp8.c.

static av_always_inline void vp8_mc_chroma ( VP8Context s,
uint8_t *  dst1,
uint8_t *  dst2,
AVFrame ref,
const VP56mv mv,
int  x_off,
int  y_off,
int  block_w,
int  block_h,
int  width,
int  height,
int  linesize,
vp8_mc_func  mc_func[3][3] 
) [static]

chroma MC function

Parameters:
s VP8 decoding context
dst1 target buffer for block data at block position (U plane)
dst2 target buffer for block data at block position (V plane)
ref reference picture buffer at origin (0, 0)
mv motion vector (relative to block position) to get pixel data from
x_off horizontal position of block from origin (0, 0)
y_off vertical position of block from origin (0, 0)
block_w width of block (16, 8 or 4)
block_h height of block (always same as block_w)
width width of src/dst plane data
height height of src/dst plane data
linesize size of a single line of plane data, including padding
mc_func motion compensation function pointers (bilinear or sixtap MC)

Definition at line 1119 of file vp8.c.

Referenced by inter_predict(), and vp8_mc_part().

static av_always_inline void vp8_mc_luma ( VP8Context s,
uint8_t *  dst,
AVFrame ref,
const VP56mv mv,
int  x_off,
int  y_off,
int  block_w,
int  block_h,
int  width,
int  height,
int  linesize,
vp8_mc_func  mc_func[3][3] 
) [static]

luma MC function

Parameters:
s VP8 decoding context
dst target buffer for block data at block position
src reference picture buffer at origin (0, 0)
mv motion vector (relative to block position) to get pixel data from
x_off horizontal position of block from origin (0, 0)
y_off vertical position of block from origin (0, 0)
block_w width of block (16, 8 or 4)
block_h height of block (always same as block_w)
width width of src/dst plane data
height height of src/dst plane data
linesize size of a single line of plane data, including padding
mc_func motion compensation function pointers (bilinear or sixtap MC)

Definition at line 1069 of file vp8.c.

Referenced by inter_predict(), and vp8_mc_part().

static av_always_inline void vp8_mc_part ( VP8Context s,
uint8_t *  dst[3],
AVFrame ref_frame,
int  x_off,
int  y_off,
int  bx_off,
int  by_off,
int  block_w,
int  block_h,
int  width,
int  height,
VP56mv mv 
) [static]

Definition at line 1162 of file vp8.c.

Referenced by inter_predict().

static av_always_inline void xchg_mb_border ( uint8_t *  top_border,
uint8_t *  src_y,
uint8_t *  src_cb,
uint8_t *  src_cr,
int  linesize,
int  uvlinesize,
int  mb_x,
int  mb_y,
int  mb_width,
int  simple,
int  xchg 
) [static]

Definition at line 803 of file vp8.c.


Variable Documentation

const uint8_t subpel_idx[3][8] [static]

Initial value:

 {
    { 0, 1, 2, 1, 2, 1, 2, 1 }, 
                                
    { 0, 3, 5, 3, 5, 3, 5, 3 }, 
    { 0, 2, 3, 2, 3, 2, 3, 2 }, 
}

Definition at line 1045 of file vp8.c.

Referenced by vp8_mc_chroma(), and vp8_mc_luma().


Generated on Fri Oct 26 02:39:47 2012 for FFmpeg by  doxygen 1.5.8