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

📄 mpeg3io.h

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 H
字号:
#ifndef MPEG3IO_H
#define MPEG3IO_H

#include <mpeg4ip.h>
#include "mpeg3css.h"
#include "mpeg3private.inc"

/* Filesystem structure */
/* We buffer in MPEG3_IO_SIZE buffers.  Stream IO would require back */
/* buffering a buffer since the stream must be rewound for packet headers, */
/* sequence start codes, format parsing, decryption, and mpeg3cat. */



typedef struct
{
	FILE *fd;
	mpeg3_css_t *css;          /* Encryption object */
	char path[MPEG3_STRLEN];
	unsigned char *buffer;   /* Readahead buffer */
	int64_t buffer_offset;      /* Current buffer position */
	int64_t buffer_size;        /* Bytes in buffer */
	int64_t buffer_position;    /* Byte in file of start of buffer */

/* Hypothetical position of file pointer */
	int64_t current_byte;
	int64_t total_bytes;
} mpeg3_fs_t;




#define mpeg3io_tell(fs) (((mpeg3_fs_t *)(fs))->current_byte)

// End of file
#define mpeg3io_eof(fs) (((mpeg3_fs_t *)(fs))->current_byte >= ((mpeg3_fs_t *)(fs))->total_bytes)

// Beginning of file
#define mpeg3io_bof(fs)	(((mpeg3_fs_t *)(fs))->current_byte < 0)

#define mpeg3io_get_fd(fs) (fileno(((mpeg3_fs_t *)(fs))->fd))

#define mpeg3io_total_bytes(fs) (((mpeg3_fs_t *)(fs))->total_bytes)

static __inline int mpeg3io_sync_buffer(mpeg3_fs_t *fs)
{
	if(fs->buffer_position + fs->buffer_offset != fs->current_byte)
// Reposition buffer offset
	{
		fs->buffer_offset = fs->current_byte - fs->buffer_position;
	}

// Load new buffer
	if(fs->current_byte < fs->buffer_position ||
		fs->current_byte >= fs->buffer_position + fs->buffer_size)
	{
// Sequential reverse buffer
		if(fs->current_byte == fs->buffer_position - 1)
		{
//printf("mpeg3io_sync_buffer 1 %x %x\n", fs->current_byte, fs->buffer_position);
			fs->buffer_position = fs->current_byte - MPEG3_IO_SIZE + 1;
			if(fs->buffer_position < 0) fs->buffer_position = 0;

			fs->buffer_size = fs->current_byte - fs->buffer_position + 1;
			fs->buffer_offset = fs->buffer_size - 1;

			fseek(fs->fd, fs->buffer_position, SEEK_SET);
			fs->buffer_size = fread(fs->buffer, 1, fs->buffer_size, fs->fd);
		}
		else
// Sequential forward buffer or random seek
		{
//printf("mpeg3io_sync_buffer 2 %x %x\n", fs->current_byte, fs->buffer_position);
			fs->buffer_position = fs->current_byte;
			fs->buffer_offset = 0;
			fseek(fs->fd, fs->buffer_position, SEEK_SET);
			fs->buffer_size = fread(fs->buffer, 1, MPEG3_IO_SIZE, fs->fd);
		}
	}
	
	return !fs->buffer_size;
}

static unsigned int mpeg3io_read_char(mpeg3_fs_t *fs)
{
	unsigned int result;
	mpeg3io_sync_buffer(fs);
	result = fs->buffer[fs->buffer_offset++];
	fs->current_byte++;
	return result;
}

static __inline unsigned char mpeg3io_next_char(mpeg3_fs_t *fs)
{
	unsigned char result;
	mpeg3io_sync_buffer(fs);
	result = fs->buffer[fs->buffer_offset];
	return result;
}

static __inline uint32_t mpeg3io_read_int32(mpeg3_fs_t *fs)
{
	int a, b, c, d;
	uint32_t result;
/* Do not fread.  This breaks byte ordering. */
	a = mpeg3io_read_char(fs);
	b = mpeg3io_read_char(fs);
	c = mpeg3io_read_char(fs);
	d = mpeg3io_read_char(fs);
	result = (a << 24) |
					(b << 16) |
					(c << 8) |
					(d);
	return result;
}

static __inline uint32_t mpeg3io_read_int24(mpeg3_fs_t *fs)
{
	int b, c, d;
	uint32_t result;
/* Do not fread.  This breaks byte ordering. */
	b = mpeg3io_read_char(fs);
	c = mpeg3io_read_char(fs);
	d = mpeg3io_read_char(fs);
	result = (b << 16) |
					(c << 8) |
					(d);
	return result;
}

static __inline uint16_t mpeg3io_read_int16(mpeg3_fs_t *fs)
{
	int c, d;
	uint16_t result;
/* Do not fread.  This breaks byte ordering. */
	c = mpeg3io_read_char(fs);
	d = mpeg3io_read_char(fs);
	result = (c << 8) |
					(d);
	return result;
}

#endif

⌨️ 快捷键说明

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