190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VP8_DECODER_ONYXD_INT_H_ 13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_DECODER_ONYXD_INT_H_ 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 1679f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxd.h" 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "treereader.h" 1879f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxc_int.h" 1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/threading.h" 201b362b15af34006e6a11974088a46d42b903418eJohann 211b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 221b362b15af34006e6a11974088a46d42b903418eJohann#include "ec_types.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#endif 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ithread; 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void *ptr1; 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber void *ptr2; 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} DECODETHREAD_DATA; 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber MACROBLOCKD mbd; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} MB_ROW_DEC; 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{ 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int enabled; 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int count; 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *ptrs[MAX_PARTITIONS]; 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int sizes[MAX_PARTITIONS]; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} FRAGMENT_DATA; 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_FB_MT_DEC 32 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct frame_buffers 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{ 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * this struct will be populated with frame buffer management 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * info in future commits. */ 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* enable/disable frame-based threading */ 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int use_frame_threads; 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* decoder instances */ 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct VP8D_COMP *pbi[MAX_FB_MT_DEC]; 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 661b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct VP8D_COMP 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, MACROBLOCKD, mb); 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 701b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS]; 711b362b15af34006e6a11974088a46d42b903418eJohann 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DECLARE_ALIGNED(16, VP8_COMMON, common); 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 741b362b15af34006e6a11974088a46d42b903418eJohann /* the last partition will be used for the modes/mvs */ 751b362b15af34006e6a11974088a46d42b903418eJohann vp8_reader mbc[MAX_PARTITIONS]; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber VP8D_CONFIG oxcf; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FRAGMENT_DATA fragments; 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8179f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD 8279f15823c34ae1e423108295e416213200bb280fAndreas Huber /* variable for threading */ 8379f15823c34ae1e423108295e416213200bb280fAndreas Huber 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber volatile int b_multithreaded_rd; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int max_threads; 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int current_mb_col_main; 871b362b15af34006e6a11974088a46d42b903418eJohann unsigned int decoding_thread_count; 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int allocated_decoding_thread_count; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int mt_baseline_filter_level[MAX_MB_SEGMENTS]; 91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int sync_range; 92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int *mt_current_mb_col; /* Each row remembers its already decoded column. */ 93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_yabove_row; /* mb_rows x width */ 95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_uabove_row; 96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_vabove_row; 97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_yleft_col; /* mb_rows x 16 */ 98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_uleft_col; /* mb_rows x 8 */ 99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber unsigned char **mt_vleft_col; /* mb_rows x 8 */ 100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber MB_ROW_DEC *mb_row_di; 102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber DECODETHREAD_DATA *de_thread_data; 103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pthread_t *h_decoding_thread; 105f71323e297a928af368937089d3ed71239786f86Andreas Huber sem_t *h_event_start_decoding; 106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber sem_t h_event_end_decoding; 107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* end of threading data */ 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 1101b362b15af34006e6a11974088a46d42b903418eJohann int64_t last_time_stamp; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int ready_for_new_data; 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 113f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_prob prob_intra; 114f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_prob prob_last; 115f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_prob prob_gf; 116f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_prob prob_skip_false; 117f71323e297a928af368937089d3ed71239786f86Andreas Huber 1181b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 1191b362b15af34006e6a11974088a46d42b903418eJohann MB_OVERLAP *overlaps; 1201b362b15af34006e6a11974088a46d42b903418eJohann /* the mb num from which modes and mvs (first partition) are corrupt */ 1211b362b15af34006e6a11974088a46d42b903418eJohann unsigned int mvs_corrupt_from_mb; 1221b362b15af34006e6a11974088a46d42b903418eJohann#endif 1231b362b15af34006e6a11974088a46d42b903418eJohann int ec_enabled; 1241b362b15af34006e6a11974088a46d42b903418eJohann int ec_active; 1251b362b15af34006e6a11974088a46d42b903418eJohann int decoded_key_frame; 1261b362b15af34006e6a11974088a46d42b903418eJohann int independent_partitions; 1271b362b15af34006e6a11974088a46d42b903418eJohann int frame_corrupt_residual; 1281b362b15af34006e6a11974088a46d42b903418eJohann 129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_decrypt_cb *decrypt_cb; 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *decrypt_state; 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} VP8D_COMP; 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_decode_frame(VP8D_COMP *cpi); 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf); 136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_remove_decoder_instances(struct frame_buffers *fb); 137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_DEBUG 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\ 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lval = (expr); \ 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if(!lval) \ 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\ 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber "Failed to allocate "#lval" at %s:%d", \ 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber __FILE__,__LINE__);\ 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } while(0) 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\ 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lval = (expr); \ 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if(!lval) \ 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\ 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber "Failed to allocate "#lval);\ 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } while(0) 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 155b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif // VP8_DECODER_ONYXD_INT_H_ 160