⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readfile.cpp

📁 This code is based on mpeg_play, available from: http://bmrc.berkeley.edu/frame/research/mpeg/
💻 CPP
字号:
/* * readfile.c -- * *       Procedures concerned with reading data and parsing  *       start codes from MPEG files. * *//* * Copyright (c) 1995 The Regents of the University of California. * All rights reserved. *  * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. *//* * Portions of this software Copyright (c) 1995 Brown University. * All rights reserved. *  * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice and the * following two paragraphs appear in all copies of this software. *  * IN NO EVENT SHALL BROWN UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF BROWN * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * BROWN UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" * BASIS, AND BROWN UNIVERSITY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */#include <sys/types.h>#ifdef __STDC__#include <stdlib.h>#include <string.h>#endif#include <string.h>#include <signal.h>#include "SDL_endian.h"#include "video.h"#include "proto.h"#include "util.h"#include "dither.h"/*   Changes to make the code reentrant:      deglobalized: totNumFrames, realTimeStart, stream id vars, Prase_done,         swap, seekValue, input, EOF_flag, ReadPacket statics, sys_layer,	 bitOffset, bitLength, bitBuffer, curVidStream   removed: [aud,sys,vid]Bytes   Additional changes:      get rid on ANSI C complaints about shifting   -lsh@cs.brown.edu (Loring Holden) *//* *-------------------------------------------------------------- * * get_more_data -- * *	Called by get_more_data to read in more data from *      video MPG files (non-system-layer) * * Results: *	Input buffer updated, buffer length updated. *      Returns 1 if data read, 0 if EOF, -1 if error. * * Side effects: *      None. * *-------------------------------------------------------------- */int get_more_data( VidStream* vid_stream ){  unsigned int *buf_start;  int length, num_read, i;  unsigned int request;  unsigned char *buffer, *mark;  unsigned int *lmark;  Sint32 timestamp_offset;  Uint32 data_pos;       if (vid_stream->EOF_flag) return 0;    buf_start = vid_stream->buf_start;  length = vid_stream->buf_length;  buffer = (unsigned char *) vid_stream->buffer;    if (length > 0) {    memcpy((unsigned char *) buf_start, buffer, (unsigned int) (length*4));    mark = ((unsigned char *) (buf_start + length));  }  else {    mark = (unsigned char *) buf_start;    length = 0;  }    request = (vid_stream->max_buf_length-length)*4;    data_pos = vid_stream->_smpeg->mpeg->pos;    num_read = vid_stream->_smpeg->mpeg->copy_data(mark, request);  vid_stream->timestamp = vid_stream->_smpeg->mpeg->timestamp;  timestamp_offset = vid_stream->_smpeg->mpeg->timestamp_pos - data_pos;  vid_stream->timestamp_mark = (unsigned int *)(mark+timestamp_offset);  vid_stream->timestamp_used = false;  /* Paulo Villegas - 26/1/1993: Correction for 4-byte alignment */  {    int num_read_rounded;    unsigned char *index;        num_read_rounded = 4*(num_read/4);        /* this can happen only if num_read<request; i.e. end of file reached */    if ( num_read_rounded < num_read ) {  	  num_read_rounded = 4*( num_read/4+1 ); 	    /* fill in with zeros */ 	  for( index=mark+num_read; index<mark+num_read_rounded; *(index++)=0 ); 	  /* advance to the next 4-byte boundary */ 	  num_read = num_read_rounded;    }  }    if (num_read < 0) {    return -1;  }  if (num_read == 0) {    vid_stream->buffer = buf_start;        /* Make 32 bits after end equal to 0 and 32     * bits after that equal to seq end code     * in order to prevent messy data from infinite     * recursion.     */        *(buf_start + length) = 0x0;    *(buf_start + length+1) = SEQ_END_CODE;        vid_stream->EOF_flag = 1;    return 0;  }    lmark = (unsigned int *) mark;    num_read = num_read/4;    for (i = 0; i < num_read; i++) {    *lmark = SDL_SwapBE32(*lmark);    lmark++;  }    vid_stream->buffer = buf_start;  vid_stream->buf_length = length + num_read;    return 1;}/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -