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