[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 660, Tue Nov 19 13:23:17 2002 UTC revision 814, Sun Feb 2 10:05:27 2003 UTC
# Line 49  Line 49 
49          double total2 = 0.0;          double total2 = 0.0;
50          double dbytes, dbytes2;          double dbytes, dbytes2;
51    
52            /* ensure free() is called safely */
53            codec->twopass.hintstream = NULL;
54            twopass->nns1_array = NULL;
55            twopass->nns2_array = NULL;
56    
57          if (codec->config.hinted_me)          if (codec->config.hinted_me)
58          {          {
59                  codec->twopass.hintstream = malloc(100000);                  codec->twopass.hintstream = malloc(100000);
# Line 337  Line 342 
342    
343                          twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) /                          twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) /
344                                  (bframe_total_ext + pframe_total_ext));                                  (bframe_total_ext + pframe_total_ext));
345    
346                            if (bframes)
347                          twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve;                          twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve;
348    
349                            if (pframes)
350                          twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve;                          twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve;
351                            else
352                                    if (bframes)
353                                            twopass->average_pframe = twopass->average_bframe;  // b-frame packed bitstream fix
354                                    else
355                                    {
356                                            DEBUGERR("ERROR:  No p-frames or b-frames were present in the 1st pass.  Rate control cannot function properly!");
357                                            return ICERR_ERROR;
358                                    }
359    
360    
361    
# Line 648  Line 665 
665                                  break;                                  break;
666                          }                          }
667    
668                            if (bframes)
669                          twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve;                          twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve;
670    
671                            if (pframes)
672                          twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve;                          twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve;
673                            else
674                                    if (bframes)
675                                            twopass->average_pframe = twopass->average_bframe;  // b-frame packed bitstream fix
676                                    else
677                                    {
678                                            DEBUGERR("ERROR:  No p-frames or b-frames were present in the 1st pass.  Rate control cannot function properly!");
679                                            return ICERR_ERROR;
680                                    }
681    
682    
683    
# Line 965  Line 993 
993    
994          if (twopass->nns_array_pos >= twopass->nns_array_length)          if (twopass->nns_array_pos >= twopass->nns_array_length)
995          {          {
996                  twopass->nns_array_pos = 0;                  // fix for VirtualDub 1.4.13 bframe handling
997                  DEBUG("ERROR: VIDEO EXCEEDS 1ST PASS!!!");                  if (codec->config.max_bframes > 0 &&
998                  frame->intra = -1;                          codec->framenum < twopass->nns_array_length + codec->config.max_bframes)
999                  return 2;                  {
1000                            return ICERR_OK;
1001                    }
1002                    else
1003                    {
1004                            DEBUGERR("ERROR: VIDEO EXCEEDS 1ST PASS!!!");
1005                            return ICERR_ERROR;
1006                    }
1007          }          }
1008    
1009          memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));          memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS));
# Line 985  Line 1020 
1020                  twopass->bytes2 = bytes1;                  twopass->bytes2 = bytes1;
1021                  twopass->desired_bytes2 = bytes1;                  twopass->desired_bytes2 = bytes1;
1022                  frame->intra = 3;                  frame->intra = 3;
1023                  return 2;                  return ICERR_OK;
1024          }          }
1025          else if (twopass->nns1.dd_v & NNSTATS_PADFRAME)          else if (twopass->nns1.dd_v & NNSTATS_PADFRAME)
1026          {          {
# Line 993  Line 1028 
1028                  twopass->bytes2 = bytes1;                  twopass->bytes2 = bytes1;
1029                  twopass->desired_bytes2 = bytes1;                  twopass->desired_bytes2 = bytes1;
1030                  frame->intra = 4;                  frame->intra = 4;
1031                  return 2;                  return ICERR_OK;
1032          }          }
1033          else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME)          else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME)
1034          {          {
# Line 1001  Line 1036 
1036                  twopass->bytes2 = bytes1;                  twopass->bytes2 = bytes1;
1037                  twopass->desired_bytes2 = bytes1;                  twopass->desired_bytes2 = bytes1;
1038                  frame->intra = 5;                  frame->intra = 5;
1039                  return 2;                  return ICERR_OK;
1040          }          }
1041    
1042          overflow = twopass->overflow / 8;          overflow = twopass->overflow / 8;
# Line 1170  Line 1205 
1205                                                  }                                                  }
1206                                          }                                          }
1207                                  }                                  }
                                 curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;  
   
