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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifndef MPEG3IO_H
  2. #define MPEG3IO_H
  3. #include <mpeg4ip.h>
  4. #include "mpeg3css.h"
  5. #include "mpeg3private.inc"
  6. /* Filesystem structure */
  7. /* We buffer in MPEG3_IO_SIZE buffers.  Stream IO would require back */
  8. /* buffering a buffer since the stream must be rewound for packet headers, */
  9. /* sequence start codes, format parsing, decryption, and mpeg3cat. */
  10. typedef struct
  11. {
  12. FILE *fd;
  13. mpeg3_css_t *css;          /* Encryption object */
  14. char path[MPEG3_STRLEN];
  15. unsigned char *buffer;   /* Readahead buffer */
  16. int64_t buffer_offset;      /* Current buffer position */
  17. int64_t buffer_size;        /* Bytes in buffer */
  18. int64_t buffer_position;    /* Byte in file of start of buffer */
  19. /* Hypothetical position of file pointer */
  20. int64_t current_byte;
  21. int64_t total_bytes;
  22. } mpeg3_fs_t;
  23. #define mpeg3io_tell(fs) (((mpeg3_fs_t *)(fs))->current_byte)
  24. // End of file
  25. #define mpeg3io_eof(fs) (((mpeg3_fs_t *)(fs))->current_byte >= ((mpeg3_fs_t *)(fs))->total_bytes)
  26. // Beginning of file
  27. #define mpeg3io_bof(fs) (((mpeg3_fs_t *)(fs))->current_byte < 0)
  28. #define mpeg3io_get_fd(fs) (fileno(((mpeg3_fs_t *)(fs))->fd))
  29. #define mpeg3io_total_bytes(fs) (((mpeg3_fs_t *)(fs))->total_bytes)
  30. static __inline int mpeg3io_sync_buffer(mpeg3_fs_t *fs)
  31. {
  32. if(fs->buffer_position + fs->buffer_offset != fs->current_byte)
  33. // Reposition buffer offset
  34. {
  35. fs->buffer_offset = fs->current_byte - fs->buffer_position;
  36. }
  37. // Load new buffer
  38. if(fs->current_byte < fs->buffer_position ||
  39. fs->current_byte >= fs->buffer_position + fs->buffer_size)
  40. {
  41. // Sequential reverse buffer
  42. if(fs->current_byte == fs->buffer_position - 1)
  43. {
  44. //printf("mpeg3io_sync_buffer 1 %x %xn", fs->current_byte, fs->buffer_position);
  45. fs->buffer_position = fs->current_byte - MPEG3_IO_SIZE + 1;
  46. if(fs->buffer_position < 0) fs->buffer_position = 0;
  47. fs->buffer_size = fs->current_byte - fs->buffer_position + 1;
  48. fs->buffer_offset = fs->buffer_size - 1;
  49. fseek(fs->fd, fs->buffer_position, SEEK_SET);
  50. fs->buffer_size = fread(fs->buffer, 1, fs->buffer_size, fs->fd);
  51. }
  52. else
  53. // Sequential forward buffer or random seek
  54. {
  55. //printf("mpeg3io_sync_buffer 2 %x %xn", fs->current_byte, fs->buffer_position);
  56. fs->buffer_position = fs->current_byte;
  57. fs->buffer_offset = 0;
  58. fseek(fs->fd, fs->buffer_position, SEEK_SET);
  59. fs->buffer_size = fread(fs->buffer, 1, MPEG3_IO_SIZE, fs->fd);
  60. }
  61. }
  62. return !fs->buffer_size;
  63. }
  64. static unsigned int mpeg3io_read_char(mpeg3_fs_t *fs)
  65. {
  66. unsigned int result;
  67. mpeg3io_sync_buffer(fs);
  68. result = fs->buffer[fs->buffer_offset++];
  69. fs->current_byte++;
  70. return result;
  71. }
  72. static __inline unsigned char mpeg3io_next_char(mpeg3_fs_t *fs)
  73. {
  74. unsigned char result;
  75. mpeg3io_sync_buffer(fs);
  76. result = fs->buffer[fs->buffer_offset];
  77. return result;
  78. }
  79. static __inline uint32_t mpeg3io_read_int32(mpeg3_fs_t *fs)
  80. {
  81. int a, b, c, d;
  82. uint32_t result;
  83. /* Do not fread.  This breaks byte ordering. */
  84. a = mpeg3io_read_char(fs);
  85. b = mpeg3io_read_char(fs);
  86. c = mpeg3io_read_char(fs);
  87. d = mpeg3io_read_char(fs);
  88. result = (a << 24) |
  89. (b << 16) |
  90. (c << 8) |
  91. (d);
  92. return result;
  93. }
  94. static __inline uint32_t mpeg3io_read_int24(mpeg3_fs_t *fs)
  95. {
  96. int b, c, d;
  97. uint32_t result;
  98. /* Do not fread.  This breaks byte ordering. */
  99. b = mpeg3io_read_char(fs);
  100. c = mpeg3io_read_char(fs);
  101. d = mpeg3io_read_char(fs);
  102. result = (b << 16) |
  103. (c << 8) |
  104. (d);
  105. return result;
  106. }
  107. static __inline uint16_t mpeg3io_read_int16(mpeg3_fs_t *fs)
  108. {
  109. int c, d;
  110. uint16_t result;
  111. /* Do not fread.  This breaks byte ordering. */
  112. c = mpeg3io_read_char(fs);
  113. d = mpeg3io_read_char(fs);
  114. result = (c << 8) |
  115. (d);
  116. return result;
  117. }
  118. #endif