demux_real_new.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,849 行 · 第 1/5 页

C
1,849
字号
                                    UINT32  ulBytesToRead);typedef void (*rm_seek_func_ptr) (void*  pUserRead,                                  UINT32 ulOffset,                                  UINT32 ulOrigin);                                  unsigned int rm_file_read(void* pUserRead,                          unsigned char*   pBuf,                          unsigned int ulBytesToRead){	return stream_read(pUserRead,pBuf,ulBytesToRead);}                                    void rm_file_seek(void*  pUserRead,                                  unsigned int ulOffset,                                  unsigned int ulOrigin){	stream_t *s = (stream_t *)pUserRead;	unsigned int pos;	if(ulOrigin == 0)	{		return stream_seek(pUserRead,ulOffset);	}else if(ulOrigin == 1)	{		pos = stream_tell();		return stream_seek(pUserRead,pos + ulOffset);	}			return -1;}                                                                    static demuxer_t* demux_open_real(demuxer_t* demuxer){	int lBytesRead;	unsigned char       *ucBuf = NULL;  HX_RESULT hxRet;    stream_seek(demuxer->stream,0);  pParser = rm_parser_create2(NULL, rm2yuv_error,HXNULL,rm_memory_default_malloc,rm_memory_default_free);  if(pParser == NULL)  {  	F("rm:create parse error!\n");  }   rm_parser_init_io(rm_parser*        pParser,                            void*             pUserRead,                            rm_read_func_ptr  fpRead,                            rm_seek_func_ptr  fpSeek)                              hxRet = rm_parser_init_io(pParser,demuxer->stream,(rm_read_func_ptr)rm_file_read,(rm_seek_func_ptr)rm_file_seek);  if(hxRet == != HXR_OK)  {  	F("rm:rm_parser_init_io error!\n");    goto exitsub;  }  retVal = rm_parser_read_headers(pParser);  if (retVal != HXR_OK)  {      goto exitsub;  }  /* Get the number of streams */  ulNumStreams = rm_parser_get_num_streams(pParser);  if (ulNumStreams == 0)  {      fprintf(stderr, "Error: rm_parser_get_num_streams() returns 0\n");      goto exitsub;  }  /* Now loop through the stream headers and find the video */  for (i = 0; i < ulNumStreams && retVal == HXR_OK; i++)  {      retVal = rm_parser_get_stream_header(pParser, i, &pHdr);      if (retVal == HXR_OK)      {          if (rm_stream_is_realvideo(pHdr))          {              usStreamNum = (UINT16) i;              break;          }          else          {              /* Destroy the stream header */              rm_parser_destroy_stream_header(pParser, &pHdr);          }      }  }  /* Do we have a RealVideo stream in this .rm file? */  if (!pHdr)  {      fprintf(stderr, "There is no RealVideo stream in this file.\n");      goto exitsub;  }  exitsub:		return demuxer}static demuxer_t* demux_open_real(demuxer_t* demuxer){            real_priv_t* priv = demuxer->priv;    int num_of_headers;    int a_streams=0;    int v_streams=0;    int i;    int header_size;    header_size = stream_read_dword(demuxer->stream); /* header size */    mp_msg(MSGT_DEMUX,MSGL_V, "real: Header size: %d\n", header_size);    i = stream_read_word(demuxer->stream); /* version */    mp_msg(MSGT_DEMUX,MSGL_V, "real: Header object version: %d\n", i);    if (header_size == 0x10)    	i = stream_read_word(demuxer->stream);    else /* we should test header_size here too. */    	i = stream_read_dword(demuxer->stream);    mp_msg(MSGT_DEMUX,MSGL_V, "real: File version: %d\n", i);    num_of_headers = stream_read_dword(demuxer->stream);    /* parse chunks */    for (i = 1; i <= num_of_headers; i++)//    for (i = 1; ; i++)    {	int chunk_id, chunk_pos, chunk_size;		chunk_pos = stream_tell(demuxer->stream);	chunk_id = stream_read_dword_le(demuxer->stream);	chunk_size = stream_read_dword(demuxer->stream);	stream_skip(demuxer->stream, 2); /* version */	mp_msg(MSGT_DEMUX,MSGL_V, "Chunk: %.4s (%x) (size: 0x%x, offset: 0x%x)\n",	    (char *)&chunk_id, chunk_id, chunk_size, chunk_pos);		if (chunk_size < 10){	    mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_real: invalid chunksize! (%d)\n",chunk_size);	    break; //return;	}		switch(chunk_id)	{	    case MKTAG('P', 'R', 'O', 'P'):		/* Properties header */		stream_skip(demuxer->stream, 4); /* max bitrate */		stream_skip(demuxer->stream, 4); /* avg bitrate */		stream_skip(demuxer->stream, 4); /* max packet size */		stream_skip(demuxer->stream, 4); /* avg packet size */		stream_skip(demuxer->stream, 4); /* nb packets */		priv->duration = stream_read_dword(demuxer->stream)/1000; /* duration */		stream_skip(demuxer->stream, 4); /* preroll */		priv->index_chunk_offset = stream_read_dword(demuxer->stream);		mp_msg(MSGT_DEMUX,MSGL_V,"First index chunk offset: 0x%x\n", priv->index_chunk_offset);		priv->data_chunk_offset = stream_read_dword(demuxer->stream)+10;		mp_msg(MSGT_DEMUX,MSGL_V,"First data chunk offset: 0x%x\n", priv->data_chunk_offset);		stream_skip(demuxer->stream, 2); /* nb streams */#if 0		stream_skip(demuxer->stream, 2); /* flags */#else		{		    int flags = stream_read_word(demuxer->stream);		    		    if (flags)		    {		    mp_msg(MSGT_DEMUX,MSGL_V,"Flags (%x): ", flags);		    if (flags & 0x1)			mp_msg(MSGT_DEMUX,MSGL_V,"[save allowed] ");		    if (flags & 0x2)			mp_msg(MSGT_DEMUX,MSGL_V,"[perfect play (more buffers)] ");		    if (flags & 0x4)			mp_msg(MSGT_DEMUX,MSGL_V,"[live broadcast] ");		    mp_msg(MSGT_DEMUX,MSGL_V,"\n");		    }		}#endif		break;	    case MKTAG('C', 'O', 'N', 'T'):	    {		/* Content description header */		char *buf;		int len;		len = stream_read_word(demuxer->stream);		if (len > 0)		{		    buf = malloc(len+1);		    stream_read(demuxer->stream, buf, len);		    buf[len] = 0;		    demux_info_add(demuxer, "name", buf);		    free(buf);		}		len = stream_read_word(demuxer->stream);		if (len > 0)		{		    buf = malloc(len+1);		    stream_read(demuxer->stream, buf, len);		    buf[len] = 0;		    demux_info_add(demuxer, "author", buf);		    free(buf);		}		len = stream_read_word(demuxer->stream);		if (len > 0)		{		    buf = malloc(len+1);		    stream_read(demuxer->stream, buf, len);		    buf[len] = 0;		    demux_info_add(demuxer, "copyright", buf);		    free(buf);		}		len = stream_read_word(demuxer->stream);		if (len > 0)		{		    buf = malloc(len+1);	    	    stream_read(demuxer->stream, buf, len);		    buf[len] = 0;		    demux_info_add(demuxer, "comment", buf);		    free(buf);		}		break;	    }	    case MKTAG('M', 'D', 'P', 'R'):	    {		/* Media properties header */		int stream_id;		int bitrate;		int codec_data_size;		int codec_pos;		int tmp;		int len;		char *descr, *mimet = NULL;		stream_id = stream_read_word(demuxer->stream);		mp_msg(MSGT_DEMUX,MSGL_V,"Found new stream (id: %d)\n", stream_id);				stream_skip(demuxer->stream, 4); /* max bitrate */		bitrate = stream_read_dword(demuxer->stream); /* avg bitrate */		stream_skip(demuxer->stream, 4); /* max packet size */		stream_skip(demuxer->stream, 4); /* avg packet size */		stream_skip(demuxer->stream, 4); /* start time */		stream_skip(demuxer->stream, 4); /* preroll */		stream_skip(demuxer->stream, 4); /* duration */				if ((len = stream_read_char(demuxer->stream)) > 0) {		    descr = malloc(len+1);	    	stream_read(demuxer->stream, descr, len);		    descr[len] = 0;		    mp_msg(MSGT_DEMUX, MSGL_INFO,"Stream description: %s\n", descr);		    free(descr);		}		if ((len = stream_read_char(demuxer->stream)) > 0) {		    mimet = malloc(len+1);	    	stream_read(demuxer->stream, mimet, len);		    mimet[len] = 0;		    mp_msg(MSGT_DEMUX, MSGL_INFO,"Stream mimetype: %s\n", mimet);		}				/* Type specific header */		codec_data_size = stream_read_dword(demuxer->stream);		codec_pos = stream_tell(demuxer->stream);#ifdef MP_DEBUG#define stream_skip(st,siz) { int i; for(i=0;i<siz;i++) mp_msg(MSGT_DEMUX,MSGL_V," %02X",stream_read_char(st)); mp_msg(MSGT_DEMUX,MSGL_V,"\n");}#endif	if (!strncmp(mimet,"audio/",6)) {	  if (strstr(mimet,"x-pn-realaudio") || strstr(mimet,"x-pn-multirate-realaudio")) {		tmp = stream_read_dword(demuxer->stream);		if (tmp != MKTAG(0xfd, 'a', 'r', '.'))		{		    mp_msg(MSGT_DEMUX,MSGL_V,"Audio: can't find .ra in codec data\n");		} else {		    /* audio header */		    sh_audio_t *sh = new_sh_audio(demuxer, stream_id);		    char buf[128]; /* for codec name */		    int frame_size;		    int sub_packet_size;		    int sub_packet_h;		    int version;		    int flavor;		    int coded_frame_size;		    int codecdata_length;		    int i;		    char *buft;		    int hdr_size;		    		    mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n");		    version = stream_read_word(demuxer->stream);		    mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version);                   if (version == 3) {                    stream_skip(demuxer->stream, 2);                    stream_skip(demuxer->stream, 10);                    stream_skip(demuxer->stream, 4);                    // Name, author, (c) are also in CONT tag                    if ((i = stream_read_char(demuxer->stream)) != 0) {                      buft = malloc(i+1);                      stream_read(demuxer->stream, buft, i);                      buft[i] = 0;                      demux_info_add(demuxer, "Name", buft);                      free(buft);                    }                    if ((i = stream_read_char(demuxer->stream)) != 0) {                      buft = malloc(i+1);                      stream_read(demuxer->stream, buft, i);                      buft[i] = 0;                      demux_info_add(demuxer, "Author", buft);                      free(buft);                    }                    if ((i = stream_read_char(demuxer->stream)) != 0) {                      buft = malloc(i+1);                      stream_read(demuxer->stream, buft, i);                      buft[i] = 0;                      demux_info_add(demuxer, "Copyright", buft);                      free(buft);                    }                    if ((i = stream_read_char(demuxer->stream)) != 0)                      mp_msg(MSGT_DEMUX,MSGL_WARN,"Last header byte is not zero!\n");                    stream_skip(demuxer->stream, 1);                    i = stream_read_char(demuxer->stream);                    sh->format = stream_read_dword_le(demuxer->stream);                    if (i != 4) {                      mp_msg(MSGT_DEMUX,MSGL_WARN,"Audio FourCC size is not 4 (%d), please report to "                             "MPlayer developers\n", i);                      stream_skip(demuxer->stream, i - 4);                    }                    if (sh->format != mmioFOURCC('l','p','c','J')) {                      mp_msg(MSGT_DEMUX,MSGL_WARN,"Version 3 audio with FourCC %8x, please report to "                             "MPlayer developers\n", sh->format);                    }                    sh->channels = 1;                    sh->samplesize = 16;                    sh->samplerate = 8000;                    frame_size = 240;                    strcpy(buf, "14_4");                   } else {		    stream_skip(demuxer->stream, 2); // 00 00		    stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */		    stream_skip(demuxer->stream, 4); // ???		    stream_skip(demuxer->stream, 2); /* version (4 or 5) */		    hdr_size = stream_read_dword(demuxer->stream); // header size		    mp_msg(MSGT_DEMUX,MSGL_V,"header size: %d\n", hdr_size);		    flavor = stream_read_word(demuxer->stream);/* codec flavor id */		    coded_frame_size = stream_read_dword(demuxer->stream);/* needed by codec */		    mp_msg(MSGT_DEMUX,MSGL_V,"coded_frame_size: %d\n", coded_frame_size);		    stream_skip(demuxer->stream, 4); // big number		    stream_skip(demuxer->stream, 4); // bigger number		    stream_skip(demuxer->stream, 4); // 2 || -''-		    sub_packet_h = stream_read_word(demuxer->stream);		    mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_h: %d\n", sub_packet_h);		    frame_size = stream_read_word(demuxer->stream);		    mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size);		    sub_packet_size = stream_read_word(demuxer->stream);		    mp_msg(MSGT_DEMUX,MSGL_V,"sub_packet_size: %d\n", sub_packet_size);		    stream_skip(demuxer->stream, 2); // 0		    		    if (version == 5)			stream_skip(demuxer->stream, 6); //0,srate,0		    sh->samplerate = stream_read_word(demuxer->stream);		    stream_skip(demuxer->stream, 2);  // 0		    sh->samplesize = stream_read_word(demuxer->stream)/8;		    sh->channels = stream_read_word(demuxer->stream);		    mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n",			sh->samplerate, sh->channels);		    if (version == 5)		    {

⌨️ 快捷键说明

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