V0lt
Цитата:
Файл - ...\Mpc-hc\src\filters\transform\mpcvideodec\MPCVideoDecFilter.cpp
функция - HRESULT CMPCVideoDecFilter::Transform(IMediaSample* pIn), ну и вот сам код :
if((m_nARMode) && (m_pAVCtx))
{
if((m_pAVCtx->sample_aspect_ratio.num>1) && (m_pAVCtx->sample_aspect_ratio.num>1))
{
double SAR = ((double)m_pAVCtx->sample_aspect_ratio.num/(double)m_pAVCtx->sample_aspect_ratio.den);
if(m_sar != SAR)
{
m_sar = SAR;
double DAR = SAR * m_nWidth/m_nHeight;
CSize aspect(0,0);
aspect.cy = m_nHeight;
aspect.cx = (int)m_nHeight*DAR;
int lnko = 0;
do
{
lnko = LNKO(aspect.cx, aspect.cy);
if(lnko > 1) aspect.cx /= lnko, aspect.cy /= lnko;
}
while(lnko > 1);
if(aspect.cx != aspect.cy) SetAspect(aspect);
}
}
}
m_pAVCtx->sample_aspect_ratio - это береться из ffmpeg
Передает параметры в функции SetAspect(aspect), которая находиться в
...\Mpc-hc\src\filters\transform\basevideofilter\BaseVideoFilter.cpp, вот код ее :
void CBaseVideoFilter::SetAspect(CSize aspect)
{
m_arx = aspect.cx;
m_ary = aspect.cy;
}
И при выводе просто идет задание :
vih->dwPictAspectRatioX = m_arx;
vih->dwPictAspectRatioY = m_ary;
Думаю понятно.
З.Ы. - Блин времени нету, не могу понять как работает вывод при режиме DXVA, т.к. при нем не вызываються функции из BaseVideoFilter.cpp, и поэтому я не могу понять кому/куда передавать параметры этого Aspect Ratio
Цитата:
Aleksoid1978
Цитата:Я могу выложить кусок кода, который отвечает за определение DAR/SAR из потока, если надо - вдруг ктонить возьмет и улучшит его.
дай посмотреть
Файл - ...\Mpc-hc\src\filters\transform\mpcvideodec\MPCVideoDecFilter.cpp
функция - HRESULT CMPCVideoDecFilter::Transform(IMediaSample* pIn), ну и вот сам код :
if((m_nARMode) && (m_pAVCtx))
{
if((m_pAVCtx->sample_aspect_ratio.num>1) && (m_pAVCtx->sample_aspect_ratio.num>1))
{
double SAR = ((double)m_pAVCtx->sample_aspect_ratio.num/(double)m_pAVCtx->sample_aspect_ratio.den);
if(m_sar != SAR)
{
m_sar = SAR;
double DAR = SAR * m_nWidth/m_nHeight;
CSize aspect(0,0);
aspect.cy = m_nHeight;
aspect.cx = (int)m_nHeight*DAR;
int lnko = 0;
do
{
lnko = LNKO(aspect.cx, aspect.cy);
if(lnko > 1) aspect.cx /= lnko, aspect.cy /= lnko;
}
while(lnko > 1);
if(aspect.cx != aspect.cy) SetAspect(aspect);
}
}
}
m_pAVCtx->sample_aspect_ratio - это береться из ffmpeg
Передает параметры в функции SetAspect(aspect), которая находиться в
...\Mpc-hc\src\filters\transform\basevideofilter\BaseVideoFilter.cpp, вот код ее :
void CBaseVideoFilter::SetAspect(CSize aspect)
{
m_arx = aspect.cx;
m_ary = aspect.cy;
}
И при выводе просто идет задание :
vih->dwPictAspectRatioX = m_arx;
vih->dwPictAspectRatioY = m_ary;
Думаю понятно.
З.Ы. - Блин времени нету, не могу понять как работает вывод при режиме DXVA, т.к. при нем не вызываються функции из BaseVideoFilter.cpp, и поэтому я не могу понять кому/куда передавать параметры этого Aspect Ratio