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

Diff of /trunk/vfw/src/2pass.c

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

revision 343, Sat Jul 27 21:38:19 2002 UTC revision 552, Sat Sep 28 02:01:56 2002 UTC
# Line 41  Line 41 
41          DWORD version = -20;          DWORD version = -20;
42          DWORD read, wrote;          DWORD read, wrote;
43    
44          int     frames = 0, credits_frames = 0, i_frames = 0;          int     frames = 0, credits_frames = 0, i_frames = 0, recminpsize = 0, recminisize = 0;
45          __int64 total_ext = 0, total = 0, i_total = 0, i_boost_total = 0, start = 0, end = 0, start_curved = 0, end_curved = 0;          __int64 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;
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 173  Line 174 
174                                  else                                  else
175                                          ++credits_frames;                                          ++credits_frames;
176    
177                                    if (twopass->nns1.quant & NNSTATS_KEYFRAME)
178                                    {
179                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
180                                                    recminisize = twopass->nns1.bytes;
181                                    }
182                                    else
183                                    {
184                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
185                                                    recminpsize = twopass->nns1.bytes;
186                                    }
187    
188                                  ++frames;                                  ++frames;
189                          }                          }
190                          twopass->keyframe_locations[i_frames] = frames;                          twopass->keyframe_locations[i_frames] = frames;
# Line 252  Line 264 
264                                          }                                          }
265                                  }                                  }
266    
267                                    if (frames == 0)
268                                    {
269                                            twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
270                                            twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
271                                            if (recminpsize > twopass->minpsize)
272                                                    twopass->minpsize = recminpsize;
273                                            if (recminisize > twopass->minisize)
274                                                    twopass->minisize = recminisize;
275                                    }
276    
277                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
278                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
279                                  {                                  {
280                                          double dbytes = twopass->nns2.bytes / twopass->movie_curve;                                          dbytes = twopass->nns2.bytes / twopass->movie_curve;
281                                          total1 += dbytes;                                          total1 += dbytes;
282    
283                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
# Line 263  Line 285 
285                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
286                                                  {                                                  {
287                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
288                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
289                                                          else                                                          else
290                                                          {                                                          {
291                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
292                                                                  {                                                                  {
293                                                                  case 2:                                                                  case 2:
294                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
295                                                                          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)));
296                                                                          break;                                                                          break;
297                                                                  case 1:                                                                  case 1:
298                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
299                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
300                                                                          break;                                                                          break;
301                                                                  case 0:                                                                  case 0:
302                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
303                                                                          (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))));
304                                                                  }                                                                  }
305                                                          }                                                          }
# Line 285  Line 307 
307                                                  else                                                  else
308                                                  {                                                  {
309                                                          if (dbytes <= twopass->alt_curve_low)                                                          if (dbytes <= twopass->alt_curve_low)
310                                                                  total2 += dbytes;                                                                  dbytes2 = dbytes;
311                                                          else                                                          else
312                                                          {                                                          {
313                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
314                                                                  {                                                                  {
315                                                                  case 2:                                                                  case 2:
316                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
317                                                                          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)));
318                                                                          break;                                                                          break;
319                                                                  case 1:                                                                  case 1:
320                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
321                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
322                                                                          break;                                                                          break;
323                                                                  case 0:                                                                  case 0:
324                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
325                                                                          (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))));
326                                                                  }                                                                  }
327                                                          }                                                          }
# Line 309  Line 331 
331                                          {                                          {
332                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
333                                                  {                                                  {
334                                                          total2 += ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
335                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
336                                                  }                                                  }
337                                                  else                                                  else
338                                                  {                                                  {
339                                                          total2 += ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
340                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
341                                                  }                                                  }
342                                          }                                          }
343    
344                                            if (dbytes2 < twopass->minpsize)
345                                                    dbytes2 = twopass->minpsize;
346    
347                                            total2 += dbytes2;
348                                  }                                  }
349    
350                                  ++frames;                                  ++frames;
# Line 379  Line 406 
406    
407                                  total += twopass->nns1.bytes;                                  total += twopass->nns1.bytes;
408    
409                                    if (twopass->nns1.quant & NNSTATS_KEYFRAME)
410                                    {
411                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
412                                                    recminisize = twopass->nns1.bytes;
413                                    }
414                                    else
415                                    {
416                                            if (!(twopass->nns1.kblk + twopass->nns1.mblk))
417                                                    recminpsize = twopass->nns1.bytes;
418                                    }
419    
420                                  ++frames;                                  ++frames;
421                          }                          }
422                          twopass->keyframe_locations[i_frames] = frames;                          twopass->keyframe_locations[i_frames] = frames;
# Line 511  Line 549 
549                                          }                                          }
550                                  }                                  }
551    
552                                    if (frames == 0)
553                                    {
554                                            twopass->minpsize = (twopass->nns1.kblk + 88) / 8;
555                                            twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8;
556                                            if (recminpsize > twopass->minpsize)
557                                                    twopass->minpsize = recminpsize;
558                                            if (recminisize > twopass->minisize)
559                                                    twopass->minisize = recminisize;
560                                    }
561    
562                                  if (!codec_is_in_credits(&codec->config, frames) &&                                  if (!codec_is_in_credits(&codec->config, frames) &&
563                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))                                          !(twopass->nns1.quant & NNSTATS_KEYFRAME))
564                                  {                                  {
565                                          double dbytes = twopass->nns1.bytes / twopass->movie_curve;                                          dbytes = twopass->nns1.bytes / twopass->movie_curve;
566                                          total1 += dbytes;                                          total1 += dbytes;
567    
568                                          if (codec->config.use_alt_curve)                                          if (codec->config.use_alt_curve)
# Line 522  Line 570 
570                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
571                                                  {                                                  {
572                                                          if (dbytes >= twopass->alt_curve_high)                                                          if (dbytes >= twopass->alt_curve_high)
573                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev);
574                                                          else                                                          else
575                                                          {                                                          {
576                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
577                                                                  {                                                                  {
578                                                                  case 2:                                                                  case 2:
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                                                                          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)));
581                                                                          break;                                                                          break;
582                                                                  case 1:                                                                  case 1:
583                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
584                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_high_diff);
585                                                                          break;                                                                          break;
586                                                                  case 0:                                                                  case 0:
587                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
588                                                                          (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))));
589                                                                  }                                                                  }
590                                                          }                                                          }
# Line 544  Line 592 
592                                                  else                                                  else
593                                                  {                                                  {
594                                                          if (dbytes <= twopass->alt_curve_low)                                                          if (dbytes <= twopass->alt_curve_low)
595                                                                  total2 += dbytes;                                                                  dbytes2 = dbytes;
596                                                          else                                                          else
597                                                          {                                                          {
598                                                                  switch(codec->config.alt_curve_type)                                                                  switch(codec->config.alt_curve_type)
599                                                                  {                                                                  {
600                                                                  case 2:                                                                  case 2:
601                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
602                                                                          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)));
603                                                                          break;                                                                          break;
604                                                                  case 1:                                                                  case 1:
605                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev *
606                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);                                                                          (dbytes - twopass->average_frame) / twopass->alt_curve_low_diff);
607                                                                          break;                                                                          break;
608                                                                  case 0:                                                                  case 0:
609                                                                  total2 += dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *                                                                  dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev *
610                                                                          (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))));
611                                                                  }                                                                  }
612                                                          }                                                          }
# Line 568  Line 616 
616                                          {                                          {
617                                                  if (dbytes > twopass->average_frame)                                                  if (dbytes > twopass->average_frame)
618                                                  {                                                  {
619                                                          total2 += ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
620                                                                  codec->config.curve_compression_high / 100.0);                                                                  codec->config.curve_compression_high / 100.0);
621                                                  }                                                  }
622                                                  else                                                  else
623                                                  {                                                  {
624                                                          total2 += ((double)dbytes + (twopass->average_frame - dbytes) *                                                          dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) *
625                                                                  codec->config.curve_compression_low / 100.0);                                                                  codec->config.curve_compression_low / 100.0);
626                                                  }                                                  }
627                                          }                                          }
628    
629                                            if (dbytes2 < twopass->minpsize)
630                                                    dbytes2 = twopass->minpsize;
631    
632                                            total2 += dbytes2;
633                                  }                                  }
634    
635                                  ++frames;                                  ++frames;
# Line 794  Line 847 
847                  }                  }
848                  else    // DLG_MODE_2PASS_2_EXT                  else    // DLG_MODE_2PASS_2_EXT
849                  {                  {
850                            if (codec->config.credits_mode == CREDITS_MODE_QUANT)
851                            {
852                                    if (codec->config.credits_quant_i != codec->config.credits_quant_p)
853                                    {
854                                            frame->quant = frame->intra ?
855                                                    codec->config.credits_quant_i :
856                                                    codec->config.credits_quant_p;
857                                    }
858                                    else
859                                    {
860                                            frame->quant = codec->config.credits_quant_p;
861                                            frame->intra = -1;
862                                    }
863    
864                                    twopass->bytes1 = bytes1;
865                                    twopass->bytes2 = bytes1;
866                                    twopass->desired_bytes2 = bytes1;
867                                    return ICERR_OK;
868                            }
869                            else
870                          bytes2 = twopass->nns2.bytes;                          bytes2 = twopass->nns2.bytes;
871                  }                  }
872          }          }
# Line 921  Line 994 
994                          curve_comp_error += bytes2 - bytes1;                          curve_comp_error += bytes2 - bytes1;
995                          bytes2 = bytes1;                          bytes2 = bytes1;
996                  }                  }
997                  else if (bytes2 < 1)                  else
998                  {                  {
999                          curve_comp_error += --bytes2;                          if (frame->intra)
1000                          bytes2 = 1;                          {
1001                                    if (bytes2 < twopass->minisize)
1002                                    {
1003                                            curve_comp_error -= twopass->minisize - bytes2;
1004                                            bytes2 = twopass->minisize;
1005                                    }
1006                            }
1007                            else if (bytes2 < twopass->minpsize)
1008                                    bytes2 = twopass->minpsize;
1009                  }                  }
1010          }          }
1011    
1012          twopass->desired_bytes2 = bytes2;          twopass->desired_bytes2 = bytes2;
1013    
1014          if (frame->intra)          // if this keyframe is too close to the next,
1015            // reduce it's byte allotment
1016            if (frame->intra && !credits_pos)
1017          {          {
1018                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -                  KFdistance = codec->twopass.keyframe_locations[codec->twopass.KF_idx] -
1019                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];                          codec->twopass.keyframe_locations[codec->twopass.KF_idx - 1];
# Line 985  Line 1068 
1068                  bytes2 = twopass->max_framesize;                  bytes2 = twopass->max_framesize;
1069          }          }
1070    
1071          if (bytes2 < 1)          // make sure to not scale below the minimum framesize
1072            if (twopass->nns1.quant & NNSTATS_KEYFRAME)
1073          {          {
1074                  bytes2 = 1;                  if (bytes2 < twopass->minisize)
1075                            bytes2 = twopass->minisize;
1076          }          }
1077            else if (bytes2 < twopass->minpsize)
1078                    bytes2 = twopass->minpsize;
1079    
1080          twopass->bytes1 = bytes1;          twopass->bytes1 = bytes1;
1081          twopass->bytes2 = bytes2;          twopass->bytes2 = bytes2;
# Line 1135  Line 1222 
1222                          codec->twopass.quant_count[frame->quant]++;                          codec->twopass.quant_count[frame->quant]++;
1223                          if ((codec->twopass.nns1.quant & NNSTATS_KEYFRAME))                          if ((codec->twopass.nns1.quant & NNSTATS_KEYFRAME))
1224                          {                          {
1225                                    // calculate how much to distribute per frame in
1226                                    // order to make up for this keyframe's overflow
1227    
1228                                  codec->twopass.overflow += codec->twopass.KFoverflow;                                  codec->twopass.overflow += codec->twopass.KFoverflow;
1229                                  codec->twopass.KFoverflow = codec->twopass.desired_bytes2 - frame->length;                                  codec->twopass.KFoverflow = codec->twopass.desired_bytes2 - frame->length;
1230    
# Line 1157  Line 1247 
1247                          }                          }
1248                          else                          else
1249                          {                          {
1250                                    // distribute part of the keyframe overflow
1251    
1252                                  codec->twopass.overflow += codec->twopass.desired_bytes2 - frame->length +                                  codec->twopass.overflow += codec->twopass.desired_bytes2 - frame->length +
1253                                          codec->twopass.KFoverflow_partial;                                          codec->twopass.KFoverflow_partial;
1254                                  codec->twopass.KFoverflow -= codec->twopass.KFoverflow_partial;                                  codec->twopass.KFoverflow -= codec->twopass.KFoverflow_partial;
# Line 1203  Line 1295 
1295                  return;                  return;
1296          }          }
1297  }  }
1298    

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

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