📄 umc_mpeg2pes_spl.cpp
字号:
{ ret = m_pDataReader->CheckByte(&byte_code, 0); while(byte_code == 0xff && ret == UMC_OK) { ret = m_pDataReader->GetByte(&byte_code); ret = m_pDataReader->CheckByte(&byte_code, 0); gotBytes++; } if((byte_code & 0xc0) == 0x40) { ret = m_pDataReader->MovePosition(2); ret = m_pDataReader->CheckByte(&byte_code, 0); gotBytes+=2; } if((byte_code & 0xf0) == 0x30) { int c1; if((ret = m_pDataReader->GetByte(&byte_code)) != UMC_OK) return ret; c1 = ((byte_code & 0x0f) >> 1); if((ret = m_pDataReader->GetUInt(&ptstmp)) != UMC_OK) return ret; ptstmp >>= 1; ptstmp = (ptstmp & 0x7fff) | (((ptstmp >> 16) & 0x7fff) << 15); *out_pts = ((double)ptstmp + (double)(c1 * 1073741824.0)) / 90000.0; gotBytes += 5; ret = m_pDataReader->MovePosition(5); gotBytes += 5; } else if((byte_code & 0xf0) == 0x20) { int c1; if((ret = m_pDataReader->GetByte(&byte_code)) != UMC_OK) return ret; c1 = ((byte_code & 0x0f) >> 1); if((ret = m_pDataReader->GetUInt(&ptstmp)) != UMC_OK) return ret; ptstmp >>= 1; ptstmp = (ptstmp & 0x7fff) | (((ptstmp >> 16) & 0x7fff) << 15); *out_pts = ((double)ptstmp + (double)(c1 * 1073741824.0)) / 90000.0; gotBytes += 5; } else { if(ret != UMC_OK) return ret; VM_ASSERT(byte_code == 0x0f); ret = m_pDataReader->GetByte(&byte_code); gotBytes += 1; } } return ret;}int MPEG2PESSplitter::CheckIfNewES(bool isAudio, int streamID, int /*index*/){ int i; unsigned char bExist = false; for(i = 0; i < m_inESCount; i++) { if(m_pESArray[i].m_uiStreamID == (unsigned)streamID) { bExist = true; break; } } if(!bExist) { m_inESCount++; m_pESArray[i].m_uiStreamID = streamID; //m_pESArray[i].m_uiStreamSubID; will be re-filled after if available if(isAudio) { if(m_iChoosedAudio[0] == -1) m_iChoosedAudio[0] = streamID; else if(m_iChoosedAudio[1] == -1) m_iChoosedAudio[1] = streamID; } else { if(m_iChoosedVideo == -1) m_iChoosedVideo = streamID; } } return i;}//not sure in this part of code//exactly know only length of this header 3 bytesStatus MPEG2PESSplitter::ParseAC3PacketHeader(ElementaryStream* pES){ Status err; //try to parse, in any case we can skip it err = m_pDataReader->MovePosition(3); if(err != UMC_OK) return err; return err;}//not sure in this part of code//exactly know only length of this header 6 bytesStatus MPEG2PESSplitter::ParseLPCMPacketHeader(ElementaryStream* pES){ Status err; //try to parse, in any case we can skip it err = m_pDataReader->MovePosition(6); if(err != UMC_OK) return err; pES->m_audioStreamInfo.bitPerSample = 16; pES->m_audioStreamInfo.sample_frequency = 48000; pES->m_audioStreamInfo.channels = 2; return err;}Status MPEG2PESSplitter::GetAudioTime(double* time, double timeStamp){ /*if(curr_audio_pts != -1) audio_pts_prev = curr_audio_pts; curr_vaudio_pts = timeStamp; if(audio_pts_base == -1 && curr_audio_pts != -1) { audio_pts_base = curr_audio_pts; } if(audio_pts_base != -1 && curr_audio_pts != -1) { if(audio_pts_base > curr_audio_pts+1.0) { audio_pts_base = curr_audio_pts; audio_pts_diff = audio_pts_prev; } } if(curr_audio_pts != -1) curr_audio_pts += audio_pts_diff; curr_audio_time = curr_audio_pts;*/ *time = timeStamp; return UMC_OK;}Status MPEG2PESSplitter::GetVideoTime(double* time, double timeStamp){ /*if(m_dCurrVideoPts != -1) m_dPrevVideoPts = m_dCurrVideoPts; m_dCurrVideoPts = timeStamp; if(m_dBaseVideoPts == -1 && m_dCurrVideoPts != -1) { m_dBaseVideoPts = m_dCurrVideoPts; } if(m_dBaseVideoPts != -1 && m_dCurrVideoPts != -1) { if(m_dBaseVideoPts > m_dCurrVideoPts+1.0) { m_dBaseVideoPts = m_dCurrVideoPts; m_dDiffVideoPts = m_dPrevVideoPts; } } if(m_dCurrVideoPts != -1) m_dCurrVideoPts += m_dDiffVideoPts;*/ *time = timeStamp; return UMC_OK;}Status MPEG2PESSplitter::GetPosition(double& pos){ if(m_pDataReader) { vm_var64 size = m_pDataReader->GetSize(); vm_var64 bitrate = m_systemStreamInfo.muxrate; double dur; if(bitrate <= 0) { bitrate = 700000; } dur = ((double)(vm_var64s)(size))/((double)(vm_var64s)(bitrate)); pos = (double)dur; return UMC_OK; } return UMC_NOT_INITIALIZED;}Status MPEG2PESSplitter::GetInfo(SplitterInfo* pSplInfo){ MPEG2AVSplitter::GetInfo(pSplInfo); pSplInfo->m_system_info = m_systemStreamInfo; if(m_pDataReader) { vm_var64 size = m_pDataReader->GetSize(); vm_var64 bitrate = m_systemStreamInfo.muxrate; if(bitrate <= 0) { bitrate = 700000; } if(pSplInfo->m_video_info.stream_type != UNDEF_VIDEO) { pSplInfo->m_video_info.duration = ((double)(vm_var64s)(size))/((double)(vm_var64s)(bitrate)); } if(pSplInfo->m_audio_info.stream_type != UNDEF_AUDIO) { pSplInfo->m_audio_info.duration = ((double)(vm_var64s)(size))/((double)(vm_var64s)(bitrate)); } } return UMC_OK;}Status MPEG2PESSplitter::MPEG2PSPackHeader(){ unsigned int longCode; unsigned short shortCode; unsigned int muxRate; Status err; err = m_pDataReader->CheckUInt(&longCode, 0); if(err != UMC_OK) return err; if(longCode != ID_PS_PACK_START_CODE) return err; err = m_pDataReader->GetUInt(&longCode ); if(err != UMC_OK) return err; err = m_pDataReader->GetUInt(&longCode ); if(err != UMC_OK) return err; if(longCode & 0x40000000) // MPEG2 Programm stream {// vm_sizet size = 0; //'01' 2 bits //system_clock_reference_base [32..30] 3 bits //marker_bit 1 bit //system_clock_reference_base [29..15] 15 bits //marker_bit 1 bit //system_clock_reference_base [14..0] 15 bits //marker_bit 1 bit //system_clock_reference_extension 9 bits //marker_bit 1 bit //4 bytes were token befor, need 2 bytes more err = m_pDataReader->GetShort(&shortCode ); if(err != UMC_OK) return err; m_systemStreamInfo.stream_type = MPEG2_PROGRAMM_STREAM; //program_mux_rate 22 bits //marker_bit 1 bit //marker_bit 1 bit //reserved 5 bits //pack_stuffing_length 3 bits err = m_pDataReader->GetUInt(&longCode); if(err != UMC_OK) return err; muxRate = longCode >> 10; m_systemStreamInfo.muxrate = muxRate*50;//bytes/sec //skip stuffing bytes: err = m_pDataReader->MovePosition(longCode & 7); if(err != UMC_OK) return err; } else { if(longCode & 0x20000000) // MPEG1 Prorgamm stream {// vm_sizet size = 0; //'0010' 4 bits //system_clock_reference [32..30] 3 bits //marker_bit 1 bits //system_clock_reference [29..15] 15bits //marker_bit 1 bits //system_clock_reference [14..0] 15bits //marker_bit 1 bit //marker_bit 1 bit //mux_rate 22bits //marker_bit 1 bit //4 bytes were token before, need 4 bytes more m_systemStreamInfo.stream_type = MPEG1_PROGRAMM_STREAM; err = m_pDataReader->GetUInt(&longCode); if(err != UMC_OK) return err; muxRate = (longCode >> 1) & 0x003fffff; m_systemStreamInfo.muxrate = muxRate*50;//bytes/sec } else return UMC_BAD_FORMAT; } err = m_pDataReader->CheckUInt(&longCode, 0); if(err != UMC_OK) return err; if (longCode == ID_PS_SYSTEM_HEADER_START_CODE) { //get system header start code err = m_pDataReader->GetUInt(&longCode ); if(err != UMC_OK) return err; //err = MPEG2PSSystemHeader(); //if(err != UMC_OK) return err; //Alternate skip system header err = m_pDataReader->GetShort(&shortCode); if(err != UMC_OK) return err; err = m_pDataReader->MovePosition( shortCode); if(err != UMC_OK) return err; } return err;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -