www.pudn.com > NETVIDEO.rar > mpeg3io.h
#ifndef MPEG3IO_H #define MPEG3IO_H #include#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