[cvs] / vfw / src / 2pass.c Repository:
ViewVC logotype

Diff of /vfw/src/2pass.c

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

revision 1.7.2.4, Wed Nov 27 11:41:45 2002 UTC revision 1.10, Tue Sep 24 14:25:42 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, bframes = 0, pframes = 0, credits_frames = 0, i_frames = 0, recminbsize = 0, recminpsize = 0, recminisize = 0;          int     frames = 0, credits_frames = 0, i_frames = 0;
45          __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;          __int64 total_ext = 0, total = 0, i_total = 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    
                 twopass->nns1_array = (NNSTATS*)malloc(sizeof(NNSTATS) * 10240);  
                 twopass->nns2_array = (NNSTATS*)malloc(sizeof(NNSTATS) * 10240);  
                 twopass->nns_array_size = 10240;  
                 twopass->nns_array_length = 0;  
                 twopass->nns_array_pos = 0;  
   
                 // read the stats file(s) into array(s) and reorder them so they  
                 // correctly represent the frames that the encoder will receive.  
104                  if (codec->config.mode == DLG_MODE_2PASS_2_EXT)                  if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
105                  {                  {
106                          if (twopass->stats2 != INVALID_HANDLE_VALUE)                          if (twopass->stats2 != INVALID_HANDLE_VALUE)
# Line 166  Line 158 
158                                          }                                          }
159                                  }                                  }
160    
                                 // increase the allocated memory if necessary  
                                 if (frames >= twopass->nns_array_size)  
                                 {  
                                         twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array,  
                                                 sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));  
                                         twopass->nns2_array = (NNSTATS*)realloc(twopass->nns2_array,  
                                                 sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));  
                                         twopass->nns_array_size = twopass->nns_array_size * 5 / 4 + 1;  
                                 }  
   
                                 // copy this frame's stats into the arrays  
                                 memcpy (&twopass->nns1_array[frames], &twopass->nns1, sizeof(NNSTATS));  
                                 memcpy (&twopass->nns2_array[frames], &twopass->nns2, sizeof(NNSTATS));  
                                 frames++;  
                         }  
   
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
                         SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);  
                 }  
                 else    // DLG_MODE_2PASS_2_INT  
                 {  
                         while (1)  
                         {  
                                 if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))  
                                 {  
                                         DWORD err = GetLastError();  
   
                                         if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)  
                                         {  
                                                 break;  
                                         }  
                                         else  
                                         {  
                                                 CloseHandle(twopass->stats1);  
                                                 twopass->stats1 = INVALID_HANDLE_VALUE;  
                                                 DEBUGERR("2pass init error - incomplete stats2 record?");  
                                                 return ICERR_ERROR;  
                                         }  
                                 }  
   
                                 // increase the allocated memory if necessary  
                                 if (frames >= twopass->nns_array_size)  
                                 {  
                                         twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array,  
                                                 sizeof(NNSTATS) * (twopass->nns_array_size * 5 / 4 + 1));  
                                         twopass->nns_array_size = twopass->nns_array_size * 5 / 4 + 1;  
                                 }  
   
                                 // copy this frame's stats into the array  
                                 memcpy (&twopass->nns1_array[frames], &twopass->nns1, sizeof(NNSTATS));  
                                 frames++;  
                         }  
   
                         SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);  
                 }  
                 twopass->nns1_array = (NNSTATS*)realloc(twopass->nns1_array, sizeof(NNSTATS) * frames);  
                 twopass->nns2_array = (NNSTATS*)realloc(twopass->nns2_array, sizeof(NNSTATS) * frames);  
                 twopass->nns_array_size = frames;  
                 twopass->nns_array_length = frames;  
                 frames = 0;  
   
 /* // this isn't necessary with the current core.  
                 // reorder the array(s) so they are in the order that they were received  
                 // IPBBPBB to  
                 // IBBPBBP  
                 for (i=0; i<twopass->nns_array_length; i++)  
                 {  
                         NNSTATS temp_nns, temp_nns2;  
                         int k, num_bframes;  
                         if (twopass->nns1_array[i].dd_v & NNSTATS_BFRAME)  
                         {  
                                 num_bframes = 1;  
                                 for (k=i+1; k<twopass->nns_array_length; k++)  
                                 {  
                                         if (twopass->nns1_array[k].dd_v & NNSTATS_BFRAME)  
                                                 num_bframes++;  
                                         else  
                                                 k=twopass->nns_array_length;  
                                 }  
   
                                 i--;  
                                 memcpy (&temp_nns, &twopass->nns1_array[i], sizeof(NNSTATS));  
                                 if (codec->config.mode == DLG_MODE_2PASS_2_EXT)  
                                         memcpy (&temp_nns2, &twopass->nns2_array[i], sizeof(NNSTATS));  
   
                                 for (k=0; k<num_bframes; k++)  
                                 {  
                                         memcpy(&twopass->nns1_array[i], &twopass->nns1_array[i+1], sizeof(NNSTATS));  
                                         if (codec->config.mode == DLG_MODE_2PASS_2_EXT)  
                                                 memcpy(&twopass->nns2_array[i], &twopass->nns2_array[i+1], sizeof(NNSTATS));  
                                         i++;  
                                 }  
   
                                 memcpy(&twopass->nns1_array[i], &temp_nns, sizeof(NNSTATS));  
                                 if (codec->config.mode == DLG_MODE_2PASS_2_EXT)  
                                         memcpy(&twopass->nns2_array[i], &temp_nns2, sizeof(NNSTATS));  
                         }  
                 }  
 */  
                 // continue with the initialization..  
                 if (codec->config.mode == DLG_MODE_2PASS_2_EXT)  
                 {  
                         while (1)  
                         {  
                                 if (twopass->nns_array_pos >= twopass->nns_array_length)  
                                 {  
                                         twopass->nns_array_pos = 0;  
                                         break;  
                                 }  
   
                                 memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));  
                                 memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));  
                                 twopass->nns_array_pos++;  
   
                                 // skip unnecessary frames.  
                                 if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_PADFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_DELAYFRAME)  
                                         continue;  
   
161                                  if (!codec_is_in_credits(&codec->config, frames))                                  if (!codec_is_in_credits(&codec->config, frames))
162                                  {                                  {
163                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)
164                                          {                                          {
                                                 i_total += twopass->nns2.bytes;  
165                                                  i_boost_total += twopass->nns2.bytes * codec->config.keyframe_boost / 100;                                                  i_boost_total += twopass->nns2.bytes * codec->config.keyframe_boost / 100;
166                                                    i_total += twopass->nns2.bytes;
167                                                  twopass->keyframe_locations[i_frames] = frames;                                                  twopass->keyframe_locations[i_frames] = frames;
168                                                  ++i_frames;                                                  ++i_frames;
169                                          }                                          }
                                         else  
                                         {  
                                                 if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                                 {  
                                                         bframe_total += twopass->nns1.bytes;  
                                                         bframe_total_ext += twopass->nns2.bytes;  
                                                         bframes++;  
                                                 }  
                                                 else  
                                                 {  
                                                         pframe_total += twopass->nns1.bytes;  
                                                         pframe_total_ext += twopass->nns2.bytes;  
                                                         pframes++;  
                                                 }  
                                         }  
                                 }  
                                 else  
                                         ++credits_frames;  
