--- trunk/xvidcore/vfw/src/codec.c 2010/12/21 16:56:42 1914 +++ branches/release-1_3-branch/xvidcore/vfw/src/codec.c 2010/12/30 22:08:02 1933 @@ -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.28 2010-12-21 16:56:42 Isibaar Exp $ + * $Id: codec.c,v 1.30.2.1 2010-12-30 22:07:43 Isibaar Exp $ * *************************************************************************/ @@ -433,6 +433,32 @@ 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 mb_width = (lpbiInput->bmiHeader.biWidth + 15) / 16; + int mb_height = (lpbiInput->bmiHeader.biHeight + 15) / 16; + + int slices = (int)((mb_width*mb_height) / 811); /* use multiple slices only above SD resolutions for now */ + + if (slices > 1) { + if (create.num_threads <= 1) + slices &= ~1; /* make even */ + else if (create.num_threads <= slices) + slices = (slices / create.num_threads) * create.num_threads; /* multiple of threads */ + else if (create.num_threads % slices) + slices = (!(create.num_threads%2)) ? (create.num_threads/2) : (create.num_threads/3); + } + + create.num_slices = slices; + } + else { + create.num_slices = codec->config.num_slices; /* force manual value - by registry edit */ + } + + } + /* plugins */ create.plugins = plugins; switch (codec->config.mode)