--- trunk/xvidcore/vfw/src/codec.c 2010/12/02 06:46:07 1910 +++ trunk/xvidcore/vfw/src/codec.c 2010/12/22 16:52:12 1917 @@ -19,7 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: codec.c,v 1.27 2010-12-02 06:46:07 Isibaar Exp $ + * $Id: codec.c,v 1.29 2010-12-22 16:52:12 Isibaar Exp $ * *************************************************************************/ @@ -401,7 +401,7 @@ xvid_gbl_info_t info; int i; HANDLE hFile; - const quality_t* quality_preset = (codec->config.quality==quality_table_num) ? + const quality_t* quality_preset = (codec->config.quality==quality_table_num) ? &codec->config.quality_user : &quality_table[codec->config.quality]; CONFIG tmpCfg; /* if we want to alter config to suit our needs, it shouldn't be visible to user later */ @@ -427,6 +427,30 @@ memset(&create, 0, sizeof(create)); create.version = XVID_VERSION; + /* Encoder threads */ + if (codec->config.cpu & XVID_CPU_FORCE) + create.num_threads = codec->config.num_threads; + else + create.num_threads = info.num_threads; /* Autodetect */ + + /* Encoder slices */ + if ((profiles[codec->config.profile].flags & PROFILE_RESYNCMARKER) && codec->config.num_slices != 1) { + + if (codec->config.num_slices == 0) { /* auto */ + int rows = (lpbiInput->bmiHeader.biHeight + 15) / 16; + int slices = (rows > 36) ? 2 : 1; + + create.num_slices = (rows > 45) ? 4 : slices; + + if (create.num_slices > create.num_threads) + create.num_slices = create.num_threads; + } + else { + create.num_slices = codec->config.num_slices; + } + + } + /* plugins */ create.plugins = plugins; switch (codec->config.mode) @@ -578,15 +602,6 @@ create.frame_drop_ratio = quality_preset->frame_drop_ratio; - /* Encoder threads */ - if (codec->config.num_threads == 0) - create.num_threads = info.num_threads; /* Autodetect */ - else if (codec->config.num_threads == 1) - create.num_threads = -1; /* Single-threaded, disable SMP */ - else - create.num_threads = codec->config.num_threads; - - switch(codec->xvid_encore_func(0, XVID_ENC_CREATE, &create, NULL)) { case XVID_ERR_FAIL : @@ -798,6 +813,9 @@ break; } + if (quality_preset->vhq_metric == 1) + frame.vop_flags |= XVID_VOP_RD_PSNRHVSM; + frame.input.plane[0] = icc->lpInput; frame.input.stride[0] = CALC_BI_STRIDE(icc->lpbiInput->biWidth, icc->lpbiInput->biBitCount); @@ -974,6 +992,7 @@ { BITMAPINFOHEADER * inhdr = &lpbiInput->bmiHeader; xvid_gbl_init_t init; + xvid_gbl_info_t info; xvid_dec_create_t create; HKEY hKey; @@ -985,12 +1004,22 @@ init.debug = codec->config.debug; codec->xvid_global_func(0, XVID_GBL_INIT, &init, NULL); + memset(&info, 0, sizeof(info)); + info.version = XVID_VERSION; + codec->xvid_global_func(0, XVID_GBL_INFO, &info, NULL); + memset(&create, 0, sizeof(create)); create.version = XVID_VERSION; create.width = lpbiInput->bmiHeader.biWidth; create.height = lpbiInput->bmiHeader.biHeight; create.fourcc = inhdr->biCompression; + /* Decoder threads */ + if (codec->config.cpu & XVID_CPU_FORCE) + create.num_threads = codec->config.num_threads; + else + create.num_threads = info.num_threads; /* Autodetect */ + switch(codec->xvid_decore_func(0, XVID_DEC_CREATE, &create, NULL)) { case XVID_ERR_FAIL :