📄 fmfcdecfilter.cpp
字号:
pStrmBuf = (BYTE*) SsbSipMPEG4DecodeGetInBuf(decode_ctx, dwBytesToRead);
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
}
////////////////////////////////////////////////
// 3. Decode Frames //
////////////////////////////////////////////////
if (SsbSipMPEG4DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_MPEG4_DEC_RET_OK) {
RETAILMSG(1,(L"MPEG4 Decoding Failed.\n"));
return S_FALSE;
}
/////////////////////////////////////
/// 4. Get YUV data ///
/////////////////////////////////////
m_pFrmBuf = (BYTE*) SsbSipMPEG4DecodeGetOutBuf(decode_ctx, &m_FrmSize);
return S_OK;
}
//
// H264Transform
//
HRESULT CMFCDecFilter::H264Decode(IMediaSample* pSample)
{
BYTE *pDataIn;
HRESULT hr;
unsigned int dwBytesToRead;
BYTE *pStrmBuf;
SSBSIP_H264_STREAM_INFO stream_info;
hr = pSample->GetPointer(&pDataIn);
if (FAILED(hr))
return hr;
dwBytesToRead = pSample->GetActualDataLength();
////////////////////////////////////////////////
// 1. Decoder init //
////////////////////////////////////////////////
if(m_H264IsFirstTransform) {
decode_ctx = SsbSipH264DecodeInit();
if (decode_ctx == NULL) {
RETAILMSG(1,(L"[MFC Filter] SsbSipH264DecodeInit Failed.\n"));
return S_FALSE;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipH264DecodeGetInBuf(decode_ctx, dwBytesToRead);
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
pStrmBuf[0] = 0x00;
pStrmBuf[1] = 0x00;
pStrmBuf[2] = 0x00;
pStrmBuf[3] = 0x01;
////////////////////////////////////////////////
// 3. Decoder Init //
////////////////////////////////////////////////
if (SsbSipH264DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"H.264 Decoder Configuration Failed.\n"));
return S_FALSE;
}
/////////////////////////////////////
/// 4. Get stream information ///
/////////////////////////////////////
SsbSipH264DecodeGetConfig(decode_ctx, H264_DEC_GETCONF_STREAMINFO, &stream_info);
m_Width = stream_info.width;
m_Height = stream_info.height;
m_H264IsFirstTransform = FALSE;
}
else {
if (decode_ctx == NULL) {
return S_FALSE;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipH264DecodeGetInBuf(decode_ctx, dwBytesToRead);
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
pStrmBuf[0] = 0x00;
pStrmBuf[1] = 0x00;
pStrmBuf[2] = 0x00;
pStrmBuf[3] = 0x01;
}
////////////////////////////////////////////////
// 3. Decode Frames //
////////////////////////////////////////////////
if (SsbSipH264DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"H.264 Decoding Failed.\n"));
return S_FALSE;
}
/////////////////////////////////////
/// 5. Get YUV data ///
/////////////////////////////////////
m_pFrmBuf = (BYTE*) SsbSipH264DecodeGetOutBuf(decode_ctx, &m_FrmSize);
return S_OK;
}
//
// VC1Decode
//
HRESULT CMFCDecFilter::VC1Decode(IMediaSample* pSample)
{
BYTE *pDataIn;
HRESULT hr;
unsigned int dwBytesToRead;
BYTE *pStrmBuf;
SSBSIP_H264_STREAM_INFO stream_info;
hr = pSample->GetPointer(&pDataIn);
if (FAILED(hr))
return hr;
dwBytesToRead = pSample->GetActualDataLength();
////////////////////////////////////////////////
// 1. Decoder init //
////////////////////////////////////////////////
if(m_VC1IsFirstTransform) {
decode_ctx = SsbSipVC1DecodeInit();
if (decode_ctx == NULL) {
RETAILMSG(1,(L"[MFC Filter] SsbSipVC1DecodeInit Failed.\n"));
return S_FALSE;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipVC1DecodeGetInBuf(decode_ctx, dwBytesToRead);
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
pStrmBuf[0] = 0x00;
pStrmBuf[1] = 0x00;
pStrmBuf[2] = 0x00;
pStrmBuf[3] = 0x01;
////////////////////////////////////////////////
// 3. Decoder Init //
////////////////////////////////////////////////
if (SsbSipVC1DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"VC-1Decoder Configuration Failed.\n"));
return S_FALSE;
}
/////////////////////////////////////
/// 4. Get stream information ///
/////////////////////////////////////
SsbSipVC1DecodeGetConfig(decode_ctx, H264_DEC_GETCONF_STREAMINFO, &stream_info);
m_Width = stream_info.width;
m_Height = stream_info.height;
m_VC1IsFirstTransform = FALSE;
}
else {
if (decode_ctx == NULL) {
return S_FALSE;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipVC1DecodeGetInBuf(decode_ctx, dwBytesToRead);
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
pStrmBuf[0] = 0x00;
pStrmBuf[1] = 0x00;
pStrmBuf[2] = 0x00;
pStrmBuf[3] = 0x01;
}
////////////////////////////////////////////////
// 3. Decode Frames //
////////////////////////////////////////////////
if (SsbSipVC1DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"VC-1 Decoding Failed.\n"));
return S_FALSE;
}
/////////////////////////////////////
/// 5. Get YUV data ///
/////////////////////////////////////
m_pFrmBuf = (BYTE*) SsbSipVC1DecodeGetOutBuf(decode_ctx, &m_FrmSize);
return S_OK;
}
// WMV9 Transform
//
HRESULT CMFCDecFilter::WMV9Decode(IMediaSample* pSample)
{
BYTE *pDataIn;
HRESULT hr;
unsigned int dwBytesToRead, index=0;
BYTE *pStrmBuf;
SSBSIP_H264_STREAM_INFO stream_info;
hr = pSample->GetPointer(&pDataIn);
if (FAILED(hr))
return hr;
dwBytesToRead = pSample->GetActualDataLength();
////////////////////////////////////////////////
// 1. Decoder init //
////////////////////////////////////////////////
if(m_WMV9sFirstTransform) {
decode_ctx = SsbSipVC1DecodeInit();
if (decode_ctx == NULL) {
RETAILMSG(0,(L"[MFC Filter] wmvDecodeInit Failed.\n"));
return 0;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipVC1DecodeGetInBuf(decode_ctx, dwBytesToRead);
index =0;
//indefnite stream
pStrmBuf[index] = 0xFF;
pStrmBuf[index+1] = 0xFF ;
pStrmBuf[index+2] = 0xFF ;
pStrmBuf[index+3] = 0xc5;
index+=4;
pStrmBuf[index] = 0x04;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
//struct_c
pStrmBuf[index] = m_Wmvdata & 0xFF ;
pStrmBuf[index+1] = (m_Wmvdata >>8)& 0xFF ;
pStrmBuf[index+2] = (m_Wmvdata>>16) & 0xFF;
pStrmBuf[index+3] = (m_Wmvdata>>24) & 0xFF;
index+=4;
//struct_a_vert
pStrmBuf[index] = m_Height & 0xFF ;
pStrmBuf[index+1] = (m_Height>>8) & 0xFF ;
pStrmBuf[index+2] = (m_Height>>16) & 0xFF;
pStrmBuf[index+3] = (m_Height>>24) & 0xFF;
index+=4;
//struct_a_horz
pStrmBuf[index] = m_Width & 0xFF ;
pStrmBuf[index+1] = (m_Width>>8) & 0xFF ;
pStrmBuf[index+2] = (m_Width>>16) & 0xFF;
pStrmBuf[index+3] = (m_Width>>24) & 0xFF;
index+=4;
//const_0C
pStrmBuf[index] = 0x0C;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
//struct_b_1
pStrmBuf[index] = 0x00;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
//struct_b_2
pStrmBuf[index] = 0x00;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
//struct_b_3
pStrmBuf[index] = 0x00;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
//pStrmBuf +=index;
//frame data
//index;
pStrmBuf[index] = dwBytesToRead & 0xFF;
pStrmBuf[index+1] = (dwBytesToRead>>8) & 0xFF;
pStrmBuf[index+2] = (dwBytesToRead>>16) & 0xFF;
pStrmBuf[index+3] = 0x80;
index+=4;
pStrmBuf[index] = 0x00;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
pStrmBuf +=index;
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
////////////////////////////////////////////////
// 3. Decoder Init //
////////////////////////////////////////////////
if (SsbSipVC1DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"WMV9 Decoder decoding 1 Failed.\n"));
return 0;
}
/////////////////////////////////////
/// 4. Get stream information ///
/////////////////////////////////////
SsbSipVC1DecodeGetConfig(decode_ctx, H264_DEC_GETCONF_STREAMINFO, &stream_info);
m_Width = stream_info.width;
m_Height = stream_info.height;
m_WMV9sFirstTransform = FALSE;
}
else {
if (decode_ctx == NULL) {
return S_FALSE;
}
////////////////////////////////////////////////
// 2. Data copy //
////////////////////////////////////////////////
pStrmBuf = (BYTE*) SsbSipVC1DecodeGetInBuf(decode_ctx, dwBytesToRead);
pStrmBuf[index] = dwBytesToRead & 0xFF;
pStrmBuf[index+1] = (dwBytesToRead>>8) & 0xFF;
pStrmBuf[index+2] = (dwBytesToRead>>16) & 0xFF;
pStrmBuf[index+3] = 0x00;
index+=4;
pStrmBuf[index] = 0x00;
pStrmBuf[index+1] = 0x00;
pStrmBuf[index+2] = 0x00;
pStrmBuf[index+3] = 0x00;
index+=4;
pStrmBuf +=8;
memcpy(pStrmBuf, pDataIn, dwBytesToRead);
pStrmBuf += dwBytesToRead;
}
////////////////////////////////////////////////
// 3. Decode Frames //
////////////////////////////////////////////////
if (SsbSipVC1DecodeExe(decode_ctx, dwBytesToRead) != SSBSIP_H264_DEC_RET_OK) {
RETAILMSG(1,(L"WMV9 Decoder decoding Failed.\n"));
return 0;
}
/////////////////////////////////////
/// 5. Get YUV data ///
/////////////////////////////////////
m_pFrmBuf = (BYTE*) SsbSipVC1DecodeGetOutBuf(decode_ctx, &m_FrmSize);
return S_OK;
}
HRESULT CMFCDecFilter::Receive(IMediaSample* pSample)
{
HRESULT hr;
switch (m_StrmType) {
case RAW_STRM_TYPE_M4V:
hr = MP4Decode(pSample);
break;
case RAW_STRM_TYPE_H264RAW:
hr = H264Decode(pSample);
break;
case RAW_STRM_TYPE_RCV:
hr = VC1Decode(pSample);
break;
case VIDEO_STRM_TYPE_WMV9:
hr = WMV9Decode(pSample);
break;
default:
RETAILMSG(1, (L"[MFC Filter]unsupported file type\n"));
return E_FAIL;
}
if (FAILED(hr))
return hr;
return CTransformFilter::Receive(pSample);
}
void CMFCDecFilter::DecoderReset()
{
if((m_StrmType == RAW_STRM_TYPE_M4V) && (decode_ctx != NULL))
{
SsbSipMPEG4DecodeDeInit(decode_ctx);
this->decode_ctx = NULL;
this->m_MP4IsFirstTransform = TRUE;
}
else if((m_StrmType == RAW_STRM_TYPE_H264RAW) && (decode_ctx != NULL))
{
SsbSipH264DecodeDeInit(decode_ctx);
this->decode_ctx = NULL;
this->m_H264IsFirstTransform = TRUE;
}
else if((m_StrmType == RAW_STRM_TYPE_RCV) && (decode_ctx != NULL))
{
SsbSipVC1DecodeDeInit(decode_ctx);
this->decode_ctx = NULL;
this->m_VC1IsFirstTransform = TRUE;
}
else if((m_StrmType == VIDEO_STRM_TYPE_WMV9) && (decode_ctx != NULL))
{
SsbSipVC1DecodeDeInit(decode_ctx);
this->decode_ctx = NULL;
this->m_WMV9sFirstTransform = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -