📄 umc_vc1_dec_frame_descr.cpp
字号:
if (temp_value == 1) //PIC_HEADER_FLAG
{
++m_pContext->m_picLayerHeader;
//m_pContext->m_picLayerHeader->is_slice = 1;
if (isSecondField)
m_pContext->m_picLayerHeader->CurrField = 1;
else
m_pContext->m_picLayerHeader->CurrField = 0;
DecodePictureHeader_Adv(m_pContext);
DecodePicHeader(m_pContext);
}
m_pContext->m_picLayerHeader->is_slice = 1;
if (*(pOffsets+1) && *(pValues+1) == 0x0B010000)
{
bitstream = reinterpret_cast<Ipp32u*>(m_pContext->m_pBufferStart + *(pOffsets+1));
VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value);
bitoffset = 31;
VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow);
}
else if(*(pValues+1) == 0x0C010000)
slparams.MBEndRow = m_pContext->m_seqLayerHeader->heightMB/2;
else
slparams.MBEndRow = m_pContext->m_seqLayerHeader->heightMB;
slparams.m_picLayerHeader = m_pContext->m_picLayerHeader;
slparams.m_vlcTbl = m_pContext->m_vlcTbl;
slparams.m_pstart = m_pContext->m_bitstream.pBitstream;
slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset;
slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow;
task.m_pSlice = &slparams;
task.setSliceParams(m_pContext);
if (isSecondField)
task.m_isFieldReady = false;
else
task.m_isFieldReady = true;
m_pStore->AddSampleTask(&task,m_iSelfID);
#ifdef SLICE_INFO
printf("Slice number %d\n", slice_counter);
printf("Number MB rows to decode =%d\n", slparams.MBRowsToDecode);
++slice_counter;
#endif
slparams.MBStartRow = slparams.MBEndRow;
++pOffsets;
++pValues;
}
else
{
pOffsets++;
pValues++;
}
}
task.m_pSlice = NULL;
STATISTICS_START_TIME(m_timeStatistics->alg_StartTime);
m_pStore->DistributeTasks(m_iSelfID);
STATISTICS_END_TIME(m_timeStatistics->alg_StartTime,
m_timeStatistics->alg_EndTime,
m_timeStatistics->alg_TotalTime);
}
Status VC1FrameDescriptor::preProcData(Ipp8u* pbufferStart,
Ipp32u bufferSize,
Ipp64u frameCount,
bool isWMV)
{
Status vc1Sts = UMC_OK;
Ipp32u Ptype;
m_iFrameCounter = frameCount;
m_pContext->m_FrameSize = bufferSize;
if (isWMV)
bufferSize += 8;
ippsCopy_8u(pbufferStart,m_pContext->m_pBufferStart,(bufferSize & 0xFFFFFFF8) + 8); // (bufferSize & 0xFFFFFFF8) + 8 - skip frames
m_pContext->m_bitstream.pBitstream = (Ipp32u*)m_pContext->m_pBufferStart + 1;
m_pContext->m_bitstream.bitOffset = 31;
m_pContext->m_picLayerHeader = m_pContext->m_InitPicLayer;
m_bIsSpecialBSkipFrame = false;
if (m_pContext->m_seqLayerHeader->PROFILE == VC1_PROFILE_ADVANCED)
{
m_pContext->m_bNeedToUseCompBuffer = 0;
GetNextPicHeader_Adv(m_pContext);
Ptype = m_pContext->m_picLayerHeader->PTYPE|m_pContext->m_picLayerHeader->PTypeField1;
vc1Sts = SetDisplayIndex_Adv(Ptype);
// skipping tools
if (m_pStore->IsNeedSkipFrame(Ptype))
{
if ((Ptype == VC1_B_FRAME) || (Ptype == VC1_BI_FRAME))
m_bIsSpecialBSkipFrame = true;
m_pContext->m_picLayerHeader->PTYPE = Ptype = VC1_SKIPPED_FRAME;
}
}
else
{
if (!isWMV)
m_pContext->m_bitstream.pBitstream = (Ipp32u*)m_pContext->m_pBufferStart + 2;
GetNextPicHeader(m_pContext);
// skipping tools
vc1Sts = SetDisplayIndex(m_pContext->m_picLayerHeader->PTYPE);
if (m_pStore->IsNeedSkipFrame(m_pContext->m_picLayerHeader->PTYPE))
{
if ((m_pContext->m_picLayerHeader->PTYPE == VC1_B_FRAME) || (m_pContext->m_picLayerHeader->PTYPE == VC1_BI_FRAME))
m_bIsSpecialBSkipFrame = true;
m_pContext->m_picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
}
}
m_pContext->m_bIntensityCompensation = 0;
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].m_bIsExpanded = 0;
return vc1Sts;
}
Status VC1FrameDescriptor::SetDisplayIndex_Adv(Ipp32u PTYPE)
{
Status vc1Sts = VC1_OK;
switch(PTYPE)
{
case VC1_I_FRAME:
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
}
break;
case VC1_P_FRAME:
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
if (m_pContext->m_frmBuff.m_iPrevIndex == -1)
{
m_bIsWarningStream = true;
m_pContext->m_frmBuff.m_iPrevIndex = 0;
m_pContext->m_frmBuff.m_iDisplayIndex = 0;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
//vc1Sts = UMC_WRN_INVALID_STREAM;
throw vc1_exception(invalid_stream);
}
else
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
}
}
break;
case VC1_B_FRAME:
{
if (!m_bIsSpecialBSkipFrame)
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
}
else
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex();
}
if ((m_pContext->m_frmBuff.m_iNextIndex == -1)||(m_pContext->m_frmBuff.m_iPrevIndex == -1))
{
m_bIsWarningStream = true;
if(m_pContext->m_frmBuff.m_iNextIndex == -1)
{
m_pContext->m_frmBuff.m_iNextIndex = 0;
m_pContext->m_frmBuff.m_iPrevIndex = 1;
m_pContext->m_frmBuff.m_iCurrIndex = 2;
m_pContext->m_frmBuff.m_iDisplayIndex = 2;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_AllocatedMemorySize);
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
}
else
{
m_pContext->m_frmBuff.m_iPrevIndex = 0;
m_pContext->m_frmBuff.m_iCurrIndex = 2;
m_pContext->m_frmBuff.m_iDisplayIndex = 2;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
}
//vc1Sts = UMC_WRN_INVALID_STREAM;
throw vc1_exception(invalid_stream);
}
else
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
//vc1Sts = VC1_NOT_ENOUGH_DATA;
}
}
break;
case VC1_BI_FRAME:
{
m_bIsWarningStream = false;
if (!m_bIsSpecialBSkipFrame)
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
}
else
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex();
}
//m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
//m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
// vc1Sts = VC1_NOT_ENOUGH_DATA ;
}
break;
case VC1_SKIPPED_FRAME:
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
}
break;
default:
break;
}
if (m_pContext->m_frmBuff.m_iDisplayIndex == -1)
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
return vc1Sts;
}
Status VC1FrameDescriptor::SetDisplayIndex(Ipp32u PTYPE)
{
Status vc1Sts = VC1_OK;
switch(PTYPE)
{
case VC1_I_FRAME:
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
}
break;
case VC1_BI_FRAME:
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
}
break;
case VC1_P_FRAME:
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
if (m_pContext->m_frmBuff.m_iPrevIndex == -1)
{
m_pContext->m_frmBuff.m_iPrevIndex = 0;
m_pContext->m_frmBuff.m_iDisplayIndex = 0;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
m_bIsWarningStream = true;
throw vc1_exception(invalid_stream);
//vc1Sts = UMC_WRN_INVALID_STREAM;
}
else
{
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
m_bIsWarningStream = false;
}
}
break;
case VC1_B_FRAME:
{
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
if ((m_pContext->m_frmBuff.m_iNextIndex == -1)||(m_pContext->m_frmBuff.m_iPrevIndex == -1))
{
m_bIsWarningStream = true;
if(m_pContext->m_frmBuff.m_iNextIndex == -1)
{
m_pContext->m_frmBuff.m_iNextIndex = 0;
m_pContext->m_frmBuff.m_iPrevIndex = 1;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_AllocatedMemorySize);
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
}
else
{
m_pContext->m_frmBuff.m_iPrevIndex = 1 - m_pContext->m_frmBuff.m_iNextIndex;
memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
128,
m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
}
throw vc1_exception(invalid_stream);
//vc1Sts = UMC_WRN_INVALID_STREAM;
}
else
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
if (*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].pRANGE_MAPY ==
(m_pContext->m_picLayerHeader->RANGEREDFRM - 1))
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
else
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].pRANGE_MAPY;
// vc1Sts = VC1_NOT_ENOUGH_DATA;
}
}
break;
case VC1_SKIPPED_FRAME:
{
m_bIsWarningStream = false;
m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
}
break;
}
if (m_pContext->m_frmBuff.m_iDisplayIndex == -1)
m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
return vc1Sts;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -