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
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyx_int.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "threading.h"
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "common.h"
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "extend.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vp8cx_encode_inter_macroblock(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t, int recon_yoffset, int recon_uvoffset);
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t);
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x);
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_build_block_offsets(MACROBLOCK *x);
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_setup_block_ptrs(MACROBLOCK *x);
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberTHREAD_FUNCTION thread_encoding_proc(void *p_data)
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MULTITHREAD
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ithread = ((ENCODETHREAD_DATA *)p_data)->ithread;
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi   = (VP8_COMP *)(((ENCODETHREAD_DATA *)p_data)->ptr1);
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MB_ROW_COMP *mbri = (MB_ROW_COMP *)(((ENCODETHREAD_DATA *)p_data)->ptr2);
31f71323e297a928af368937089d3ed71239786f86Andreas Huber    ENTROPY_CONTEXT_PLANES mb_row_left_context;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //printf("Started thread %d\n", ithread);
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (1)
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->b_multi_threaded == 0)
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            break;
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //if(WaitForSingleObject(cpi->h_event_mbrencoding[ithread], INFINITE) == WAIT_OBJECT_0)
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (sem_wait(&cpi->h_event_mbrencoding[ithread]) == 0)
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->b_multi_threaded == FALSE) // we're shutting down
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                VP8_COMMON *cm      = &cpi->common;
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int mb_row           = mbri->mb_row;
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                MACROBLOCK  *x      = &mbri->mb;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                MACROBLOCKD *xd     = &x->e_mbd;
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                TOKENEXTRA **tp     = &mbri->tp;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int *segment_counts  = mbri->segment_counts;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int *totalrate      = &mbri->totalrate;
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    int i;
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    int recon_yoffset, recon_uvoffset;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    int mb_col;
59f71323e297a928af368937089d3ed71239786f86Andreas Huber                    int ref_fb_idx = cm->lst_fb_idx;
60f71323e297a928af368937089d3ed71239786f86Andreas Huber                    int dst_fb_idx = cm->new_fb_idx;
61f71323e297a928af368937089d3ed71239786f86Andreas Huber                    int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
62f71323e297a928af368937089d3ed71239786f86Andreas Huber                    int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    volatile int *last_row_current_mb_col;
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (ithread > 0)
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        last_row_current_mb_col = &cpi->mb_row_ei[ithread-1].current_mb_col;
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        last_row_current_mb_col = &cpi->current_mb_col_main;
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // reset above block coeffs
71f71323e297a928af368937089d3ed71239786f86Andreas Huber                    xd->above_context = cm->above_context;
72f71323e297a928af368937089d3ed71239786f86Andreas Huber                    xd->left_context = &mb_row_left_context;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_zero(mb_row_left_context);
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    xd->up_available = (mb_row != 0);
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    recon_yoffset = (mb_row * recon_y_stride * 16);
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    recon_uvoffset = (mb_row * recon_uv_stride * 8);
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->tplist[mb_row].start = *tp;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    //printf("Thread mb_row = %d\n", mb_row);
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // for each macroblock col in image
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int seg_map_index = (mb_row * cm->mb_cols);
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        while (mb_col > (*last_row_current_mb_col - 1) && *last_row_current_mb_col != cm->mb_cols - 1)
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            x86_pause_hint();
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            thread_sleep(0);
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Distance of Mb to the various image edges.
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // These specified to 8th pel as they are always compared to values that are in 1/8th pel units
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->mb_to_left_edge = -((mb_col * 16) << 3);
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->mb_to_top_edge = -((mb_row * 16) << 3);
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Set up limit values for motion vectors used to prevent them extending outside the UMV borders
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109f71323e297a928af368937089d3ed71239786f86Andreas Huber                        xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
110f71323e297a928af368937089d3ed71239786f86Andreas Huber                        xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
111f71323e297a928af368937089d3ed71239786f86Andreas Huber                        xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->left_available = (mb_col != 0);
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Is segmentation enabled
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // MB level adjutment to quantizer
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        if (xd->segmentation_enabled)
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            // Code to set segment id in xd->mbmi.segment_id for current MB (with range checking)
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            if (cpi->segmentation_map[seg_map_index+mb_col] <= 3)
120f71323e297a928af368937089d3ed71239786f86Andreas Huber                                xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[seg_map_index+mb_col];
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            else
122f71323e297a928af368937089d3ed71239786f86Andreas Huber                                xd->mode_info_context->mbmi.segment_id = 0;
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            vp8cx_mb_init_quantizer(cpi, x);
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
127f71323e297a928af368937089d3ed71239786f86Andreas Huber                            xd->mode_info_context->mbmi.segment_id = 0;         // Set to Segment 0 by default
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        if (cm->frame_type == KEY_FRAME)
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            *totalrate += vp8cx_encode_intra_macro_block(cpi, x, tp);
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            y_modes[xd->mbmi.mode] ++;
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            *totalrate += vp8cx_encode_inter_macroblock(cpi, x, tp, recon_yoffset, recon_uvoffset);
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            inter_y_modes[xd->mbmi.mode] ++;
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            if (xd->mbmi.mode == SPLITMV)
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            {
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                int b;
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                for (b = 0; b < xd->mbmi.partition_count; b++)
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                {
150f71323e297a928af368937089d3ed71239786f86Andreas Huber                                    inter_b_modes[x->partition->bmi[b].mode] ++;
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                }
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            }
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            // Count of last ref frame 0,0 useage
157f71323e297a928af368937089d3ed71239786f86Andreas Huber                            if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                cpi->inter_zz_count ++;
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->tplist[mb_row].stop = *tp;
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
164f71323e297a928af368937089d3ed71239786f86Andreas Huber                        x->gf_active_ptr++;      // Increment pointer into gf useage flags structure for next mb
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        for (i = 0; i < 16; i++)
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi));
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // adjust to the next column of macroblocks
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->src.y_buffer += 16;
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->src.u_buffer += 8;
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        x->src.v_buffer += 8;
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        recon_yoffset += 16;
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        recon_uvoffset += 8;
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Keep track of segment useage
178f71323e297a928af368937089d3ed71239786f86Andreas Huber                        segment_counts[xd->mode_info_context->mbmi.segment_id] ++;
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // skip to next mb
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->mode_info_context++;
182f71323e297a928af368937089d3ed71239786f86Andreas Huber                        x->partition_info++;
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
184f71323e297a928af368937089d3ed71239786f86Andreas Huber                        xd->above_context++;
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->mb_row_ei[ithread].current_mb_col = mb_col;
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    //extend the recon for intra prediction
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    vp8_extend_mb_row(
192f71323e297a928af368937089d3ed71239786f86Andreas Huber                        &cm->yv12_fb[dst_fb_idx],
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->dst.y_buffer + 16,
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->dst.u_buffer + 8,
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        xd->dst.v_buffer + 8);
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // this is to account for the border
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    xd->mode_info_context++;
199f71323e297a928af368937089d3ed71239786f86Andreas Huber                    x->partition_info++;
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    x->src.u_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    x->src.v_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
206f71323e297a928af368937089d3ed71239786f86Andreas Huber                    x->partition_info += xd->mode_info_stride * cpi->encoding_thread_count;
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (ithread == (cpi->encoding_thread_count - 1) || mb_row == cm->mb_rows - 1)
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        //SetEvent(cpi->h_event_main);
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        sem_post(&cpi->h_event_main);
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) p_data;
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //printf("exit thread %d\n", ithread);
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 0;
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void setup_mbby_copy(MACROBLOCK *mbdst, MACROBLOCK *mbsrc)
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MACROBLOCK *x = mbsrc;
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MACROBLOCK *z = mbdst;
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->ss               = x->ss;
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->ss_count          = x->ss_count;
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->searches_per_step  = x->searches_per_step;
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->errorperbit      = x->errorperbit;
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->sadperbit16      = x->sadperbit16;
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->sadperbit4       = x->sadperbit4;
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->errthresh        = x->errthresh;
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->rddiv            = x->rddiv;
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->rdmult           = x->rdmult;
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mv_col_min    = x->mv_col_min;
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mv_col_max    = x->mv_col_max;
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mv_row_min    = x->mv_row_min;
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mv_row_max    = x->mv_row_max;
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->vector_range = x->vector_range ;
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    */
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->vp8_short_fdct4x4     = x->vp8_short_fdct4x4;
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->vp8_short_fdct8x4     = x->vp8_short_fdct8x4;
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->short_walsh4x4    = x->short_walsh4x4;
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->quantize_b        = x->quantize_b;
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mvc              = x->mvc;
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->src.y_buffer      = x->src.y_buffer;
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->src.u_buffer      = x->src.u_buffer;
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->src.v_buffer      = x->src.v_buffer;
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    */
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->mvcosts,          x->mvcosts,         sizeof(x->mvcosts));
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mvcost[0] = &z->mvcosts[0][mv_max+1];
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mvcost[1] = &z->mvcosts[1][mv_max+1];
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mvsadcost[0] = &z->mvsadcosts[0][mv_max+1];
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    z->mvsadcost[1] = &z->mvsadcosts[1][mv_max+1];
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->token_costs,       x->token_costs,      sizeof(x->token_costs));
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->inter_bmode_costs,  x->inter_bmode_costs, sizeof(x->inter_bmode_costs));
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //memcpy(z->mvcosts,            x->mvcosts,         sizeof(x->mvcosts));
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //memcpy(z->mvcost,         x->mvcost,          sizeof(x->mvcost));
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->mbmode_cost,       x->mbmode_cost,      sizeof(x->mbmode_cost));
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->intra_uv_mode_cost,  x->intra_uv_mode_cost, sizeof(x->intra_uv_mode_cost));
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(z->bmode_costs,       x->bmode_costs,      sizeof(x->bmode_costs));
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 25; i++)
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].quant           = x->block[i].quant;
285f71323e297a928af368937089d3ed71239786f86Andreas Huber        z->block[i].quant_shift     = x->block[i].quant_shift;
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].zbin            = x->block[i].zbin;
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].zrun_zbin_boost   = x->block[i].zrun_zbin_boost;
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].round           = x->block[i].round;
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].src             = x->block[i].src;
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        */
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].src_stride       = x->block[i].src_stride;
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        z->block[i].force_empty      = x->block[i].force_empty;
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MACROBLOCKD *xd = &x->e_mbd;
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MACROBLOCKD *zd = &z->e_mbd;
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mode_info_context = xd->mode_info_context;
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mode_info        = xd->mode_info;
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mode_info_stride  = xd->mode_info_stride;
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->frame_type       = xd->frame_type;
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->up_available     = xd->up_available   ;
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->left_available   = xd->left_available;
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->left_context     = xd->left_context;
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->last_frame_dc     = xd->last_frame_dc;
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->last_frame_dccons = xd->last_frame_dccons;
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->gold_frame_dc     = xd->gold_frame_dc;
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->gold_frame_dccons = xd->gold_frame_dccons;
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mb_to_left_edge    = xd->mb_to_left_edge;
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mb_to_right_edge   = xd->mb_to_right_edge;
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mb_to_top_edge     = xd->mb_to_top_edge   ;
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mb_to_bottom_edge  = xd->mb_to_bottom_edge;
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->gf_active_ptr     = xd->gf_active_ptr;
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->frames_since_golden       = xd->frames_since_golden;
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->frames_till_alt_ref_frame   = xd->frames_till_alt_ref_frame;
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        */
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->subpixel_predict         = xd->subpixel_predict;
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->subpixel_predict8x4      = xd->subpixel_predict8x4;
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->subpixel_predict8x8      = xd->subpixel_predict8x8;
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->subpixel_predict16x16    = xd->subpixel_predict16x16;
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->segmentation_enabled     = xd->segmentation_enabled;
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        zd->mb_segement_abs_delta      = xd->mb_segement_abs_delta;
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memcpy(zd->segment_feature_data, xd->segment_feature_data, sizeof(xd->segment_feature_data));
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < 25; i++)
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            zd->block[i].dequant = xd->block[i].dequant;
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8cx_init_mbrthread_data(VP8_COMP *cpi,
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               MACROBLOCK *x,
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               MB_ROW_COMP *mbr_ei,
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int mb_row,
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               int count
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                              )
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMMON *const cm = & cpi->common;
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MACROBLOCKD *const xd = & x->e_mbd;
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) mb_row;
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < count; i++)
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MACROBLOCK *mb = & mbr_ei[i].mb;
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        MACROBLOCKD *mbd = &mb->e_mbd;
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->subpixel_predict        = xd->subpixel_predict;
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->subpixel_predict8x4     = xd->subpixel_predict8x4;
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->subpixel_predict8x8     = xd->subpixel_predict8x8;
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->subpixel_predict16x16   = xd->subpixel_predict16x16;
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->rtcd                   = xd->rtcd;
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
363f71323e297a928af368937089d3ed71239786f86Andreas Huber        mb->gf_active_ptr            = x->gf_active_ptr;
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->vector_range             = 32;
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memset(mbr_ei[i].segment_counts, 0, sizeof(mbr_ei[i].segment_counts));
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbr_ei[i].totalrate = 0;
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
370f71323e297a928af368937089d3ed71239786f86Andreas Huber        mb->partition_info = x->pi + x->e_mbd.mode_info_stride * (i + 1);
371f71323e297a928af368937089d3ed71239786f86Andreas Huber
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->mode_info_context = cm->mi   + x->e_mbd.mode_info_stride * (i + 1);
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->mode_info_stride  = cm->mode_info_stride;
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->frame_type = cm->frame_type;
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->frames_since_golden = cm->frames_since_golden;
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mbd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame;
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->src = * cpi->Source;
381f71323e297a928af368937089d3ed71239786f86Andreas Huber        mbd->pre = cm->yv12_fb[cm->lst_fb_idx];
382f71323e297a928af368937089d3ed71239786f86Andreas Huber        mbd->dst = cm->yv12_fb[cm->new_fb_idx];
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->src.y_buffer += 16 * x->src.y_stride * (i + 1);
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->src.u_buffer +=  8 * x->src.uv_stride * (i + 1);
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->src.v_buffer +=  8 * x->src.uv_stride * (i + 1);
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_build_block_offsets(mb);
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_setup_block_dptrs(mbd);
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_setup_block_ptrs(mb);
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->rddiv = cpi->RDDIV;
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->rdmult = cpi->RDMULT;
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
398f71323e297a928af368937089d3ed71239786f86Andreas Huber        mbd->left_context = &cm->left_context;
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        mb->mvc = cm->fc.mvc;
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        setup_mbby_copy(&mbr_ei[i].mb, x);
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8cx_create_encoder_threads(VP8_COMP *cpi)
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->b_multi_threaded = 0;
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->processor_core_count = 32; //vp8_get_proc_core_count();
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MULTITHREAD
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->processor_core_count > 1 && cpi->oxcf.multi_threaded > 1)
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int ithread;
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->oxcf.multi_threaded > cpi->processor_core_count)
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->encoding_thread_count = cpi->processor_core_count - 1;
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->encoding_thread_count = cpi->oxcf.multi_threaded - 1;
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        CHECK_MEM_ERROR(cpi->h_encoding_thread, vpx_malloc(sizeof(pthread_t) * cpi->encoding_thread_count));
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        CHECK_MEM_ERROR(cpi->h_event_mbrencoding, vpx_malloc(sizeof(sem_t) * cpi->encoding_thread_count));
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        CHECK_MEM_ERROR(cpi->mb_row_ei, vpx_memalign(32, sizeof(MB_ROW_COMP) * cpi->encoding_thread_count));
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_memset(cpi->mb_row_ei, 0, sizeof(MB_ROW_COMP) * cpi->encoding_thread_count);
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        CHECK_MEM_ERROR(cpi->en_thread_data, vpx_malloc(sizeof(ENCODETHREAD_DATA) * cpi->encoding_thread_count));
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //cpi->h_event_main = CreateEvent(NULL, FALSE, FALSE, NULL);
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        sem_init(&cpi->h_event_main, 0, 0);
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->b_multi_threaded = 1;
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //printf("[VP8:] multi_threaded encoding is enabled with %d threads\n\n", (cpi->encoding_thread_count +1));
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (ithread = 0; ithread < cpi->encoding_thread_count; ithread++)
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //cpi->h_event_mbrencoding[ithread] = CreateEvent(NULL, FALSE, FALSE, NULL);
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sem_init(&cpi->h_event_mbrencoding[ithread], 0, 0);
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->en_thread_data[ithread].ithread = ithread;
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->en_thread_data[ithread].ptr1 = (void *)cpi;
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->en_thread_data[ithread].ptr2 = (void *)&cpi->mb_row_ei[ithread];
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //printf(" call begin thread %d \n", ithread);
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //cpi->h_encoding_thread[ithread] =   (HANDLE)_beginthreadex(
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  NULL,           // security
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  0,              // stksize
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  thread_encoding_proc,
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  (&cpi->en_thread_data[ithread]),          // Thread data
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  0,
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //  NULL);
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pthread_create(&cpi->h_encoding_thread[ithread], 0, thread_encoding_proc, (&cpi->en_thread_data[ithread]));
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8cx_remove_encoder_threads(VP8_COMP *cpi)
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_MULTITHREAD
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->b_multi_threaded)
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //shutdown other threads
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->b_multi_threaded = 0;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int i;
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < cpi->encoding_thread_count; i++)
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                //SetEvent(cpi->h_event_mbrencoding[i]);
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                sem_post(&cpi->h_event_mbrencoding[i]);
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                pthread_join(cpi->h_encoding_thread[i], 0);
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for (i = 0; i < cpi->encoding_thread_count; i++)
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                sem_destroy(&cpi->h_event_mbrencoding[i]);
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //free thread related resources
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(cpi->h_event_mbrencoding);
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(cpi->h_encoding_thread);
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(cpi->mb_row_ei);
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vpx_free(cpi->en_thread_data);
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_free(cpi->tplist);
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
497