170    
171                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                          total += twopass->nns1.bytes;
172                                  {                                          total_ext += twopass->nns2.bytes;
                                         // this test needs to be corrected..  
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminisize = twopass->nns1.bytes;  
                                 }  
                                 else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                 {  
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminbsize = twopass->nns1.bytes;  
173                                  }                                  }
174                                  else                                  else
175                                  {                                          ++credits_frames;
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminpsize = twopass->nns1.bytes;  
                                 }  
176    
177                                  ++frames;                                  ++frames;
178                          }                          }
179                          twopass->keyframe_locations[i_frames] = frames;                          twopass->keyframe_locations[i_frames] = frames;
180    
181                          twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) /                          twopass->movie_curve = ((double)(total_ext + i_boost_total) / total_ext);
182                                  (bframe_total_ext + pframe_total_ext));                          twopass->average_frame = ((double)(total_ext - i_total) / (frames - credits_frames - i_frames) / twopass->movie_curve);
   
                         if (bframes)  
                                 twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve;  
   
                         if (pframes)  
                                 twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve;  
                         else  
                                 if (bframes)  
                                         twopass->average_pframe = twopass->average_bframe;  // b-frame packed bitstream fix  
                                 else  
                                 {  
                                         DEBUGERR("ERROR:  No p-frames or b-frames were present in the 1st pass.  Rate control cannot function properly!");  
                                         return ICERR_ERROR;  
                                 }  
   
183    
184                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
185                            SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);
186    
187                          // perform prepass to compensate for over/undersizing                          // perform prepass to compensate for over/undersizing
188                          frames = 0;                          frames = 0;
189    
190                          if (codec->config.use_alt_curve)                          if (codec->config.use_alt_curve)
191                          {                          {
192                                  twopass->alt_curve_low = twopass->average_pframe - twopass->average_pframe * (double)codec->config.alt_curve_low_dist / 100.0;                                  twopass->alt_curve_low = twopass->average_frame - twopass->average_frame * (double)codec->config.alt_curve_low_dist / 100.0;
193                                  twopass->alt_curve_low_diff = twopass->average_pframe - twopass->alt_curve_low;                                  twopass->alt_curve_low_diff = twopass->average_frame - twopass->alt_curve_low;
194                                  twopass->alt_curve_high = twopass->average_pframe + twopass->average_pframe * (double)codec->config.alt_curve_high_dist / 100.0;                                  twopass->alt_curve_high = twopass->average_frame + twopass->average_frame * (double)codec->config.alt_curve_high_dist / 100.0;
195                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_pframe;                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_frame;
196                                  if (codec->config.alt_curve_use_auto)                                  if (codec->config.alt_curve_use_auto)
197                                  {                                  {
198                                          if (bframe_total + pframe_total > bframe_total_ext + pframe_total_ext)                                          if (total > total_ext)
199                                          {                                          {
200                                                  codec->config.alt_curve_min_rel_qual = (int)(100.0 - (100.0 - 100.0 /                                                  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);
                                                         ((double)(bframe_total + pframe_total) / (double)(bframe_total_ext + pframe_total_ext))) *  
                                                         (double)codec->config.alt_curve_auto_str / 100.0);  
   
201                                                  if (codec->config.alt_curve_min_rel_qual < 20)                                                  if (codec->config.alt_curve_min_rel_qual < 20)
202                                                          codec->config.alt_curve_min_rel_qual = 20;                                                          codec->config.alt_curve_min_rel_qual = 20;
203                                          }                                          }
# Line 385  Line 212 
212                                          {                                          {
213                                          case 2: // Sine Curve (high aggressiveness)                                          case 2: // Sine Curve (high aggressiveness)
214                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
215                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));
216                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
217                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff));                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff));
218                                                  break;                                                  break;
219                                          case 1: // Linear (medium aggressiveness)                                          case 1: // Linear (medium aggressiveness)
220                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
221                                                          twopass->average_pframe / twopass->alt_curve_low_diff);                                                          twopass->average_frame / twopass->alt_curve_low_diff);
222                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
223                                                          twopass->average_pframe / twopass->alt_curve_low_diff;                                                          twopass->average_frame / twopass->alt_curve_low_diff;
224                                                  break;                                                  break;
225                                          case 0: // Cosine Curve (low aggressiveness)                                          case 0: // Cosine Curve (low aggressiveness)
226                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
227                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff))));
228                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
229                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));
230                                          }                                          }
231                                  }                                  }
232                          }                          }
233    
234                          while (1)                          while (1)
235                          {                          {
236                                  if (twopass->nns_array_pos >= twopass->nns_array_length)                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS) ||
237                                            !ReadFile(twopass->stats2, &twopass->nns2, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))
238                                    {
239                                            DWORD err = GetLastError();
240    
241                                            if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)
242                                  {                                  {
                                         twopass->nns_array_pos = 0;  
243                                          break;                                          break;
244                                  }                                  }
245                                            else
246                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));                                          {
247                                  memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));                                                  CloseHandle(twopass->stats1);
248                                  twopass->nns_array_pos++;                                                  CloseHandle(twopass->stats2);
249                                                    twopass->stats1 = INVALID_HANDLE_VALUE;
250                                                    twopass->stats2 = INVALID_HANDLE_VALUE;
251                                                    DEBUGERR("2pass init error - incomplete stats1/stats2 record?");
252                                                    return ICERR_ERROR;
253                                            }
254                                    }
255    
256                                  if (frames == 0)                                  if (frames == 0)
257                                  {                                  {
                                         twopass->minbsize = (twopass->nns1.kblk + 88) / 8;  
258                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
259                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
                                         if (recminbsize > twopass->minbsize)  
                                                 twopass->minbsize = recminbsize;  
                                         if (recminpsize > twopass->minpsize)  
                                                 twopass->minpsize = recminpsize;  
                                         if (recminisize > twopass->minisize)  
                                                 twopass->minisize = recminisize;  
260                                  }                                  }
261    
                                 // skip unnecessary frames.  
                                 if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_PADFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_DELAYFRAME)  
                                         continue;  
   
