Пример #1
0
void FDKprintDisclaimer(void)
{
  FDKprintf(
  "This program is protected by copyright law and international treaties.\n"  \
  "Any reproduction or distribution of this program, or any portion\n"        \
  "of it, may result in severe civil and criminal penalties, and will be\n"   \
  "prosecuted to the maximum extent possible under law.\n\n");
}
Пример #2
0
/**
 * \brief Synchronize to stream and estimate the amount of missing access units due
 *        to a current synchronization error in case of constant average bit rate.
 */
static
TRANSPORTDEC_ERROR transportDec_readStream ( HANDLE_TRANSPORTDEC hTp, const UINT layer )
{

  TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK;
  HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[layer];
  INT nAU = -1;
  INT headerBits;
  INT bitDistance, bfDelta;

  /* Obtain distance to next synch word */
  bitDistance = FDKgetValidBits(hBs);
  error = synchronization(hTp, &headerBits);
  bitDistance -= FDKgetValidBits(hBs);


  FDK_ASSERT(bitDistance >= 0);

  if (error == TRANSPORTDEC_SYNC_ERROR || (hTp->flags & TPDEC_LOST_FRAMES_PENDING))
  {
    /* Check if estimating lost access units is feasible. */
    if (hTp->avgBitRate > 0 && hTp->asc[0].m_samplesPerFrame > 0 && hTp->asc[0].m_samplingFrequency > 0)
    {
      if (error == TRANSPORTDEC_OK)
      {
        int aj;

        aj = transportDec_GetBufferFullness(hTp);
        if (aj > 0) {
          bfDelta = aj;
        } else {
          bfDelta = 0;
        }
        /* sync was ok: last of a series of bad access units. */
        hTp->flags &= ~TPDEC_LOST_FRAMES_PENDING;
        /* Add up bitDistance until end of the current frame. Later we substract
           this frame from the grand total, since this current successfully synchronized
           frame should not be skipped of course; but it must be accounted into the
           bufferfulness math. */
        bitDistance += hTp->auLength[0];
      } else {
        if ( !(hTp->flags & TPDEC_LOST_FRAMES_PENDING) ) {
          /* sync not ok: one of many bad access units. */
          hTp->flags |= TPDEC_LOST_FRAMES_PENDING;
          bfDelta = - (INT)hTp->lastValidBufferFullness;
        } else {
          bfDelta = 0;
        }
      }

      {
        int num, denom;

        /* Obtain estimate of number of lost frames */
        num = hTp->asc[0].m_samplingFrequency * (bfDelta + bitDistance) + hTp->remainder;
        denom = hTp->avgBitRate * hTp->asc[0].m_samplesPerFrame;
        if (num > 0) {
          nAU = num / denom;
          hTp->remainder = num % denom;
        } else {
          hTp->remainder = num;
        }

        if (error == TRANSPORTDEC_OK)
        {
          /* Final adjustment of remainder, taken -1 into account because current
             frame should not be skipped, thus substract -1 or do nothing instead
             of +1-1 accordingly. */
          if ( (denom - hTp->remainder) >= hTp->remainder ) {
            nAU--;
          }
            
          if (nAU < 0) {
            /* There was one frame too much concealed, so unfortunately we will have to skip one good frame. */
            transportDec_EndAccessUnit(hTp);
            error = synchronization(hTp, &headerBits);             
            nAU = -1;
#ifdef DEBUG
            FDKprintf("ERROR: Bufferfullness accounting failed. remainder=%d, nAU=%d\n", hTp->remainder, nAU);
#endif
          }
          hTp->remainder = 0;
          /* Enforce last missed frames to be concealed. */
          if (nAU > 0) {
            FDKpushBack(hBs, headerBits);
          }
        }
      }
    }
  }

  /* Be sure that lost frames are handled correctly. This is necessary due to some
     sync error sequences where later it turns out that there is not enough data, but
     the bits upto the sync word are discarded, thus causing a value of nAU > 0 */
  if (nAU > 0) {
    error = TRANSPORTDEC_SYNC_ERROR;
  }

  hTp->missingAccessUnits = nAU;

  return error;
}
Пример #3
0
int IIS_ProcessCmdlList(const char* param_filename, int (*pFunction)(int, TEXTCHAR**))
{
    /* static to reduce required stack size */

    FDKFILE *config_fp;
    int argc;
    char *line_ptr;

#ifdef CMDFILE_PREFIX
    FDKstrcpy(tmp, CMDFILE_PREFIX);
    FDKstrcpy(tmp+FDKstrlen(CMDFILE_PREFIX), param_filename);
    /* Open the file with command lines */
    config_fp = FDKfopen(tmp, "r");
#else
    /* Open the file with command lines */
    config_fp = FDKfopen(param_filename, "r");
#endif

    if(config_fp == NULL)
    {
#ifdef CMDFILE_PREFIX
        FDKprintf("\ncould not open config file %s", tmp);
#else
        FDKprintf("\ncould not open config file %s", param_filename);
#endif
        return 1;
    }

    /* Obtain a command line from config file */
    while (FDKfgets(line, CMDL_MAX_STRLEN*CMDL_MAX_ARGC, config_fp) != NULL)
    {
        argc = 1;

        /* Eat \n */
        line_ptr =  (char*)FDKstrchr(line, '\n');
        if (line_ptr != NULL)
            *line_ptr = ' ';

        line_ptr = line;

        /* Scan the line and put the command line params into argv */
        do {
            /* Skip consecutive blanks. */
            while (*line_ptr == ' ' && line_ptr < line+CMDL_MAX_STRLEN)
                line_ptr++;
            /* Assign argument. TODO: maybe handle quotes */
            argv_ptr[argc] = line_ptr;
            /* Get pointer to next blank. */
            line_ptr = (char*)FDKstrchr(line_ptr, ' ');
            /*  */
            if (line_ptr != NULL) {
                /* Null terminate */
                *line_ptr = 0;
                /* Skip former blank (now null character) */
                line_ptr++;
                /* Advance argument counter */
            }
            argc++;
        } while ( line_ptr != NULL && argc < CMDL_MAX_ARGC);

        /* call "would be main()" */
        if (argc > 2 && *argv_ptr[1] != '#' && FDKstrlen(argv_ptr[1])>1)
        {
            int retval;

            retval = (*pFunction)(argc, argv_ptr);

            FDKprintf("main returned %d\n", retval);
        }
    }

    FDKfclose(config_fp);
    return 0;
}
Пример #4
0
INT IIS_ScanCmdl(INT argc, TEXTCHAR* argv[], const TEXTCHAR* str, ...)
{
    INT i              = 0;
    INT found_and_set  = 0;
    INT nArgs          = 0;
    INT* switches_used = 0;
    INT*   b_str_opt   = 0;
    TEXTCHAR*  s_str       = 0;
    TEXTCHAR*  c_str_type  = 0;
    TEXTCHAR*  str_clean   = 0;

    va_list ap;

    if (argc == 0 || argc == 1)
    {
        FDKprintf("No command line arguments\n");
        goto bail;
    }

    str_clean  = (TEXTCHAR*)  FDKcalloc((unsigned int)_tcslen(str), sizeof(TEXTCHAR));
    if (str_clean == NULL) {
        FDKprintf("Error allocating memory line %d, file %s\n",  __LINE__, __FILE__);
        return 0;
    }

    RemoveWhiteSpace(str, str_clean );
    GetNumberOfArgs(str_clean, &nArgs);

    b_str_opt  = (INT*)   FDKcalloc(nArgs,    sizeof(INT));
    s_str      = (TEXTCHAR*)  FDKcalloc(nArgs*CMDL_MAX_ARGC, sizeof(TEXTCHAR) );
    c_str_type = (TEXTCHAR*)  FDKcalloc(nArgs,    sizeof(TEXTCHAR));
    switches_used = (INT*) FDKcalloc(argc, sizeof(INT));

    if (b_str_opt == NULL || s_str == NULL || c_str_type == NULL || switches_used == NULL) {
        FDKprintf("Error allocating memory line %d, file %s\n",  __LINE__, __FILE__);
        goto bail;
    }

    if ( ParseString( str_clean, b_str_opt, s_str, c_str_type )) {
        goto bail;
    }

    va_start(ap, str);

    for ( i = 0; i < nArgs; i++ )
    {
        TEXTCHAR arg[CMDL_MAX_STRLEN] = {L'\0'};
        TEXTCHAR* p_arg = arg;
        TEXTCHAR* current_str = &(s_str[i*CMDL_MAX_ARGC]);

        if (GetArgFromString(argc, argv, current_str, c_str_type[i], arg, switches_used )
                && !b_str_opt[i] )
        {
#ifdef _UNICODE
            _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%ls'.\n" ), current_str);
#else
            _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%s'.\n" ), current_str);
#endif
            found_and_set = 0;
            goto bail;
        }
        if (CheckArg(p_arg, s_str, nArgs, c_str_type[i], current_str))
        {
            goto bail;
        }

        switch (c_str_type[i] )
        {
        case 's':
        {
            TEXTCHAR* tmp;
            tmp = va_arg(ap, TEXTCHAR*);

            if ( arg[0] == '\0' )
                break;

            _tcsncpy( tmp, arg, CMDL_MAX_STRLEN );
            /* Remove quotes. Windows Mobile Workaround. */
            removeQuotes(tmp);
            found_and_set++;
            break;
        }
        case 'd':
        {
            INT* tmp = va_arg(ap, INT*);

            if ( arg[0] == '\0' )
                break;

            *tmp = _tcstol(arg, NULL, 0);
            found_and_set++;
            break;
        }
        case 'c':
        {
            char* tmp = va_arg(ap, char*);

            if ( arg[0] == '\0' )
                break;

            *tmp = *arg;
            found_and_set++;
            break;
        }
        case 'u':
        {
            UCHAR* tmp = va_arg(ap, UCHAR*);

            if ( arg[0] == '\0' )
                break;

            *tmp = _tstoi(arg);
            found_and_set++;
            break;
        }
        case 'f':
        {
            float* tmp = (float*) va_arg( ap,double*);

            if ( arg[0] == '\0' )
                break;

            *tmp = (float) _tstof(arg);
            found_and_set++;
            break;
        }
        case 'y': // support 'data type double'
        {
            double* tmp = (double*) va_arg( ap,double*);
            // use sscanf instead _tstof because of gcc
            //_tstof(arg,"%lf",tmp); // '%lf' reads as double
            *tmp = _tstof(arg); // '%lf' reads as double
            found_and_set++;
            break;
        }
        case '1':
        {

            INT* tmp = va_arg( ap, INT*);

            if ( arg[0] == '\0' )
                break;

            *tmp = 1;
            found_and_set++;
            break;
        }

        default:
            FDKprintfErr("Bug: unsupported data identifier \"%c\"\n", c_str_type[i]);
            break;

        }

    }

    va_end(ap);

    CheckForUnusedSwitches(argc, /*argv,*/ switches_used);

bail:
    if (b_str_opt)     FDKfree(b_str_opt);
    if (s_str)         FDKfree(s_str);
    if (c_str_type)    FDKfree(c_str_type);
    if (str_clean)     FDKfree(str_clean);
    if (switches_used) FDKfree(switches_used);

    return found_and_set;
}