[svn] / branches / dev-api-3 / vfw / src / 2pass.c Repository:
ViewVC logotype

Diff of /branches/dev-api-3/vfw/src/2pass.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 552, Sat Sep 28 02:01:56 2002 UTC revision 660, Tue Nov 19 13:23:17 2002 UTC
# Line 41  Line 41 
41          DWORD version = -20;          DWORD version = -20;
42          DWORD read, wrote;          DWORD read, wrote;
43    
44          int     frames = 0, credits_frames = 0, i_frames = 0, recminpsize = 0, recminisize = 0;          int     frames = 0, bframes = 0, pframes = 0, credits_frames = 0, i_frames = 0, recminbsize = 0, recminpsize = 0, recminisize = 0;
45          __int64 total_ext = 0, total = 0, i_total = 0, i_boost_total = 0, start = 0, end = 0, start_curved = 0, end_curved = 0;          __int64 bframe_total_ext = 0, pframe_total_ext = 0, pframe_total = 0, bframe_total = 0, i_total = 0, i_total_ext = 0, i_boost_total = 0, start = 0, end = 0, start_curved = 0, end_curved = 0;
46          __int64 desired = (__int64)codec->config.desired_size * 1024;          __int64 desired = (__int64)codec->config.desired_size * 1024;
47    
48          double total1 = 0.0;          double total1 = 0.0;
# Line 101  Line 101 
101                          return ICERR_ERROR;                          return ICERR_ERROR;
102                  }                  }
103    
104                    twopass->nns1_array = (NNSTATS*)malloc(sizeof(NNSTATS) * 10240);
105                    twopass->nns2_array = (NNSTATS*)malloc(sizeof(NNSTATS) * 10240);
106                    twopass->nns_array_size = 10240;
107                    twopass->nns_array_length = 0;
108                    twopass->nns_array_pos = 0;
109    
110                    // read the stats file(s) into array(s) and reorder them so they
111                    // correctly represent the frames that the encoder will receive.
112                  if (codec->config.mode == DLG_MODE_2PASS_2_EXT)                  if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
113                  {                  {
114                          if (twopass->stats2 != INVALID_HANDLE_VALUE)                          if (twopass->stats2 != INVALID_HANDLE_VALUE)
# Line 158  Line 166 
166                                          }                                          }
167                                  }                                  }
168    
169                                    // increase the allocated memory if necessary
170                                    if (frames >= twopass->nns_array_size)
171                                    {
172                                            twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array,
173                                                    sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));
174                                            twopass->nns2_array = (NNSTATS*)realloc(twopass->nns2_array,
175                                                    sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));
176                                            twopass->nns_array_size = twopass->nns_array_size * 5 / 4 + 1;
177                                    }
178    
179                                    // copy this frame's stats into the arrays
180                                    memcpy (&twopass->nns1_array[frames], &twopass->nns1, sizeof(NNSTATS));
181                                    memcpy (&twopass->nns2_array[frames], &twopass->nns2, sizeof(NNSTATS));
182                                    frames++;
183                            }
184    
185                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
186                            SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);
187                    }
188                    else    // DLG_MODE_2PASS_2_INT
189                    {
190                            while (1)
191                            {
192                                    if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))
193                                    {
194                                            DWORD err = GetLastError();
195    
196                                            if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)
197                                            {
198                                                    break;
199                                            }
200                                            else
201                                            {
202                                                    CloseHandle(twopass->stats1);
203                                                    twopass->stats1 = INVALID_HANDLE_VALUE;
204                                                    DEBUGERR("2pass init error - incomplete stats2 record?");
205                                                    return ICERR_ERROR;
206                                            }
207                                    }
208    
209                                    // increase the allocated memory if necessary
210                                    if (frames >= twopass->nns_array_size)
211                                    {
212                                            twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array,
213                                                    sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));
214                                            twopass->nns_array_size = twopass->nns_array_size * 5 / 4 + 1;
215                                    }
216    
217                                    // copy this frame's stats into the array
218                                    memcpy (&twopass->nns1_array[frames], &twopass->nns1, sizeof(NNSTATS));
219                                    frames++;
220                            }
221    
222                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
223                    }
224                    twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array, sizeof(NNSTATS) * frames);
225                    twopass->nns2_array = (NNSTATS*)realloc(twopass->nns2_array, sizeof(NNSTATS) * frames);
226                    twopass->nns_array_size = frames;
227                    twopass->nns_array_length = frames;
228                    frames = 0;
229    
230    /* // this isn't necessary with the current core.
231                    // reorder the array(s) so they are in the order that they were received
232                    // IPBBPBB to
233                    // IBBPBBP
234                    for (i=0; i<twopass->nns_array_length; i++)
235                    {
236                            NNSTATS temp_nns, temp_nns2;
237                            int k, num_bframes;
238                            if (twopass->nns1_array[i].dd_v & NNSTATS_BFRAME)
239                            {
240                                    num_bframes = 1;
241                                    for (k=i+1; k<twopass->nns_array_length; k++)
242                                    {
243                                            if (twopass->nns1_array[k].dd_v & NNSTATS_BFRAME)
244                                                    num_bframes++;
245                                            else
246                                                    k=twopass->nns_array_length;
247                                    }
248    
249                                    i--;
250                                    memcpy (&temp_nns, &twopass->nns1_array[i], sizeof(NNSTATS));
251                                    if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
252                                            memcpy (&temp_nns2, &twopass->nns2_array[i], sizeof(NNSTATS));
253    
254                                    for (k=0; k<num_bframes; k++)
255                                    {
256                                            memcpy(&twopass->nns1_array[i], &twopass->nns1_array[i+1], sizeof(NNSTATS));
257                                            if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
258                                                    memcpy(&twopass->nns2_array[i], &twopass->nns2_array[i+1], sizeof(NNSTATS));
259                                            i++;
260                                    }
261    
262                                    memcpy(&twopass->nns1_array[i], &temp_nns, sizeof(NNSTATS));
263                                    if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
264                                            memcpy(&twopass->nns2_array[i], &temp_nns2, sizeof(NNSTATS));
265                            }
266                    }
267    */
268                    // continue with the initialization..
269                    if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
270                    {
271                            while (1)
272                            {
273                                    if (twopass->nns_array_pos >= twopass->nns_array_length)
274                                    {
275                                            twopass->nns_array_pos = 0;
276                                            break;
277                                    }
278    
279                                    memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
280                                    memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));
281                                    twopass->nns_array_pos++;
282    
283                                    // skip unnecessary frames.
284                                    if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||
285                                            twopass->nns1.dd_v & NNSTATS_PADFRAME ||
286                                            twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
287                                            continue;
288    
289                                  if (!codec_is_in_credits(&codec->config, frames))                                  if (!codec_is_in_credits(&codec->config, frames))
290                                  {                                  {
291                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)
292                                          {                                          {
                                                 i_boost_total += twopass->nns2.bytes * codec->config.keyframe_boost / 100;  
293                                                  i_total += twopass->nns2.bytes;                                                  i_total += twopass->nns2.bytes;
294                                                    i_boost_total += twopass->nns2.bytes * codec->config.keyframe_boost / 100;
295                                                  twopass->keyframe_locations[i_frames] = frames;                                                  twopass->keyframe_locations[i_frames] = frames;
296                                                  ++i_frames;                                                  ++i_frames;
297                                          }                                          }
298                                            else
299                                          total += twopass->nns1.bytes;                                          {
300                                          total_ext += twopass->nns2.bytes;                                                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)
301                                                    {
302                                                            bframe_total += twopass->nns1.bytes;
303                                                            bframe_total_ext += twopass->nns2.bytes;
304                                                            bframes++;
305                                                    }
306                                                    else
307                                                    {
308                                                            pframe_total += twopass->nns1.bytes;
309                                                            pframe_total_ext += twopass->nns2.bytes;
310                                                            pframes++;
311                                                    }
312                                            }
313                                  }                                  }
314                                  else                                  else
315                                          ++credits_frames;                                          ++credits_frames;
316    
317                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)
318                                  {                                  {
319                                            // this test needs to be corrected..
320                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))
321                                                  recminisize = twopass->nns1.bytes;                                                  recminisize = twopass->nns1.bytes;
322                                  }                                  }
323                                    else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
324                                    {
325                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
326                                                    recminbsize = twopass->nns1.bytes;
327                                    }
328                                  else                                  else
329                                  {                                  {
330                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))
# Line 189  Line 335 
335                          }                          }
336                          twopass->keyframe_locations[i_frames] = frames;                          twopass->keyframe_locations[i_frames] = frames;
337    
338                          twopass->movie_curve = ((double)(total_ext + i_boost_total) / total_ext);                          twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) /
339                          twopass->average_frame = ((double)(total_ext - i_total) / (frames - credits_frames - i_frames) / twopass->movie_curve);                                  (bframe_total_ext + pframe_total_ext));
340                            twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve;
341                            twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve;
342    
343    
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
                         SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);  