262                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
263                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
264                                  {                                  {
265                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;
266                                          total1 += dbytes;                                          total1 += dbytes;
267    
                                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                                 dbytes *= twopass->average_pframe / twopass->average_bframe;  
   
268                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
269                                          {                                          {
270                                                  if (dbytes > twopass->average_pframe)                                                  if (dbytes > twopass->average_frame)
271                                                  {                                                  {
272                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
273                                                                  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 456  Line 277 
277                                                                  {                                                                  {
278                                                                  case 2:                                                                  case 2:
279                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
280                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));
281                                                                          break;                                                                          break;
282                                                                  case 1:                                                                  case 1:
283                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
284                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
285                                                                          break;                                                                          break;
286                                                                  case 0:                                                                  case 0:
287                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
288                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
289                                                                  }                                                                  }
290                                                          }                                                          }
291                                                  }                                                  }
# Line 478  Line 299 
299                                                                  {                                                                  {
300                                                                  case 2:                                                                  case 2:
301                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
302                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));
303                                                                          break;                                                                          break;
304                                                                  case 1:                                                                  case 1:
305                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
306                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
307                                                                          break;                                                                          break;
308                                                                  case 0:                                                                  case 0:
309                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
310                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
311                                                                  }                                                                  }
312                                                          }                                                          }
313                                                  }                                                  }
314                                          }                                          }
315                                          else                                          else
316                                          {                                          {
317                                                  if (dbytes > twopass->average_pframe)                                                  if (dbytes > twopass->average_frame)
318                                                  {                                                  {
319                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
320                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
321                                                  }                                                  }
322                                                  else                                                  else
323                                                  {                                                  {
324                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
325                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
326                                                  }                                                  }
327                                          }                                          }
328    
                                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                         {  
                                                 dbytes2 *= twopass->average_bframe / twopass->average_pframe;  
                                                 if (dbytes2 < twopass->minbsize)  
                                                         dbytes2 = twopass->minbsize;  
                                         }  
                                         else  
                                         {  
329                                                  if (dbytes2 < twopass->minpsize)                                                  if (dbytes2 < twopass->minpsize)
330                                                          dbytes2 = twopass->minpsize;                                                          dbytes2 = twopass->minpsize;
                                         }  
331    
332                                          total2 += dbytes2;                                          total2 += dbytes2;
333                                  }                                  }
# Line 530  Line 342 
342                                  int asymmetric_average_frame;                                  int asymmetric_average_frame;
343                                  char s[100];                                  char s[100];
344    
345                                  asymmetric_average_frame = (int)(twopass->average_pframe * twopass->curve_comp_scale);                                  asymmetric_average_frame = (int)(twopass->average_frame * twopass->curve_comp_scale);
346                                  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);
347                                  DEBUG2P(s);                                  DEBUG2P(s);
348                          }                          }
349    
350                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
351                            SetFilePointer(twopass->stats2, sizeof(DWORD), 0, FILE_BEGIN);
352                  }                  }
353                  else    // DLG_MODE_2PASS_2_INT                  else    // DLG_MODE_2PASS_2_INT
354                  {                  {
355                          while (1)                          while (1)
356                          {                          {
357                                  if (twopass->nns_array_pos >= twopass->nns_array_length)                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))
358                                    {
359                                            DWORD err = GetLastError();
360    
361                                            if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)
362                                  {                                  {
                                         twopass->nns_array_pos = 0;  
363                                          break;                                          break;
364                                  }                                  }
365                                            else
366                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));                                          {
367                                  twopass->nns_array_pos++;                                                  CloseHandle(twopass->stats1);
368                                                    twopass->stats1 = INVALID_HANDLE_VALUE;
369                                  // skip unnecessary frames.                                                  DEBUGERR("2pass init error - incomplete stats2 record?");
370                                  if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||                                                  return ICERR_ERROR;
371                                          twopass->nns1.dd_v & NNSTATS_PADFRAME ||                                          }
372                                          twopass->nns1.dd_v & NNSTATS_DELAYFRAME)                                  }
                                         continue;  
373    
374                                  if (codec_is_in_credits(&codec->config, frames) == CREDITS_START)                                  if (codec_is_in_credits(&codec->config, frames) == CREDITS_START)
375                                  {                                  {
# Line 567  Line 384 
384                                  else if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                  else if (twopass->nns1.quant & NNSTATS_KEYFRAME)
385                                  {                                  {
386                                          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;
387                                            total += twopass->nns1.bytes * codec->config.keyframe_boost / 100;
388                                          twopass->keyframe_locations[i_frames] = frames;                                          twopass->keyframe_locations[i_frames] = frames;
389                                          ++i_frames;                                          ++i_frames;
390                                  }                                  }
                                 else  
                                 {  
                                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                         {  
                                                 bframe_total += twopass->nns1.bytes;  
                                                 bframes++;  
                                         }  
                                         else  
                                         {  
                                                 pframe_total += twopass->nns1.bytes;  
                                                 pframes++;  
                                         }  
                                 }  
391    
392                                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                  total += twopass->nns1.bytes;
                                 {  
                                         // this test needs to be corrected..  
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminisize = twopass->nns1.bytes;  
                                 }  
                                 else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                 {  
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminbsize = twopass->nns1.bytes;  
                                 }  
                                 else  
                                 {  
                                         if (!(twopass->nns1.kblk + twopass->nns1.mblk))  
                                                 recminpsize = twopass->nns1.bytes;  
                                 }  
393    
394                                  ++frames;                                  ++frames;
395                          }                          }
# Line 614  Line 404 
404    
405                                  // credits curve = (total / desired_size) * (100 / credits_rate)                                  // credits curve = (total / desired_size) * (100 / credits_rate)
406                                  twopass->credits_start_curve = twopass->credits_end_curve =                                  twopass->credits_start_curve = twopass->credits_end_curve =
407                                          ((double)(bframe_total + pframe_total + i_total + start + end) / desired) *                                          ((double)total / desired) * ((double)100 / codec->config.credits_rate);
                                         ((double)100 / codec->config.credits_rate);  
