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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  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 sample_size)
  21. {
  22. stsz->sample_size = sample_size; /* if == 0, then use table */
  23. stsz->total_entries = 0;   /* set this when closing */
  24. stsz->entries_allocated = 0;
  25. }
  26. int quicktime_stsz_delete(quicktime_stsz_t *stsz)
  27. {
  28. if(!stsz->sample_size && stsz->total_entries) 
  29. 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. /* Xanim requires an unoptimized table for video. */
  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. stsz->table = (quicktime_stsz_table_t *)realloc(stsz->table,
  114. sizeof(quicktime_stsz_table_t) * stsz->entries_allocated);
  115. }
  116. stsz->table[sample].size = sample_size;
  117. if(sample >= stsz->total_entries) 
  118. stsz->total_entries = sample + 1;
  119. }
  120. }