#define _WIN32_WINNT 0x0400 //for COINIT_MULTITHREADED
#include <atlbase.h>
#include <atlcom.h>
#include <tchar.h>
#include <iostream>
#include <iomanip>
#include "flixengine_com.h"
using std::cout;
using std::cerr;
using std::endl;
using std::ios_base;
LPTSTR hresult_desc(HRESULT hr)
{
LPTSTR str;
if(HRESULT_FACILITY(hr) == FACILITY_WINDOWS)
hr = HRESULT_CODE(hr);
if(!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&str, 0, NULL)) {
_stprintf(str= (LPTSTR)LocalAlloc(LPTR,512),
_T("[no description available, HRESULT_CODE(hr):%d]\n"),hr);
}
return str;
}
#define CHECK_HR(func) {\
HRESULT hr = (func);\
if(FAILED(hr)) {\
LPTSTR desc = hresult_desc(hr);\
\
cerr << endl << #func << " failed!" << endl\
<< "HRESULT(" << endl << hr << "," << endl << desc << ")" << endl;\
LocalFree(desc);\
\
\
__if_exists(flix) {\
FE2_errno flixerr = ErrNone;\
on2s32 syserr = 0;\
\
hr= flix->errno_(&flixerr,&syserr);\
cerr << "flix->errno_: hr:"\
<< std::setiosflags(ios_base::hex|ios_base::showbase)\
<< std::setw(8) << hr\
<< std::dec << " flixerrno:" << flixerr\
<< " syserrno:" << syserr << endl;\
}\
exit(EXIT_FAILURE);\
}\
}
void print_encoder_status(IFlix* flix)
{
cout << "\nEncoder Status\n";
FE2_EncState state;
CHECK_HR( flix->getEncoderState(&state) )
cout << " flix->getEncoderState: " << state << endl;
FE2_errno flixerr = ErrNone;
on2s32 syserr;
CHECK_HR( flix->errno_(&flixerr,&syserr) )
cout << " flix->errno_: flixerrno:" << flixerr
<< " syserrno:" << syserr << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
CHECK_HR( CoInitializeEx(NULL,COINIT_MULTITHREADED) );
IUnknown* unk;
CHECK_HR( CoCreateInstance(CLSID_Flix, 0, CLSCTX_INPROC_SERVER,
IID_IUnknown, reinterpret_cast<void**>(&unk)) );
IFlix* flix = NULL;
CHECK_HR( unk->QueryInterface(IID_IFlix, reinterpret_cast<void**>(&flix)) );
unk->Release();
BSTR bstr;
CHECK_HR( flix->version(&bstr) );
cout << "Flix Engine COM library. Flix Engine v" << COLE2CT(bstr);
::SysFreeString(bstr);
CHECK_HR( flix->com_version(&bstr) );
cout << " COM v" << COLE2CT(bstr) << endl;
::SysFreeString(bstr);
CHECK_HR( flix->copyright(&bstr) );
cout << COLE2CT(bstr) << endl << endl;
::SysFreeString(bstr);
if(argc<3) {
cerr << "usage: cli_encode_com.exe <infile> <outfile>" << endl << endl;
return EXIT_FAILURE;
}
cout << "Input file : " << argv[1] << endl;
CHECK_HR( flix->setInputFile(CComBSTR(argv[1])) );
IVideoOptions* vidopts;
CHECK_HR( flix->videoOptions(&vidopts) );
on2s32 duration; CHECK_HR( flix->getSourceDuration(&duration) );
on2s32 srcw; CHECK_HR( vidopts->getSourceWidth(&srcw) );
on2s32 srch; CHECK_HR( vidopts->getSourceHeight(&srch) );
cout << std::setw(25) << "Width: " << srcw << endl
<< std::setw(25) << "Height: " << srch << endl
<< std::setw(25) << "Duration: " << duration << "ms" << endl;
vidopts->Release();
cout << "Output File : " << argv[2] << endl;
CHECK_HR( flix->setOutputFile(CComBSTR(argv[2])) );
CHECK_HR( flix->encode() );
IEncodingStatus* encstatus;
CHECK_HR( flix->encodingStatus(&encstatus) );
on2bool b;
on2s32 pcnt;
cout << endl;
do {
Sleep(500);
CHECK_HR( flix->isEncoderRunning(&b) );
CHECK_HR( encstatus->percentComplete(&pcnt) );
cout << "\rEncoding..." << std::setw(3) << pcnt << "% ";
} while(b);
cout << "Done!" << endl;
print_encoder_status(flix);
encstatus->Release();
flix->Release();
return EXIT_SUCCESS;
}