408    
409                                  start_curved = (__int64)(start / twopass->credits_start_curve);                                  start_curved = (__int64)(start / twopass->credits_start_curve);
410                                  end_curved = (__int64)(end / twopass->credits_end_curve);                                  end_curved = (__int64)(end / twopass->credits_end_curve);
411    
412                                  // movie curve = (total - credits) / (desired_size - curved credits)                                  // movie curve = (total - credits) / (desired_size - curved credits)
413                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
414                                          (bframe_total + pframe_total + i_total) /                                          (total - start - end) /
415                                          (desired - start_curved - end_curved);                                          (desired - start_curved - end_curved);
416    
417                                  break;                                  break;
# Line 631  Line 420 
420    
421                                  // movie curve = (total - credits) / (desired_size - credits)                                  // movie curve = (total - credits) / (desired_size - credits)
422                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
423                                          (bframe_total + pframe_total + i_total) / (desired - start - end);                                          (total - start - end) / (desired - start - end);
424    
425                                  // aid the average asymmetric frame calculation below                                  // aid the average asymmetric frame calculation below
426                                  start_curved = start;                                  start_curved = start;
# Line 654  Line 443 
443    
444                                  // movie curve = (total - credits) / (desired_size - curved credits)                                  // movie curve = (total - credits) / (desired_size - curved credits)
445                                  twopass->movie_curve = (double)                                  twopass->movie_curve = (double)
446                                          (bframe_total + pframe_total + i_total) /                                          (total - start - end) /
447                                          (desired - start_curved - end_curved);                                          (desired - start_curved - end_curved);
448    
449                                  break;                                  break;
450                          }                          }
451    
452                          twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve;                          // average frame size = (desired - curved credits - curved keyframes) /
453                          twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve;                          //      (frames - credits frames - keyframes)
454                            twopass->average_frame = (double)
455                                    (desired - start_curved - end_curved - (i_total / twopass->movie_curve)) /
456                                    (frames - credits_frames - i_frames);
457    
458                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
459    
460                          // perform prepass to compensate for over/undersizing                          // perform prepass to compensate for over/undersizing
461                          frames = 0;                          frames = 0;
462    
463                          if (codec->config.use_alt_curve)                          if (codec->config.use_alt_curve)
464                          {                          {
465                                  twopass->alt_curve_low = twopass->average_pframe - twopass->average_pframe * (double)codec->config.alt_curve_low_dist / 100.0;                                  twopass->alt_curve_low = twopass->average_frame - twopass->average_frame * (double)codec->config.alt_curve_low_dist / 100.0;
466                                  twopass->alt_curve_low_diff = twopass->average_pframe - twopass->alt_curve_low;                                  twopass->alt_curve_low_diff = twopass->average_frame - twopass->alt_curve_low;
467                                  twopass->alt_curve_high = twopass->average_pframe + twopass->average_pframe * (double)codec->config.alt_curve_high_dist / 100.0;                                  twopass->alt_curve_high = twopass->average_frame + twopass->average_frame * (double)codec->config.alt_curve_high_dist / 100.0;
468                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_pframe;                                  twopass->alt_curve_high_diff = twopass->alt_curve_high - twopass->average_frame;
469                                  if (codec->config.alt_curve_use_auto)                                  if (codec->config.alt_curve_use_auto)
470                                  {                                  {
471                                          if (twopass->movie_curve > 1.0)                                          if (twopass->movie_curve > 1.0)
# Line 693  Line 485 
485                                          {                                          {
486                                          case 2: // Sine Curve (high aggressiveness)                                          case 2: // Sine Curve (high aggressiveness)
487                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
488                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));
489                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
490                                                          sin(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff));                                                          sin(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff));
491                                                  break;                                                  break;
492                                          case 1: // Linear (medium aggressiveness)                                          case 1: // Linear (medium aggressiveness)
493                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
494                                                          twopass->average_pframe / twopass->alt_curve_low_diff);                                                          twopass->average_frame / twopass->alt_curve_low_diff);
495                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
496                                                          twopass->average_pframe / twopass->alt_curve_low_diff;                                                          twopass->average_frame / twopass->alt_curve_low_diff;
497                                                  break;                                                  break;
498                                          case 0: // Cosine Curve (low aggressiveness)                                          case 0: // Cosine Curve (low aggressiveness)
499                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +                                                  twopass->alt_curve_qual_dev *= 2.0 / (1.0 +
500                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff))));
501                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *                                                  twopass->alt_curve_mid_qual = 1.0 - twopass->alt_curve_qual_dev *
502                                                          (1.0 - cos(DEG2RAD * (twopass->average_pframe * 90.0 / twopass->alt_curve_low_diff)));                                                          (1.0 - cos(DEG2RAD * (twopass->average_frame * 90.0 / twopass->alt_curve_low_diff)));
503                                          }                                          }
504                                  }                                  }
505                          }                          }
506    
507                          while (1)                          while (1)
508                          {                          {
509                                  if (twopass->nns_array_pos >= twopass->nns_array_length)                                  if (!ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, NULL) || read != sizeof(NNSTATS))
510                                    {
511                                            DWORD err = GetLastError();
512    
513                                            if (err == ERROR_HANDLE_EOF || err == ERROR_SUCCESS)
514                                  {                                  {
                                         twopass->nns_array_pos = 0;  
515                                          break;                                          break;
516                                  }                                  }
517                                            else
518                                  memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));                                          {
519                                  twopass->nns_array_pos++;                                                  CloseHandle(twopass->stats1);
520                                                    twopass->stats1 = INVALID_HANDLE_VALUE;
521                                                    DEBUGERR("2pass init error - incomplete stats2 record?");
522                                                    return ICERR_ERROR;
523                                            }
524                                    }
525    
526                                  if (frames == 0)                                  if (frames == 0)
527                                  {                                  {
                                         twopass->minbsize = (twopass->nns1.kblk + 88) / 8;  
528                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;                                          twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
529                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;                                          twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
                                         if (recminbsize > twopass->minbsize)  
                                                 twopass->minbsize = recminbsize;  
                                         if (recminpsize > twopass->minpsize)  
                                                 twopass->minpsize = recminpsize;  
                                         if (recminisize > twopass->minisize)  
                                                 twopass->minisize = recminisize;  
530                                  }                                  }
531    
                                 // skip unnecessary frames.  
                                 if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_PADFRAME ||  
                                         twopass->nns1.dd_v & NNSTATS_DELAYFRAME)  
                                         continue;  
   
