1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_DECODER_ONYXD_INT_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_DECODER_ONYXD_INT_H_ 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/onyxd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "treereader.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/onyxc_int.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/threading.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_ERROR_CONCEALMENT 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "ec_types.h" 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 26233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ithread; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan void *ptr1; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan void *ptr2; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan} DECODETHREAD_DATA; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD mbd; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan} MB_ROW_DEC; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan int enabled; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int count; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan const unsigned char *ptrs[MAX_PARTITIONS]; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int sizes[MAX_PARTITIONS]; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan} FRAGMENT_DATA; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_FB_MT_DEC 32 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan 52233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct frame_buffers 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan * this struct will be populated with frame buffer management 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan * info in future commits. */ 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* enable/disable frame-based threading */ 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan int use_frame_threads; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* decoder instances */ 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct VP8D_COMP *pbi[MAX_FB_MT_DEC]; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct VP8D_COMP 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, MACROBLOCKD, mb); 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS]; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, VP8_COMMON, common); 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* the last partition will be used for the modes/mvs */ 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_reader mbc[MAX_PARTITIONS]; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan VP8D_CONFIG oxcf; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan FRAGMENT_DATA fragments; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTITHREAD 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* variable for threading */ 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan volatile int b_multithreaded_rd; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan int max_threads; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan int current_mb_col_main; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int decoding_thread_count; 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan int allocated_decoding_thread_count; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mt_baseline_filter_level[MAX_MB_SEGMENTS]; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sync_range; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *mt_current_mb_col; /* Each row remembers its already decoded column. */ 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_yabove_row; /* mb_rows x width */ 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_uabove_row; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_vabove_row; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_yleft_col; /* mb_rows x 16 */ 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_uleft_col; /* mb_rows x 8 */ 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **mt_vleft_col; /* mb_rows x 8 */ 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_ROW_DEC *mb_row_di; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECODETHREAD_DATA *de_thread_data; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan pthread_t *h_decoding_thread; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan sem_t *h_event_start_decoding; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan sem_t h_event_end_decoding; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* end of threading data */ 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t last_time_stamp; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ready_for_new_data; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob prob_intra; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob prob_last; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob prob_gf; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob prob_skip_false; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_ERROR_CONCEALMENT 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_OVERLAP *overlaps; 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* the mb num from which modes and mvs (first partition) are corrupt */ 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int mvs_corrupt_from_mb; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ec_enabled; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ec_active; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan int decoded_key_frame; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan int independent_partitions; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan int frame_corrupt_residual; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_decrypt_cb *decrypt_cb; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan void *decrypt_state; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VP8D_COMP; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 133233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_decode_frame(VP8D_COMP *cpi); 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf); 136233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_remove_decoder_instances(struct frame_buffers *fb); 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_DEBUG 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define CHECK_MEM_ERROR(lval,expr) do {\ 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan lval = (expr); \ 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!lval) \ 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\ 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan "Failed to allocate "#lval" at %s:%d", \ 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan __FILE__,__LINE__);\ 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define CHECK_MEM_ERROR(lval,expr) do {\ 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan lval = (expr); \ 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(!lval) \ 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\ 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan "Failed to allocate "#lval);\ 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan } while(0) 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP8_DECODER_ONYXD_INT_H_ 160