344    
345                          // perform prepass to compensate for over/undersizing                          // perform prepass to compensate for over/undersizing
346                          frames = 0;                          frames = 0;
347    
348                          if (codec->config.use_alt_curve)                          if (codec->config.use_alt_curve)
349                          {                          {
350                                  twopass->alt_curve_low = twopass->average_frame - twopass->average_frame * (double)codec->config.alt_curve_low_dist / 100.0;                                  twopass->alt_curve_low = twopass->average_pframe - twopass->average_pframe * (double)codec->config.alt_curve_low_dist / 100.0;
351                                  twopass->alt_curve_low_diff = twopass->average_frame - twopass->alt_curve_low;                                  twopass->alt_curve_low_diff = twopass->average_pframe - twopass->alt_curve_low;
352                                  twopass->alt_curve_high = twopass->average_frame + twopass->average_frame * (double)codec->config.alt_curve_high_dist / 100.0;                                  twopass->alt_curve_high = twopass->average_pframe + twopass->average_pframe * (double)codec->config.alt_curve_high_dist / 100.0;
353                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_frame;                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_pframe;
354                                  if (codec->config.alt_curve_use_auto)                                  if (codec->config.alt_curve_use_auto)
355                                  {                                  {
356                                          if (total > total_ext)                                          if (bframe_total + pframe_total > bframe_total_ext + pframe_total_ext)
357                                          {                                          {
358                                                  codec->config.alt_curve_min_rel_qual = (int)(100.0 - (100.0 - 100.0 / ((double)total / (double)total_ext)) * (double)codec->config.alt_curve_auto_str / 100.0);                                                  codec->config.alt_curve_min_rel_qual = (int)(100.0 - (100.0 - 100.0 /
359                                                            ((double)(bframe_total + pframe_total) / (double)(bframe_total_ext + pframe_total_ext))) *
360                                                            (double)codec->config.alt_curve_auto_str / 100.0);
361    
362                                                  if (codec->config.alt_curve_min_rel_qual < 20)                                                  if (codec->config.alt_curve_min_rel_qual < 20)
363                                                          codec->config.alt_curve_min_rel_qual = 20;                                                          codec->config.alt_curve_min_rel_qual = 20;
364                                          }                                          }
# Line 223  Line 373 
373                                          {                                          {
374                                          case 2: // Sine Curve (high aggressiveness)                                          case 2: // Sine Curve (high aggressiveness)
375                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
376                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));
377                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
378                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff));                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff));
379                                                  break;                                                  break;
380                                          case 1: // Linear (medium aggressiveness)                                          case 1: // Linear (medium aggressiveness)
381                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
382                                                          twopass->average_frame / twopass->alt_curve_low_diff);                                                          twopass->average_pframe / twopass->alt_curve_low_diff);
383                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
384                                                          twopass->average_frame / twopass->alt_curve_low_diff;                                                          twopass->average_pframe / twopass->alt_curve_low_diff;
385                                                  break;                                                  break;
386                                          case 0: // Cosine Curve (low aggressiveness)                                          case 0: // Cosine Curve (low aggressiveness)
387                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
388                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff))));
389                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
390                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));
391                                          }                                          }
392                                  }                                  }
393                          }                          }
394    
395                          while (1)                          while (1)
396                          {                          {
397                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS) ||                                  if (twopass->nns_array_pos >= twopass->nns_array_length)
                                         !ReadFile(twopass->stats2, &twopass->nns2, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))  
                                 {  
                                         DWORD err = GetLastError();  
   
                                         if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)  
398                                          {                                          {
399                                            twopass->nns_array_pos = 0;
400                                                  break;                                                  break;
401                                          }                                          }
402                                          else  
403                                          {                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
404                                                  CloseHandle(twopass->stats1);                                  memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));
405                                                  CloseHandle(twopass->stats2);                                  twopass->nns_array_pos++;
                                                 twopass->stats1 = INVALID_HANDLE_VALUE;  
                                                 twopass->stats2 = INVALID_HANDLE_VALUE;  
                                                 DEBUGERR("2pass init error - incomplete stats1/stats2 record?");  
                                                 return ICERR_ERROR;  
                                         }  
                                 }  
