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

多媒体

开发平台:

Unix_Linux

  1. #include "quicktime.h"
  2. int quicktime_stsz_init(quicktime_stsz_t *stsz)
  3. {
  4. stsz->version = 0;
  5. stsz->flags = 0;
  6. stsz->sample_size = 0;
  7. stsz->total_entries = 0;
  8. stsz->entries_allocated = 0;
  9. }
  10. int quicktime_stsz_init_video(quicktime_t *file, quicktime_stsz_t *stsz)
  11. {
  12. stsz->sample_size = 0;
  13. if(!stsz->entries_allocated)
  14. {
  15. stsz->entries_allocated = 2000;
  16. stsz->total_entries = 0;
  17. stsz->table = (quicktime_stsz_table_t*)malloc(sizeof(quicktime_stsz_table_t) * stsz->entries_allocated);
  18. }
  19. }
  20. int quicktime_stsz_init_audio(quicktime_t *file, quicktime_stsz_t *stsz, int channels, int bits)
  21. {
  22. //stsz->sample_size = channels * bits / 8;
  23. stsz->sample_size = 1;   // ?
  24. stsz->total_entries = 0;   // set this when closing
  25. stsz->entries_allocated = 0;
  26. }
  27. int quicktime_stsz_delete(quicktime_stsz_t *stsz)
  28. {
  29. if(!stsz->sample_size && stsz->total_entries) free(stsz->table);
  30. stsz->total_entries = 0;
  31. stsz->entries_allocated = 0;
  32. }
  33. int quicktime_stsz_dump(quicktime_stsz_t *stsz)
  34. {
  35. int i;
  36. printf("     sample sizen");
  37. printf("      version %dn", stsz->version);
  38. printf("      flags %dn", stsz->flags);
  39. printf("      sample_size %dn", stsz->sample_size);
  40. printf("      total_entries %dn", stsz->total_entries);
  41. if(!stsz->sample_size)
  42. {
  43. for(i = 0; i < stsz->total_entries; i++)
  44. {
  45. printf("       sample_size %dn", stsz->table[i].size);
  46. }
  47. }
  48. }
  49. int quicktime_read_stsz(quicktime_t *file, quicktime_stsz_t *stsz)
  50. {
  51. int i;
  52. stsz->version = quicktime_read_char(file);
  53. stsz->flags = quicktime_read_int24(file);
  54. stsz->sample_size = quicktime_read_int32(file);
  55. stsz->total_entries = quicktime_read_int32(file);
  56. stsz->entries_allocated = stsz->total_entries;
  57. if(!stsz->sample_size)
  58. {
  59. stsz->table = (quicktime_stsz_table_t*)malloc(sizeof(quicktime_stsz_table_t) * stsz->entries_allocated);
  60. for(i = 0; i < stsz->total_entries; i++)
  61. {
  62. stsz->table[i].size = quicktime_read_int32(file);
  63. }
  64. }
  65. }
  66. int quicktime_write_stsz(quicktime_t *file, quicktime_stsz_t *stsz)
  67. {
  68. int i, result;
  69. quicktime_atom_t atom;
  70. quicktime_atom_write_header(file, &atom, "stsz");
  71. // optimize if possible
  72. // doesn't work with xanim
  73. //  if(!stsz->sample_size)
  74. //  {
  75. //  for(i = 0, result = 0; i < stsz->total_entries && !result; i++)
  76. //  {
  77. //  if(stsz->table[i].size != stsz->table[0].size) result = 1;
  78. //  }
  79. // 
  80. //  if(!result)
  81. //  {
  82. //  stsz->sample_size = stsz->table[0].size;
  83. //  stsz->total_entries = 0;
  84. //  free(stsz->table);
  85. //  }
  86. //  }
  87. quicktime_write_char(file, stsz->version);
  88. quicktime_write_int24(file, stsz->flags);
  89. quicktime_write_int32(file, stsz->sample_size);
  90. if(stsz->sample_size)
  91. {
  92. quicktime_write_int32(file, stsz->total_entries);
  93. }
  94. else
  95. {
  96. quicktime_write_int32(file, stsz->total_entries);
  97. for(i = 0; i < stsz->total_entries; i++)
  98. {
  99. quicktime_write_int32(file, stsz->table[i].size);
  100. }
  101. }
  102. quicktime_atom_write_footer(file, &atom);
  103. }
  104. int quicktime_update_stsz(quicktime_stsz_t *stsz, long sample, long sample_size)
  105. {
  106. quicktime_stsz_table_t *new_table;
  107. int i;
  108. if(!stsz->sample_size)
  109. {
  110. if(sample >= stsz->entries_allocated)
  111. {
  112. stsz->entries_allocated = sample * 2;
  113. new_table = (quicktime_stsz_table_t*)malloc(sizeof(quicktime_stsz_table_t) * stsz->entries_allocated);
  114. for(i = 0; i < stsz->total_entries; i++) new_table[i] = stsz->table[i];
  115. free(stsz->table);
  116. stsz->table = new_table;
  117. }
  118. stsz->table[sample].size = sample_size;
  119. if(sample >= stsz->total_entries) stsz->total_entries = sample + 1;
  120. }
  121. }