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 121b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "blockd.h" 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h" 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyxc_int.h" 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "findnearmv.h" 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "entropymode.h" 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "systemdependent.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_de_alloc_frame_buffers(VP8_COMMON *oci) 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 22f71323e297a928af368937089d3ed71239786f86Andreas Huber int i; 23f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < NUM_YV12_BUFFERS; i++) 24f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_yv12_de_alloc_frame_buffer(&oci->yv12_fb[i]); 25f71323e297a928af368937089d3ed71239786f86Andreas Huber 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_yv12_de_alloc_frame_buffer(&oci->temp_scale_frame); 271b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_POSTPROC 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_yv12_de_alloc_frame_buffer(&oci->post_proc_buffer); 291b362b15af34006e6a11974088a46d42b903418eJohann if (oci->post_proc_buffer_int_used) 301b362b15af34006e6a11974088a46d42b903418eJohann vp8_yv12_de_alloc_frame_buffer(&oci->post_proc_buffer_int); 311b362b15af34006e6a11974088a46d42b903418eJohann 321b362b15af34006e6a11974088a46d42b903418eJohann vpx_free(oci->pp_limits_buffer); 331b362b15af34006e6a11974088a46d42b903418eJohann oci->pp_limits_buffer = NULL; 341b362b15af34006e6a11974088a46d42b903418eJohann#endif 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_free(oci->above_context); 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_free(oci->mip); 381b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 391b362b15af34006e6a11974088a46d42b903418eJohann vpx_free(oci->prev_mip); 401b362b15af34006e6a11974088a46d42b903418eJohann oci->prev_mip = NULL; 411b362b15af34006e6a11974088a46d42b903418eJohann#endif 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 431b362b15af34006e6a11974088a46d42b903418eJohann oci->above_context = NULL; 441b362b15af34006e6a11974088a46d42b903418eJohann oci->mip = NULL; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height) 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 49f71323e297a928af368937089d3ed71239786f86Andreas Huber int i; 50f71323e297a928af368937089d3ed71239786f86Andreas Huber 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_de_alloc_frame_buffers(oci); 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* our internal buffers are always multiples of 16 */ 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ((width & 0xf) != 0) 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber width += 16 - (width & 0xf); 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ((height & 0xf) != 0) 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber height += 16 - (height & 0xf); 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = 0; i < NUM_YV12_BUFFERS; i++) 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 631b362b15af34006e6a11974088a46d42b903418eJohann oci->fb_idx_ref_cnt[i] = 0; 641b362b15af34006e6a11974088a46d42b903418eJohann oci->yv12_fb[i].flags = 0; 651b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_yv12_alloc_frame_buffer(&oci->yv12_fb[i], width, height, VP8BORDERINPIXELS) < 0) 661b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 69f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->new_fb_idx = 0; 70f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->lst_fb_idx = 1; 71f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->gld_fb_idx = 2; 72f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->alt_fb_idx = 3; 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->fb_idx_ref_cnt[0] = 1; 75f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->fb_idx_ref_cnt[1] = 1; 76f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->fb_idx_ref_cnt[2] = 1; 77f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->fb_idx_ref_cnt[3] = 1; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79f71323e297a928af368937089d3ed71239786f86Andreas Huber if (vp8_yv12_alloc_frame_buffer(&oci->temp_scale_frame, width, 16, VP8BORDERINPIXELS) < 0) 801b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mb_rows = height >> 4; 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mb_cols = width >> 4; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->MBs = oci->mb_rows * oci->mb_cols; 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mode_info_stride = oci->mb_cols + 1; 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mip = vpx_calloc((oci->mb_cols + 1) * (oci->mb_rows + 1), sizeof(MODE_INFO)); 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!oci->mip) 891b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mi = oci->mip + oci->mode_info_stride + 1; 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 931b362b15af34006e6a11974088a46d42b903418eJohann /* Allocation of previous mode info will be done in vp8_decode_frame() 941b362b15af34006e6a11974088a46d42b903418eJohann * as it is a decoder only data */ 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 96f71323e297a928af368937089d3ed71239786f86Andreas Huber oci->above_context = vpx_calloc(sizeof(ENTROPY_CONTEXT_PLANES) * oci->mb_cols, 1); 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!oci->above_context) 991b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1011b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_POSTPROC 1021b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer, width, height, VP8BORDERINPIXELS) < 0) 1031b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann oci->post_proc_buffer_int_used = 0; 1061b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(&oci->postproc_state, 0, sizeof(oci->postproc_state)); 1071b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(oci->post_proc_buffer.buffer_alloc, 128, 1081b362b15af34006e6a11974088a46d42b903418eJohann oci->post_proc_buffer.frame_size); 1091b362b15af34006e6a11974088a46d42b903418eJohann 1101b362b15af34006e6a11974088a46d42b903418eJohann /* Allocate buffer to store post-processing filter coefficients. 1111b362b15af34006e6a11974088a46d42b903418eJohann * 1121b362b15af34006e6a11974088a46d42b903418eJohann * Note: Round up mb_cols to support SIMD reads 1131b362b15af34006e6a11974088a46d42b903418eJohann */ 1141b362b15af34006e6a11974088a46d42b903418eJohann oci->pp_limits_buffer = vpx_memalign(16, 24 * ((oci->mb_cols + 1) & ~1)); 1151b362b15af34006e6a11974088a46d42b903418eJohann if (!oci->pp_limits_buffer) 1161b362b15af34006e6a11974088a46d42b903418eJohann goto allocation_fail; 1171b362b15af34006e6a11974088a46d42b903418eJohann#endif 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return 0; 1201b362b15af34006e6a11974088a46d42b903418eJohann 1211b362b15af34006e6a11974088a46d42b903418eJohannallocation_fail: 1221b362b15af34006e6a11974088a46d42b903418eJohann vp8_de_alloc_frame_buffers(oci); 1231b362b15af34006e6a11974088a46d42b903418eJohann return 1; 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 1251b362b15af34006e6a11974088a46d42b903418eJohann 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_setup_version(VP8_COMMON *cm) 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch (cm->version) 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case 0: 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->no_lpf = 0; 1321b362b15af34006e6a11974088a46d42b903418eJohann cm->filter_type = NORMAL_LOOPFILTER; 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->use_bilinear_mc_filter = 0; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->full_pixel = 0; 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case 1: 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->no_lpf = 0; 1381b362b15af34006e6a11974088a46d42b903418eJohann cm->filter_type = SIMPLE_LOOPFILTER; 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->use_bilinear_mc_filter = 1; 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->full_pixel = 0; 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case 2: 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->no_lpf = 1; 1441b362b15af34006e6a11974088a46d42b903418eJohann cm->filter_type = NORMAL_LOOPFILTER; 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->use_bilinear_mc_filter = 1; 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->full_pixel = 0; 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case 3: 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->no_lpf = 1; 1501b362b15af34006e6a11974088a46d42b903418eJohann cm->filter_type = SIMPLE_LOOPFILTER; 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->use_bilinear_mc_filter = 1; 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->full_pixel = 1; 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber default: 155538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*4,5,6,7 are reserved for future use*/ 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->no_lpf = 0; 1571b362b15af34006e6a11974088a46d42b903418eJohann cm->filter_type = NORMAL_LOOPFILTER; 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->use_bilinear_mc_filter = 0; 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cm->full_pixel = 0; 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_create_common(VP8_COMMON *oci) 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_machine_specific_config(oci); 1661b362b15af34006e6a11974088a46d42b903418eJohann 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_init_mbmode_probs(oci); 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_default_bmode_probs(oci->fc.bmode_prob); 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->mb_no_coeff_skip = 1; 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->no_lpf = 0; 1721b362b15af34006e6a11974088a46d42b903418eJohann oci->filter_type = NORMAL_LOOPFILTER; 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->use_bilinear_mc_filter = 0; 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->full_pixel = 0; 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->multi_token_partition = ONE_PARTITION; 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->clamp_type = RECON_CLAMP_REQUIRED; 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1781b362b15af34006e6a11974088a46d42b903418eJohann /* Initialize reference frame sign bias structure to defaults */ 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_memset(oci->ref_frame_sign_bias, 0, sizeof(oci->ref_frame_sign_bias)); 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 181538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* Default disable buffer to buffer copying */ 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->copy_buffer_to_gf = 0; 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber oci->copy_buffer_to_arf = 0; 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_remove_common(VP8_COMMON *oci) 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_de_alloc_frame_buffers(oci); 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 190