📄 umc_mp4_spl_int.cpp
字号:
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 + -