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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "quicktime.h"
  2. int quicktime_stsc_init(quicktime_stsc_t *stsc)
  3. {
  4. stsc->version = 0;
  5. stsc->flags = 0;
  6. stsc->total_entries = 0;
  7. stsc->entries_allocated = 0;
  8. }
  9. int quicktime_stsc_init_table(quicktime_t *file, quicktime_stsc_t *stsc)
  10. {
  11. if(!stsc->total_entries)
  12. {
  13. stsc->total_entries = 1;
  14. stsc->entries_allocated = 1;
  15. stsc->table = (quicktime_stsc_table_t*)malloc(sizeof(quicktime_stsc_table_t) * stsc->entries_allocated);
  16. }
  17. }
  18. int quicktime_stsc_init_video(quicktime_t *file, quicktime_stsc_t *stsc)
  19. {
  20. quicktime_stsc_table_t *table;
  21. quicktime_stsc_init_table(file, stsc);
  22. table = &(stsc->table[0]);
  23. table->chunk = 1;
  24. table->samples = 1;
  25. table->id = 1;
  26. }
  27. int quicktime_stsc_init_audio(quicktime_t *file, quicktime_stsc_t *stsc)
  28. {
  29. quicktime_stsc_table_t *table;
  30. quicktime_stsc_init_table(file, stsc);
  31. table = &(stsc->table[0]);
  32. table->chunk = 1;
  33. table->samples = 0;         /* set this after completion or after every audio chunk is written */
  34. table->id = 1;
  35. }
  36. int quicktime_stsc_delete(quicktime_stsc_t *stsc)
  37. {
  38. if(stsc->total_entries) free(stsc->table);
  39. stsc->total_entries = 0;
  40. }
  41. int quicktime_stsc_dump(quicktime_stsc_t *stsc)
  42. {
  43. int i;
  44. printf("     sample to chunkn");
  45. printf("      version %dn", stsc->version);
  46. printf("      flags %dn", stsc->flags);
  47. printf("      total_entries %dn", stsc->total_entries);
  48. for(i = 0; i < stsc->total_entries; i++)
  49. {
  50. printf("       chunk %d samples %d id %dn", 
  51. stsc->table[i].chunk, stsc->table[i].samples, stsc->table[i].id);
  52. }
  53. }
  54. int quicktime_read_stsc(quicktime_t *file, quicktime_stsc_t *stsc)
  55. {
  56. int i;
  57. stsc->version = quicktime_read_char(file);
  58. stsc->flags = quicktime_read_int24(file);
  59. stsc->total_entries = quicktime_read_int32(file);
  60. stsc->entries_allocated = stsc->total_entries;
  61. stsc->table = (quicktime_stsc_table_t*)malloc(sizeof(quicktime_stsc_table_t) * stsc->total_entries);
  62. for(i = 0; i < stsc->total_entries; i++)
  63. {
  64. stsc->table[i].chunk = quicktime_read_int32(file);
  65. stsc->table[i].samples = quicktime_read_int32(file);
  66. stsc->table[i].id = quicktime_read_int32(file);
  67. }
  68. }
  69. int quicktime_write_stsc(quicktime_t *file, quicktime_stsc_t *stsc)
  70. {
  71. int i, last_same;
  72. quicktime_atom_t atom;
  73. quicktime_atom_write_header(file, &atom, "stsc");
  74. for(i = 1, last_same = 0; i < stsc->total_entries; i++)
  75. {
  76. if(stsc->table[i].samples != stsc->table[last_same].samples)
  77. {
  78. /* An entry has a different sample count. */
  79. last_same++;
  80. if(last_same < i)
  81. {
  82. /* Move it up the list. */
  83. stsc->table[last_same] = stsc->table[i];
  84. }
  85. }
  86. }
  87. last_same++;
  88. stsc->total_entries = last_same;
  89. quicktime_write_char(file, stsc->version);
  90. quicktime_write_int24(file, stsc->flags);
  91. quicktime_write_int32(file, stsc->total_entries);
  92. for(i = 0; i < stsc->total_entries; i++)
  93. {
  94. quicktime_write_int32(file, stsc->table[i].chunk);
  95. quicktime_write_int32(file, stsc->table[i].samples);
  96. quicktime_write_int32(file, stsc->table[i].id);
  97. }
  98. quicktime_atom_write_footer(file, &atom);
  99. }
  100. int quicktime_update_stsc(quicktime_stsc_t *stsc, long chunk, long samples)
  101. {
  102. /* quicktime_stsc_table_t *table = stsc->table; */
  103. quicktime_stsc_table_t *new_table;
  104. long i;
  105. if(chunk > stsc->entries_allocated)
  106. {
  107. stsc->entries_allocated = chunk * 2;
  108. new_table = (quicktime_stsc_table_t*)malloc(sizeof(quicktime_stsc_table_t) * stsc->entries_allocated);
  109. for(i = 0; i < stsc->total_entries; i++) new_table[i] = stsc->table[i];
  110. free(stsc->table);
  111. stsc->table = new_table;
  112. }
  113. stsc->table[chunk - 1].samples = samples;
  114. stsc->table[chunk - 1].chunk = chunk;
  115. stsc->table[chunk - 1].id = 1;
  116. if(chunk > stsc->total_entries) stsc->total_entries = chunk;
  117. return 0;
  118. }
  119. /* Optimizing while writing doesn't allow seeks during recording so */
  120. /* entries are created for every chunk and only optimized during */
  121. /* writeout.  Unfortunately there's no way to keep audio synchronized */
  122. /* after overwriting  a recording as the fractional audio chunk in the */
  123. /* middle always overwrites the previous location of a larger chunk.  On */
  124. /* writing, the table must be optimized.  RealProducer requires an  */
  125. /* optimized table. */