406    
407                                  if (frames == 0)                                  if (frames == 0)
408                                  {                                  {
409                                            twopass->minbsize = (twopass->nns1.kblk + 88) / 8;
410                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
411                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
412                                            if (recminbsize > twopass->minbsize)
413                                                    twopass->minbsize = recminbsize;
414                                          if (recminpsize > twopass->minpsize)                                          if (recminpsize > twopass->minpsize)
415                                                  twopass->minpsize = recminpsize;                                                  twopass->minpsize = recminpsize;
416                                          if (recminisize > twopass->minisize)                                          if (recminisize > twopass->minisize)
417                                                  twopass->minisize = recminisize;                                                  twopass->minisize = recminisize;
418                                  }                                  }
419    
420                                    // skip unnecessary frames.
421                                    if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||
422                                            twopass->nns1.dd_v & NNSTATS_PADFRAME ||
423                                            twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
424                                            continue;
425    
426                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
427                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
428                                  {                                  {
429                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;
430                                          total1 += dbytes;                                          total1 += dbytes;
431    
432                                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
433                                                    dbytes *= twopass->average_pframe / twopass->average_bframe;
434    
435                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
436                                          {                                          {
437                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_pframe)
438                                                  {                                                  {
439                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
440                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
# Line 292  Line 444 
444                                                                  {                                                                  {
445                                                                  case 2:                                                                  case 2:
446                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
447                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));
448                                                                          break;                                                                          break;
449                                                                  case 1:                                                                  case 1:
450                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
451                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);
452                                                                          break;                                                                          break;
453                                                                  case 0:                                                                  case 0:
454                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
455                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));
456                                                                  }                                                                  }
457                                                          }                                                          }
458                                                  }                                                  }
# Line 314  Line 466 
466                                                                  {                                                                  {
467                                                                  case 2:                                                                  case 2:
468                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
469                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));
470                                                                          break;                                                                          break;
471                                                                  case 1:                                                                  case 1:
472                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
473                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);
474                                                                          break;                                                                          break;
475                                                                  case 0:                                                                  case 0:
476                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
477                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));
478                                                                  }                                                                  }
479                                                          }                                                          }
480                                                  }                                                  }
481                                          }                                          }
482                                          else                                          else
483                                          {                                          {
484                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_pframe)
485                                                  {                                                  {
486                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *
487                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
488                                                  }                                                  }
489                                                  else                                                  else
490                                                  {                                                  {
491                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *
492                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
493                                                  }                                                  }
494                                          }                                          }
495    
496                                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
497                                            {
498                                                    dbytes2 *= twopass->average_bframe / twopass->average_pframe;
499                                                    if (dbytes2 < twopass->minbsize)
500                                                            dbytes2 = twopass->minbsize;
501                                            }
502                                            else
503                                            {
504                                          if (dbytes2 < twopass->minpsize)                                          if (dbytes2 < twopass->minpsize)
505                                                  dbytes2 = twopass->minpsize;                                                  dbytes2 = twopass->minpsize;
506                                            }
507    
508                                          total2 += dbytes2;                                          total2 += dbytes2;
509                                  }                                  }
# Line 357  Line 518 
518                                  int asymmetric_average_frame;                                  int asymmetric_average_frame;
519                                  char s[100];                                  char s[100];
520    
521                                  asymmetric_average_frame = (int)(twopass->average_frame * twopass->curve_comp_scale);                                  asymmetric_average_frame = (int)(twopass->average_pframe * twopass->curve_comp_scale);
522                                  wsprintf(s, "middle frame size for asymmetric curve compression: %i", asymmetric_average_frame);                                  wsprintf(s, "middle frame size for asymmetric curve compression: %i", asymmetric_average_frame);
523                                  DEBUG2P(s);                                  DEBUG2P(s);
524                          }                          }
   
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
                         SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);  
525                  }                  }
526                  else    // DLG_MODE_2PASS_2_INT                  else    // DLG_MODE_2PASS_2_INT
527                  {                  {
528                          while (1)                          while (1)
529                          {                          {
530                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))                                  if (twopass->nns_array_pos >= twopass->nns_array_length)
                                 {  
                                         DWORD err = GetLastError();  
   
                                         if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)  
531                                          {                                          {
532                                            twopass->nns_array_pos = 0;
533                                                  break;                                                  break;
534                                          }                                          }
535                                          else  
536                                          {                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
537                                                  CloseHandle(twopass->stats1);                                  twopass->nns_array_pos++;
538                                                  twopass->stats1 = INVALID_HANDLE_VALUE;  
539                                                  DEBUGERR("2pass init error - incomplete stats2 record?");                                  // skip unnecessary frames.
540                                                  return ICERR_ERROR;                                  if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||
541                                          }                                          twopass->nns1.dd_v & NNSTATS_PADFRAME ||
542                                  }                                          twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
543                                            continue;
544    
545                                  if (codec_is_in_credits(&codec->config, frames) == CREDITS_START)                                  if (codec_is_in_credits(&codec->config, frames) == CREDITS_START)
546                                  {                                  {
# Line 399  Line 555 
555                                  else if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                  else if (twopass->nns1.quant & NNSTATS_KEYFRAME)
556                                  {                                  {
557                                          i_total += twopass->nns1.bytes + twopass->nns1.bytes * codec->config.keyframe_boost / 100;                                          i_total += twopass->nns1.bytes + twopass->nns1.bytes * codec->config.keyframe_boost / 100;
                                         total += twopass->nns1.bytes * codec->config.keyframe_boost / 100;  
558                                          twopass->keyframe_locations[i_frames] = frames;                                          twopass->keyframe_locations[i_frames] = frames;
559                                          ++i_frames;                                          ++i_frames;
560                                  }                                  }
561                                    else
562                                  total += twopass->nns1.bytes;                                  {
563                                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
564                                            {
565                                                    bframe_total += twopass->nns1.bytes;
566                                                    bframes++;
567                                            }
568                                            else
569                                            {
570                                                    pframe_total += twopass->nns1.bytes;
571                                                    pframes++;
572                                            }
573                                    }
574    
575                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)
576                                  {                                  {
577                                            // this test needs to be corrected..
578                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))
579                                                  recminisize = twopass->nns1.bytes;                                                  recminisize = twopass->nns1.bytes;
580                                  }                                  }
581                                    else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
582                                    {
583                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
584                                                    recminbsize = twopass->nns1.bytes;
585                                    }
586                                  else                                  else
587                                  {                                  {
588                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))                                          if (!(twopass->nns1.kblk + twopass->nns1.mblk))
# Line 430  Line 602 
602    
603                                  // credits curve = (total / desired_size) * (100 / credits_rate)                                  // credits curve = (total / desired_size) * (100 / credits_rate)
604                                  twopass->credits_start_curve = twopass->credits_end_curve =                                  twopass->credits_start_curve = twopass->credits_end_curve =
605                                          ((double)total / desired) * ((double)100 / codec->config.credits_rate);                                          ((double)(bframe_total + pframe_total + i_total + start + end) / desired) *
606                                            ((double)100 / codec->config.credits_rate);
607    
608                                  start_curved = (__int64)(start / twopass->credits_start_curve);                                  start_curved = (__int64)(start / twopass->credits_start_curve);
609                                  end_curved = (__int64)(end / twopass->credits_end_curve);                                  end_curved = (__int64)(end / twopass->credits_end_curve);
610    
611                                  // movie curve = (total - credits) / (desired_size - curved credits)                                  // movie curve = (total - credits) / (desired_size - curved credits)
612                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
613                                          (total - start - end) /                                          (bframe_total + pframe_total + i_total) /
614                                          (desired - start_curved - end_curved);                                          (desired - start_curved - end_curved);
615    
616                                  break;                                  break;
# Line 446  Line 619 
619    
620                                  // movie curve = (total - credits) / (desired_size - credits)                                  // movie curve = (total - credits) / (desired_size - credits)
621                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
622                                          (total - start - end) / (desired - start - end);                                          (bframe_total + pframe_total + i_total) / (desired - start - end);
623    
624                                  // aid the average asymmetric frame calculation below                                  // aid the average asymmetric frame calculation below
625                                  start_curved = start;                                  start_curved = start;
# Line 469  Line 642 
642    
643                                  // movie curve = (total - credits) / (desired_size - curved credits)                                  // movie curve = (total - credits) / (desired_size - curved credits)
644                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
645                                          (total - start - end) /                                          (bframe_total + pframe_total + i_total) /
646                                          (desired - start_curved - end_curved);                                          (desired - start_curved - end_curved);
647    
648                                  break;                                  break;
649                          }                          }
650    
651                          // average frame size = (desired - curved credits - curved keyframes) /                          twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve;
652                          //      (frames - credits frames - keyframes)                          twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve;
653                          twopass->average_frame = (double)  
                                 (desired - start_curved - end_curved - (i_total / twopass->movie_curve)) /  
                                 (frames - credits_frames - i_frames);  