532                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
533                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
534                                  {                                  {
535                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;
536                                          total1 += dbytes;                                          total1 += dbytes;
537    
                                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                                 dbytes *= twopass->average_pframe / twopass->average_bframe;  
   
538                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
539                                          {                                          {
540                                                  if (dbytes > twopass->average_pframe)                                                  if (dbytes > twopass->average_frame)
541                                                  {                                                  {
542                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
543                                                                  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 763  Line 547 
547                                                                  {                                                                  {
548                                                                  case 2:                                                                  case 2:
549                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
550                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));
551                                                                          break;                                                                          break;
552                                                                  case 1:                                                                  case 1:
553                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
554                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
555                                                                          break;                                                                          break;
556                                                                  case 0:                                                                  case 0:
557                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
558                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
559                                                                  }                                                                  }
560                                                          }                                                          }
561                                                  }                                                  }
# Line 785  Line 569 
569                                                                  {                                                                  {
570                                                                  case 2:                                                                  case 2:
571                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
572                                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));                                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));
573                                                                          break;                                                                          break;
574                                                                  case 1:                                                                  case 1:
575                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
576                                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
577                                                                          break;                                                                          break;
578                                                                  case 0:                                                                  case 0:
579                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
580                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
581                                                                  }                                                                  }
582                                                          }                                                          }
583                                                  }                                                  }
584                                          }                                          }
585                                          else                                          else
586                                          {                                          {
587                                                  if (dbytes > twopass->average_pframe)                                                  if (dbytes > twopass->average_frame)
588                                                  {                                                  {
589                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
590                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
591                                                  }                                                  }
592                                                  else                                                  else
593                                                  {                                                  {
594                                                          dbytes2 = ((double)dbytes + (twopass->average_pframe - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
595                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
596                                                  }                                                  }
597                                          }                                          }
598    
                                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                         {  
                                                 dbytes2 *= twopass->average_bframe / twopass->average_pframe;  
                                                 if (dbytes2 < twopass->minbsize)  
                                                         dbytes2 = twopass->minbsize;  
                                         }  
                                         else  
                                         {  
599                                                  if (dbytes2 < twopass->minpsize)                                                  if (dbytes2 < twopass->minpsize)
600                                                          dbytes2 = twopass->minpsize;                                                          dbytes2 = twopass->minpsize;
                                         }  
601    
602                                          total2 += dbytes2;                                          total2 += dbytes2;
603                                  }                                  }
# Line 837  Line 612 
612                                  int asymmetric_average_frame;                                  int asymmetric_average_frame;
613                                  char s[100];                                  char s[100];
614    
615                                  asymmetric_average_frame = (int)(twopass->average_pframe * twopass->curve_comp_scale);                                  asymmetric_average_frame = (int)(twopass->average_frame * twopass->curve_comp_scale);
616                                  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);
617                                  DEBUG2P(s);                                  DEBUG2P(s);
618                          }                          }
619    
620                            SetFilePointer(twopass->stats1, sizeof(DWORD), 0, FILE_BEGIN);
621                  }                  }
622    
623                  if (codec->config.use_alt_curve)                  if (codec->config.use_alt_curve)
# Line 859  Line 636 
636                                  int i, newquant, percent;                                  int i, newquant, percent;
637                                  int oldquant = 1;                                  int oldquant = 1;
638    
639                                  wsprintf(s, "avg scaled framesize:%i", (int)(twopass->average_pframe));                                  wsprintf(s, "avg scaled framesize:%i", (int)(twopass->average_frame));
640                                  DEBUG2P(s);                                  DEBUG2P(s);
641    
642                                  wsprintf(s, "bias bonus:%i bytes", (int)(twopass->curve_bias_bonus));                                  wsprintf(s, "bias bonus:%i bytes", (int)(twopass->curve_bias_bonus));
# Line 868  Line 645 
645                                  for (i=1; i <= (int)(twopass->alt_curve_high*2)+1; i++)                                  for (i=1; i <= (int)(twopass->alt_curve_high*2)+1; i++)
646                                  {                                  {
647                                          dbytes = i;                                          dbytes = i;
648                                          if (dbytes > twopass->average_pframe)                                          if (dbytes > twopass->average_frame)
649                                          {                                          {
650                                                  if (dbytes >= twopass->alt_curve_high)                                                  if (dbytes >= twopass->alt_curve_high)
651                                                          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 878  Line 655 
655                                                          {                                                          {
656                                                          case 2:                                                          case 2:
657                                                          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 *
658                                                                  sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff)));                                                                  sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)));
659                                                                  break;                                                                  break;
660                                                          case 1:                                                          case 1:
661                                                          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 *
662                                                                  (dbytes - twopass->average_pframe) / twopass->alt_curve_high_diff);                                                                  (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
663                                                                  break;                                                                  break;
664                                                          case 0:                                                          case 0:
665                                                          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 *
666                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_high_diff))));                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
667                                                          }                                                          }
668                                                  }                                                  }
669                                          }                                          }
# Line 900  Line 677 
677                                                          {                                                          {
678                                                          case 2:                                                          case 2:
679                                                          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 *
680                                                                  sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));                                                                  sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));
681                                                                  break;                                                                  break;
682                                                          case 1:                                                          case 1:
683                                                          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 *
684                                                                  (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);                                                                  (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
685                                                                  break;                                                                  break;
686                                                          case 0:                                                          case 0:
687                                                          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 *
688                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));                                                                  (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
689                                                          }                                                          }
690                                                  }                                                  }
691                                          }                                          }
# Line 922  Line 699 
699                                                  if (newquant != oldquant)                                                  if (newquant != oldquant)
700                                                  {                                                  {
701                                                          oldquant = newquant;                                                          oldquant = newquant;
702                                                          percent = (int)((i - twopass->average_pframe) * 100.0 / twopass->average_pframe);                                                          percent = (int)((i - twopass->average_frame) * 100.0 / twopass->average_frame);
703                                                          wsprintf(s, "quant:%i threshold at %i : %i percent", newquant, i, percent);                                                          wsprintf(s, "quant:%i threshold at %i : %i percent", newquant, i, percent);
704                                                          DEBUG2P(s);                                                          DEBUG2P(s);
705                                                  }                                                  }
# Line 942  Line 719 
719          return ICERR_OK;          return ICERR_OK;
720  }  }
721    
722  // NOTE: codec_2pass_get_quant() should be called for all the frames that are in the stats file(s)  
723  int codec_2pass_get_quant(CODEC* codec, XVID_ENC_FRAME* frame)  int codec_2pass_get_quant(CODEC* codec, XVID_ENC_FRAME* frame)
724  {  {
725          static double bquant_error[32];          static double quant_error[32];
         static double pquant_error[32];  
726          static double curve_comp_error;          static double curve_comp_error;
727          static int last_bquant, last_pquant;          static int last_quant;
728    
729          TWOPASS * twopass = &codec->twopass;          TWOPASS * twopass = &codec->twopass;
730    
731  //      DWORD read;          DWORD read;
732          int bytes1, bytes2;          int bytes1, bytes2;
733          int overflow;          int overflow;
734          int credits_pos;          int credits_pos;
# Line 965  Line 741 
741    
742                  for (i=0 ; i<32 ; ++i)                  for (i=0 ; i<32 ; ++i)
743                  {                  {
744                          bquant_error[i] = 0.0;                          quant_error[i] = 0.0;
                         pquant_error[i] = 0.0;  
745                          twopass->quant_count[i] = 0;                          twopass->quant_count[i] = 0;
746                  }                  }
747    
748                  curve_comp_error = 0.0;                  curve_comp_error = 0.0;
749                  last_bquant = 0;                  last_quant = 0;
                 last_pquant = 0;  
750          }          }
751    
752          if (twopass->nns_array_pos >= twopass->nns_array_length)          if (ReadFile(twopass->stats1, &twopass->nns1, sizeof(NNSTATS), &read, 0) == 0 || read != sizeof(NNSTATS))
753          {          {
754                  twopass->nns_array_pos = 0;                  DEBUGERR("2ndpass quant: couldn't read from stats1");
                 DEBUGERR("ERROR: VIDEO EXCEEDS 1ST PASS!!!");  
755                  return ICERR_ERROR;                  return ICERR_ERROR;
756          }          }
   
         memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));  
757          if (codec->config.mode == DLG_MODE_2PASS_2_EXT)          if (codec->config.mode == DLG_MODE_2PASS_2_EXT)
                 memcpy(&twopass->nns2, &twopass->nns2_array[twopass->nns_array_pos], sizeof(NNSTATS));  
         twopass->nns_array_pos++;  
   
         bytes1 = twopass->nns1.bytes;  
   
         // skip unnecessary frames.  
         if (twopass->nns1.dd_v & NNSTATS_SKIPFRAME)  
