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

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. /* 
  22.  * Notes:
  23.  *  - file formatted with tabstops == 4 spaces 
  24.  */
  25. #include <mp4av_common.h>
  26. bool MP4AV_AudioConsecutiveHinter( 
  27. MP4FileHandle mp4File, 
  28. MP4TrackId mediaTrackId, 
  29. MP4TrackId hintTrackId,
  30. MP4Duration sampleDuration, 
  31. u_int8_t perPacketHeaderSize,
  32. u_int8_t perSampleHeaderSize,
  33. u_int8_t maxSamplesPerPacket,
  34. u_int16_t maxPayloadSize,
  35. MP4AV_AudioSampleSizer pSizer,
  36. MP4AV_AudioConcatenator pConcatenator,
  37. MP4AV_AudioFragmenter pFragmenter)
  38. {
  39. bool rc;
  40. u_int32_t numSamples = 
  41. MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
  42. u_int16_t bytesThisHint = perPacketHeaderSize;
  43. u_int16_t samplesThisHint = 0;
  44. MP4SampleId* pSampleIds = 
  45. new MP4SampleId[maxSamplesPerPacket];
  46. for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
  47. u_int32_t sampleSize = 
  48. (*pSizer)(mp4File, mediaTrackId, sampleId);
  49. // sample won't fit in this packet
  50. // or we've reached the limit on samples per packet
  51. if ((int16_t)(sampleSize + perSampleHeaderSize) 
  52.     > maxPayloadSize - bytesThisHint 
  53.   || samplesThisHint == maxSamplesPerPacket) {
  54. if (samplesThisHint > 0) {
  55. rc = (*pConcatenator)(mp4File, mediaTrackId, hintTrackId,
  56. samplesThisHint, pSampleIds,
  57. samplesThisHint * sampleDuration,
  58. maxPayloadSize);
  59. if (!rc) {
  60. return false;
  61. }
  62. }
  63. // start a new hint 
  64. samplesThisHint = 0;
  65. bytesThisHint = perPacketHeaderSize;
  66. // fall thru
  67. }
  68. // sample is less than remaining payload size
  69. if ((int16_t)(sampleSize + perSampleHeaderSize)
  70.   <= maxPayloadSize - bytesThisHint) {
  71. // add it to this hint
  72. bytesThisHint += (sampleSize + perSampleHeaderSize);
  73. pSampleIds[samplesThisHint++] = sampleId;
  74. } else { 
  75. // jumbo frame, need to fragment it
  76. rc = (*pFragmenter)(mp4File, mediaTrackId, hintTrackId,
  77. sampleId, sampleSize, sampleDuration, maxPayloadSize);
  78. if (!rc) {
  79. return false;
  80. }
  81. // start a new hint 
  82. samplesThisHint = 0;
  83. bytesThisHint = perPacketHeaderSize;
  84. }
  85. }
  86. delete [] pSampleIds;
  87. return true;
  88. }
  89. bool MP4AV_AudioInterleaveHinter( 
  90. MP4FileHandle mp4File, 
  91. MP4TrackId mediaTrackId, 
  92. MP4TrackId hintTrackId,
  93. MP4Duration sampleDuration, 
  94. u_int8_t stride, 
  95. u_int8_t bundle,
  96. u_int16_t maxPayloadSize,
  97. MP4AV_AudioConcatenator pConcatenator)
  98. {
  99. bool rc;
  100. u_int32_t numSamples = 
  101. MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
  102. MP4SampleId* pSampleIds = new MP4SampleId[bundle];
  103. for (u_int32_t i = 1; i <= numSamples; i += stride * bundle) {
  104. for (u_int32_t j = 0; j < stride; j++) {
  105. u_int32_t k;
  106. for (k = 0; k < bundle; k++) {
  107. MP4SampleId sampleId = i + j + (k * stride);
  108. // out of samples for this bundle
  109. if (sampleId > numSamples) {
  110. break;
  111. }
  112. // add sample to this hint
  113. pSampleIds[k] = sampleId;
  114. }
  115. if (k == 0) {
  116. break;
  117. }
  118. // compute hint duration
  119. // note this is used to control the RTP timestamps 
  120. // that are emitted for the packet,
  121. // it isn't the actual duration of the samples in the packet
  122. MP4Duration hintDuration;
  123. if (j + 1 == stride) {
  124. // at the end of the track
  125. if (i + (stride * bundle) > numSamples) {
  126. hintDuration = ((numSamples - i) - j) * sampleDuration;
  127. } else {
  128. hintDuration = ((stride * bundle) - j) * sampleDuration;
  129. }
  130. } else {
  131. hintDuration = sampleDuration;
  132. }
  133. // write hint
  134. rc = (*pConcatenator)(mp4File, mediaTrackId, hintTrackId,
  135. k, pSampleIds, hintDuration, maxPayloadSize);
  136. if (!rc) {
  137. return false;
  138. }
  139. }
  140. }
  141. delete [] pSampleIds;
  142. return true;
  143. }