dxhead.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:4k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/stdlib.h"
  36. #include "hlxclib/stdio.h"
  37. #include "hlxclib/float.h"
  38. #include "hlxclib/math.h"
  39. #include "dxhead.h"
  40. // 4   Xing
  41. // 4   flags
  42. // 4   frames
  43. // 4   bytes
  44. // 100 toc
  45. /*-------------------------------------------------------------*/
  46. static int ExtractI4(unsigned char *buf)
  47. {
  48. int x;
  49. // big endian extract
  50. x = buf[0];
  51. x <<= 8;
  52. x |= buf[1];
  53. x <<= 8;
  54. x |= buf[2];
  55. x <<= 8;
  56. x |= buf[3];
  57. return x;
  58. }
  59. /*-------------------------------------------------------------*/
  60. int GetXingHeader(XHEADDATA *X,  unsigned char *buf)
  61. {
  62. int i, head_flags;
  63. int h_id, h_mode, h_sr_index;
  64. static const int sr_table[4] = { 44100, 48000, 32000, 99999 };
  65. // get Xing header data
  66. X->flags = 0;     // clear to null incase fail
  67. // get selected MPEG header data
  68. h_id       = (buf[1] >> 3) & 1;
  69. h_sr_index = (buf[2] >> 2) & 3;
  70. h_mode     = (buf[3] >> 6) & 3;
  71. // determine offset of header
  72. if( h_id ) {        // mpeg1
  73.     if( h_mode != 3 ) buf+=(32+4);
  74.     else              buf+=(17+4);
  75. }
  76. else {      // mpeg2
  77.     if( h_mode != 3 ) buf+=(17+4);
  78.     else              buf+=(9+4);
  79. }
  80. if( buf[0] != 'X' ) return 0;    // fail
  81. if( buf[1] != 'i' ) return 0;    // header not found
  82. if( buf[2] != 'n' ) return 0;
  83. if( buf[3] != 'g' ) return 0;
  84. buf+=4;
  85. X->h_id = h_id;
  86. X->samprate = sr_table[h_sr_index];
  87. if( h_id == 0 ) X->samprate >>= 1;
  88. head_flags = X->flags = ExtractI4(buf); buf+=4;      // get flags
  89. if( head_flags & FRAMES_FLAG ) {X->frames   = ExtractI4(buf); buf+=4;}
  90. if( head_flags & BYTES_FLAG )  {X->bytes = ExtractI4(buf); buf+=4;}
  91. if( head_flags & TOC_FLAG ) {
  92.     if( X->toc != NULL ) {
  93.         for(i=0;i<100;i++) X->toc[i] = buf[i];
  94.     }
  95.     buf+=100;
  96. }
  97. X->vbr_scale = -1;
  98. if( head_flags & VBR_SCALE_FLAG )  {X->vbr_scale = ExtractI4(buf); buf+=4;}
  99. //if( X->toc != NULL ) {
  100. //for(i=0;i<100;i++) {
  101. //    if( (i%10) == 0 ) printf("n");
  102. //    printf(" %3d", (int)(X->toc[i]));
  103. //}
  104. //}
  105. return 1;       // success
  106. }
  107. /*-------------------------------------------------------------*/
  108. int SeekPoint(unsigned char TOC[100], int file_bytes, float percent) /* Flawfinder: ignore */
  109. {
  110. // interpolate in TOC to get file seek point in bytes
  111. int a, seekpoint;
  112. float fa, fb, fx;
  113. if( percent < 0.0f )   percent = 0.0f;
  114. if( percent > 100.0f ) percent = 100.0f;
  115. a = (int)percent;
  116. if( a > 99 ) a = 99;
  117. fa = TOC[a];
  118. if( a < 99 ) {
  119.     fb = TOC[a+1];
  120. }
  121. else {
  122.     fb = 256.0f;
  123. }
  124. fx = fa + (fb-fa)*(percent-a);
  125. seekpoint = (int)((1.0f/256.0f)*fx*file_bytes); 
  126. return seekpoint;
  127. }
  128. /*-------------------------------------------------------------*/