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); }
Page *Heap::extractMax() { if (size < 1) return NULL; Page *max = buf[1]; buf[1] = buf[size]; UPDATE_INDEX(1); size--; maxHeapify(1); return max; }
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); } }
/* * ======== 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); }