758          {          {
759                  twopass->bytes1 = bytes1;                  if (ReadFile(twopass->stats2, &twopass->nns2, sizeof(NNSTATS), &read, 0) == 0 || read != sizeof(NNSTATS))
                 twopass->bytes2 = bytes1;  
                 twopass->desired_bytes2 = bytes1;  
                 frame->intra = 3;  
                 return 2;  
         }  
         else if (twopass->nns1.dd_v & NNSTATS_PADFRAME)  
760          {          {
761                  twopass->bytes1 = bytes1;                          DEBUGERR("2ndpass quant: couldn't read from stats2");
762                  twopass->bytes2 = bytes1;                          return ICERR_ERROR;
                 twopass->desired_bytes2 = bytes1;  
                 frame->intra = 4;  
                 return 2;  
763          }          }
         else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME)  
         {  
                 twopass->bytes1 = bytes1;  
                 twopass->bytes2 = bytes1;  
                 twopass->desired_bytes2 = bytes1;  
                 frame->intra = 5;  
                 return 2;  
764          }          }
765    
766            bytes1 = twopass->nns1.bytes;
767          overflow = twopass->overflow / 8;          overflow = twopass->overflow / 8;
768    
769          // override codec i-frame choice (reenable in credits)          // override codec i-frame choice (reenable in credits)
770          if (twopass->nns1.quant & NNSTATS_KEYFRAME)          frame->intra = (twopass->nns1.quant & NNSTATS_KEYFRAME);
                 frame->intra=1;  
         else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                 frame->intra=2;  
         else  
                 frame->intra=0;  
771    
772          if (frame->intra==1)          if (frame->intra)
773          {          {
774                  overflow = 0;                  overflow = 0;
775          }          }
# Line 1077  Line 821 
821                          {                          {
822                                  if (codec->config.credits_quant_i != codec->config.credits_quant_p)                                  if (codec->config.credits_quant_i != codec->config.credits_quant_p)
823                                  {                                  {
824                                          frame->quant = frame->intra == 1 ?                                          frame->quant = frame->intra ?
825                                                  codec->config.credits_quant_i :                                                  codec->config.credits_quant_i :
826                                                  codec->config.credits_quant_p;                                                  codec->config.credits_quant_p;
827                                  }                                  }
# Line 1102  Line 846 
846    
847                  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;
848    
849                  if (frame->intra==1)                  if (frame->intra)
850                  {                  {
851                          dbytes = ((int)(bytes2 + bytes2 * codec->config.keyframe_boost / 100)) /                          dbytes = ((int)(bytes2 + bytes2 * codec->config.keyframe_boost / 100)) /
852                                  twopass->movie_curve;                                  twopass->movie_curve;
# Line 1112  Line 856 
856                          dbytes = bytes2 / twopass->movie_curve;                          dbytes = bytes2 / twopass->movie_curve;
857                  }                  }
858    
                 if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                         dbytes *= twopass->average_pframe / twopass->average_bframe;  
   
859                  // spread the compression error across payback_delay frames                  // spread the compression error across payback_delay frames
860                  if (codec->config.bitrate_payback_method == 0)                  if (codec->config.bitrate_payback_method == 0)
861                  {                  {
# Line 1123  Line 864 
864                  else                  else
865                  {                  {
866                          bytes2 = (int)(curve_comp_error * dbytes /                          bytes2 = (int)(curve_comp_error * dbytes /
867                                  twopass->average_pframe / codec->config.bitrate_payback_delay);                                  twopass->average_frame / codec->config.bitrate_payback_delay);
868    
869                          if (labs(bytes2) > fabs(curve_comp_error))                          if (labs(bytes2) > fabs(curve_comp_error))
870                          {                          {
# Line 1135  Line 876 
876    
877                  if (codec->config.use_alt_curve)                  if (codec->config.use_alt_curve)
878                  {                  {
879                          if (!(frame->intra==1))                          if (!frame->intra)
880                          {                          {
881                                  if (dbytes > twopass->average_pframe)                                  if (dbytes > twopass->average_frame)
882                                  {                                  {
883                                          if (dbytes >= twopass->alt_curve_high)                                          if (dbytes >= twopass->alt_curve_high)
884                                                  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 1147  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_pframe) * 90.0 / twopass->alt_curve_high_diff)));                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_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_pframe) / twopass->alt_curve_high_diff);                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_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_pframe) * 90.0 / twopass->alt_curve_high_diff))));                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
900                                                  }                                                  }
901                                          }                                          }
902                                  }                                  }
# Line 1169  Line 910 
910                                                  {                                                  {
911                                                  case 2:                                                  case 2:
912                                                  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 *
913                                                          sin(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff)));                                                          sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)));
914                                                          break;                                                          break;
915                                                  case 1:                                                  case 1:
916                                                  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 *
917                                                          (dbytes - twopass->average_pframe) / twopass->alt_curve_low_diff);                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
918                                                          break;                                                          break;
919                                                  case 0:                                                  case 0:
920                                                  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 *
921                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_pframe) * 90.0 / twopass->alt_curve_low_diff))));                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
922                                                  }                                                  }
923                                          }                                          }
924                                  }                                  }
                                 if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                         curve_temp *= twopass->average_bframe / twopass->average_pframe;  
   