654    
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
655    
656                          // perform prepass to compensate for over/undersizing                          // perform prepass to compensate for over/undersizing
657                          frames = 0;                          frames = 0;
658    
659                          if (codec->config.use_alt_curve)                          if (codec->config.use_alt_curve)
660                          {                          {
661                                  twopass->alt_curve_low = twopass->average_frame - twopass->average_frame * (double)codec->config.alt_curve_low_dist / 100.0;                                  twopass->alt_curve_low = twopass->average_pframe - twopass->average_pframe * (double)codec->config.alt_curve_low_dist / 100.0;
662                                  twopass->alt_curve_low_diff = twopass->average_frame - twopass->alt_curve_low;                                  twopass->alt_curve_low_diff = twopass->average_pframe - twopass->alt_curve_low;
663                                  twopass->alt_curve_high = twopass->average_frame + twopass->average_frame * (double)codec->config.alt_curve_high_dist / 100.0;                                  twopass->alt_curve_high = twopass->average_pframe + twopass->average_pframe * (double)codec->config.alt_curve_high_dist / 100.0;
664                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_frame;                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_pframe;
665                                  if (codec->config.alt_curve_use_auto)                                  if (codec->config.alt_curve_use_auto)
666                                  {                                  {
667                                          if (twopass->movie_curve > 1.0)                                          if (twopass->movie_curve > 1.0)
# Line 511  Line 681 
681                                          {                                          {
682                                          case 2: // Sine Curve (high aggressiveness)                                          case 2: // Sine Curve (high aggressiveness)
683                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
684                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));
685                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
686                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff));                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff));
687                                                  break;                                                  break;
688                                          case 1: // Linear (medium aggressiveness)                                          case 1: // Linear (medium aggressiveness)
689                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
690                                                          twopass->average_frame / twopass->alt_curve_low_diff);                                                          twopass->average_pframe / twopass->alt_curve_low_diff);
691                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
692                                                          twopass->average_frame / twopass->alt_curve_low_diff;                                                          twopass->average_pframe / twopass->alt_curve_low_diff;
693                                                  break;                                                  break;
694                                          case 0: // Cosine Curve (low aggressiveness)                                          case 0: // Cosine Curve (low aggressiveness)
695                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
696                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff))));
697                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
698                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));
699                                          }                                          }
700                                  }                                  }
701                          }                          }
702    
703                          while (1)                          while (1)
704                          {                          {
705                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))                                  if (twopass->nns_array_pos >= twopass->nns_array_length)
                                 {  
                                         DWORD err = GetLastError();  
   
                                         if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)  
706                                          {                                          {
707                                            twopass->nns_array_pos = 0;
708                                                  break;                                                  break;
709                                          }                                          }
710                                          else  
711                                          {                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
712                                                  CloseHandle(twopass->stats1);                                  twopass->nns_array_pos++;
                                                 twopass->stats1 = INVALID_HANDLE_VALUE;  
                                                 DEBUGERR("2pass init error - incomplete stats2 record?");  
                                                 return ICERR_ERROR;  
                                         }  
                                 }  
