demux_real.c

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

C
1,820
字号
				if (vpkg_length > len) {		    mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** WARNING: vpkg_length=%i > len=%i ********\n", vpkg_length, len);		    /*		     * To keep the video stream rolling, we need to break 		     * here. We shouldn't touch len to make sure rest of the		     * broken packet is skipped.		     */		#if 0		F("bbbb %d\n",priv->current_vpacket);		if((priv->current_vpacket - 1) > 0)		{ 				int pos;				pos = priv->index_table[stream_id][priv->current_vpacket - 1].offset; 				F("bbbb pos = %d\n",pos);				stream_seek(demuxer->stream, pos);							 seterrorseek();			 continue; //goto loop;			 		}else		#endif		     		break;		}				dp_hdr->len=vpkg_length; len-=vpkg_length;		stream_read(demuxer->stream, dp_data, vpkg_length);		if(priv->video_after_seek){			priv->kf_base = 0;			priv->kf_pts = dp_hdr->timestamp;			dp->pts=			real_fix_timestamp(priv,dp_data,dp_hdr->timestamp,sh_video->frametime,sh_video->format);			priv->video_after_seek = 0;		} else if (dp_hdr->len >= 3)		    dp->pts =		    real_fix_timestamp(priv,dp_data,dp_hdr->timestamp,sh_video->frametime,sh_video->format);		ds_add_packet(ds,dp);	    } // while(len>0)	    if(len){		mp_msg(MSGT_DEMUX, MSGL_WARN,"\n******** !!!!!!!! BUG!! len=%d !!!!!!!!!!! ********\n",len);		if(len>0) stream_skip(demuxer->stream, len);	    }	}	if ((unsigned)demuxer->video->id < MAX_STREAMS)		while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] && 		       timestamp > priv->index_table[demuxer->video->id][priv->current_vpacket + 1].timestamp)			priv->current_vpacket += 1;	if(priv->is_multirate)		while (priv->v_idx_ptr + 1 < priv->index_table_size[demuxer->video->id] &&		       timestamp > priv->index_table[demuxer->video->id][priv->v_idx_ptr + 1].timestamp) {			priv->v_idx_ptr++;			priv->video_curpos = stream_tell(demuxer->stream);			priv->stream_switch = 1;		}	return 1;    }if((unsigned)stream_id<MAX_STREAMS){    if(demuxer->audio->id==-1 && demuxer->a_streams[stream_id]){	sh_audio_t *sh = demuxer->a_streams[stream_id];	demuxer->audio->id=stream_id;	sh->ds=demuxer->audio;	demuxer->audio->sh=sh;	priv->audio_buf = calloc(priv->sub_packet_h[demuxer->audio->id], priv->audiopk_size[demuxer->audio->id]);	priv->audio_timestamp = calloc(priv->sub_packet_h[demuxer->audio->id], sizeof(double));        mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM audio ID = %d\n",stream_id);	goto got_audio;    }    if(demuxer->video->id==-1 && demuxer->v_streams[stream_id]){	sh_video_t *sh = demuxer->v_streams[stream_id];	demuxer->video->id=stream_id;	sh->ds=demuxer->video;	demuxer->video->sh=sh;        mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected RM video ID = %d\n",stream_id);	goto got_video;    }}    mp_msg(MSGT_DEMUX,MSGL_DBG2, "unknown stream id (%d)\n", stream_id);discard:    stream_skip(demuxer->stream, len);  }//    goto loop;  return 0;}extern void print_wave_header(WAVEFORMATEX *h, int verbose_level);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_INFO, MSGTR_AudioID, "real", stream_id);		    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)		    {			stream_read(demuxer->stream, buf, 4);  // interleaver id			priv->intl_id[stream_id] = MKTAG(buf[0], buf[1], buf[2], buf[3]);			stream_read(demuxer->stream, buf, 4); // fourcc

⌨️ 快捷键说明

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