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

📄 umc_h264_nalu_stream.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
字号:
/*
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2003-2007 Intel Corporation. All Rights Reserved.
//
*/
#include "umc_defs.h"
#if defined (UMC_ENABLE_H264_SPLITTER)

#include "umc_h264_nalu_stream.h"

namespace UMC
{

    H264_NALU_Stream::H264_NALU_Stream()
    {
        Init( 0 );
    }

    H264_NALU_Stream::~H264_NALU_Stream(void){}

    Status H264_NALU_Stream::Init( Ipp32s p_iSize )
    {
        m_iZeroCount = 0;
        m_vecNALU.clear();
        m_vecNALU.reserve(p_iSize);
        return UMC_OK;
    }

    Status H264_NALU_Stream::Close()
    {
        m_vecNALU.clear();
        return UMC_OK;
    }

    Status H264_NALU_Stream::PutData(MediaData & p_dataNal)
    {
        Ipp32s iStart;

        for(iStart = 0; iStart < m_iZeroCount; iStart++)
            m_vecNALU.insert(m_vecNALU.end(), (Ipp8u)0);

        iStart = -1;

        for(Ipp32s iCur =0 ; iCur<(Ipp32s)p_dataNal.GetDataSize() ; iCur++) {
            Ipp8u bCur = *((Ipp8u*)p_dataNal.GetDataPointer() + iCur);
            switch(bCur)
            {
            case 0x00:
                //////////////////////////////////////////////////////////////////////////
                {
                    if(m_iZeroCount == 0){
                        iStart = iCur;
                    }
                    m_iZeroCount++;
                }
                //////////////////////////////////////////////////////////////////////////
                break;
            case 0x01:
                //////////////////////////////////////////////////////////////////////////
                {
                    if(m_iZeroCount >= 2 ){
                        // Detected stop bit
                        CopyRest( p_dataNal, iStart );
                        p_dataNal.MoveDataPointer(iCur + 1);
                        m_iZeroCount = 0;
                        if( 0 != m_vecNALU.size()){
                            return UMC_OK;
                        }
                        iCur = -1;
                    }
                    iStart = -1;
                    m_iZeroCount = 0;
                }
                //////////////////////////////////////////////////////////////////////////
                break;
            default:
                //////////////////////////////////////////////////////////////////////////
                {
                    m_iZeroCount = 0;
                    iStart = -1;
                }
                //////////////////////////////////////////////////////////////////////////
                break;
            }
        }

        CopyRest(p_dataNal, iStart);
        p_dataNal.MoveDataPointer((Ipp32s)p_dataNal.GetDataSize());
        return UMC_ERR_NOT_ENOUGH_DATA;
    }

    Status H264_NALU_Stream::CopyRest(MediaData & p_dataNal, Ipp32s p_iStart)
    {
        if(m_iZeroCount == 0){
            if( 0 < p_dataNal.GetDataSize()){
                m_vecNALU.insert(m_vecNALU.end(), ((Ipp8u*)p_dataNal.GetDataPointer()),
                                 ((Ipp8u*)p_dataNal.GetDataPointer()) + p_dataNal.GetDataSize());
            }
        } else {
            if(0 < p_iStart){
                m_vecNALU.insert(m_vecNALU.end(), ((Ipp8u*)p_dataNal.GetDataPointer()),
                                 ((Ipp8u*)p_dataNal.GetDataPointer()) + p_iStart);
            }
        }
        return UMC_OK;
    }

    Status H264_NALU_Stream::LockOutputData(MediaData & o_dataNALU)
    {
        if( 0 == m_vecNALU.size() ){
            return UMC_ERR_NOT_ENOUGH_DATA;
        }

        o_dataNALU.SetBufferPointer(&(m_vecNALU[0]), m_vecNALU.size());
        o_dataNALU.SetDataSize(m_vecNALU.size());
        return UMC_OK;
    }

    Status H264_NALU_Stream::UnLockOutputData()
    {
        m_vecNALU.clear();
        return UMC_OK;
    }
} // namespace UMC

#endif // UMC_ENABLE_H264_SPLITTER

⌨️ 快捷键说明

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