713    
714                                  if (frames == 0)                                  if (frames == 0)
715                                  {                                  {
716                                            twopass->minbsize = (twopass->nns1.kblk + 88) / 8;
717                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
718                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
719                                            if (recminbsize > twopass->minbsize)
720                                                    twopass->minbsize = recminbsize;
721                                          if (recminpsize > twopass->minpsize)                                          if (recminpsize > twopass->minpsize)
722                                                  twopass->minpsize = recminpsize;                                                  twopass->minpsize = recminpsize;
723                                          if (recminisize > twopass->minisize)                                          if (recminisize > twopass->minisize)
724                                                  twopass->minisize = recminisize;                                                  twopass->minisize = recminisize;
725                                  }                                  }
726    
727                                    // skip unnecessary frames.
728                                    if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||
729                                            twopass->nns1.dd_v & NNSTATS_PADFRAME ||
730                                            twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
731                                            continue;
732    
733                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
734                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
735                                  {                                  {
736                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;
737                                          total1 += dbytes;                                          total1 += dbytes;
738    
739                                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
740                                                    dbytes *= twopass->average_pframe / twopass->average_bframe;
741    
742                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
743                                          {                                          {
744                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_pframe)
745                                                  {                                                  {
746                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
747                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
# Line 577  Line 751 
751                                                                  {                                                                  {
752                                                                  case 2:                                                                  case 2:
753                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
754                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));
755                                                                          break;                                                                          break;
756                                                                  case 1:                                                                  case 1:
757                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
758                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);
759                                                                          break;                                                                          break;
760                                                                  case 0:                                                                  case 0:
761                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
762                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));
763                                                                  }                                                                  }
764                                                          }                                                          }
765                                                  }                                                  }
# Line 599  Line 773 
773                                                                  {                                                                  {
774                                                                  case 2:                                                                  case 2:
775                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
776                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));
777                                                                          break;                                                                          break;
778                                                                  case 1:                                                                  case 1:
779                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
780                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);
781                                                                          break;                                                                          break;
782                                                                  case 0:                                                                  case 0:
783                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
784                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));
785                                                                  }                                                                  }
786                                                          }                                                          }
787                                                  }                                                  }
788                                          }                                          }
789                                          else                                          else
790                                          {                                          {
791                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_pframe)
792                                                  {                                                  {
793                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *
794                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
795                                                  }                                                  }
796                                                  else                                                  else
797                                                  {                                                  {
798                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *
799                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
800                                                  }                                                  }
801                                          }                                          }
802    
803                                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
804                                            {
805                                                    dbytes2 *= twopass->average_bframe / twopass->average_pframe;
806                                                    if (dbytes2 < twopass->minbsize)
807                                                            dbytes2 = twopass->minbsize;
808                                            }
809                                            else
810                                            {
811                                          if (dbytes2 < twopass->minpsize)                                          if (dbytes2 < twopass->minpsize)
812                                                  dbytes2 = twopass->minpsize;                                                  dbytes2 = twopass->minpsize;
813                                            }
814    
815                                          total2 += dbytes2;                                          total2 += dbytes2;
816                                  }                                  }
# Line 642  Line 825 
825                                  int asymmetric_average_frame;                                  int asymmetric_average_frame;
826                                  char s[100];                                  char s[100];
827    
828                                  asymmetric_average_frame = (int)(twopass->average_frame * twopass->curve_comp_scale);                                  asymmetric_average_frame = (int)(twopass->average_pframe * twopass->curve_comp_scale);
829                                  wsprintf(s, "middle frame size for asymmetric curve compression: %i", asymmetric_average_frame);                                  wsprintf(s, "middle frame size for asymmetric curve compression: %i", asymmetric_average_frame);
830                                  DEBUG2P(s);                                  DEBUG2P(s);
831                          }                          }
   
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
832                  }                  }
833    
834                  if (codec->config.use_alt_curve)                  if (codec->config.use_alt_curve)
# Line 666  Line 847 
847                                  int i, newquant, percent;                                  int i, newquant, percent;
848                                  int oldquant = 1;                                  int oldquant = 1;
849    
850                                  wsprintf(s, "avg scaled framesize:%i", (int)(twopass->average_frame));                                  wsprintf(s, "avg scaled framesize:%i", (int)(twopass->average_pframe));
851                                  DEBUG2P(s);                                  DEBUG2P(s);
852    
853                                  wsprintf(s, "bias bonus:%i bytes", (int)(twopass->curve_bias_bonus));                                  wsprintf(s, "bias bonus:%i bytes", (int)(twopass->curve_bias_bonus));
# Line 675  Line 856 
856                                  for (i=1; i <= (int)(twopass->alt_curve_high*2)+1; i++)                                  for (i=1; i <= (int)(twopass->alt_curve_high*2)+1; i++)
857                                  {                                  {
858                                          dbytes = i;                                          dbytes = i;
859                                          if (dbytes > twopass->average_frame)                                          if (dbytes > twopass->average_pframe)
860                                          {                                          {
861                                                  if (dbytes >= twopass->alt_curve_high)                                                  if (dbytes >= twopass->alt_curve_high)
862                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
# Line 685  Line 866 
866                                                          {                                                          {
867                                                          case 2:                                                          case 2:
868                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
869                                                                  sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));                                                                  sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));
870                                                                  break;                                                                  break;
871                                                          case 1:                                                          case 1:
872                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
873                                                                  (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                                  (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);
874                                                                  break;                                                                  break;
875                                                          case 0:                                                          case 0:
876                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
877                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));
878                                                          }                                                          }
879                                                  }                                                  }
880                                          }                                          }
# Line 707  Line 888 
888                                                          {                                                          {
889                                                          case 2:                                                          case 2:
890                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
891                                                                  sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));                                                                  sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));
892                                                                  break;                                                                  break;
893                                                          case 1:                                                          case 1:
894                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
895                                                                  (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                                  (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);
896                                                                  break;                                                                  break;
897                                                          case 0:                                                          case 0:
898                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                          curve_temp = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
899                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));
900                                                          }                                                          }
901                                                  }                                                  }
902                                          }                                          }
# Line 729  Line 910 
910                                                  if (newquant != oldquant)                                                  if (newquant != oldquant)
911                                                  {                                                  {
912                                                          oldquant = newquant;                                                          oldquant = newquant;
913                                                          percent = (int)((i - twopass->average_frame) * 100.0 / twopass->average_frame);                                                          percent = (int)((i - twopass->average_pframe) * 100.0 / twopass->average_pframe);
914                                                          wsprintf(s, "quant:%i threshold at %i : %i percent", newquant, i, percent);                                                          wsprintf(s, "quant:%i threshold at %i : %i percent", newquant, i, percent);
915                                                          DEBUG2P(s);                                                          DEBUG2P(s);
916                                                  }                                                  }
# Line 749  Line 930 
930          return ICERR_OK;          return ICERR_OK;
931  }  }
932    
933    // NOTE: codec_2pass_get_quant() should be called for all the frames that are in the stats file(s)
934  int codec_2pass_get_quant(CODEC* codec, XVID_ENC_FRAME* frame)  int codec_2pass_get_quant(CODEC* codec, XVID_ENC_FRAME* frame)
935  {  {
936          static double quant_error[32];          static double bquant_error[32];
937            static double pquant_error[32];
938          static double curve_comp_error;          static double curve_comp_error;
939          static int last_quant;          static int last_bquant, last_pquant;
940    
941          TWOPASS * twopass = &codec->twopass;          TWOPASS * twopass = &codec->twopass;
942    
943          DWORD read;  //      DWORD read;
944          int bytes1, bytes2;          int bytes1, bytes2;
945          int overflow;          int overflow;
946          int credits_pos;          int credits_pos;
# Line 771  Line 953 
953    
954                  for (i=0 ; i<32 ; ++i)                  for (i=0 ; i<32 ; ++i)
955                  {                  {
956                          quant_error[i] = 0.0;                          bquant_error[i] = 0.0;
957                            pquant_error[i] = 0.0;
958                          twopass->quant_count[i] = 0;                          twopass->quant_count[i] = 0;
959                  }                  }
960    
961                  curve_comp_error = 0.0;                  curve_comp_error = 0.0;
962                  last_quant = 0;                  last_bquant = 0;
963                    last_pquant = 0;
964          }          }
965    
966          if (ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, 0) == 0 || read != sizeof(NNSTATS))          if (twopass->nns_array_pos >= twopass->nns_array_length)
967          {          {
968                  DEBUGERR("2ndpass quant: couldn't read from stats1");                  twopass->nns_array_pos = 0;
969                  return ICERR_ERROR;                  DEBUG("ERROR: VIDEO EXCEEDS 1ST PASS!!!");
970                    frame->intra = -1;
971                    return 2;
972          }          }
973    
974            memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
975          if (codec->config.mode == DLG_MODE_2PASS_2_EXT)          if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
976                    memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));
977            twopass->nns_array_pos++;
978    
979            bytes1 = twopass->nns1.bytes;
980    
981            // skip unnecessary frames.
982            if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME)
983          {          {
984                  if (ReadFile(twopass->stats2, &twopass->nns2, sizeof(NNSTATS), &read, 0) == 0 || read != sizeof(NNSTATS))                  twopass->bytes1 = bytes1;
985                    twopass->bytes2 = bytes1;
986                    twopass->desired_bytes2 = bytes1;
987                    frame->intra = 3;
988                    return 2;
989            }
990            else if (twopass->nns1.dd_v & NNSTATS_PADFRAME)
991                  {                  {
992                          DEBUGERR("2ndpass quant: couldn't read from stats2");                  twopass->bytes1 = bytes1;
993                          return ICERR_ERROR;                  twopass->bytes2 = bytes1;
994                    twopass->desired_bytes2 = bytes1;
995                    frame->intra = 4;
996                    return 2;
997                  }                  }
998            else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
999            {
1000                    twopass->bytes1 = bytes1;
1001                    twopass->bytes2 = bytes1;
1002                    twopass->desired_bytes2 = bytes1;
1003                    frame->intra = 5;
1004                    return 2;
1005          }          }
1006    
         bytes1 = twopass->nns1.bytes;  