1208                                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)                                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1209                                          curve_temp *= twopass->average_bframe / twopass->average_pframe;                                          curve_temp *= twopass->average_bframe / twopass->average_pframe;
1210    
1211                                    curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus;
1212    
1213                                  bytes2 += ((int)curve_temp);                                  bytes2 += ((int)curve_temp);
1214                                  curve_comp_error += curve_temp - ((int)curve_temp);                                  curve_comp_error += curve_temp - ((int)curve_temp);
1215                          }                          }
# Line 1430  Line 1465 
1465    
1466          if (capped_to_max_framesize == 0)          if (capped_to_max_framesize == 0)
1467          {          {
1468                  if (twopass->nns1.dd_v & NNSTATS_BFRAME)                  if (twopass->nns1.quant & NNSTATS_KEYFRAME)
1469                    {
1470                            last_bquant = frame->quant;
1471                            last_pquant = frame->quant;
1472                    }
1473                    else if (twopass->nns1.dd_v & NNSTATS_BFRAME)
1474                          last_bquant = frame->quant;                          last_bquant = frame->quant;
1475                  else                  else
1476                          last_pquant = frame->quant;                          last_pquant = frame->quant;
# Line 1441  Line 1481 
1481                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;                  frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT;
1482                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;                  frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT;
1483          }          }
1484  /*  
1485          if (codec->config.quant_type == QUANT_MODE_MOD_NEW)          if (codec->config.quant_type == QUANT_MODE_MOD_NEW)
1486          {          {
1487                  frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT;                  frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT;
1488                  frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT;                  frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT;
1489          }          }
1490  */  
1491          return ICERR_OK;          return ICERR_OK;
1492  }  }
1493    
# Line 1475  Line 1515 
1515          {          {
1516          case DLG_MODE_2PASS_1 :          case DLG_MODE_2PASS_1 :
1517                  nns1.bytes = frame->length;     // total bytes                  nns1.bytes = frame->length;     // total bytes
1518                  nns1.dd_v = stats->hlength;     // header bytes  // THIS small bugger messed up 2pass encoding!
1519    //              nns1.dd_v = stats->hlength;     // header bytes
1520                    nns1.dd_v = 0;
1521                  nns1.dd_u = nns1.dd_y = 0;                  nns1.dd_u = nns1.dd_y = 0;
1522                  nns1.dk_v = nns1.dk_u = nns1.dk_y = 0;                  nns1.dk_v = nns1.dk_u = nns1.dk_y = 0;
1523                  nns1.md_u = nns1.md_y = 0;                  nns1.md_u = nns1.md_y = 0;
# Line 1588  Line 1629 
1629                  else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) {                  else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) {
1630                          frame_type="skipped";                          frame_type="skipped";
1631                          frame->quant = 2;                          frame->quant = 2;
1632                          codec->twopass.bytes1 = 8;                          codec->twopass.bytes1 = 1;
1633                          codec->twopass.desired_bytes2 = 8;                          codec->twopass.desired_bytes2 = 1;
1634                          frame->length = 8;                          frame->length = 1;
1635                  }                  }
1636                  else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) {                  else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) {
1637                          frame_type="padded";                          frame_type="padded";
1638                          frame->quant = 2;                          frame->quant = 2;
1639                          codec->twopass.bytes1 = 8;                          codec->twopass.bytes1 = 7;
1640                          codec->twopass.desired_bytes2 = 8;                          codec->twopass.desired_bytes2 = 7;
1641                          frame->length = 8;                          frame->length = 7;
1642                  }                  }
1643                  else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) {                  else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) {
1644                          frame_type="delayed";                          frame_type="delayed";
1645                          frame->quant = 2;                          frame->quant = 2;
1646                          codec->twopass.bytes1 = 8;                          codec->twopass.bytes1 = 1;
1647                          codec->twopass.desired_bytes2 = 8;                          codec->twopass.desired_bytes2 = 1;
1648                          frame->length = 8;                          frame->length = 1;
1649                  }                  }
1650    
1651                  DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)                  DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos)
# Line 1623  Line 1664 
1664          char s[100];          char s[100];
1665    
1666          if (codec->twopass.nns1_array)          if (codec->twopass.nns1_array)
1667            {
1668                  free(codec->twopass.nns1_array);                  free(codec->twopass.nns1_array);
1669                    codec->twopass.nns1_array = NULL;
1670            }
1671          if (codec->twopass.nns2_array)          if (codec->twopass.nns2_array)
1672            {
1673                  free(codec->twopass.nns2_array);                  free(codec->twopass.nns2_array);
1674                    codec->twopass.nns2_array = NULL;
1675            }
1676          codec->twopass.nns_array_size = 0;          codec->twopass.nns_array_size = 0;
1677          codec->twopass.nns_array_length = 0;          codec->twopass.nns_array_length = 0;
1678          codec->twopass.nns_array_pos = 0;          codec->twopass.nns_array_pos = 0;

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

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