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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* MPGLIB replacement using mpega.library (AmigaOS)
  2.  * Written by Thomas Wenzel and Sigbj鴕n (CISC) Skj鎟et.
  3.  *
  4.  * Big thanks to St閜hane Tavernard for mpega.library.
  5.  *
  6.  */
  7. #ifdef AMIGA_MPEGA
  8. #include "lame.h"
  9. #include "util.h"
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <proto/exec.h>
  13. #include <dos.h>
  14. #include <proto/mpega.h>
  15. struct Library  *MPEGABase;
  16. MPEGA_STREAM    *mstream=NULL;
  17. MPEGA_CTRL      mctrl;
  18. static int break_cleanup(void)
  19. {
  20. /* Dummy break function to make atexit() work. :P */
  21. return 1;
  22. }
  23. static void exit_cleanup(void)
  24. {
  25. if(mstream) {
  26. MPEGA_close(mstream);
  27. mstream = NULL;
  28. }
  29. if(MPEGABase) {
  30. CloseLibrary(MPEGABase);
  31. MPEGABase = NULL;
  32. }
  33. }
  34. int lame_decode_initfile(const char *fullname, int *stereo, int *samp, int *bitrate, unsigned long *nsamp)
  35. {
  36. mctrl.bs_access = NULL;
  37. mctrl.layer_1_2.mono.quality    = 2;
  38. mctrl.layer_1_2.stereo.quality  = 2;
  39. mctrl.layer_1_2.mono.freq_div   = 1;
  40. mctrl.layer_1_2.stereo.freq_div = 1;
  41. mctrl.layer_1_2.mono.freq_max   = 48000;
  42. mctrl.layer_1_2.stereo.freq_max = 48000;
  43. mctrl.layer_3.mono.quality      = 2;
  44. mctrl.layer_3.stereo.quality    = 2;
  45. mctrl.layer_3.mono.freq_div     = 1;
  46. mctrl.layer_3.stereo.freq_div   = 1;
  47. mctrl.layer_3.mono.freq_max     = 48000;
  48. mctrl.layer_3.stereo.freq_max   = 48000;
  49. mctrl.layer_1_2.force_mono      = 0;
  50. mctrl.layer_3.force_mono        = 0;
  51. MPEGABase = OpenLibrary("mpega.library", 2);
  52. if(!MPEGABase) {
  53. fprintf(stderr, "Unable to open mpega.library v2n");
  54. exit(1);
  55. }
  56. onbreak(break_cleanup);
  57. atexit(exit_cleanup);
  58. mstream=MPEGA_open(fullname, &mctrl);
  59. if(!mstream) { return (-1); }
  60. *stereo  = mstream->dec_channels;
  61. *samp    = mstream->dec_frequency;
  62. *bitrate = mstream->bitrate;
  63. /* *nsamp   = MAX_U_32_NUM; */
  64. *nsamp   = (FLOAT)mstream->ms_duration/1000 * mstream->dec_frequency;
  65. return 0;
  66. }
  67. int lame_decode_fromfile(FILE *fd, short pcm_l[],short pcm_r[])
  68. {
  69. int outsize=0;
  70. WORD *b[MPEGA_MAX_CHANNELS];
  71. b[0]=pcm_l;
  72. b[1]=pcm_r;
  73. while (outsize == 0)
  74. outsize = MPEGA_decode_frame(mstream, b);
  75. if (outsize < 0) { return (-1); }
  76. else { return outsize; }
  77. }
  78. #endif /* AMIGA_MPEGA */