⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sr1.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
// #define NEWBUFFERING//#define DEBUG_RESYNC/* 1 frame = 4608 byte PCM */#ifdef __GNUC__#define LOCAL static inline#else#define LOCAL static _inline#endif//#undef LOCAL//#define LOCAL#include        <stdlib.h>#include        <stdio.h>#include        <string.h>#include        <signal.h>#include        <math.h>#define real float// #define int long#include "mpg123.h"#include "huffman.h"#include "mp3.h"#include "bswap.h"#include "../cpudetect.h"//#include "../liba52/mm_accel.h"#include "../mp_msg.h"#ifdef ARCH_X86#define CAN_COMPILE_X86_ASM#endif//static FILE* mp3_file=NULL;int MP3_frames=0;int MP3_eof=0;int MP3_pause=0;int MP3_filesize=0;int MP3_fpos=0;      // current file positionint MP3_framesize=0; // current framesizeint MP3_bitrate=0;   // current bitrateint MP3_samplerate=0;  // current samplerateint MP3_resync=0;int MP3_channels=0;int MP3_bps=2;static long outscale = 32768;#include "tabinit.c"#if 1extern int mplayer_audio_read(char *buf,int size);LOCAL int mp3_read(char *buf,int size){//  int len=fread(buf,1,size,mp3_file);  int len=mplayer_audio_read(buf,size);  if(len>0) MP3_fpos+=len;//  if(len!=size) MP3_eof=1;  return len;}#elseextern int mp3_read(char *buf,int size);#endif/* * Modified for use with MPlayer, for details see the CVS changelog at * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ * $Id: sr1.c,v 1.32 2005/04/15 22:21:34 diego Exp $ *///void mp3_seek(int pos){//  fseek(mp3_file,pos,SEEK_SET);//  return (MP3_fpos=ftell(mp3_file));//}/*       Frame reader           */#define MAXFRAMESIZE 1280#define MAXFRAMESIZE2 (512+MAXFRAMESIZE)static int fsizeold=0,ssize=0;static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */static unsigned char *bsbufold=bsspace[0]+512;static unsigned char *bsbuf=bsspace[1]+512;static int bsnum=0;static int bitindex;static unsigned char *wordpointer;static int bitsleft;static unsigned char *pcm_sample;   /* outbuffer address */static int pcm_point = 0;           /* outbuffer offset */static struct frame fr;static int tabsel_123[2][3][16] = {   { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},     {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},     {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },   { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},     {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},     {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }};static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };LOCAL unsigned int getbits(short number_of_bits){  unsigned long rval;//  if(MP3_frames>=7741) printf("getbits: bits=%d  bitsleft=%d  wordptr=%x\n",number_of_bits,bitsleft,wordpointer);  if((bitsleft-=number_of_bits)<0) return 0;  if(!number_of_bits) return 0;         rval = wordpointer[0];         rval <<= 8;         rval |= wordpointer[1];         rval <<= 8;         rval |= wordpointer[2];         rval <<= bitindex;         rval &= 0xffffff;         bitindex += number_of_bits;         rval >>= (24-number_of_bits);         wordpointer += (bitindex>>3);         bitindex &= 7;  return rval;}LOCAL unsigned int getbits_fast(short number_of_bits){  unsigned long rval;//  if(MP3_frames>=7741) printf("getbits_fast: bits=%d  bitsleft=%d  wordptr=%x\n",number_of_bits,bitsleft,wordpointer);  if((bitsleft-=number_of_bits)<0) return 0;  if(!number_of_bits) return 0;#if defined(CAN_COMPILE_X86_ASM)  rval = bswap_16(*((unsigned short *)wordpointer));#else  /*   * we may not be able to address unaligned 16-bit data on non-x86 cpus.   * Fall back to some portable code.   */  rval = wordpointer[0] << 8 | wordpointer[1];#endif         rval <<= bitindex;         rval &= 0xffff;         bitindex += number_of_bits;         rval >>= (16-number_of_bits);         wordpointer += (bitindex>>3);         bitindex &= 7;  return rval;}LOCAL unsigned int get1bit(void){  unsigned char rval;//  if(MP3_frames>=7741) printf("get1bit: bitsleft=%d  wordptr=%x\n",bitsleft,wordpointer);  if((--bitsleft)<0) return 0;  rval = *wordpointer << bitindex;  bitindex++;  wordpointer += (bitindex>>3);  bitindex &= 7;  return ((rval>>7)&1);}LOCAL void set_pointer(long backstep){//  if(backstep!=512 && backstep>fsizeold)//    printf("\rWarning! backstep (%d>%d)                                         \n",backstep,fsizeold);  wordpointer = bsbuf + ssize - backstep;  if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep);  bitindex = 0;  bitsleft+=8*backstep;//  printf("Backstep %d  (bitsleft=%d)\n",backstep,bitsleft);}LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){  if(mp3_read(hbuf,4) != 4) return FALSE;#if defined(CAN_COMPILE_X86_ASM)  *newhead = bswap_32(*((unsigned long *)hbuf));#else  /*   * we may not be able to address unaligned 32-bit data on non-x86 cpus.   * Fall back to some portable code.   */  *newhead =       hbuf[0] << 24 |      hbuf[1] << 16 |      hbuf[2] <<  8 |      hbuf[3];#endif  return TRUE;}LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){  *((unsigned long *)hbuf) >>= 8;  if(mp3_read(hbuf+3,1) != 1) return 0;  *head <<= 8;  *head |= hbuf[3];  return 1;}/* * decode a header and write the information * into the frame structure */LOCAL int decode_header(struct frame *fr,unsigned long newhead){    // head_check:    if( (newhead & 0xffe00000) != 0xffe00000 ||          (newhead & 0x0000fc00) == 0x0000fc00) return FALSE;    fr->lay = 4-((newhead>>17)&3);//    if(fr->lay!=3) return FALSE;    if( newhead & ((long)1<<20) ) {      fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;      fr->mpeg25 = 0;    } else {      fr->lsf = 1;      fr->mpeg25 = 1;    }    if(fr->mpeg25)      fr->sampling_frequency = 6 + ((newhead>>10)&0x3);    else      fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);    if(fr->sampling_frequency>8) return FALSE;  // valid: 0..8    fr->error_protection = ((newhead>>16)&0x1)^0x1;    fr->bitrate_index = ((newhead>>12)&0xf);    fr->padding   = ((newhead>>9)&0x1);    fr->extension = ((newhead>>8)&0x1);    fr->mode      = ((newhead>>6)&0x3);    fr->mode_ext  = ((newhead>>4)&0x3);    fr->copyright = ((newhead>>3)&0x1);    fr->original  = ((newhead>>2)&0x1);    fr->emphasis  = newhead & 0x3;    MP3_channels = fr->stereo    = (fr->mode == MPG_MD_MONO) ? 1 : 2;    if(!fr->bitrate_index){//      fprintf(stderr,"Free format not supported.\n");      return FALSE;    }switch(fr->lay){  case 2:    MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index];    MP3_samplerate=freqs[fr->sampling_frequency];    fr->framesize = (long) MP3_bitrate * 144000;    fr->framesize /= MP3_samplerate;    MP3_framesize=fr->framesize;    fr->framesize += fr->padding - 4;    break;  case 3:    if(fr->lsf)      ssize = (fr->stereo == 1) ? 9 : 17;    else      ssize = (fr->stereo == 1) ? 17 : 32;    if(fr->error_protection) ssize += 2;    MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index];    MP3_samplerate=freqs[fr->sampling_frequency];    fr->framesize  = (long) MP3_bitrate * 144000;    fr->framesize /= MP3_samplerate<<(fr->lsf);    MP3_framesize=fr->framesize;    fr->framesize += fr->padding - 4;    break;  case 1://    fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;    MP3_bitrate=tabsel_123[fr->lsf][0][fr->bitrate_index];    MP3_samplerate=freqs[fr->sampling_frequency];    fr->framesize  = (long) MP3_bitrate * 12000;    fr->framesize /= MP3_samplerate;    MP3_framesize  = ((fr->framesize+fr->padding)<<2);    fr->framesize  = MP3_framesize-4;//    printf("framesize=%d\n",fr->framesize);    break;  default:    MP3_framesize=fr->framesize=0;//    fprintf(stderr,"Sorry, unsupported layer type.\n");    return 0;}    if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE;    return 1;}LOCAL int stream_read_frame_body(int size){  /* flip/init buffer for Layer 3 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -