📄 mpeg3io.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 + -