925                                  curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;                                  curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;
926    
927                                  bytes2 += ((int)curve_temp);                                  bytes2 += ((int)curve_temp);
# Line 1191  Line 929 
929                          }                          }
930                          else                          else
931                          {                          {
                                 if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                         dbytes *= twopass->average_bframe / twopass->average_pframe;  
   
                                 bytes2 += ((int)dbytes);  
932                                  curve_comp_error += dbytes - ((int)dbytes);                                  curve_comp_error += dbytes - ((int)dbytes);
933                                    bytes2 += ((int)dbytes);
934                          }                          }
935                  }                  }
936                  else if ((codec->config.curve_compression_high + codec->config.curve_compression_low) &&                  else if ((codec->config.curve_compression_high + codec->config.curve_compression_low) &&
937                          !(frame->intra==1))                          !frame->intra)
938                  {                  {
939                          if (dbytes > twopass->average_pframe)                          if (dbytes > twopass->average_frame)
940                          {                          {
941                                  curve_temp = twopass->curve_comp_scale *                                  curve_temp = twopass->curve_comp_scale *
942                                          ((double)dbytes + (twopass->average_pframe - dbytes) *                                          ((double)dbytes + (twopass->average_frame - dbytes) *
943                                          codec->config.curve_compression_high / 100.0);                                          codec->config.curve_compression_high / 100.0);
944                          }                          }
945                          else                          else
946                          {                          {
947                                  curve_temp = twopass->curve_comp_scale *                                  curve_temp = twopass->curve_comp_scale *
948                                          ((double)dbytes + (twopass->average_pframe - dbytes) *                                          ((double)dbytes + (twopass->average_frame - dbytes) *
949                                          codec->config.curve_compression_low / 100.0);                                          codec->config.curve_compression_low / 100.0);
950                          }                          }
951    
                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                 curve_temp *= twopass->average_bframe / twopass->average_pframe;  
   
952                          bytes2 += ((int)curve_temp);                          bytes2 += ((int)curve_temp);
953                          curve_comp_error += curve_temp - ((int)curve_temp);                          curve_comp_error += curve_temp - ((int)curve_temp);
954                  }                  }
955                  else                  else
956                  {                  {
                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                                 dbytes *= twopass->average_bframe / twopass->average_pframe;  
   
                         bytes2 += ((int)dbytes);  
957                          curve_comp_error += dbytes - ((int)dbytes);                          curve_comp_error += dbytes - ((int)dbytes);
958                            bytes2 += ((int)dbytes);
959                  }                  }
960    
961                  // cap bytes2 to first pass size, lowers number of quant=1 frames                  if (frame->intra)
                 if (bytes2 > bytes1)  
                 {  
                         curve_comp_error += bytes2 - bytes1;  
                         bytes2 = bytes1;  
                 }  
                 else  
                 {  
                         if (frame->intra==1)  
962                          {                          {
963                                  if (bytes2 < twopass->minisize)                                  if (bytes2 < twopass->minisize)
964                                  {                                  {
# Line 1245  Line 966 
966                                          bytes2 = twopass->minisize;                                          bytes2 = twopass->minisize;
967                                  }                                  }
968                          }                          }
                         else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                         {  
                                 if (bytes2 < twopass->minbsize)  
                                         bytes2 = twopass->minbsize;  
                         }  
969                          else                          else
970                          {                          {
971                                  if (bytes2 < twopass->minpsize)                          // cap bytes2 to first pass size, lowers number of quant=1 frames
972                                          bytes2 = twopass->minpsize;                          if (bytes2 > bytes1)
973                            {
974                                    curve_comp_error += bytes2 - bytes1;
975                                    bytes2 = bytes1;
976                          }                          }
977                            else if (bytes2 < twopass->minpsize)
978                                    bytes2 = twopass->minpsize;
979                  }                  }
980          }          }
981    
# Line 1262  Line 983 
983    
984          // if this keyframe is too close to the next,          // if this keyframe is too close to the next,
985          // reduce it's byte allotment          // reduce it's byte allotment
986          if ((frame->intra==1) && !credits_pos)          if (frame->intra && !credits_pos)
987          {          {
988                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -
989                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];
# Line 1288  Line 1009 
1009    
1010          // 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
1011          // too much/little bitrate          // too much/little bitrate
1012          overflow = (int)((double)overflow * bytes2 / twopass->average_pframe);          overflow = (int)((double)overflow * bytes2 / twopass->average_frame *
1013                    (bytes1 - bytes2) / bytes1);
1014    
1015          // Foxer: reign in overflow with huge frames          // Foxer: reign in overflow with huge frames
1016          if (labs(overflow) > labs(twopass->overflow))          if (labs(overflow) > labs(twopass->overflow))
# Line 1317  Line 1039 
1039                  bytes2 = twopass->max_framesize;                  bytes2 = twopass->max_framesize;
1040          }          }
1041    
1042          // make sure to not scale below the minimum framesize          if (bytes2 < 1)
         if (twopass->nns1.quant & NNSTATS_KEYFRAME)  
         {  
                 if (bytes2 < twopass->minisize)  
                         bytes2 = twopass->minisize;  
         }  
         else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
         {  
                 if (bytes2 < twopass->minbsize)  
                         bytes2 = twopass->minbsize;  
         }  
         else  
1043          {          {
1044                  if (bytes2 < twopass->minpsize)                  bytes2 = 1;
                         bytes2 = twopass->minpsize;  
1045          }          }
1046    
1047          twopass->bytes1 = bytes1;          twopass->bytes1 = bytes1;
# Line 1348  Line 1058 
1058          {          {
1059                  frame->quant = 31;                  frame->quant = 31;
1060          }          }
1061          else if (!(frame->intra==1))          else if (!frame->intra)
1062          {          {
1063                  // Foxer: aid desired quantizer precision by accumulating decision error                  // Foxer: aid desired quantizer precision by accumulating decision error
1064                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)                  quant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *
                 {  
                         bquant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *  
1065                                  bytes1) / bytes2) - frame->quant;                                  bytes1) / bytes2) - frame->quant;
1066    
1067                          if (bquant_error[frame->quant] >= 1.0)                  if (quant_error[frame->quant] >= 1.0)
1068                          {                          {
1069                                  bquant_error[frame->quant] -= 1.0;                          quant_error[frame->quant] -= 1.0;
1070                                  ++frame->quant;                                  ++frame->quant;
1071                          }                          }
1072                  }                  }
                 else  
                 {  
                         pquant_error[frame->quant] += ((double)((twopass->nns1.quant & ~NNSTATS_KEYFRAME) *  
                                 bytes1) / bytes2) - frame->quant;  
   
                         if (pquant_error[frame->quant] >= 1.0)  
                         {  
                                 pquant_error[frame->quant] -= 1.0;  
                                 ++frame->quant;  
                         }  
                 }  
         }  
1073    
1074          // we're done with credits          // we're done with credits
1075          if (codec_is_in_credits(&codec->config, codec->framenum))          if (codec_is_in_credits(&codec->config, codec->framenum))
# Line 1381  Line 1077 
1077                  return ICERR_OK;                  return ICERR_OK;
1078          }          }
1079    
1080          if ((frame->intra==1))          if (frame->intra)
1081          {          {
1082                  if (frame->quant < codec->config.min_iquant)                  if (frame->quant < codec->config.min_iquant)
1083                  {                  {
# Line 1406  Line 1102 
1102                  }                  }
1103    
1104                  // subsequent frame quants can only be +- 2                  // subsequent frame quants can only be +- 2
1105                  if ((last_pquant || last_bquant) && capped_to_max_framesize == 0)                  if (last_quant && capped_to_max_framesize == 0)
                 {  
                         if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                         {  
                                 // this bframe quantizer variation  
                                 // restriction needs to be redone.  
                                 if (frame->quant > last_bquant + 2)  
                                 {  
                                         frame->quant = last_bquant + 2;  
                                         DEBUG2P("B-frame quantizer prevented from rising too steeply");  
                                 }  
                                 if (frame->quant < last_bquant - 2)  
                                 {  
                                         frame->quant = last_bquant - 2;  
                                         DEBUG2P("B-frame quantizer prevented from falling too steeply");  
                                 }  
                         }  
                         else  
1106                          {                          {
1107                                  if (frame->quant > last_pquant + 2)                          if (frame->quant > last_quant + 2)
1108                                  {                                  {
1109                                          frame->quant = last_pquant + 2;                                  frame->quant = last_quant + 2;
1110                                          DEBUG2P("P-frame quantizer prevented from rising too steeply");                                          DEBUG2P("P-frame quantizer prevented from rising too steeply");
1111                                  }                                  }
1112                                  if (frame->quant < last_pquant - 2)                          if (frame->quant < last_quant - 2)
1113                                  {                                  {
1114                                          frame->quant = last_pquant - 2;                                  frame->quant = last_quant - 2;
1115                                          DEBUG2P("P-frame quantizer prevented from falling too steeply");                                          DEBUG2P("P-frame quantizer prevented from falling too steeply");
1116                                  }                                  }
1117                          }                          }
1118                  }                  }
         }  
