mpeg3io.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "mpeg3private.h"
  2. #include "mpeg3protos.h"
  3. #include <mpeg4ip.h>
  4. #ifdef HAVE_LINUX_CDROM_H
  5. #include <mntent.h>
  6. #endif
  7. #if 0
  8. #include <stdint.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys/stat.h>
  12. #endif
  13. mpeg3_fs_t* mpeg3_new_fs(const char *path)
  14. {
  15. mpeg3_fs_t *fs = calloc(1, sizeof(mpeg3_fs_t));
  16. fs->buffer = calloc(1, MPEG3_IO_SIZE);
  17. // Force initial read
  18. fs->buffer_position = -0xffff;
  19. fs->css = mpeg3_new_css();
  20. strcpy(fs->path, path);
  21. return fs;
  22. }
  23. int mpeg3_delete_fs(mpeg3_fs_t *fs)
  24. {
  25. mpeg3_delete_css(fs->css);
  26. free(fs->buffer);
  27. free(fs);
  28. return 0;
  29. }
  30. int mpeg3_copy_fs(mpeg3_fs_t *dst, mpeg3_fs_t *src)
  31. {
  32. strcpy(dst->path, src->path);
  33. dst->current_byte = 0;
  34. return 0;
  35. }
  36. long mpeg3io_get_total_bytes(mpeg3_fs_t *fs)
  37. {
  38. struct stat ostat;
  39. stat(fs->path, &ostat);
  40. fs->total_bytes = ostat.st_size;
  41. return fs->total_bytes;
  42. /*
  43.  *  fseek(fs->fd, 0, SEEK_END);
  44.  *  fs->total_bytes = ftell(fs->fd);
  45.  *  fseek(fs->fd, 0, SEEK_SET);
  46.  *  return fs->total_bytes;
  47.  */
  48. }
  49. long mpeg3io_path_total_bytes(char *path)
  50. {
  51. struct stat st;
  52. if(stat(path, &st) < 0) return 0;
  53. return (long)st.st_size;
  54. }
  55. int mpeg3io_open_file(mpeg3_fs_t *fs)
  56. {
  57. /* Need to perform authentication before reading a single byte. */
  58. mpeg3_get_keys(fs->css, fs->path);
  59. if(!(fs->fd = fopen(fs->path, "rb")))
  60. {
  61. perror("mpeg3io_open_file");
  62. return 1;
  63. }
  64. fs->total_bytes = mpeg3io_get_total_bytes(fs);
  65. if(!fs->total_bytes)
  66. {
  67. fclose(fs->fd);
  68. return 1;
  69. }
  70. fs->current_byte = 0;
  71. fs->buffer_position = -0xffff;
  72. return 0;
  73. }
  74. int mpeg3io_close_file(mpeg3_fs_t *fs)
  75. {
  76. if(fs->fd) fclose(fs->fd);
  77. fs->fd = 0;
  78. return 0;
  79. }
  80. int mpeg3io_read_data(unsigned char *buffer, long bytes, mpeg3_fs_t *fs)
  81. {
  82. int result = 0, i, fragment_size;
  83. //fprintf(stderr, "mpeg3io_read_data 1 %dn", bytes);
  84. for(i = 0; bytes > 0 && !result; )
  85. {
  86. result = mpeg3io_sync_buffer(fs);
  87. fragment_size = MPEG3_IO_SIZE;
  88. if(fragment_size > bytes) fragment_size = bytes;
  89. if(fs->buffer_offset + fragment_size > fs->buffer_size) 
  90. fragment_size = fs->buffer_size - fs->buffer_offset;
  91. memcpy(buffer + i, fs->buffer + fs->buffer_offset, fragment_size);
  92. fs->buffer_offset += fragment_size;
  93. fs->current_byte += fragment_size;
  94. i += fragment_size;
  95. bytes -= fragment_size;
  96. }
  97. //fprintf(stderr, "mpeg3io_read_data 2 %dn", bytes);
  98. return (result && bytes);
  99. }
  100. int mpeg3io_seek(mpeg3_fs_t *fs, int64_t byte)
  101. {
  102. fs->current_byte = byte;
  103. return (fs->current_byte < 0) || (fs->current_byte > fs->total_bytes);
  104. }
  105. int mpeg3io_seek_relative(mpeg3_fs_t *fs, long bytes)
  106. {
  107. fs->current_byte += bytes;
  108. return (fs->current_byte < 0) || (fs->current_byte > fs->total_bytes);
  109. }
  110. void mpeg3io_complete_path(char *complete_path, char *path)
  111. {
  112. if(path[0] != '/')
  113. {
  114. char current_dir[MPEG3_STRLEN];
  115. getcwd(current_dir, MPEG3_STRLEN);
  116. sprintf(complete_path, "%s/%s", current_dir, path);
  117. }
  118. else
  119. strcpy(complete_path, path);
  120. }
  121. #ifdef HAVE_LINUX_CDROM_H
  122. int mpeg3io_device(char *path, char *device)
  123. {
  124. struct stat file_st, device_st;
  125.     struct mntent *mnt;
  126. FILE *fp;
  127. if(stat(path, &file_st) < 0)
  128. {
  129. perror("mpeg3io_device");
  130. return 1;
  131. }
  132. fp = setmntent(MOUNTED, "r");
  133.     while(fp && (mnt = getmntent(fp)))
  134. {
  135. if(stat(mnt->mnt_fsname, &device_st) < 0) continue;
  136. if(device_st.st_rdev == file_st.st_dev)
  137. {
  138. strncpy(device, mnt->mnt_fsname, MPEG3_STRLEN);
  139. break;
  140. }
  141. }
  142. endmntent(fp);
  143. return 0;
  144. }
  145. #endif
  146. void mpeg3io_get_directory(char *directory, char *path)
  147. {
  148. char *ptr = strrchr(path, '/');
  149. if(ptr)
  150. {
  151. int i;
  152. for(i = 0; i < ptr - path; i++)
  153. {
  154. directory[i] = path[i];
  155. }
  156. directory[i] = 0;
  157. }
  158. }
  159. void mpeg3io_get_filename(char *filename, char *path)
  160. {
  161. char *ptr = strrchr(path, '/');
  162. if(!ptr) 
  163. ptr = path;
  164. else
  165. ptr++;
  166. strcpy(filename, ptr);
  167. }
  168. void mpeg3io_joinpath(char *title_path, char *directory, char *new_filename)
  169. {
  170. sprintf(title_path, "%s/%s", directory, new_filename);
  171. }
  172. /* Find end of next 4 byte code */
  173. int mpeg3io_next_code(mpeg3_fs_t *fs, uint32_t code, int count)
  174. {
  175. uint32_t header = 0;
  176. while(header != code &&
  177. !mpeg3io_eof(fs) &&
  178. count > 0)
  179. {
  180. header <<= 8;
  181. header |= mpeg3io_read_char(fs);
  182. count--;
  183. }
  184. return mpeg3io_eof(fs) || count <= 0;
  185. }
  186. /* Find start of previous 4 byte code */
  187. int mpeg3io_prev_code(mpeg3_fs_t *fs, uint32_t code, int count)
  188. {
  189. uint32_t header = 0;
  190. while(header != code &&
  191. !mpeg3io_bof(fs) &&
  192. count > 0)
  193. {
  194. mpeg3io_seek_relative(fs, -1);
  195. header >>= 8;
  196. header |= ((uint32_t)mpeg3io_read_char(fs)) << 24;
  197. //printf("mpeg3io_prev_code %08xn", header);
  198. mpeg3io_seek_relative(fs, -1);
  199. count--;
  200. }
  201. return mpeg3io_bof(fs) || count <= 0;
  202. }