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