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

📄 umc_mpeg2pes_spl.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    {        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 + -