Example #1
0
void Heap::onChange(int i)
{
  while (i > 1 && KEY(buf[parent(i)]) < KEY(buf[i]))
    {
      int j = parent(i);
      Page *temp = buf[i];
      buf[i] = buf[j];
      UPDATE_INDEX(i);
      buf[j] = temp;
      i = j;
    }
  UPDATE_INDEX(i);
}
Example #2
0
Page *Heap::extractMax()
{
  if (size < 1)
    return NULL;
  Page *max = buf[1];
  buf[1] = buf[size];
  UPDATE_INDEX(1);
  size--;
  maxHeapify(1);
  return max;
}
Example #3
0
void Heap::maxHeapify(int i)
{
  int l = left(i);
  int r = right(i);
  int largest;
  if (l <= size && KEY(buf[l]) > KEY(buf[i]))
    largest = l;
  else
    largest = i;
  if (r <= size && KEY(buf[r]) > KEY(buf[largest]))
    largest = r;
  if (largest != i)
    {
      Page *temp = buf[i];
      buf[i] = buf[largest];
      buf[largest] = temp;
      UPDATE_INDEX(i);
      UPDATE_INDEX(largest);
      maxHeapify(largest);
    }
}
Example #4
0
/*
 *  ======== encode_decode ========
 */
static Void encode_decode(AUDENC1_Handle enc, AUDDEC1_Handle dec, FILE *in,
    FILE *out)
{
    Bool                        last;
    Int                         i;
    Int                         n;
    Int32                       status;
    Int                         decProcessIn = 0;
    Int                         decWaitIn = 0;
    Int                         decProcessOut = 0;
    Int                         decWaitOut = 0;
    Int                         encProcessIn = 0;
    Int                         encProcessOut = 0;

    for (i = 0; i < NBUFFERS; i++) {
        inBufDesc[i].descs[0].buf = inBuf[i];
        outBufDesc[i].descs[0].buf = outBuf[i];
        encodedBufDesc[i].descs[0].buf = encodedBuf[i];
        inBufDesc[i].numBufs = encodedBufDesc[i].numBufs =
          outBufDesc[i].numBufs = 1;
        inBufDesc[i].descs[0].bufSize = encodedBufDesc[i].descs[0].bufSize =
          outBufDesc[i].descs[0].bufSize = NSAMPLES;

        /* initialize all "sized" fields */
        encInArgs[i].size    = sizeof(encInArgs[i]);
        decInArgs[i].size    = sizeof(decInArgs[i]);
        encOutArgs[i].size   = sizeof(encOutArgs[i]);
        decOutArgs[i].size   = sizeof(decOutArgs[i]);

        /* ancillary data to encode */
#if USE_ANCDATA
        encInArgs[i].ancData.buf = ancBuf[i];
        encInArgs[i].ancData.bufSize = ENCANCBUFSIZE;
#else
        /* Be sure to initialize these to NULL! */
        encInArgs[i].ancData.buf = NULL;
        encInArgs[i].ancData.bufSize = 0;
#endif
    }
    encodedBufDesc[NBUFFERS].descs[0].buf = encodedBuf[NBUFFERS];
    encodedBufDesc[NBUFFERS].numBufs = 1;
    encodedBufDesc[NBUFFERS].descs[0].bufSize = NSAMPLES;
    encOutArgs[NBUFFERS].size = sizeof(encOutArgs[NBUFFERS]);
    decInArgs[NBUFFERS].size = sizeof(decInArgs[NBUFFERS]);

    encDynParams.size = sizeof(encDynParams);
    decDynParams.size = sizeof(decDynParams);
    encStatus.size    = sizeof(encStatus);
    decStatus.size    = sizeof(decStatus);

    /*
     * Note that we use versionBuf in both the encoder and decoder.  In this
     * application, this is okay, as there is always only one user of
     * the buffer.  Not all applications can make this assumption.
     */
    encStatus.data.buf     = decStatus.data.buf     = versionBuf;
    encStatus.data.bufSize = decStatus.data.bufSize = MAXVERSIONSIZE;

    /* if the codecs support it, dump their versions */
    status = AUDDEC1_control(dec, XDM_GETVERSION, &decDynParams, &decStatus);
    GT_1trace(curMask, GT_1CLASS, "Decoder version:  %s\n",
        (status == AUDDEC1_EOK ? ((char *)decStatus.data.buf) : "[unknown]"));

    status = AUDENC1_control(enc, XDM_GETVERSION, &encDynParams, &encStatus);
    GT_1trace(curMask, GT_1CLASS, "Encoder version:  %s\n",
        (status == AUDENC1_EOK ? ((char *)encStatus.data.buf) : "[unknown]"));

    /*
     * This app expects the encoder to accept 1 buf in and get 1 buf out,
     * and the buf sizes of the in and out buffer must be able to handle
     * NSAMPLES bytes of data.
     */
    status = AUDENC1_control(enc, XDM_GETBUFINFO, &encDynParams, &encStatus);
    if (status != AUDENC1_EOK) {
        /* failure, report error and exit */
        GT_1trace(curMask, GT_7CLASS, "encode control status = %ld\n", status);
        return;
    }

    /* Validate this encoder codec will meet our buffer requirements */
    if ((inBufDesc[0].numBufs < encStatus.bufInfo.minNumInBufs) ||
        (IFRAMESIZE < encStatus.bufInfo.minInBufSize[0]) ||
        (encodedBufDesc[0].numBufs < encStatus.bufInfo.minNumOutBufs) ||
        (EFRAMESIZE < encStatus.bufInfo.minOutBufSize[0])) {

        /* failure, report error and exit */
        GT_0trace(curMask, GT_7CLASS,
            "Error:  encoder codec feature conflict\n");
        return;
    }

    status = AUDDEC1_control(dec, XDM_GETBUFINFO, &decDynParams, &decStatus);
    if (status != AUDDEC1_EOK) {
        /* failure, report error and exit */
        GT_1trace(curMask, GT_7CLASS, "decode control status = %ld\n", status);
        return;
    }

    /* Validate this decoder codec will meet our buffer requirements */
    if ((encodedBufDesc[0].numBufs < decStatus.bufInfo.minNumInBufs) ||
        (EFRAMESIZE < decStatus.bufInfo.minInBufSize[0]) ||
        (outBufDesc[0].numBufs < decStatus.bufInfo.minNumOutBufs) ||
        (OFRAMESIZE < decStatus.bufInfo.minOutBufSize[0])) {

        /* failure, report error and exit */
        GT_0trace(curMask, GT_7CLASS,
            "App-> ERROR: decoder does not meet buffer requirements.\n");
        return;
    }

    /*
     * Read complete frames from in, encode, decode, and write to out.
     */
    for (n = 0; fread(inBuf[encProcessIn], IFRAMESIZE, 1, in) == 1; n++) {

        GT_1trace(curMask, GT_1CLASS, "App-> Processing encode frame %d...\n",
                  n);
        status = encodeIssue(enc, encProcessIn, encProcessOut);
        if (status != AUDENC1_EOK) {
            goto done;
        }

        UPDATE_INDEX(encProcessIn, NBUFFERS);
        UPDATE_INDEX(encProcessOut, NBUFFERS + 1);

        if (n == 0) {
            /*
             *  "Poor man's prologue" - need to feed encoder two buffers of
             *  input before reclaiming encoded data.
             */
            continue;
        }

        GT_1trace(curMask, GT_1CLASS, "App-> Waiting for encoded frame %d...\n",
                  n - 1);
        status = encodeReclaim(enc, decProcessOut, decProcessIn);
        if (status != AUDENC1_EOK) {
            goto done;
        }

        GT_1trace(curMask, GT_1CLASS, "App-> Processing decode frame %d...\n",
                  n - 1);
        status = decodeIssue(dec, decProcessIn, decProcessOut);
        if (status != AUDDEC1_EOK) {
            goto done;
        }

        UPDATE_INDEX(decProcessIn, NBUFFERS + 1);
        UPDATE_INDEX(decProcessOut, NBUFFERS);

        if (n == 1) {
            /*
             *  "Poor man's prologue" - need to feed decoder two buffers of
             *  input before reclaiming decoded data.
             */
            continue;
        }

        GT_1trace(curMask, GT_1CLASS, "App-> Waiting for decoded frame %d...\n",
                  n - 2);
        status = decodeReclaim(dec, decWaitIn, decWaitOut);
        if (status != AUDDEC1_EOK) {
            goto done;
        }

        GT_2trace(curMask, GT_1CLASS, "App-> Writing outBuf[%d]=%#x\n",
                  decWaitOut, outBuf[decWaitOut]);

        /* write to file */
        fwrite(outBuf[decWaitOut], OFRAMESIZE, 1, out);

        UPDATE_INDEX(decWaitIn, NBUFFERS + 1);
        UPDATE_INDEX(decWaitOut, NBUFFERS);
    }

    /*
     *  Due to the buffering achieved with async calls, at this point we still
     *  need to:
     *     - drain one buffer from the encoder
     *     - feed encoded buffer to the decoder
     *     - drain two buffers from the decoder
     *     - write decoded buffers to file
     */
    GT_1trace(curMask, GT_1CLASS, "App-> Waiting for encoded frame %d...\n",
              n - 1);
    status = encodeReclaim(enc, decProcessOut, decProcessIn);
    if (status != AUDENC1_EOK) {
        goto done;
    }

    /* decode the frame */
    GT_1trace(curMask, GT_1CLASS, "App-> Processing decode frame %d...\n",
              n - 1);
    status = decodeIssue(dec, decProcessIn, decProcessOut);
    if (status != AUDDEC1_EOK) {
        goto done;
    }

    UPDATE_INDEX(decProcessIn, NBUFFERS + 1);
    UPDATE_INDEX(decProcessOut, NBUFFERS);

    last = TRUE;

last_frame:
    GT_1trace(curMask, GT_1CLASS, "App-> Waiting for decoded frame %d...\n",
              n - 2);
    status = decodeReclaim(dec, decWaitIn, decWaitOut);
    if (status != AUDDEC1_EOK) {
        goto done;
    }

    GT_2trace(curMask, GT_1CLASS, "App-> Writing outBuf[%d]=%#x\n",
              decWaitOut, outBuf[decWaitOut]);

    /* write to file */
    fwrite(outBuf[decWaitOut], OFRAMESIZE, 1, out);

    UPDATE_INDEX(decWaitIn, NBUFFERS + 1);
    UPDATE_INDEX(decWaitOut, NBUFFERS);

    if (last) {
        /*
         *  "Poor man's epilogue" - need to reclaim and write last
         *  decoded buffer.
         */
        n++;
        last = FALSE;
        goto last_frame;
    }

done:
    GT_1trace(curMask, GT_1CLASS, "%d frames encoded/decoded\n", n - 2);
}