/* * Copyright (c) 2010 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
typedefstruct { int ref_count;
MV_REF *mvs; int mi_rows; int mi_cols;
uint8_t released;
// Note that frame_index/frame_coding_index are only set by set_frame_index() // on the encoder side.
// TODO(angiebird): Set frame_index/frame_coding_index on the decoder side // properly. int frame_index; // Display order in the video, it's equivalent to the // show_idx defined in EncodeFrameInfo. int frame_coding_index; // The coding order (starting from zero) of this // frame.
vpx_codec_frame_buffer_t raw_frame_buffer;
YV12_BUFFER_CONFIG buf;
} RefCntBuffer;
typedefstruct BufferPool { // Private data associated with the frame buffer callbacks. void *cb_priv;
// Frame buffers allocated internally by the codec.
InternalFrameBufferList int_frame_buffers;
} BufferPool;
typedefstruct VP9Common { struct vpx_internal_error_info error;
vpx_color_space_t color_space;
vpx_color_range_t color_range; int width; int height; int render_width; int render_height; int last_width; int last_height;
// TODO(jkoleszar): this implies chroma ss right now, but could vary per // plane. Revisit as part of the future change to YV12_BUFFER_CONFIG to // support additional planes. int subsampling_x; int subsampling_y;
#if CONFIG_VP9_HIGHBITDEPTH int use_highbitdepth; // Marks if we need to use 16bit frame buffers. #endif
FRAME_TYPE last_frame_type; /* last frame's frame type for motion search.*/
FRAME_TYPE frame_type;
int show_frame; int last_show_frame; int show_existing_frame;
// Flag signaling that the frame is encoded using only INTRA modes.
uint8_t intra_only;
uint8_t last_intra_only;
int allow_high_precision_mv;
// Flag signaling that the frame context should be reset to default values. // 0 or 1 implies don't reset, 2 reset just the context specified in the // frame header, 3 reset all contexts. int reset_frame_context;
// MBs, mb_rows/cols is in 16-pixel units; mi_rows/cols is in // MODE_INFO (8-pixel) units. int MBs; int mb_rows, mi_rows; int mb_cols, mi_cols; int mi_stride;
/* profile settings */
TX_MODE tx_mode;
int base_qindex; int y_dc_delta_q; int uv_dc_delta_q; int uv_ac_delta_q;
int16_t y_dequant[MAX_SEGMENTS][2];
int16_t uv_dequant[MAX_SEGMENTS][2];
/* We allocate a MODE_INFO struct for each macroblock, together with
an extra row on top and column on the left to simplify prediction. */ int mi_alloc_size;
MODE_INFO *mip; /* Base of allocated array */
MODE_INFO *mi; /* Corresponds to upper left visible macroblock */
// TODO(agrange): Move prev_mi into encoder structure. // prev_mip and prev_mi will only be allocated in VP9 encoder.
MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */
MODE_INFO *prev_mi; /* 'mi' from last frame (points into prev_mip) */
// Separate mi functions between encoder and decoder. int (*alloc_mi)(struct VP9Common *cm, int mi_size); void (*free_mi)(struct VP9Common *cm); void (*setup_mi)(struct VP9Common *cm);
// Grid of pointers to 8x8 MODE_INFO structs. Any 8x8 not in the visible // area will be NULL.
MODE_INFO **mi_grid_base;
MODE_INFO **mi_grid_visible;
MODE_INFO **prev_mi_grid_base;
MODE_INFO **prev_mi_grid_visible;
// Whether to use previous frame's motion vectors for prediction. int use_prev_frame_mvs;
// Persistent mb segment id map used in prediction. int seg_map_idx; int prev_seg_map_idx;
uint8_t *seg_map_array[NUM_PING_PONG_BUFFERS];
uint8_t *last_frame_seg_map;
uint8_t *current_frame_seg_map; int seg_map_alloc_size;
INTERP_FILTER interp_filter;
loop_filter_info_n lf_info;
int refresh_frame_context; /* Two state 0 = NO, 1 = YES */
int ref_frame_sign_bias[MAX_REF_FRAMES]; /* Two state 0, 1 */
FRAME_CONTEXT *fc; /* this frame entropy */
FRAME_CONTEXT *frame_contexts; // FRAME_CONTEXTS unsignedint frame_context_idx; /* Context to use/update */
FRAME_COUNTS counts;
// TODO(angiebird): current_video_frame/current_frame_coding_index into a // structure unsignedint current_video_frame; // Each show or no show frame is assigned with a coding index based on its // coding order (starting from zero).
// Current frame's coding index. int current_frame_coding_index;
BITSTREAM_PROFILE profile;
// VPX_BITS_8 in profile 0 or 1, VPX_BITS_10 or VPX_BITS_12 in profile 2 or 3.
vpx_bit_depth_t bit_depth;
vpx_bit_depth_t dequant_bit_depth; // bit_depth of current dequantizer
staticINLINEvoid update_frame_indexes(VP9_COMMON *cm, int show_frame) { if (show_frame) { // Don't increment frame counters if this was an altref buffer // update not a real frame
++cm->current_video_frame;
}
++cm->current_frame_coding_index;
}
typedefstruct { int frame_width; int frame_height; int render_frame_width; int render_frame_height; int mi_rows; int mi_cols; int mb_rows; int mb_cols; int num_mbs;
vpx_bit_depth_t bit_depth;
} FRAME_INFO;
staticINLINEvoid init_frame_info(FRAME_INFO *frame_info, const VP9_COMMON *cm) {
frame_info->frame_width = cm->width;
frame_info->frame_height = cm->height;
frame_info->render_frame_width = cm->render_width;
frame_info->render_frame_height = cm->render_height;
frame_info->mi_cols = cm->mi_cols;
frame_info->mi_rows = cm->mi_rows;
frame_info->mb_cols = cm->mb_cols;
frame_info->mb_rows = cm->mb_rows;
frame_info->num_mbs = cm->MBs;
frame_info->bit_depth = cm->bit_depth; // TODO(angiebird): Figure out how to get subsampling_x/y here
}
staticINLINE YV12_BUFFER_CONFIG *get_buf_frame(VP9_COMMON *cm, int index) { if (index < 0 || index >= FRAME_BUFFERS) return NULL; if (cm->error.error_code != VPX_CODEC_OK) return NULL; return &cm->buffer_pool->frame_bufs[index].buf;
}
staticINLINE YV12_BUFFER_CONFIG *get_ref_frame(VP9_COMMON *cm, int index) { if (index < 0 || index >= REF_FRAMES) return NULL; if (cm->ref_frame_map[index] < 0) return NULL;
assert(cm->ref_frame_map[index] < FRAME_BUFFERS); return &cm->buffer_pool->frame_bufs[cm->ref_frame_map[index]].buf;
}
// update the partition context at the end notes. set partition bits // of block sizes larger than the current one to be one, and partition // bits of smaller block sizes to be zero.
memset(above_ctx, partition_context_lookup[subsize].above, bs);
memset(left_ctx, partition_context_lookup[subsize].left, bs);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.