1119    
1120          if (capped_to_max_framesize == 0)          if (capped_to_max_framesize == 0)
1121          {                  last_quant = frame->quant;
                 if (twopass->nns1.quant & NNSTATS_KEYFRAME)  
                 {  
                         last_bquant = frame->quant;  
                         last_pquant = frame->quant;  
                 }  
                 else if (twopass->nns1.dd_v & NNSTATS_BFRAME)  
                         last_bquant = frame->quant;  
                 else  
                         last_pquant = frame->quant;  
         }  
1122    
1123          if (codec->config.quant_type == QUANT_MODE_MOD)          if (codec->config.quant_type == QUANT_MODE_MOD)
1124          {          {
1125                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
1126                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
1127          }          }
1128  /*  
         if (codec->config.quant_type == QUANT_MODE_MOD_NEW)  
         {  
                 frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT;  
                 frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT;  
         }  
 */  
1129          return ICERR_OK;          return ICERR_OK;
1130  }  }
1131    
# Line 1476  Line 1138 
1138          DWORD wrote;          DWORD wrote;
1139          int credits_pos, tempdiv;          int credits_pos, tempdiv;
1140          char* quant_type;          char* quant_type;
         char* frame_type;  
1141    
1142          if (codec->framenum == 0)          if (codec->framenum == 0)
1143          {          {
# Line 1500  Line 1161 
1161    
1162  //              nns1.quant = stats->quant;  //              nns1.quant = stats->quant;
1163                  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
1164                  nns1.lum_noise[0] = nns1.lum_noise[1] = 1;                  if (frame->intra)
1165                  frame_type="inter";                  {
                 if (frame->intra==1) {  
1166                          nns1.quant |= NNSTATS_KEYFRAME;                          nns1.quant |= NNSTATS_KEYFRAME;
                         frame_type="intra";  
                 }  
                 else if (frame->intra==2) {  
                         nns1.dd_v |= NNSTATS_BFRAME;  
                         frame_type="bframe";  
                 }  
                 else if (frame->intra==3) {  
                         nns1.dd_v |= NNSTATS_SKIPFRAME;  
                         frame_type="skiped";  
                 }  
                 else if (frame->intra==4) {  
                         nns1.dd_v |= NNSTATS_PADFRAME;  
                         frame_type="padded";  
                 }  
                 else if (frame->intra==5) {  
                         nns1.dd_v |= NNSTATS_DELAYFRAME;  
                         frame_type="delayed";  
1167                  }                  }
1168                  nns1.kblk = stats->kblks;                  nns1.kblk = stats->kblks;
1169                  nns1.mblk = stats->mblks;                  nns1.mblk = stats->mblks;
1170                  nns1.ublk = stats->ublks;                  nns1.ublk = stats->ublks;
1171                    nns1.lum_noise[0] = nns1.lum_noise[1] = 1;
1172    
1173                  total_size += frame->length;                  total_size += frame->length;
1174    
1175                  DEBUG1ST(frame->length, (int)total_size/1024, frame_type, frame->quant, quant_type, stats->kblks, stats->mblks)                  DEBUG1ST(frame->length, (int)total_size/1024, frame->intra, frame->quant, quant_type, stats->kblks, stats->mblks)
   
1176    
1177                  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))
1178                  {                  {
# Line 1541  Line 1184 
1184          case DLG_MODE_2PASS_2_INT :          case DLG_MODE_2PASS_2_INT :
1185          case DLG_MODE_2PASS_2_EXT :          case DLG_MODE_2PASS_2_EXT :
1186                  credits_pos = codec_is_in_credits(&codec->config, codec->framenum);                  credits_pos = codec_is_in_credits(&codec->config, codec->framenum);
                 if (!(codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) &&  
                         !(codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) &&  
                         !(codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME))  
                 {  
1187                          if (!credits_pos)                          if (!credits_pos)
1188                          {                          {
1189                                  codec->twopass.quant_count[frame->quant]++;                                  codec->twopass.quant_count[frame->quant]++;
# Line 1592  Line 1231 
1231                                  codec->twopass.KFoverflow_partial = 0;                                  codec->twopass.KFoverflow_partial = 0;
1232                                  // end of ugly fix.                                  // end of ugly fix.
1233                          }                          }
                 }  
1234    
1235                  frame_type="inter";                  DEBUG2ND(frame->quant, quant_type, frame->intra, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)
                 if (frame->intra==1) {  
                         frame_type="intra";  
                 }  
                 else if (codec->twopass.nns1.dd_v & NNSTATS_BFRAME) {  
                         frame_type="bframe";  
                 }  
                 else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) {  
                         frame_type="skipped";  
                         frame->quant = 2;  
                         codec->twopass.bytes1 = 1;  
                         codec->twopass.desired_bytes2 = 1;  
                         frame->length = 1;  
                 }  
                 else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) {  
                         frame_type="padded";  
                         frame->quant = 2;  
                         codec->twopass.bytes1 = 7;  
                         codec->twopass.desired_bytes2 = 7;  
                         frame->length = 7;  
                 }  
                 else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) {  
                         frame_type="delayed";  
                         frame->quant = 2;  
                         codec->twopass.bytes1 = 1;  
                         codec->twopass.desired_bytes2 = 1;  
                         frame->length = 1;  
                 }  
   
                 DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)  
1236                  break;                  break;
1237    
1238          default:          default:
# Line 1637  Line 1246 
1246  {  {
1247          int i;          int i;
1248          char s[100];          char s[100];
   
         if (codec->twopass.nns1_array)  
         {  
                 free(codec->twopass.nns1_array);  
                 codec->twopass.nns1_array = NULL;  
         }  
         if (codec->twopass.nns2_array)  
         {  
                 free(codec->twopass.nns2_array);  
                 codec->twopass.nns2_array = NULL;  
         }  
         codec->twopass.nns_array_size = 0;  
         codec->twopass.nns_array_length = 0;  
         codec->twopass.nns_array_pos = 0;  
   
1249          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)
1250          {          {
1251                  // output the quantizer distribution for this encode.                  // output the quantizer distribution for this encode.

Legend:
Removed from v.1.7.2.4  
changed lines
  Added in v.1.10

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