1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include "mpeg3private.h"
#include "mpeg3protos.h"
#ifndef _WIN32
#include <mntent.h>
#else
#endif
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
mpeg3_fs_t* mpeg3_new_fs(char *path)
{
mpeg3_fs_t *fs = (mpeg3_fs_t*)calloc(1, sizeof(mpeg3_fs_t));
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);
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 st;
if(stat(fs->path, &st) < 0) return 0;
return (long)st.st_size;
/* fseek(fs->fd, 0, SEEK_END); */
/* fs->total_bytes = ftell(fs->fd); */
/* fseek(fs->fd, 0, SEEK_SET); */
/* return fs->total_bytes; */
}
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;
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;
//printf("read %d bytes\n",bytes);
result = !fread(buffer, 1, bytes, fs->fd);
fs->current_byte += bytes;
return (result && bytes);
}
int 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;
}
#ifndef _WIN32
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);
#endif
return 0;
}
int mpeg3io_seek(mpeg3_fs_t *fs, long byte)
{
fs->current_byte = byte;
return fseek(fs->fd, byte, SEEK_SET);
}
int mpeg3io_seek_relative(mpeg3_fs_t *fs, long bytes)
{
fs->current_byte += bytes;
return fseek(fs->fd, fs->current_byte, SEEK_SET);
}
|