#include <assert.h>
#include <stdlib.h>
#include "./vp9_rtcd.h"
#include "./vpx_dsp_rtcd.h"
#include "./vpx_scale_rtcd.h"
#include "vpx_dsp/bitreader_buffer.h"
#include "vpx_dsp/bitreader.h"
#include "vpx_dsp/vpx_dsp_common.h"
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/mem.h"
#include "vpx_ports/mem_ops.h"
#include "vpx_scale/vpx_scale.h"
#include "vpx_util/vpx_pthread.h"
#include "vpx_util/vpx_thread.h"
#if CONFIG_BITSTREAM_DEBUG || CONFIG_MISMATCH_DEBUG
#include "vpx_util/vpx_debug_util.h"
#endif
#include "vp9/common/vp9_alloccommon.h"
#include "vp9/common/vp9_common.h"
#include "vp9/common/vp9_entropy.h"
#include "vp9/common/vp9_entropymode.h"
#include "vp9/common/vp9_idct.h"
#include "vp9/common/vp9_thread_common.h"
#include "vp9/common/vp9_pred_common.h"
#include "vp9/common/vp9_quant_common.h"
#include "vp9/common/vp9_reconintra.h"
#include "vp9/common/vp9_reconinter.h"
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_tile_common.h"
#include "vp9/decoder/vp9_decodeframe.h"
#include "vp9/decoder/vp9_detokenize.h"
#include "vp9/decoder/vp9_decodemv.h"
#include "vp9/decoder/vp9_decoder.h"
#include "vp9/decoder/vp9_dsubexp.h"
#include "vp9/decoder/vp9_job_queue.h"
#define MAX_VP9_HEADER_SIZE …
predict_recon_func;
intra_recon_func;
static int read_is_valid(const uint8_t *start, size_t len, const uint8_t *end) { … }
static int decode_unsigned_max(struct vpx_read_bit_buffer *rb, int max) { … }
static TX_MODE read_tx_mode(vpx_reader *r) { … }
static void read_tx_mode_probs(struct tx_probs *tx_probs, vpx_reader *r) { … }
static void read_switchable_interp_probs(FRAME_CONTEXT *fc, vpx_reader *r) { … }
static void read_inter_mode_probs(FRAME_CONTEXT *fc, vpx_reader *r) { … }
static REFERENCE_MODE read_frame_reference_mode(const VP9_COMMON *cm,
vpx_reader *r) { … }
static void read_frame_reference_mode_probs(VP9_COMMON *cm, vpx_reader *r) { … }
static void update_mv_probs(vpx_prob *p, int n, vpx_reader *r) { … }
static void read_mv_probs(nmv_context *ctx, int allow_hp, vpx_reader *r) { … }
static void inverse_transform_block_inter(MACROBLOCKD *xd, int plane,
const TX_SIZE tx_size, uint8_t *dst,
int stride, int eob) { … }
static void inverse_transform_block_intra(MACROBLOCKD *xd, int plane,
const TX_TYPE tx_type,
const TX_SIZE tx_size, uint8_t *dst,
int stride, int eob) { … }
static void predict_and_reconstruct_intra_block(TileWorkerData *twd,
MODE_INFO *const mi, int plane,
int row, int col,
TX_SIZE tx_size) { … }
static void parse_intra_block_row_mt(TileWorkerData *twd, MODE_INFO *const mi,
int plane, int row, int col,
TX_SIZE tx_size) { … }
static void predict_and_reconstruct_intra_block_row_mt(TileWorkerData *twd,
MODE_INFO *const mi,
int plane, int row,
int col,
TX_SIZE tx_size) { … }
static int reconstruct_inter_block(TileWorkerData *twd, MODE_INFO *const mi,
int plane, int row, int col, TX_SIZE tx_size,
int mi_row, int mi_col) { … }
static int parse_inter_block_row_mt(TileWorkerData *twd, MODE_INFO *const mi,
int plane, int row, int col,
TX_SIZE tx_size) { … }
static int reconstruct_inter_block_row_mt(TileWorkerData *twd,
MODE_INFO *const mi, int plane,
int row, int col, TX_SIZE tx_size) { … }
static void build_mc_border(const uint8_t *src, int src_stride, uint8_t *dst,
int dst_stride, int x, int y, int b_w, int b_h,
int w, int h) { … }
#if CONFIG_VP9_HIGHBITDEPTH
static void high_build_mc_border(const uint8_t *src8, int src_stride,
uint16_t *dst, int dst_stride, int x, int y,
int b_w, int b_h, int w, int h) { … }
#endif
#if CONFIG_VP9_HIGHBITDEPTH
static void extend_and_predict(TileWorkerData *twd, const uint8_t *buf_ptr1,
int pre_buf_stride, int x0, int y0, int b_w,
int b_h, int frame_width, int frame_height,
int border_offset, uint8_t *const dst,
int dst_buf_stride, int subpel_x, int subpel_y,
const InterpKernel *kernel,
const struct scale_factors *sf, MACROBLOCKD *xd,
int w, int h, int ref, int xs, int ys) { … }
#else
static void extend_and_predict(TileWorkerData *twd, const uint8_t *buf_ptr1,
int pre_buf_stride, int x0, int y0, int b_w,
int b_h, int frame_width, int frame_height,
int border_offset, uint8_t *const dst,
int dst_buf_stride, int subpel_x, int subpel_y,
const InterpKernel *kernel,
const struct scale_factors *sf, int w, int h,
int ref, int xs, int ys) {
uint8_t *mc_buf = (uint8_t *)twd->extend_and_predict_buf;
const uint8_t *buf_ptr;
build_mc_border(buf_ptr1, pre_buf_stride, mc_buf, b_w, x0, y0, b_w, b_h,
frame_width, frame_height);
buf_ptr = mc_buf + border_offset;
inter_predictor(buf_ptr, b_w, dst, dst_buf_stride, subpel_x, subpel_y, sf, w,
h, ref, kernel, xs, ys);
}
#endif
static void dec_build_inter_predictors(
TileWorkerData *twd, MACROBLOCKD *xd, int plane, int bw, int bh, int x,
int y, int w, int h, int mi_x, int mi_y, const InterpKernel *kernel,
const struct scale_factors *sf, struct buf_2d *pre_buf,
struct buf_2d *dst_buf, const MV *mv, RefCntBuffer *ref_frame_buf,
int is_scaled, int ref) { … }
static void dec_build_inter_predictors_sb(TileWorkerData *twd,
VP9Decoder *const pbi,
MACROBLOCKD *xd, int mi_row,
int mi_col) { … }
static INLINE void dec_reset_skip_context(MACROBLOCKD *xd) { … }
static void set_plane_n4(MACROBLOCKD *const xd, int bw, int bh, int bwl,
int bhl) { … }
static MODE_INFO *set_offsets_recon(VP9_COMMON *const cm, MACROBLOCKD *const xd,
int mi_row, int mi_col, int bw, int bh,
int bwl, int bhl) { … }
static MODE_INFO *set_offsets(VP9_COMMON *const cm, MACROBLOCKD *const xd,
BLOCK_SIZE bsize, int mi_row, int mi_col, int bw,
int bh, int x_mis, int y_mis, int bwl, int bhl) { … }
static INLINE int predict_recon_inter(MACROBLOCKD *xd, MODE_INFO *mi,
TileWorkerData *twd,
predict_recon_func func) { … }
static INLINE void predict_recon_intra(MACROBLOCKD *xd, MODE_INFO *mi,
TileWorkerData *twd,
intra_recon_func func) { … }
static void decode_block(TileWorkerData *twd, VP9Decoder *const pbi, int mi_row,
int mi_col, BLOCK_SIZE bsize, int bwl, int bhl) { … }
static void recon_block(TileWorkerData *twd, VP9Decoder *const pbi, int mi_row,
int mi_col, BLOCK_SIZE bsize, int bwl, int bhl) { … }
static void parse_block(TileWorkerData *twd, VP9Decoder *const pbi, int mi_row,
int mi_col, BLOCK_SIZE bsize, int bwl, int bhl) { … }
static INLINE int dec_partition_plane_context(TileWorkerData *twd, int mi_row,
int mi_col, int bsl) { … }
static INLINE void dec_update_partition_context(TileWorkerData *twd, int mi_row,
int mi_col, BLOCK_SIZE subsize,
int bw) { … }
static PARTITION_TYPE read_partition(TileWorkerData *twd, int mi_row,
int mi_col, int has_rows, int has_cols,
int bsl) { … }
static void decode_partition(TileWorkerData *twd, VP9Decoder *const pbi,
int mi_row, int mi_col, BLOCK_SIZE bsize,
int n4x4_l2) { … }
static void process_partition(TileWorkerData *twd, VP9Decoder *const pbi,
int mi_row, int mi_col, BLOCK_SIZE bsize,
int n4x4_l2, int parse_recon_flag,
process_block_fn_t process_block) { … }
static void setup_token_decoder(const uint8_t *data, const uint8_t *data_end,
size_t read_size,
struct vpx_internal_error_info *error_info,
vpx_reader *r, vpx_decrypt_cb decrypt_cb,
void *decrypt_state) { … }
static void read_coef_probs_common(vp9_coeff_probs_model *coef_probs,
vpx_reader *r) { … }
static void read_coef_probs(FRAME_CONTEXT *fc, TX_MODE tx_mode, vpx_reader *r) { … }
static void setup_segmentation(struct segmentation *seg,
struct vpx_read_bit_buffer *rb) { … }
static void setup_loopfilter(struct loopfilter *lf,
struct vpx_read_bit_buffer *rb) { … }
static INLINE int read_delta_q(struct vpx_read_bit_buffer *rb) { … }
static void setup_quantization(VP9_COMMON *const cm, MACROBLOCKD *const xd,
struct vpx_read_bit_buffer *rb) { … }
static void setup_segmentation_dequant(VP9_COMMON *const cm) { … }
static INTERP_FILTER read_interp_filter(struct vpx_read_bit_buffer *rb) { … }
static void setup_render_size(VP9_COMMON *cm, struct vpx_read_bit_buffer *rb) { … }
static void resize_mv_buffer(VP9_COMMON *cm) { … }
static void resize_context_buffers(VP9_COMMON *cm, int width, int height) { … }
static void setup_frame_size(VP9_COMMON *cm, struct vpx_read_bit_buffer *rb) { … }
static INLINE int valid_ref_frame_img_fmt(vpx_bit_depth_t ref_bit_depth,
int ref_xss, int ref_yss,
vpx_bit_depth_t this_bit_depth,
int this_xss, int this_yss) { … }
static void setup_frame_size_with_refs(VP9_COMMON *cm,
struct vpx_read_bit_buffer *rb) { … }
static void setup_tile_info(VP9_COMMON *cm, struct vpx_read_bit_buffer *rb) { … }
static void get_tile_buffer(const uint8_t *const data_end, int is_last,
struct vpx_internal_error_info *error_info,
const uint8_t **data, vpx_decrypt_cb decrypt_cb,
void *decrypt_state, TileBuffer *buf) { … }
static void get_tile_buffers(VP9Decoder *pbi, const uint8_t *data,
const uint8_t *data_end, int tile_cols,
int tile_rows,
TileBuffer (*tile_buffers)[1 << 6]) { … }
static void map_write(RowMTWorkerData *const row_mt_worker_data, int map_idx,
int sync_idx) { … }
static void map_read(RowMTWorkerData *const row_mt_worker_data, int map_idx,
int sync_idx) { … }
static int lpf_map_write_check(VP9LfSync *lf_sync, int row, int num_tile_cols) { … }
static void vp9_tile_done(VP9Decoder *pbi) { … }
static void vp9_jobq_alloc(VP9Decoder *pbi) { … }
static void recon_tile_row(TileWorkerData *tile_data, VP9Decoder *pbi,
int mi_row, int is_last_row, VP9LfSync *lf_sync,
int cur_tile_col) { … }
static void parse_tile_row(TileWorkerData *tile_data, VP9Decoder *pbi,
int mi_row, int cur_tile_col, uint8_t **data_end) { … }
static int row_decode_worker_hook(void *arg1, void *arg2) { … }
static const uint8_t *decode_tiles(VP9Decoder *pbi, const uint8_t *data,
const uint8_t *data_end) { … }
static void set_rows_after_error(VP9LfSync *lf_sync, int start_row, int mi_rows,
int num_tiles_left, int total_num_tiles) { … }
static int tile_worker_hook(void *arg1, void *arg2) { … }
static int compare_tile_buffers(const void *a, const void *b) { … }
static INLINE void init_mt(VP9Decoder *pbi) { … }
static const uint8_t *decode_tiles_row_wise_mt(VP9Decoder *pbi,
const uint8_t *data,
const uint8_t *data_end) { … }
static const uint8_t *decode_tiles_mt(VP9Decoder *pbi, const uint8_t *data,
const uint8_t *data_end) { … }
static void error_handler(void *data) { … }
static void read_bitdepth_colorspace_sampling(VP9_COMMON *cm,
struct vpx_read_bit_buffer *rb) { … }
static INLINE void flush_all_fb_on_key(VP9_COMMON *cm) { … }
static size_t read_uncompressed_header(VP9Decoder *pbi,
struct vpx_read_bit_buffer *rb) { … }
static int read_compressed_header(VP9Decoder *pbi, const uint8_t *data,
size_t partition_size) { … }
static struct vpx_read_bit_buffer *init_read_bit_buffer(
VP9Decoder *pbi, struct vpx_read_bit_buffer *rb, const uint8_t *data,
const uint8_t *data_end, uint8_t clear_data[MAX_VP9_HEADER_SIZE]) { … }
int vp9_read_sync_code(struct vpx_read_bit_buffer *const rb) { … }
void vp9_read_frame_size(struct vpx_read_bit_buffer *rb, int *width,
int *height) { … }
BITSTREAM_PROFILE vp9_read_profile(struct vpx_read_bit_buffer *rb) { … }
void vp9_decode_frame(VP9Decoder *pbi, const uint8_t *data,
const uint8_t *data_end, const uint8_t **p_data_end) { … }