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

📄 umc_mp4_spl_int.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
Status SplitterMP4::GetNextAudioData(MediaData* data, vm_var32 track_idx){    int size;    if ( buferAD[track_idx].buf->numberOfSample_R >= headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.total_entries )    {        return UMC_END_OF_STREAM;    }    if ( (buferAD[track_idx].buf->flag_Start) &&        (headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen != 0) )    {            data->SetBufferPointer(headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig,                                headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen);            data->SetTime(getTime(headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak],                            buferAD[track_idx].buf->numberOfSample_R), 0);            buferAD[track_idx].buf->flag_Start = 0;            vm_debug_trace(4, VM_STRING("-mp4 splitter, config_data_size = %d\n"),headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen);            return UMC_OK;    }    vm_semaphore_wait(&(buferAD[track_idx].buf->VfrComprSemR));    if ( headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.sample_size )    {        size = headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.sample_size;    }    else    {        size = headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.table[buferAD[track_idx].buf->numberOfSample_R].size;    }    if ( buferAD[track_idx].buf->indR == NUMBEROFFILLBUFFERS )    {        buferAD[track_idx].buf->indR = 0;    }    data->SetBufferPointer((Ipp8u*)buferAD[track_idx].buf->bufersFrCompr[buferAD[track_idx].buf->indR++],                        size);    data->SetTime(getTime(headerMPEG4.moov.trak[buferAD[track_idx].buf->idTrak],                    buferAD[track_idx].buf->numberOfSample_R), 0);    vm_semaphore_post(&(buferAD[track_idx].buf->VfrComprSemW));    buferAD[track_idx].buf->numberOfSample_R++;    return UMC_OK;}Status SplitterMP4::GetNextVideoData(MediaData* data, vm_var32 track_idx){    int size = 0;    if ( buferVC[track_idx].buf->numberOfSample_R >= headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.total_entries )    {        return UMC_END_OF_STREAM;    }    if ( (buferVC[track_idx].buf->flag_Start) &&        (headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen != 0) )    {            data->SetBufferPointer(headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig,                                headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen);            data->SetTime(getTime(headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak],                            buferVC[track_idx].buf->numberOfSample_R), 0);            buferVC[track_idx].buf->flag_Start = 0;            return UMC_OK;    }    vm_semaphore_wait(&(buferVC[track_idx].buf->VfrComprSemR));    if ( headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.sample_size )    {        size = headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.sample_size;    }    else    {        size = headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak]->mdia.minf.stbl.stsz.table[buferVC[track_idx].buf->numberOfSample_R].size;    }    if ( buferVC[track_idx].buf->indR == NUMBEROFFILLBUFFERS )    {        buferVC[track_idx].buf->indR = 0;    }    data->SetBufferPointer((Ipp8u*)buferVC[track_idx].buf->bufersFrCompr[buferVC[track_idx].buf->indR++],                        size);    data->SetTime(getTime(headerMPEG4.moov.trak[buferVC[track_idx].buf->idTrak],                    buferVC[track_idx].buf->numberOfSample_R), 0);    vm_semaphore_post(&(buferVC[track_idx].buf->VfrComprSemW));    buferVC[track_idx].buf->numberOfSample_R++;    return UMC_OK;}Status SplitterMP4::SetPosition(double pos){    Status ret = UMC_NOT_INITIALIZED;    if(m_pDataReader)    {        if(pos <= 0 || pos >= 1 )        {            ret = UMC_OPERATION_FAILED;        }        else        {            int i;            for(i = 0; i < total_audio; i++)            {                buferAD[i].buf->indW = 0;                buferAD[i].buf->indR = 0;                buferAD[i].buf->flag_Close = 0;                buferAD[i].buf->flag_End = 0;                buferAD[i].buf->flag_Start = 0;                buferAD[i].buf->numberOfSample_W = pos * headerMPEG4.moov.trak[buferVC[i].buf->idTrak]->mdia.minf.stbl.stsz.total_entries;                buferAD[i].buf->numberOfSample_R = pos * headerMPEG4.moov.trak[buferVC[i].buf->idTrak]->mdia.minf.stbl.stsz.total_entries;                vm_semaphore_init(&buferAD[i].buf->VfrComprSemR, 0);                vm_semaphore_init(&buferAD[i].buf->VfrComprSemW, NUMBEROFFILLBUFFERS - 1);            }            for(i = 0; i < total_video; i++)            {                buferVC[i].buf->indW = 0;                buferVC[i].buf->indR = 0;                buferVC[i].buf->flag_Close = 0;                buferVC[i].buf->flag_End = 0;                buferVC[i].buf->flag_Start = 0;                buferVC[i].buf->numberOfSample_W = pos * headerMPEG4.moov.trak[buferVC[i].buf->idTrak]->mdia.minf.stbl.stsz.total_entries;                buferVC[i].buf->numberOfSample_R = pos * headerMPEG4.moov.trak[buferVC[i].buf->idTrak]->mdia.minf.stbl.stsz.total_entries;                vm_semaphore_init(&buferVC[i].buf->VfrComprSemR, 0);                vm_semaphore_init(&buferVC[i].buf->VfrComprSemW, NUMBEROFFILLBUFFERS - 1);            }            ret = m_pDataReader->SetPosition(pos);            if(UMC_OK == ret)            {                ret = m_pDataReader->StartReadingAfterReposition();            }        }    }    return ret;}Status SplitterMP4::GetPosition(double &position){    position = 0;    return UMC_UNSUPPORTED;}Status SplitterMP4::GetInfo(SplitterInfo *info){    int k, j, i;    int temp;    int ptr;    int video_object_layer_shape;    sAudio_specific_config audio_config_data;    sBitsreamBuffer     bs;    info->number_video_tracks = 0;    info->number_audio_tracks = 0;    if ( (total_video > 0) &&  (m_splitter_flags & VIDEO_SPLITTER) )    {        info->number_video_tracks = total_video;        if ( total_video > 1 )        {            if ( info->m_video_info_aux )            {                ippsFree(info->m_video_info_aux);            }            unsigned int buff_size = total_video * sizeof(sVideoStreamInfo);            info->m_video_info_aux = (sVideoStreamInfo*)ippsMalloc_8u(buff_size);            memset(info->m_video_info_aux, 0, buff_size);        }        //zero audio and video track info        ptr = 0;        i = 0;        info->m_video_info.clip_info.width = -1;        // find start code VideoObjectLayer and parse width and height        for ( j = 0; j < headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfigLen; j++ )        {            if ( headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig[j] == 0x00 )            {                if ( headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig[j + 1] == 0x00 )                {                    if ( headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig[j + 2] == 0x01 )                    {                        if ( (headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig[j + 3] >= 0x20)                            && (headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig[j + 3] <= 0x2f) )                        {                            ptr = 8 * (j + 4);                            GetBits(&temp,                                    9,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            GetBits(&temp,                                    1,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            if ( temp )                            {                                GetBits(&temp,                                        7,                                        &ptr,                                        headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            }                            GetBits(&temp,                                    4,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            if ( temp == 15 )                            {                                GetBits(&temp,                                        18,                                        &ptr,                                        headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            }                            GetBits(&temp,                                    1,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            if ( temp )                            {                                GetBits(&temp,                                        3,                                        &ptr,                                        headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                                GetBits(&temp,                                        1,                                        &ptr,                                        headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                                if ( temp )                                {                                    GetBits(&temp,                                            79,                                            &ptr,                                            headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                                }                            }                            GetBits(&video_object_layer_shape,                                    2,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            if ( temp == 3 )                            {                                GetBits(&temp,                                    4,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            }                            GetBits(&temp,                                    1,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            GetBits(&temp,                                    16,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            temp = temp - 1;                            for ( k = 1; k <= 16; k ++ )                            {                                temp >>= 1;                                if ( temp == 0 )                                {                                    break;                                }                            }                            GetBits(&temp,                                    1,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            GetBits(&temp,                                    1,                                    &ptr,                                    headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            if ( temp )                            {                                GetBits(&temp,                                        k,                                        &ptr,                                        headerMPEG4.moov.trak[buferVC[0].buf->idTrak]->mdia.minf.stbl.stsd.table->esds.decoderConfig);                            }                            if ( video_object_layer_shape == 0 )                            {                                GetBits(&temp,                                        1,

⌨️ 快捷键说明

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