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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "quicktime.h"
  22. int quicktime_esds_init(quicktime_esds_t *esds)
  23. {
  24. esds->version = 0;
  25. esds->flags = 0;
  26. esds->decoderConfigLen = 0;
  27. esds->decoderConfig = NULL;
  28. return 0;
  29. }
  30. int quicktime_esds_get_decoder_config(quicktime_esds_t* esds, u_char** ppBuf, int* pBufSize)
  31. {
  32. if (esds->decoderConfig == NULL || esds->decoderConfigLen == 0) {
  33. *ppBuf = NULL;
  34. *pBufSize = 0;
  35. } else {
  36. *ppBuf = malloc(esds->decoderConfigLen);
  37. if (*ppBuf == NULL) {
  38. *pBufSize = 0;
  39. return 1;
  40. }
  41. memcpy(*ppBuf, esds->decoderConfig, esds->decoderConfigLen);
  42. *pBufSize = esds->decoderConfigLen;
  43. }
  44. return 0;
  45. }
  46. int quicktime_esds_set_decoder_config(quicktime_esds_t* esds, u_char* pBuf, int bufSize)
  47. {
  48. free(esds->decoderConfig);
  49. esds->decoderConfig = malloc(bufSize);
  50. if (esds->decoderConfig) {
  51. memcpy(esds->decoderConfig, pBuf, bufSize);
  52. esds->decoderConfigLen = bufSize;
  53. return 0;
  54. }
  55. return 1;
  56. }
  57. int quicktime_esds_delete(quicktime_esds_t *esds)
  58. {
  59. free(esds->decoderConfig);
  60. return 0;
  61. }
  62. int quicktime_esds_dump(quicktime_esds_t *esds)
  63. {
  64. int i;
  65. printf("       elementary stream descriptorn");
  66. printf("        version %dn", esds->version);
  67. printf("        flags %ldn", esds->flags);
  68. printf("        decoder config ");
  69. for (i = 0; i < esds->decoderConfigLen; i++) {
  70. printf("%02x ", esds->decoderConfig[i]);
  71. }
  72. printf("n");
  73. }
  74. int quicktime_read_esds(quicktime_t *file, quicktime_esds_t *esds)
  75. {
  76. u_int8_t tag;
  77. u_int32_t length;
  78. esds->version = quicktime_read_char(file);
  79. esds->flags = quicktime_read_int24(file);
  80. /* get and verify ES_DescrTag */
  81. tag = quicktime_read_char(file);
  82. if (tag == 0x03) {
  83. /* read length */
  84. if (quicktime_read_mp4_descr_length(file) < 5 + 15) {
  85. return 1;
  86. }
  87. /* skip 3 bytes */
  88. quicktime_set_position(file, quicktime_position(file) + 3);
  89. } else {
  90. /* skip 2 bytes */
  91. quicktime_set_position(file, quicktime_position(file) + 2);
  92. }
  93. /* get and verify DecoderConfigDescrTab */
  94. if (quicktime_read_char(file) != 0x04) {
  95. return 1;
  96. }
  97. /* read length */
  98. if (quicktime_read_mp4_descr_length(file) < 15) {
  99. return 1;
  100. }
  101. /* skip 13 bytes */
  102. quicktime_set_position(file, quicktime_position(file) + 13);
  103. /* get and verify DecSpecificInfoTag */
  104. if (quicktime_read_char(file) != 0x05) {
  105. return 1;
  106. }
  107. /* read length */
  108. esds->decoderConfigLen = quicktime_read_mp4_descr_length(file); 
  109. free(esds->decoderConfig);
  110. esds->decoderConfig = malloc(esds->decoderConfigLen);
  111. if (esds->decoderConfig) {
  112. quicktime_read_data(file, esds->decoderConfig, esds->decoderConfigLen);
  113. } else {
  114. esds->decoderConfigLen = 0;
  115. }
  116. /* will skip the remainder of the atom */
  117. return 0;
  118. }
  119. int quicktime_write_esds_common(quicktime_t *file, quicktime_esds_t *esds, int esid, u_int objectType, u_int streamType)
  120. {
  121. quicktime_atom_t atom;
  122. if (!file->use_mp4) {
  123. return 0;
  124. }
  125. quicktime_atom_write_header(file, &atom, "esds");
  126. quicktime_write_char(file, esds->version);
  127. quicktime_write_int24(file, esds->flags);
  128. quicktime_write_char(file, 0x03); /* ES_DescrTag */
  129. quicktime_write_mp4_descr_length(file, 
  130. 3 + (5 + (13 + (5 + esds->decoderConfigLen))) + 3, FALSE);
  131. quicktime_write_int16(file, esid);
  132. quicktime_write_char(file, 0x10); /* streamPriorty = 16 (0-31) */
  133. /* DecoderConfigDescriptor */
  134. quicktime_write_char(file, 0x04); /* DecoderConfigDescrTag */
  135. quicktime_write_mp4_descr_length(file, 
  136. 13 + (5 + esds->decoderConfigLen), FALSE);
  137. quicktime_write_char(file, objectType); /* objectTypeIndication */
  138. quicktime_write_char(file, streamType); /* streamType */
  139. quicktime_write_int24(file, 0); /* buffer size */
  140. quicktime_write_int32(file, 0); /* max bitrate */
  141. quicktime_write_int32(file, 0); /* average bitrate */
  142. quicktime_write_char(file, 0x05); /* DecSpecificInfoTag */
  143. quicktime_write_mp4_descr_length(file, esds->decoderConfigLen, FALSE);
  144. quicktime_write_data(file, esds->decoderConfig, esds->decoderConfigLen);
  145. /* SLConfigDescriptor */
  146. quicktime_write_char(file, 0x06); /* SLConfigDescrTag */
  147. quicktime_write_char(file, 0x01); /* length */
  148. quicktime_write_char(file, 0x02); /* constant in mp4 files */
  149. /* no IPI_DescrPointer */
  150. /* no IP_IdentificationDataSet */
  151. /* no IPMP_DescriptorPointer */
  152. /* no LanguageDescriptor */
  153. /* no QoS_Descriptor */
  154. /* no RegistrationDescriptor */
  155. /* no ExtensionDescriptor */
  156. quicktime_atom_write_footer(file, &atom);
  157. }
  158. int quicktime_write_esds_audio(quicktime_t *file, quicktime_esds_t *esds, int esid)
  159. {
  160. return quicktime_write_esds_common(file, esds, esid, (u_int)0x40, (u_int)0x05);
  161. }
  162. int quicktime_write_esds_video(quicktime_t *file, quicktime_esds_t *esds, int esid)
  163. {
  164. return quicktime_write_esds_common(file, esds, esid, (u_int)0x20, (u_int)0x04);
  165. }