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