1 #include "mpeg3private.h"
2 #include "mpeg3protos.h"
10 mpeg3_fs_t
* mpeg3_new_fs(char *path
)
12 mpeg3_fs_t
*fs
= calloc(1, sizeof(mpeg3_fs_t
));
13 fs
->buffer
= calloc(1, MPEG3_IO_SIZE
);
15 fs
->buffer_position
= -0xffff;
16 fs
->css
= mpeg3_new_css();
17 strcpy(fs
->path
, path
);
21 int mpeg3_delete_fs(mpeg3_fs_t
*fs
)
23 mpeg3_delete_css(fs
->css
);
29 int mpeg3_copy_fs(mpeg3_fs_t
*dst
, mpeg3_fs_t
*src
)
31 strcpy(dst
->path
, src
->path
);
32 dst
->current_byte
= 0;
36 int64_t mpeg3io_get_total_bytes(mpeg3_fs_t
*fs
)
39 stat64(fs
->path
, &ostat
);
40 fs
->total_bytes
= ostat
.st_size
;
41 return fs
->total_bytes
;
44 * fseek(fs->fd, 0, SEEK_END);
45 * fs->total_bytes = ftell(fs->fd);
46 * fseek(fs->fd, 0, SEEK_SET);
47 * return fs->total_bytes;
51 int64_t mpeg3io_path_total_bytes(char *path
)
54 if(stat64(path
, &st
) < 0) return 0;
58 int mpeg3io_open_file(mpeg3_fs_t
*fs
)
60 /* Need to perform authentication before reading a single byte. */
61 mpeg3_get_keys(fs
->css
, fs
->path
);
63 //printf("mpeg3io_open_file 1 %s\n", fs->path);
64 if(!(fs
->fd
= fopen64(fs
->path
, "rb")))
66 perror("mpeg3io_open_file");
70 fs
->total_bytes
= mpeg3io_get_total_bytes(fs
);
79 fs
->buffer_position
= -0xffff;
83 int mpeg3io_close_file(mpeg3_fs_t
*fs
)
85 if(fs
->fd
) fclose(fs
->fd
);
90 int mpeg3io_read_data(unsigned char *buffer
, long bytes
, mpeg3_fs_t
*fs
)
92 int result
= 0, i
, fragment_size
;
94 //printf("mpeg3io_read_data 1 %d\n", bytes);
95 for(i
= 0; bytes
> 0 && !result
; )
97 result
= mpeg3io_sync_buffer(fs
);
99 fragment_size
= MPEG3_IO_SIZE
;
101 if(fragment_size
> bytes
) fragment_size
= bytes
;
103 if(fs
->buffer_offset
+ fragment_size
> fs
->buffer_size
)
104 fragment_size
= fs
->buffer_size
- fs
->buffer_offset
;
106 memcpy(buffer
+ i
, fs
->buffer
+ fs
->buffer_offset
, fragment_size
);
108 fs
->buffer_offset
+= fragment_size
;
109 fs
->current_byte
+= fragment_size
;
111 bytes
-= fragment_size
;
112 //printf("mpeg3io_read_data 10 %d\n", bytes);
115 //printf("mpeg3io_read_data 100 %d\n", bytes);
116 return (result
&& bytes
);
119 int mpeg3io_seek(mpeg3_fs_t
*fs
, int64_t byte
)
121 //printf("mpeg3io_seek 1 %llx\n", byte);
122 fs
->current_byte
= byte
;
123 return (fs
->current_byte
< 0) || (fs
->current_byte
> fs
->total_bytes
);
126 int mpeg3io_seek_relative(mpeg3_fs_t
*fs
, long bytes
)
128 fs
->current_byte
+= bytes
;
129 return (fs
->current_byte
< 0) || (fs
->current_byte
> fs
->total_bytes
);
132 void mpeg3io_read_buffer(mpeg3_fs_t
*fs
)
134 // Sequential reverse buffer
135 if(fs
->current_byte
== fs
->buffer_position
- 1)
137 fs
->buffer_position
= fs
->current_byte
- MPEG3_IO_SIZE
+ 1;
138 if(fs
->buffer_position
< 0) fs
->buffer_position
= 0;
140 fs
->buffer_size
= fs
->current_byte
- fs
->buffer_position
+ 1;
141 fs
->buffer_offset
= fs
->buffer_size
- 1;
143 //printf("mpeg3io_read_buffer 1 %x %x\n", fs->current_byte, fs->buffer_position);
144 fseeko64(fs
->fd
, fs
->buffer_position
, SEEK_SET
);
145 //printf("mpeg3io_read_buffer 10\n");
146 fs
->buffer_size
= fread(fs
->buffer
, 1, fs
->buffer_size
, fs
->fd
);
147 //printf("mpeg3io_read_buffer 100\n");
150 // Sequential forward buffer or random seek
153 fs
->buffer_position
= fs
->current_byte
;
154 fs
->buffer_offset
= 0;
156 //printf("mpeg3io_read_buffer 200\n");
157 result
= fseeko64(fs
->fd
, fs
->buffer_position
, SEEK_SET
);
158 //printf("mpeg3io_read_buffer 210\n");
159 fs
->buffer_size
= fread(fs
->buffer
, 1, MPEG3_IO_SIZE
, fs
->fd
);
160 //printf("mpeg3io_read_buffer 220\n");
162 * printf(__FUNCTION__ " 2 result=%d ftell=%llx buffer_position=%llx %02x%02x%02x%02x%02x%02x%02x%02x %02x%02x\n",
165 * fs->buffer_position,
180 void mpeg3io_complete_path(char *complete_path
, char *path
)
184 char current_dir
[MPEG3_STRLEN
];
185 getcwd(current_dir
, MPEG3_STRLEN
);
186 sprintf(complete_path
, "%s/%s", current_dir
, path
);
189 strcpy(complete_path
, path
);
192 int mpeg3io_device(char *path
, char *device
)
194 struct stat64 file_st
, device_st
;
198 if(stat64(path
, &file_st
) < 0)
200 perror("mpeg3io_device");
204 fp
= setmntent(MOUNTED
, "r");
205 while(fp
&& (mnt
= getmntent(fp
)))
207 if(stat64(mnt
->mnt_fsname
, &device_st
) < 0) continue;
208 if(device_st
.st_rdev
== file_st
.st_dev
)
210 strncpy(device
, mnt
->mnt_fsname
, MPEG3_STRLEN
);
219 void mpeg3io_get_directory(char *directory
, char *path
)
221 char *ptr
= strrchr(path
, '/');
225 for(i
= 0; i
< ptr
- path
; i
++)
227 directory
[i
] = path
[i
];
233 void mpeg3io_get_filename(char *filename
, char *path
)
235 char *ptr
= strrchr(path
, '/');
241 strcpy(filename
, ptr
);
244 void mpeg3io_joinpath(char *title_path
, char *directory
, char *new_filename
)
246 sprintf(title_path
, "%s/%s", directory
, new_filename
);
250 /* Find end of next 4 byte code */
251 int mpeg3io_next_code(mpeg3_fs_t
*fs
, uint32_t code
, int count
)
255 while(header
!= code
&&
260 header
|= mpeg3io_read_char(fs
);
264 return mpeg3io_eof(fs
) || count
<= 0;
267 /* Find start of previous 4 byte code */
268 int mpeg3io_prev_code(mpeg3_fs_t
*fs
, uint32_t code
, int count
)
271 while(header
!= code
&&
275 mpeg3io_seek_relative(fs
, -1);
277 header
|= ((uint32_t)mpeg3io_read_char(fs
)) << 24;
278 //printf("mpeg3io_prev_code %08x\n", header);
279 mpeg3io_seek_relative(fs
, -1);
283 return mpeg3io_bof(fs
) || count
<= 0;