1007          overflow = twopass->overflow / 8;          overflow = twopass->overflow / 8;
1008    
1009          // override codec i-frame choice (reenable in credits)          // override codec i-frame choice (reenable in credits)
1010          frame->intra = (twopass->nns1.quant & NNSTATS_KEYFRAME);          if (twopass->nns1.quant & NNSTATS_KEYFRAME)
1011                    frame->intra=1;
1012            else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1013                    frame->intra=2;
1014            else
1015                    frame->intra=0;
1016    
1017          if (frame->intra)          if (frame->intra==1)
1018          {          {
1019                  overflow = 0;                  overflow = 0;
1020          }          }
# Line 851  Line 1066 
1066                          {                          {
1067                                  if (codec->config.credits_quant_i != codec->config.credits_quant_p)                                  if (codec->config.credits_quant_i != codec->config.credits_quant_p)
1068                                  {                                  {
1069                                          frame->quant = frame->intra ?                                          frame->quant = frame->intra == 1 ?
1070                                                  codec->config.credits_quant_i :                                                  codec->config.credits_quant_i :
1071                                                  codec->config.credits_quant_p;                                                  codec->config.credits_quant_p;
1072                                  }                                  }
# Line 876  Line 1091 
1091    
1092                  bytes2 = (codec->config.mode == DLG_MODE_2PASS_2_INT) ? bytes1 : twopass->nns2.bytes;                  bytes2 = (codec->config.mode == DLG_MODE_2PASS_2_INT) ? bytes1 : twopass->nns2.bytes;
1093    
1094                  if (frame->intra)                  if (frame->intra==1)
1095                  {                  {
1096                          dbytes = ((int)(bytes2 + bytes2 * codec->config.keyframe_boost / 100)) /                          dbytes = ((int)(bytes2 + bytes2 * codec->config.keyframe_boost / 100)) /
1097                                  twopass->movie_curve;                                  twopass->movie_curve;
# Line 886  Line 1101 
1101                          dbytes = bytes2 / twopass->movie_curve;                          dbytes = bytes2 / twopass->movie_curve;
1102                  }                  }
1103    
1104                    if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1105                            dbytes *= twopass->average_pframe / twopass->average_bframe;
1106    
1107                  // spread the compression error across payback_delay frames                  // spread the compression error across payback_delay frames
1108                  if (codec->config.bitrate_payback_method == 0)                  if (codec->config.bitrate_payback_method == 0)
1109                  {                  {
# Line 894  Line 1112 
1112                  else                  else
1113                  {                  {
1114                          bytes2 = (int)(curve_comp_error * dbytes /                          bytes2 = (int)(curve_comp_error * dbytes /
1115                                  twopass->average_frame / codec->config.bitrate_payback_delay);                                  twopass->average_pframe / codec->config.bitrate_payback_delay);
1116    
1117                          if (labs(bytes2) > fabs(curve_comp_error))                          if (labs(bytes2) > fabs(curve_comp_error))
1118                          {                          {
# Line 906  Line 1124 
1124    
1125                  if (codec->config.use_alt_curve)                  if (codec->config.use_alt_curve)
1126                  {                  {
1127                          if (!frame->intra)                          if (!(frame->intra==1))
1128                          {                          {
1129                                  if (dbytes > twopass->average_frame)                                  if (dbytes > twopass->average_pframe)
1130                                  {                                  {
1131                                          if (dbytes >= twopass->alt_curve_high)                                          if (dbytes >= twopass->alt_curve_high)
1132                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
# Line 918  Line 1136 
1136                                                  {                                                  {
1137                                                  case 2:                                                  case 2:
1138                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
1139                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));
1140                                                          break;                                                          break;
1141                                                  case 1:                                                  case 1:
1142                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
1143                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);
1144                                                          break;                                                          break;
1145                                                  case 0:                                                  case 0:
1146                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
1147                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));
1148                                                  }                                                  }
1149                                          }                                          }
1150                                  }                                  }
# Line 940  Line 1158 
1158                                                  {                                                  {
1159                                                  case 2:                                                  case 2:
1160                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
1161                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));
1162                                                          break;                                                          break;
1163                                                  case 1:                                                  case 1:
1164                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
1165                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);
1166                                                          break;                                                          break;
1167                                                  case 0:                                                  case 0:
1168                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                  curve_temp = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
1169                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));
1170                                                  }                                                  }
1171                                          }                                          }
1172                                  }                                  }
1173                                  curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;                                  curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;
1174    
1175                                    if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1176                                            curve_temp *= twopass->average_bframe / twopass->average_pframe;
1177    
1178                                  bytes2 += ((int)curve_temp);                                  bytes2 += ((int)curve_temp);
1179                                  curve_comp_error += curve_temp - ((int)curve_temp);                                  curve_comp_error += curve_temp - ((int)curve_temp);
1180                          }                          }
1181                          else                          else
1182                          {                          {
1183                                  curve_comp_error += dbytes - ((int)dbytes);                                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1184                                            dbytes *= twopass->average_bframe / twopass->average_pframe;
1185    
1186                                  bytes2 += ((int)dbytes);                                  bytes2 += ((int)dbytes);
1187                                    curve_comp_error += dbytes - ((int)dbytes);
1188                          }                          }
1189                  }                  }
1190                  else if ((codec->config.curve_compression_high + codec->config.curve_compression_low) &&                  else if ((codec->config.curve_compression_high + codec->config.curve_compression_low) &&
1191                          !frame->intra)                          !(frame->intra==1))
1192                  {                  {
1193                          if (dbytes > twopass->average_frame)                          if (dbytes > twopass->average_pframe)
1194                          {                          {
1195                                  curve_temp = twopass->curve_comp_scale *                                  curve_temp = twopass->curve_comp_scale *
1196                                          ((double)dbytes + (twopass->average_frame - dbytes) *                                          ((double)dbytes + (twopass->average_pframe - dbytes) *
1197                                          codec->config.curve_compression_high / 100.0);                                          codec->config.curve_compression_high / 100.0);
1198                          }                          }
1199                          else                          else
1200                          {                          {
1201                                  curve_temp = twopass->curve_comp_scale *                                  curve_temp = twopass->curve_comp_scale *
1202                                          ((double)dbytes + (twopass->average_frame - dbytes) *                                          ((double)dbytes + (twopass->average_pframe - dbytes) *
1203                                          codec->config.curve_compression_low / 100.0);                                          codec->config.curve_compression_low / 100.0);
1204                          }                          }
1205    
1206                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1207                                    curve_temp *= twopass->average_bframe / twopass->average_pframe;
1208    
1209                          bytes2 += ((int)curve_temp);                          bytes2 += ((int)curve_temp);
1210                          curve_comp_error += curve_temp - ((int)curve_temp);                          curve_comp_error += curve_temp - ((int)curve_temp);
1211                  }                  }
1212                  else                  else
1213                  {                  {
1214                          curve_comp_error += dbytes - ((int)dbytes);                          if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1215                                    dbytes *= twopass->average_bframe / twopass->average_pframe;
1216    
1217                          bytes2 += ((int)dbytes);                          bytes2 += ((int)dbytes);
1218                            curve_comp_error += dbytes - ((int)dbytes);
1219                  }                  }
1220    
1221                  // cap bytes2 to first pass size, lowers number of quant=1 frames                  // cap bytes2 to first pass size, lowers number of quant=1 frames
# Line 996  Line 1226 
1226                  }                  }
1227                  else                  else
1228                  {                  {
1229                          if (frame->intra)                          if (frame->intra==1)
1230                          {                          {
1231                                  if (bytes2 < twopass->minisize)                                  if (bytes2 < twopass->minisize)
1232                                  {                                  {
# Line 1004  Line 1234 
1234                                          bytes2 = twopass->minisize;                                          bytes2 = twopass->minisize;
1235                                  }                                  }
1236                          }                          }
1237                          else if (bytes2 < twopass->minpsize)                          else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1238                            {
1239                                    if (bytes2 < twopass->minbsize)
1240                                            bytes2 = twopass->minbsize;
1241                            }
1242                            else
1243                            {
1244                                    if (bytes2 < twopass->minpsize)
1245                                  bytes2 = twopass->minpsize;                                  bytes2 = twopass->minpsize;
1246                  }                  }
1247          }          }
1248            }
1249    
1250          twopass->desired_bytes2 = bytes2;          twopass->desired_bytes2 = bytes2;
1251    
1252          // if this keyframe is too close to the next,          // if this keyframe is too close to the next,
1253          // reduce it's byte allotment          // reduce it's byte allotment
1254          if (frame->intra && !credits_pos)          if ((frame->intra==1) && !credits_pos)
1255          {          {
1256                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -
1257                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];
# Line 1039  Line 1277 
1277    
1278          // Foxer: scale overflow in relation to average size, so smaller frames don't get          // Foxer: scale overflow in relation to average size, so smaller frames don't get
1279          // too much/little bitrate          // too much/little bitrate
1280          overflow = (int)((double)overflow * bytes2 / twopass->average_frame);          overflow = (int)((double)overflow * bytes2 / twopass->average_pframe);
1281    
1282          // Foxer: reign in overflow with huge frames          // Foxer: reign in overflow with huge frames
1283          if (labs(overflow) > labs(twopass->overflow))          if (labs(overflow) > labs(twopass->overflow))
# Line 1074  Line 1312 
1312                  if (bytes2 < twopass->minisize)                  if (bytes2 < twopass->minisize)
1313                          bytes2 = twopass->minisize;                          bytes2 = twopass->minisize;
1314          }          }
1315          else if (bytes2 < twopass->minpsize)          else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1316            {
1317                    if (bytes2 < twopass->minbsize)
1318                            bytes2 = twopass->minbsize;
1319            }
1320            else
1321            {
1322                    if (bytes2 < twopass->minpsize)
1323                  bytes2 = twopass->minpsize;                  bytes2 = twopass->minpsize;
1324            }
1325    
1326          twopass->bytes1 = bytes1;          twopass->bytes1 = bytes1;
1327          twopass->bytes2 = bytes2;          twopass->bytes2 = bytes2;
# Line 1091  Line 1337 
1337          {          {
1338                  frame->quant = 31;                  frame->quant = 31;
1339          }          }
1340          else if (!frame->intra)          else if (!(frame->intra==1))
1341          {          {
1342                  // Foxer: aid desired quantizer precision by accumulating decision error                  // Foxer: aid desired quantizer precision by accumulating decision error
1343                  quant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1344                    {
1345                            bquant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *
1346                          bytes1) / bytes2) - frame->quant;                          bytes1) / bytes2) - frame->quant;
1347    
1348                  if (quant_error[frame->quant] >= 1.0)                          if (bquant_error[frame->quant] >= 1.0)
1349                  {                  {
1350                          quant_error[frame->quant] -= 1.0;                                  bquant_error[frame->quant] -= 1.0;
1351                          ++frame->quant;                          ++frame->quant;
1352                  }                  }
1353          }          }
1354                    else
1355                    {
1356                            pquant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *
1357                                    bytes1) / bytes2) - frame->quant;
1358    
1359                            if (pquant_error[frame->quant] >= 1.0)
1360                            {
1361                                    pquant_error[frame->quant] -= 1.0;
1362                                    ++frame->quant;
1363                            }
1364                    }
1365            }
1366    
1367          // we're done with credits          // we're done with credits
1368          if (codec_is_in_credits(&codec->config, codec->framenum))          if (codec_is_in_credits(&codec->config, codec->framenum))
# Line 1110  Line 1370 
1370                  return ICERR_OK;                  return ICERR_OK;
1371          }          }
1372    
1373          if (frame->intra)          if ((frame->intra==1))
1374          {          {
1375                  if (frame->quant < codec->config.min_iquant)                  if (frame->quant < codec->config.min_iquant)
1376                  {                  {
# Line 1135  Line 1395 
1395                  }                  }
1396    
1397                  // subsequent frame quants can only be +- 2                  // subsequent frame quants can only be +- 2
1398                  if (last_quant && capped_to_max_framesize == 0)                  if ((last_pquant || last_bquant) && capped_to_max_framesize == 0)
1399                    {
1400                            if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1401                  {                  {
1402                          if (frame->quant > last_quant + 2)                                  // this bframe quantizer variation
1403                                    // restriction needs to be redone.
1404                                    if (frame->quant > last_bquant + 2)
1405                          {                          {
1406                                  frame->quant = last_quant + 2;                                          frame->quant = last_bquant + 2;
1407                                            DEBUG2P("B-frame quantizer prevented from rising too steeply");
1408                                    }
1409                                    if (frame->quant < last_bquant - 2)
1410                                    {
1411                                            frame->quant = last_bquant - 2;
1412                                            DEBUG2P("B-frame quantizer prevented from falling too steeply");
1413                                    }
1414                            }
1415                            else
1416                            {
1417                                    if (frame->quant > last_pquant + 2)
1418                                    {
1419                                            frame->quant = last_pquant + 2;
1420                                  DEBUG2P("P-frame quantizer prevented from rising too steeply");                                  DEBUG2P("P-frame quantizer prevented from rising too steeply");
1421                          }                          }
1422                          if (frame->quant < last_quant - 2)                                  if (frame->quant < last_pquant - 2)
1423                          {                          {
1424                                  frame->quant = last_quant - 2;                                          frame->quant = last_pquant - 2;
1425                                  DEBUG2P("P-frame quantizer prevented from falling too steeply");                                  DEBUG2P("P-frame quantizer prevented from falling too steeply");
1426                          }                          }
1427                  }                  }
1428          }          }
1429            }
1430    
1431          if (capped_to_max_framesize == 0)          if (capped_to_max_framesize == 0)
1432                  last_quant = frame->quant;          {
1433                    if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1434                            last_bquant = frame->quant;
1435                    else
1436                            last_pquant = frame->quant;
1437            }
1438    
1439          if (codec->config.quant_type == QUANT_MODE_MOD)          if (codec->config.quant_type == QUANT_MODE_MOD)
1440          {          {
1441                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
1442                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
1443          }          }
1444    /*
1445            if (codec->config.quant_type == QUANT_MODE_MOD_NEW)
1446            {
1447                    frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT;
1448                    frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT;
1449            }
1450    */
1451          return ICERR_OK;          return ICERR_OK;
1452  }  }
1453    
# Line 1171  Line 1460 
1460          DWORD wrote;          DWORD wrote;
1461          int credits_pos, tempdiv;          int credits_pos, tempdiv;
1462          char* quant_type;          char* quant_type;
1463            char* frame_type;
1464    
1465          if (codec->framenum == 0)          if (codec->framenum == 0)
1466          {          {
# Line 1194  Line 1484 
1484    
1485  //              nns1.quant = stats->quant;  //              nns1.quant = stats->quant;
1486                  nns1.quant = 2;                         // ugly fix for lumi masking in 1st pass returning new quant                  nns1.quant = 2;                         // ugly fix for lumi masking in 1st pass returning new quant
1487                  if (frame->intra)                  nns1.lum_noise[0] = nns1.lum_noise[1] = 1;
1488                  {                  frame_type="inter";
1489                    if (frame->intra==1) {
1490                          nns1.quant |= NNSTATS_KEYFRAME;                          nns1.quant |= NNSTATS_KEYFRAME;
1491                            frame_type="intra";
1492                    }
1493                    else if (frame->intra==2) {
1494                            nns1.dd_v |= NNSTATS_BFRAME;
1495                            frame_type="bframe";
1496                    }
1497                    else if (frame->intra==3) {
1498                            nns1.dd_v |= NNSTATS_SKIPFRAME;
1499                            frame_type="skiped";
1500                    }
1501                    else if (frame->intra==4) {
1502                            nns1.dd_v |= NNSTATS_PADFRAME;
1503                            frame_type="padded";
1504                    }
1505                    else if (frame->intra==5) {
1506                            nns1.dd_v |= NNSTATS_DELAYFRAME;
1507                            frame_type="delayed";
1508                  }                  }
1509                  nns1.kblk = stats->kblks;                  nns1.kblk = stats->kblks;
1510                  nns1.mblk = stats->mblks;                  nns1.mblk = stats->mblks;
1511                  nns1.ublk = stats->ublks;                  nns1.ublk = stats->ublks;
                 nns1.lum_noise[0] = nns1.lum_noise[1] = 1;  
1512    
1513                  total_size += frame->length;                  total_size += frame->length;
1514    
1515                  DEBUG1ST(frame->length, (int)total_size/1024, frame->intra, frame->quant, quant_type, stats->kblks, stats->mblks)                  DEBUG1ST(frame->length, (int)total_size/1024, frame_type, frame->quant, quant_type, stats->kblks, stats->mblks)
1516    
1517    
1518                  if (WriteFile(codec->twopass.stats1, &nns1, sizeof(NNSTATS), &wrote, 0) == 0 || wrote != sizeof(NNSTATS))                  if (WriteFile(codec->twopass.stats1, &nns1, sizeof(NNSTATS), &wrote, 0) == 0 || wrote != sizeof(NNSTATS))
1519                  {                  {
# Line 1217  Line 1525 
1525          case DLG_MODE_2PASS_2_INT :          case DLG_MODE_2PASS_2_INT :
1526          case DLG_MODE_2PASS_2_EXT :          case DLG_MODE_2PASS_2_EXT :
1527                  credits_pos = codec_is_in_credits(&codec->config, codec->framenum);                  credits_pos = codec_is_in_credits(&codec->config, codec->framenum);
1528                    if (!(codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) &&
1529                            !(codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) &&
1530                            !(codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME))
1531                    {
1532                  if (!credits_pos)                  if (!credits_pos)
1533                  {                  {
1534                          codec->twopass.quant_count[frame->quant]++;                          codec->twopass.quant_count[frame->quant]++;
# Line 1264  Line 1576 
1576                          codec->twopass.KFoverflow_partial = 0;                          codec->twopass.KFoverflow_partial = 0;
1577                          // end of ugly fix.                          // end of ugly fix.
1578                  }                  }
1579                    }
1580    
1581                  DEBUG2ND(frame->quant, quant_type, frame->intra, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)                  frame_type="inter";
1582                    if (frame->intra==1) {
1583                            frame_type="intra";
1584                    }
1585                    else if (codec->twopass.nns1.dd_v & NNSTATS_BFRAME) {
1586                            frame_type="bframe";
1587                    }
1588                    else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) {
1589                            frame_type="skipped";
1590                            frame->quant = 2;
1591                            codec->twopass.bytes1 = 8;
1592                            codec->twopass.desired_bytes2 = 8;
1593                            frame->length = 8;
1594                    }
1595                    else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) {
1596                            frame_type="padded";
1597                            frame->quant = 2;
1598                            codec->twopass.bytes1 = 8;
1599                            codec->twopass.desired_bytes2 = 8;
1600                            frame->length = 8;
1601                    }
1602                    else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) {
1603                            frame_type="delayed";
1604                            frame->quant = 2;
1605                            codec->twopass.bytes1 = 8;
1606                            codec->twopass.desired_bytes2 = 8;
1607                            frame->length = 8;
1608                    }
1609    
1610                    DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)
1611                  break;                  break;
1612    
1613          default:          default:
# Line 1279  Line 1621 
1621  {  {
1622          int i;          int i;
1623          char s[100];          char s[100];
1624    
1625            if (codec->twopass.nns1_array)
1626                    free(codec->twopass.nns1_array);
1627            if (codec->twopass.nns2_array)
1628                    free(codec->twopass.nns2_array);
1629            codec->twopass.nns_array_size = 0;
1630            codec->twopass.nns_array_length = 0;
1631            codec->twopass.nns_array_pos = 0;
1632    
1633          if (codec->config.mode == DLG_MODE_2PASS_2_EXT || codec->config.mode == DLG_MODE_2PASS_2_INT)          if (codec->config.mode == DLG_MODE_2PASS_2_EXT || codec->config.mode == DLG_MODE_2PASS_2_INT)
1634          {          {
1635                  // output the quantizer distribution for this encode.                  // output the quantizer distribution for this encode.

Legend:
Removed from v.552  
changed lines
  Added in v.660

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4