win-mf: Clean up encoder logging

master
jp9000 2015-09-17 17:41:03 -07:00
parent 8280dbc596
commit e077880ab5
3 changed files with 52 additions and 20 deletions

View File

@ -6,6 +6,10 @@
#include <strsafe.h>
#include <wrl/client.h>
#include <string>
using namespace std;
static void DBGMSG(PCWSTR format, ...)
{
va_list args;
@ -181,7 +185,7 @@ static float OffsetToFloat(const MFOffset& offset)
return offset.value + (static_cast<float>(offset.fract) / 65536.0f);
}
static HRESULT LogVideoArea(const PROPVARIANT& var)
static HRESULT LogVideoArea(wstring &str, const PROPVARIANT& var)
{
if (var.caub.cElems < sizeof(MFVideoArea)) {
return MF_E_BUFFERTOOSMALL;
@ -189,8 +193,15 @@ static HRESULT LogVideoArea(const PROPVARIANT& var)
MFVideoArea *pArea = (MFVideoArea*)var.caub.pElems;
DBGMSG(L"(%f,%f) (%d,%d)", OffsetToFloat(pArea->OffsetX), OffsetToFloat(pArea->OffsetY),
pArea->Area.cx, pArea->Area.cy);
str += L"(";
str += to_wstring(OffsetToFloat(pArea->OffsetX));
str += L",";
str += to_wstring(OffsetToFloat(pArea->OffsetY));
str += L") (";
str += to_wstring(pArea->Area.cx);
str += L",";
str += to_wstring(pArea->Area.cy);
str += L")";
return S_OK;
}
@ -234,30 +245,33 @@ done:
return hr;
}
static void LogUINT32AsUINT64(const PROPVARIANT& var)
static void LogUINT32AsUINT64(wstring &str, const PROPVARIANT& var)
{
UINT32 uHigh = 0, uLow = 0;
Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow);
DBGMSG(L"%d x %d", uHigh, uLow);
str += to_wstring(uHigh);
str += L" x ";
str += to_wstring(uLow);
}
// Handle certain known special cases.
static HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var)
static HRESULT SpecialCaseAttributeValue(wstring &str, GUID guid,
const PROPVARIANT& var)
{
if ((guid == MF_MT_FRAME_RATE) || (guid == MF_MT_FRAME_RATE_RANGE_MAX) ||
(guid == MF_MT_FRAME_RATE_RANGE_MIN) || (guid == MF_MT_FRAME_SIZE) ||
(guid == MF_MT_PIXEL_ASPECT_RATIO)) {
// Attributes that contain two packed 32-bit values.
LogUINT32AsUINT64(var);
LogUINT32AsUINT64(str, var);
} else if ((guid == MF_MT_GEOMETRIC_APERTURE) ||
(guid == MF_MT_MINIMUM_DISPLAY_APERTURE) ||
(guid == MF_MT_PAN_SCAN_APERTURE)) {
// Attributes that an MFVideoArea structure.
return LogVideoArea(var);
return LogVideoArea(str, var);
} else {
return S_FALSE;
@ -267,6 +281,8 @@ static HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var)
static HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index)
{
wstring str;
WCHAR *pGuidName = NULL;
WCHAR *pGuidValName = NULL;
@ -285,52 +301,58 @@ static HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index)
goto done;
}
DBGMSG(L"%s", pGuidName);
str += L" ";
str += pGuidName;
str += L": ";
hr = SpecialCaseAttributeValue(guid, var);
hr = SpecialCaseAttributeValue(str, guid, var);
if (FAILED(hr)) {
goto done;
}
if (hr == S_FALSE) {
switch (var.vt) {
case VT_UI4:
DBGMSG(L"%d", var.ulVal);
str += to_wstring(var.ulVal);
break;
case VT_UI8:
DBGMSG(L"%I64d", var.uhVal);
str += to_wstring(var.uhVal.QuadPart);
break;
case VT_R8:
DBGMSG(L"%f", var.dblVal);
str += to_wstring(var.dblVal);
break;
case VT_CLSID:
hr = GetGUIDName(*var.puuid, &pGuidValName);
if (SUCCEEDED(hr))
{
DBGMSG(pGuidValName);
str += pGuidValName;
}
break;
case VT_LPWSTR:
DBGMSG(var.pwszVal);
str += var.pwszVal;
break;
case VT_VECTOR | VT_UI1:
DBGMSG(L"<<byte array>>");
str += L"<<byte array>>";
break;
case VT_UNKNOWN:
DBGMSG(L"IUnknown");
str += L"IUnknown";
break;
default:
DBGMSG(L"Unexpected attribute type (vt = %d)", var.vt);
str += L"Unexpected attribute type (vt = ";
str += to_wstring(var.vt);
str += L")";
break;
}
}
DBGMSG(L"%s", str.c_str());
done:
CoTaskMemFree(pGuidName);
CoTaskMemFree(pGuidValName);

View File

@ -21,6 +21,13 @@ enum class EncoderType {
H264_VCE,
};
static const char *typeNames[] = {
"Software",
"Quicksync",
"NVENC",
"AMD VCE",
};
class EncoderDescriptor {
public:
static std::vector<std::shared_ptr<EncoderDescriptor>> EncoderDescriptor::Enumerate();

View File

@ -440,11 +440,14 @@ bool H264Encoder::Initialize(std::function<bool(void)> func)
goto fail;
}
MF_LOG(LOG_INFO, "Setting output type to transform");
MF_LOG(LOG_INFO, "Activating encoder: %s",
typeNames[(int)descriptor->Type()]);
MF_LOG(LOG_INFO, " Setting output type to transform:");
LogMediaType(outputType.Get());
HRC(transform->SetOutputType(0, outputType.Get(), 0));
MF_LOG(LOG_INFO, "Setting input type to transform");
MF_LOG(LOG_INFO, " Setting input type to transform:");
LogMediaType(inputType.Get());
HRC(transform->SetInputType(0, inputType.Get(), 0));