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

📄 mpeg3io.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
字号:
#include "mpeg3private.h"#include "mpeg3protos.h"#include <mpeg4ip.h>#ifdef HAVE_LINUX_CDROM_H#include <mntent.h>#endif#if 0#include <stdint.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#endifmpeg3_fs_t* mpeg3_new_fs(const char *path){	mpeg3_fs_t *fs = calloc(1, sizeof(mpeg3_fs_t));	fs->buffer = calloc(1, MPEG3_IO_SIZE);// Force initial read	fs->buffer_position = -0xffff;	fs->css = mpeg3_new_css();	strcpy(fs->path, path);	return fs;}int mpeg3_delete_fs(mpeg3_fs_t *fs){	mpeg3_delete_css(fs->css);	free(fs->buffer);	free(fs);	return 0;}int mpeg3_copy_fs(mpeg3_fs_t *dst, mpeg3_fs_t *src){	strcpy(dst->path, src->path);	dst->current_byte = 0;	return 0;}long mpeg3io_get_total_bytes(mpeg3_fs_t *fs){	struct stat ostat;	stat(fs->path, &ostat);	fs->total_bytes = ostat.st_size;	return fs->total_bytes;	/* * 	fseek(fs->fd, 0, SEEK_END); * 	fs->total_bytes = ftell(fs->fd); * 	fseek(fs->fd, 0, SEEK_SET); * 	return fs->total_bytes; */}long mpeg3io_path_total_bytes(char *path){	struct stat st;	if(stat(path, &st) < 0) return 0;	return (long)st.st_size;}int mpeg3io_open_file(mpeg3_fs_t *fs){/* Need to perform authentication before reading a single byte. */	mpeg3_get_keys(fs->css, fs->path);	if(!(fs->fd = fopen(fs->path, "rb")))	{		perror("mpeg3io_open_file");		return 1;	}	fs->total_bytes = mpeg3io_get_total_bytes(fs);	if(!fs->total_bytes)	{		fclose(fs->fd);		return 1;	}	fs->current_byte = 0;	fs->buffer_position = -0xffff;	return 0;}int mpeg3io_close_file(mpeg3_fs_t *fs){	if(fs->fd) fclose(fs->fd);	fs->fd = 0;	return 0;}int mpeg3io_read_data(unsigned char *buffer, long bytes, mpeg3_fs_t *fs){	int result = 0, i, fragment_size;	//fprintf(stderr, "mpeg3io_read_data 1 %d\n", bytes);	for(i = 0; bytes > 0 && !result; )	{		result = mpeg3io_sync_buffer(fs);		fragment_size = MPEG3_IO_SIZE;		if(fragment_size > bytes) fragment_size = bytes;		if(fs->buffer_offset + fragment_size > fs->buffer_size) 			fragment_size = fs->buffer_size - fs->buffer_offset;		memcpy(buffer + i, fs->buffer + fs->buffer_offset, fragment_size);		fs->buffer_offset += fragment_size;		fs->current_byte += fragment_size;		i += fragment_size;		bytes -= fragment_size;	}//fprintf(stderr, "mpeg3io_read_data 2 %d\n", bytes);	return (result && bytes);}int mpeg3io_seek(mpeg3_fs_t *fs, int64_t byte){	fs->current_byte = byte;	return (fs->current_byte < 0) || (fs->current_byte > fs->total_bytes);}int mpeg3io_seek_relative(mpeg3_fs_t *fs, long bytes){	fs->current_byte += bytes;	return (fs->current_byte < 0) || (fs->current_byte > fs->total_bytes);}void mpeg3io_complete_path(char *complete_path, char *path){	if(path[0] != '/')	{		char current_dir[MPEG3_STRLEN];		getcwd(current_dir, MPEG3_STRLEN);		sprintf(complete_path, "%s/%s", current_dir, path);	}	else		strcpy(complete_path, path);}#ifdef HAVE_LINUX_CDROM_Hint mpeg3io_device(char *path, char *device){	struct stat file_st, device_st;    struct mntent *mnt;	FILE *fp;	if(stat(path, &file_st) < 0)	{		perror("mpeg3io_device");		return 1;	}	fp = setmntent(MOUNTED, "r");    while(fp && (mnt = getmntent(fp)))	{		if(stat(mnt->mnt_fsname, &device_st) < 0) continue;		if(device_st.st_rdev == file_st.st_dev)		{			strncpy(device, mnt->mnt_fsname, MPEG3_STRLEN);			break;		}	}	endmntent(fp);	return 0;}#endifvoid mpeg3io_get_directory(char *directory, char *path){	char *ptr = strrchr(path, '/');	if(ptr)	{		int i;		for(i = 0; i < ptr - path; i++)		{			directory[i] = path[i];		}		directory[i] = 0;	}}void mpeg3io_get_filename(char *filename, char *path){	char *ptr = strrchr(path, '/');	if(!ptr) 		ptr = path;	else		ptr++;	strcpy(filename, ptr);}void mpeg3io_joinpath(char *title_path, char *directory, char *new_filename){	sprintf(title_path, "%s/%s", directory, new_filename);}/* Find end of next 4 byte code */int mpeg3io_next_code(mpeg3_fs_t *fs, uint32_t code, int count){	uint32_t header = 0;	while(header != code &&		!mpeg3io_eof(fs) &&		count > 0)	{		header <<= 8;		header |= mpeg3io_read_char(fs);		count--;	}	return mpeg3io_eof(fs) || count <= 0;}/* Find start of previous 4 byte code */int mpeg3io_prev_code(mpeg3_fs_t *fs, uint32_t code, int count){	uint32_t header = 0;	while(header != code &&		!mpeg3io_bof(fs) &&		count > 0)	{		mpeg3io_seek_relative(fs, -1);		header >>= 8;		header |= ((uint32_t)mpeg3io_read_char(fs)) << 24;//printf("mpeg3io_prev_code %08x\n", header);		mpeg3io_seek_relative(fs, -1);		count--;	}		return mpeg3io_bof(fs) || count <= 0;}

⌨️ 快捷键说明

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