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

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

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

revision 527, Mon Sep 23 06:10:43 2002 UTC revision 528, Mon Sep 23 06:11:34 2002 UTC
# Line 47  Line 47 
47    
48          double total1 = 0.0;          double total1 = 0.0;
49          double total2 = 0.0;          double total2 = 0.0;
50            double dbytes, dbytes2;
51    
52          if (codec->config.hinted_me)          if (codec->config.hinted_me)
53          {          {
# Line 161  Line 162 
162                                  {                                  {
163                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)                                          if (twopass->nns1.quant & NNSTATS_KEYFRAME)
164                                          {                                          {
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;                                                  i_total += twopass->nns2.bytes;
167                                                  twopass->keyframe_locations[i_frames] = frames;                                                  twopass->keyframe_locations[i_frames] = frames;
168                                                  ++i_frames;                                                  ++i_frames;
# Line 252  Line 253 
253                                          }                                          }
254                                  }                                  }
255    
256                                    if (frames == 0)
257                                    {
258                                            twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
259                                            twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
260                                    }
261    
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                                          double dbytes = twopass->nns2.bytes / twopass->movie_curve;                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;
266                                          total1 += dbytes;                                          total1 += dbytes;
267    
268                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
# Line 263  Line 270 
270                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
271                                                  {                                                  {
272                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
273                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
274                                                          else                                                          else
275                                                          {                                                          {
276                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
277                                                                  {                                                                  {
278                                                                  case 2:                                                                  case 2:
279                                                                  total2 += 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_frame) * 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                                                                  total2 += 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_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
285                                                                          break;                                                                          break;
286                                                                  case 0:                                                                  case 0:
287                                                                  total2 += 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_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
289                                                                  }                                                                  }
290                                                          }                                                          }
# Line 285  Line 292 
292                                                  else                                                  else
293                                                  {                                                  {
294                                                          if (dbytes <= twopass->alt_curve_low)                                                          if (dbytes <= twopass->alt_curve_low)
295                                                                  total2 += dbytes;                                                                  dbytes2 = dbytes;
296                                                          else                                                          else
297                                                          {                                                          {
298                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
299                                                                  {                                                                  {
300                                                                  case 2:                                                                  case 2:
301                                                                  total2 += 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_frame) * 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                                                                  total2 += 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_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
307                                                                          break;                                                                          break;
308                                                                  case 0:                                                                  case 0:
309                                                                  total2 += 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_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
311                                                                  }                                                                  }
312                                                          }                                                          }
# Line 309  Line 316 
316                                          {                                          {
317                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
318                                                  {                                                  {
319                                                          total2 += ((double)dbytes + (twopass->average_frame - 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                                                          total2 += ((double)dbytes + (twopass->average_frame - 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    
329                                            if (dbytes2 < twopass->minpsize)
330                                                    dbytes2 = twopass->minpsize;
331    
332                                            total2 += dbytes2;
333                                  }                                  }
334    
335                                  ++frames;                                  ++frames;
# Line 511  Line 523 
523                                          }                                          }
524                                  }                                  }
525    
526                                    if (frames == 0)
527                                    {
528                                            twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
529                                            twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
530                                    }
531    
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                                          double dbytes = twopass->nns1.bytes / twopass->movie_curve;                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;
536                                          total1 += dbytes;                                          total1 += dbytes;
537    
538                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
# Line 522  Line 540 
540                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
541                                                  {                                                  {
542                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
543                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
544                                                          else                                                          else
545                                                          {                                                          {
546                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
547                                                                  {                                                                  {
548                                                                  case 2:                                                                  case 2:
549                                                                  total2 += 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_frame) * 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                                                                  total2 += 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_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
555                                                                          break;                                                                          break;
556                                                                  case 0:                                                                  case 0:
557                                                                  total2 += 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_frame) * 90.0 / twopass->alt_curve_high_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))));
559                                                                  }                                                                  }
560                                                          }                                                          }
# Line 544  Line 562 
562                                                  else                                                  else
563                                                  {                                                  {
564                                                          if (dbytes <= twopass->alt_curve_low)                                                          if (dbytes <= twopass->alt_curve_low)
565                                                                  total2 += dbytes;                                                                  dbytes2 = dbytes;
566                                                          else                                                          else
567                                                          {                                                          {
568                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
569                                                                  {                                                                  {
570                                                                  case 2:                                                                  case 2:
571                                                                  total2 += 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_frame) * 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                                                                  total2 += 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_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
577                                                                          break;                                                                          break;
578                                                                  case 0:                                                                  case 0:
579                                                                  total2 += 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_frame) * 90.0 / twopass->alt_curve_low_diff))));                                                                          (1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))));
581                                                                  }                                                                  }
582                                                          }                                                          }
# Line 568  Line 586 
586                                          {                                          {
587                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
588                                                  {                                                  {
589                                                          total2 += ((double)dbytes + (twopass->average_frame - 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                                                          total2 += ((double)dbytes + (twopass->average_frame - 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    
599                                            if (dbytes2 < twopass->minpsize)
600                                                    dbytes2 = twopass->minpsize;
601    
602                                            total2 += dbytes2;
603                                  }                                  }
604    
605                                  ++frames;                                  ++frames;
# Line 794  Line 817 
817                  }                  }
818                  else    // DLG_MODE_2PASS_2_EXT                  else    // DLG_MODE_2PASS_2_EXT
819                  {                  {
820                            if (codec->config.credits_mode == CREDITS_MODE_QUANT)
821                            {
822                                    if (codec->config.credits_quant_i != codec->config.credits_quant_p)
823                                    {
824                                            frame->quant = frame->intra ?
825                                                    codec->config.credits_quant_i :
826                                                    codec->config.credits_quant_p;
827                                    }
828                                    else
829                                    {
830                                            frame->quant = codec->config.credits_quant_p;
831                                            frame->intra = -1;
832                                    }
833    
834                                    twopass->bytes1 = bytes1;
835                                    twopass->bytes2 = bytes1;
836                                    twopass->desired_bytes2 = bytes1;
837                                    return ICERR_OK;
838                            }
839                            else
840                          bytes2 = twopass->nns2.bytes;                          bytes2 = twopass->nns2.bytes;
841                  }                  }
842          }          }
# Line 915  Line 958 
958                          bytes2 += ((int)dbytes);                          bytes2 += ((int)dbytes);
959                  }                  }
960    
961                    if (frame->intra)
962                    {
963                            if (bytes2 < twopass->minisize)
964                            {
965                                    curve_comp_error -= twopass->minisize - bytes2;
966                                    bytes2 = twopass->minisize;
967                            }
968                    }
969                    else
970                    {
971                  // cap bytes2 to first pass size, lowers number of quant=1 frames                  // cap bytes2 to first pass size, lowers number of quant=1 frames
972                  if (bytes2 > bytes1)                  if (bytes2 > bytes1)
973                  {                  {
974                          curve_comp_error += bytes2 - bytes1;                          curve_comp_error += bytes2 - bytes1;
975                          bytes2 = bytes1;                          bytes2 = bytes1;
976                  }                  }
977                  else if (bytes2 < 1)                          else if (bytes2 < twopass->minpsize)
978                  {                                  bytes2 = twopass->minpsize;
                         curve_comp_error += --bytes2;  
                         bytes2 = 1;  
979                  }                  }
980          }          }
981    
# Line 958  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_frame);          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))

Legend:
Removed from v.527  
changed lines
  Added in v.528

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