home *** CD-ROM | disk | FTP | other *** search
- /*
- * This file handles filling of the buffer and contains some additional utility routines.
- */
-
- #include "video.h"
- #include "proto.h"
- #include "util.h"
-
- /* Declarations of global variables used. */
-
- int bitOffset;
- int bufLength;
- unsigned int *bitBuffer;
-
-
- /*
- *--------------------------------------------------------------
- *
- * correct_underflow --
- *
- * Called when buffer does not have sufficient data to
- * satisfy request for bits.
- * Calls get_more_data, an application specific routine
- * required to fill the buffer with more data.
- *
- * Results:
- * None really.
- *
- * Side effects:
- * buf_length and buffer fields in curVidStream structure
- * may be changed.
- *
- *--------------------------------------------------------------
- */
-
- void correct_underflow(void)
- {
- int status;
-
- status = get_more_data(curVidStream->buf_start, curVidStream->max_buf_length, &bufLength, &bitBuffer);
-
- if (status < 0) {
- if (!quietFlag) {
- fprintf (stderr, "\n");
- perror("Unexpected read error.");
- }
- exit(1);
- }
- else if ((status == 0) && (bufLength < 1)) {
- if (!quietFlag) {
- fprintf(stderr, "\nImproper or missing sequence end code.\n");
- }
- #ifdef ANALYSIS
- PrintAllStats();
- #endif
- if (!quietFlag) {
- PrintTimeInfo();
- }
-
- if (loopFlag) longjmp(env, 1);
- DestroyVidStream(curVidStream);
- exit(0);
- }
-
- }
-
-
- /*
- *--------------------------------------------------------------
- *
- * get_ext_data --
- *
- * Assumes that bit stream is at begining of extension
- * data. Parses off extension data into dynamically
- * allocated space until start code is hit.
- *
- * Results:
- * Pointer to dynamically allocated memory containing
- * extension data.
- *
- * Side effects:
- * Bit stream irreversibly parsed.
- *
- * Niceness -10000 !!!!
- *
- *--------------------------------------------------------------
- */
-
- char *get_ext_data (void)
- {
- int size, marker;
- char *dataPtr;
- unsigned int data;
-
- /* Set initial ext data buffer size. */
-
- size = EXT_BUF_SIZE;
-
- /* Allocate ext data buffer. */
-
- dataPtr = (char *) malloc(size);
-
- /* Initialize marker to keep place in ext data buffer. */
-
- marker = 0;
-
- /* While next data is not start code... */
- while ((show_bitsn(24,data)) != 0x000001) { /* data re-usage could be applied ! */
-
- /* Put ext data into ext data buffer. Advance marker. */
-
- get_bits8( dataPtr[marker] );
- marker++;
-
- /* If end of ext data buffer reached, resize data buffer. */
-
- if (marker == size) {
- size += EXT_BUF_SIZE;
- dataPtr = (char *) realloc(dataPtr, size);
- }
- }
-
- /* Realloc data buffer to free any extra space. */
-
- dataPtr = (char *) realloc(dataPtr, marker);
-
- /* Return pointer to ext data buffer. */
-
- return dataPtr;
- }
-
-
- /*
- *--------------------------------------------------------------
- *
- * get_extra_bit_info --
- *
- * Parses off extra bit info stream into dynamically
- * allocated memory. Extra bit info is indicated by
- * a flag bit set to 1, followed by 8 bits of data.
- * This continues until the flag bit is zero. Assumes
- * that bit stream set to first flag bit in extra
- * bit info stream.
- *
- * Results:
- * Pointer to dynamically allocated memory with extra
- * bit info in it. Flag bits are NOT included.
- *
- * Side effects:
- * Bit stream irreversibly parsed.
- *
- *--------------------------------------------------------------
- */
-
- char *get_extra_bit_info (void)
- {
- int size, marker;
- char *dataPtr;
- unsigned int data;
-
- /* Get first flag bit; if flag is false, return NULL pointer (i.e. no extra bit info). */
-
- if (!(get_bits1(data))) return NULL;
-
- /* Initialize size of extra bit info buffer and allocate. */
-
- size = EXT_BUF_SIZE;
- dataPtr = (char *) malloc(size);
-
- /* Reset marker to hold place in buffer. */
-
- marker = 0;
-
- /* While flag bit is true. */
-
- while (data) {
-
- /* Place in extra bit info buffer. */
-
- get_bits8( dataPtr[marker] );
- marker++;
-
- /* If buffer is full, reallocate. */
-
- if (marker == size) {
- size += EXT_BUF_SIZE;
- dataPtr = (char *) realloc(dataPtr, size);
- }
-
- /* Get next flag bit. */
- get_bits1(data);
- }
-
- /* Reallocate buffer to free extra space. */
-
- dataPtr = (char *) realloc(dataPtr, marker);
-
- /* Return pointer to extra bit info buffer. */
-
- return dataPtr;
- }
-