stsc.c
上传用户:luping1608
上传日期:2007-01-06
资源大小:38k
文件大小:4k
源码类别:

多媒体

开发平台:

Unix_Linux

  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, int sample_rate)
  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;
  72. quicktime_atom_t atom;
  73. quicktime_atom_write_header(file, &atom, "stsc");
  74. quicktime_write_char(file, stsc->version);
  75. quicktime_write_int24(file, stsc->flags);
  76. quicktime_write_int32(file, stsc->total_entries);
  77. for(i = 0; i < stsc->total_entries; i++)
  78. {
  79. quicktime_write_int32(file, stsc->table[i].chunk);
  80. quicktime_write_int32(file, stsc->table[i].samples);
  81. quicktime_write_int32(file, stsc->table[i].id);
  82. }
  83. quicktime_atom_write_footer(file, &atom);
  84. }
  85. int quicktime_update_stsc(quicktime_stsc_t *stsc, long chunk, long samples)
  86. {
  87. quicktime_stsc_table_t *table = stsc->table;
  88. quicktime_stsc_table_t *new_table;
  89. long i, j, k;
  90. i = stsc->total_entries;
  91. do
  92. {
  93. i--;
  94. if(i >= 0)
  95. {
  96. if(table[i].samples != samples)
  97. {
  98. if(table[i].chunk == chunk)
  99. {
  100. table[i].samples = samples;
  101. return 0;
  102. }
  103. else
  104. if(table[i].chunk < chunk)
  105. {
  106. if(stsc->total_entries + 1 > stsc->entries_allocated)
  107. {
  108. stsc->entries_allocated *= 2;
  109. new_table = (quicktime_stsc_table_t*)malloc(sizeof(quicktime_stsc_table_t) * stsc->entries_allocated);
  110. for(j = 0; j < stsc->total_entries; j++)
  111. new_table[j] = table[j];
  112. free(stsc->table);
  113. stsc->table = new_table;
  114. table = new_table;
  115. }
  116. for(j = stsc->total_entries, k = j - 1; k > i; j--, k--)
  117. table[j] = table[k];
  118. table[i + 1].samples = samples;
  119. table[i + 1].chunk = chunk;
  120. table[i + 1].id = table[0].id;
  121. stsc->total_entries++;
  122. i = -1;
  123. }
  124. }
  125. }
  126. }while(i >= 0 && table[i].chunk > chunk);
  127. }