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

📄 stream.c

📁 linux下的MPEG1
💻 C
字号:
/*    $Id: stream.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $    Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#include <cdio/cdio.h>/* #define STREAM_DEBUG  *//* Public headers */#include <libvcd/logging.h>/* Private headers */#include "vcd_assert.h"#include "stream.h"#include "util.h"static const char _rcsid[] = "$Id: stream.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $";/*  * DataSource implementations */struct _VcdDataSink {  void* user_data;  vcd_data_sink_io_functions op;  int is_open;  long position;};static void_vcd_data_sink_open_if_necessary(VcdDataSink *obj){  vcd_assert (obj != NULL);  if (!obj->is_open) {    if ((obj->op.open) (obj->user_data))      vcd_error("could not opening output stream...");    else {      obj->is_open = 1;      obj->position = 0;    }  }}VcdDataSink* vcd_data_sink_new(void *user_data, const vcd_data_sink_io_functions *funcs){  VcdDataSink *new_obj;  new_obj = _vcd_malloc(sizeof(VcdDataSink));  new_obj->user_data = user_data;  memcpy(&(new_obj->op), funcs, sizeof(vcd_data_sink_io_functions));  return new_obj;}longvcd_data_sink_seek(VcdDataSink* obj, long offset){  vcd_assert (obj != NULL);  _vcd_data_sink_open_if_necessary(obj);  if (obj->position != offset) {    vcd_warn("had to reposition DataSink from %ld to %ld!", obj->position, offset);    obj->position = offset;    return obj->op.seek(obj->user_data, offset);  }  return 0;}longvcd_data_sink_write(VcdDataSink* obj, const void *ptr, long size, long nmemb){  long written;  vcd_assert (obj != NULL);    _vcd_data_sink_open_if_necessary(obj);  written = obj->op.write(obj->user_data, ptr, size*nmemb);  obj->position += written;  return written;}longvcd_data_sink_printf (VcdDataSink *obj, const char format[], ...){  char buf[4096] = { 0, };  long retval;  int len;  va_list args;  va_start (args, format);  len = vsnprintf (buf, sizeof(buf), format, args);  if (len < 0 || len > (sizeof (buf) - 1))    vcd_error ("vsnprintf() returned %d", len);    retval = vcd_data_sink_write (obj, buf, 1, len);  va_end (args);  return retval;}voidvcd_data_sink_close(VcdDataSink* obj){  vcd_assert (obj != NULL);  if (obj->is_open) {    obj->op.close(obj->user_data);    obj->is_open = 0;    obj->position = 0;  }}voidvcd_data_sink_destroy(VcdDataSink* obj){  vcd_assert (obj != NULL);  vcd_data_sink_close(obj);  obj->op.free(obj->user_data);}/*  * DataSource implementations */struct _VcdDataSource {  void* user_data;  vcd_data_source_io_functions op;  int is_open;  long position;};static void_vcd_data_source_open_if_necessary(VcdDataSource *obj){  vcd_assert (obj != NULL);  if (!obj->is_open) {    if ((obj->op.open) (obj->user_data))      vcd_error ("could not opening input stream...");    else {#ifdef STREAM_DEBUG      vcd_debug ("opened source...");#endif      obj->is_open = 1;      obj->position = 0;    }  }}longvcd_data_source_seek(VcdDataSource* obj, long offset){  vcd_assert (obj != NULL);  _vcd_data_source_open_if_necessary(obj);  if (obj->position != offset) {#ifdef STREAM_DEBUG    vcd_warn("had to reposition DataSource from %ld to %ld!", obj->position, offset);#endif    obj->position = offset;    return obj->op.seek(obj->user_data, offset);  }  return 0;}VcdDataSource*vcd_data_source_new(void *user_data, const vcd_data_source_io_functions *funcs){  VcdDataSource *new_obj;  new_obj = _vcd_malloc (sizeof (VcdDataSource));  new_obj->user_data = user_data;  memcpy(&(new_obj->op), funcs, sizeof(vcd_data_source_io_functions));  return new_obj;}longvcd_data_source_read(VcdDataSource* obj, void *ptr, long size, long nmemb){  long read_bytes;  vcd_assert (obj != NULL);  _vcd_data_source_open_if_necessary(obj);  read_bytes = obj->op.read(obj->user_data, ptr, size*nmemb);  obj->position += read_bytes;  return read_bytes;}longvcd_data_source_stat(VcdDataSource* obj){  vcd_assert (obj != NULL);  _vcd_data_source_open_if_necessary(obj);  return obj->op.stat(obj->user_data);}voidvcd_data_source_close(VcdDataSource* obj){  vcd_assert (obj != NULL);  if (obj->is_open) {#ifdef STREAM_DEBUG    vcd_debug ("closed source...");#endif    obj->op.close(obj->user_data);    obj->is_open = 0;    obj->position = 0;  }}voidvcd_data_source_destroy(VcdDataSource* obj){  vcd_assert (obj != NULL);  vcd_data_source_close(obj);  obj->op.free(obj->user_data);}/*  * Local variables: *  c-file-style: "gnu" *  tab-width: 8 *  indent-tabs-mode: nil * End: */

⌨️ 快捷键说明

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