interface.cpp
上传用户:lusi_8715
上传日期:2007-01-08
资源大小:199k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  * This application contains code from OpenDivX and is released as a "Larger Work"    *
  4.  * under that license. Consistant with that license, this application is released     *
  5.  * under the GNU General Public License.                                              *
  6.  *                                                                                    *
  7.  * The OpenDivX license can be found at: http://www.projectmayo.com/opendivx/docs.php *
  8.  * The GPL can be found at: http://www.gnu.org/copyleft/gpl.html                      *
  9.  *                                                                                    *
  10.  * Authors: Damien Chavarria <roy204 at projectmayo.com>                              *
  11.  *                                                                                    *
  12.  **************************************************************************************/
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <windows.h>
  16. #include "mpg123.h"
  17. #include "mpglib.h"
  18. struct mpstr *gmp;
  19. extern int head_check(unsigned long head);
  20. /**
  21.  *
  22.  **/
  23. BOOL InitMP3 (struct mpstr *mp) 
  24. {
  25. static int init = 0;
  26. memset (mp, 0, sizeof (struct mpstr));
  27. mp->framesize = 0;
  28. mp->fsizeold = -1;
  29. mp->bsize = 0;
  30. mp->head = mp->tail = NULL;
  31. mp->fr.single = -1;
  32. mp->bsnum = 0;
  33. mp->synth_bo = 1;
  34. mp->tail = NULL;
  35. if (!init) {
  36. init = 1;
  37. make_decode_tables (32767);
  38. init_layer2 ();
  39. init_layer3 (SBLIMIT);
  40. }
  41. return 0;
  42. }
  43. /**
  44.  *
  45.  **/
  46. void ExitMP3 (struct mpstr *mp)
  47. {
  48. struct buf *b,*bn;
  49. b = mp->tail;
  50. while(b != NULL) {
  51. if(b->pnt != NULL) {
  52. free(b->pnt);
  53. }
  54. bn = b->next;
  55. free(b);
  56. b = bn;
  57. }
  58. mp->tail = NULL;
  59. }
  60. /**
  61.  *
  62.  **/
  63. static struct buf *addbuf (struct mpstr *mp,char *buf,int size)
  64. {
  65. struct buf *nbuf;
  66. if (!(nbuf = (struct buf *) malloc (sizeof (struct buf)))) {
  67.   return NULL;
  68. }
  69. if (!(nbuf->pnt = (unsigned char *) malloc(size))) {
  70. free (nbuf);
  71. return NULL;
  72. }
  73. nbuf->size = size;
  74. memcpy (nbuf->pnt,buf,size);
  75. nbuf->next = NULL;
  76. nbuf->prev = mp->head;
  77. nbuf->pos = 0;
  78. if(!mp->tail)
  79. mp->tail = nbuf;
  80. else
  81. mp->head->next = nbuf;
  82. mp->head = nbuf;
  83. mp->bsize += size;
  84. return nbuf;
  85. }
  86. /**
  87.  *
  88.  **/
  89. static void remove_buf(struct mpstr *mp)
  90. {
  91. struct buf *buf = mp->tail;
  92.   
  93. if ((mp->tail = buf->next))
  94. mp->tail->prev = NULL;
  95. else 
  96. mp->tail = mp->head = NULL;
  97.   
  98. free (buf->pnt);
  99. free (buf);
  100. }
  101. /**
  102.  *
  103.  **/
  104. static int _read_buf_byte (struct mpstr *mp)
  105. {
  106. unsigned int b;
  107. int pos;
  108. if(mp == NULL || mp->tail == NULL) {
  109.   return -1;
  110. }
  111. pos = mp->tail->pos;
  112. while (pos >= mp->tail->size) {
  113. remove_buf (mp);
  114. if(mp == NULL || mp->tail == NULL) {
  115.   return -1;
  116. }
  117. pos = mp->tail->pos;
  118. if (!mp->tail) {
  119.   return -1;
  120. }
  121. }
  122. b = mp->tail->pnt[pos];
  123. mp->bsize--;
  124. mp->tail->pos++;
  125. return b;
  126. }
  127. /**
  128.  *
  129.  **/
  130. static void read_head (struct mpstr *mp)
  131. {
  132.   uint32_t head;
  133.   head = _read_buf_byte (mp);
  134.   head <<= 8;
  135.   head |= _read_buf_byte (mp);
  136.   head <<= 8;
  137.   head |= _read_buf_byte (mp);
  138.   head <<= 8;
  139.   head |= _read_buf_byte (mp);
  140.   
  141.   mp->header = head;
  142. }
  143. /**
  144.  *
  145.  **/
  146. int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
  147. int osize,int *done)
  148. {
  149. int len, i;
  150. gmp = mp;
  151. //MessageBox(NULL, "decodeMP3", "", MB_OK);
  152. if(osize < 4608) {
  153.   return MP3_ERR;
  154. }
  155. if(in  && !addbuf(mp, in, isize)) {
  156.   return MP3_ERR;
  157. }
  158. //MessageBox(NULL, "addBuffer", "", MB_OK);
  159. /* First decode header */
  160. if (!mp->framesize) {
  161.   
  162.   if(mp->bsize < 4)
  163.     return MP3_NEED_MORE;
  164.   
  165.   read_head(mp);
  166.   
  167.   i = 0;
  168.   while(!head_check(mp->header) && i < isize) {
  169.     i++;
  170.     read_head(mp);
  171.   }
  172.   //MessageBox(NULL, "while", "", MB_OK);
  173.   if(decode_header(&mp->fr,mp->header) == -1) {
  174.     return MP3_ERR;
  175.   }
  176.   
  177.   mp->framesize = mp->fr.framesize;
  178. }
  179. //MessageBox(NULL, "decode header", "", MB_OK);
  180. if(mp->fr.framesize > mp->bsize)
  181. return MP3_NEED_MORE;
  182. wordpointer = mp->bsspace[mp->bsnum] + 512;
  183. mp->bsnum = (mp->bsnum + 1) & 0x1;
  184. bitindex = 0;
  185. len = 0;
  186. while (len < mp->framesize) {
  187. int nlen;
  188. int blen = mp->tail->size - mp->tail->pos;
  189. if ((mp->framesize - len) <= blen) {
  190. nlen = mp->framesize-len;
  191. } else {
  192. nlen = blen;
  193.                 }
  194. memcpy (wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen);
  195.                 len += nlen;
  196.                 mp->tail->pos += nlen;
  197. mp->bsize -= nlen;
  198.                 if(mp->tail->pos == mp->tail->size)
  199.                    remove_buf(mp);
  200. }
  201. //MessageBox(NULL, "while2", "", MB_OK);
  202. *done = 0;
  203. if(mp->fr.error_protection)
  204. getbits(16);
  205.         switch(mp->fr.lay) {
  206. case 1:
  207. do_layer1 (&mp->fr, (uint8_t *) out, done);
  208. break;
  209. case 2:
  210. do_layer2 (&mp->fr, (uint8_t *) out, done);
  211. break;
  212. case 3:
  213. do_layer3 (&mp->fr, (uint8_t *) out, done);
  214. break;
  215. }
  216. //MessageBox(NULL, "do layer", "", MB_OK);
  217. mp->fsizeold = mp->framesize;
  218. mp->framesize = 0;
  219. return MP3_OK;
  220. }
  221. /**
  222.  *
  223.  **/
  224. int set_pointer(long backstep)
  225. {
  226. uint8_t *bsbufold;
  227. if(gmp->fsizeold < 0 && backstep > 0) {
  228.   return MP3_ERR;
  229. }
  230. bsbufold = gmp->bsspace[gmp->bsnum] + 512;
  231. wordpointer -= backstep;
  232. if (backstep)
  233. memcpy(wordpointer,bsbufold+gmp->fsizeold-backstep,backstep);
  234. bitindex = 0;
  235. return MP3_OK;
  236. }