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 + -
显示快捷键?