Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет_2009.doc
Скачиваний:
80
Добавлен:
15.03.2015
Размер:
12.6 Mб
Скачать

Приложение б

Программная реализация кодера и декодера для формата 3D фирмы Zalman

// AVIcnvDlg.cpp : implementation file

//

#include "stdafx.h"

#include <io.h>

#include <fcntl.h>

#include "AVIcnv.h"

#include "AVIcnvDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

bool en = false;

DWORD BSum(LPBYTE src, int size) {

DWORD sum = 0;

for (int i = 0; i<size; i++) sum += *src++;

return sum;

}

////////////////////////////////////////////////////////////////////////////

#define RETERR { ErrMsg(); return; }

#define MSG(msg) ErrMsg(msg); else AddMsg(msg)

void CAVIcnvDlg::ErrMsg(LPCTSTR mes) {

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER |

FORMAT_MESSAGE_FROM_SYSTEM |

FORMAT_MESSAGE_IGNORE_INSERTS,

NULL,

GetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language

(LPTSTR) &lpMsgBuf,

0,

NULL

);

CString str;

str.Format("%s. Last IO Error: %s",mes,(LPCTSTR)lpMsgBuf);

str.Delete(str.GetLength()-2,2);

AddMsg(str);

LocalFree( lpMsgBuf );

}

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

// Implementation

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// CAVIcnvDlg dialog

CAVIcnvDlg::CAVIcnvDlg(CWnd* pParent /*=NULL*/)

: CDialog(CAVIcnvDlg::IDD, pParent)

, AVIname(_T(""))

, err(FALSE)

, opened(FALSE)

, frame(0)

, level(0)

, frames(0)

, bkup(30000000)

, sortTab(NULL)

, isize(0)

, bri(0)

, con(100)

, pgf(NULL)

, pavistream(NULL)

, pAVI(NULL)

, img(NULL)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

si = new int[WIDTH*HEIGHT];

bk = new int[WIDTH*HEIGHT];

// img = new BYTE[WIDTH*HEIGHT*3];

frmsum = new DWORD[FRMSUMS];

}

CAVIcnvDlg::~CAVIcnvDlg() {

if(pgf) Failed(AVIStreamGetFrameClose(pgf));

if(pavistream) AVIStreamRelease(pavistream);

if(pAVI) AVIFileRelease(pAVI);

opened = false;

if(sortTab) delete[] sortTab;

// if(sortTab) delete[] sortTab;

delete [] si;

delete [] bk;

delete [] frmsum;

if(img) delete [] img;

}

void CAVIcnvDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

DDX_Control(pDX, IDC_MSGLIST, msgList);

DDX_Control(pDX, IDC_SLIDER1, brSlider);

DDX_Control(pDX, IDC_SLIDER2, coSlider);

}

BEGIN_MESSAGE_MAP(CAVIcnvDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_TIMER()

//}}AFX_MSG_MAP

ON_WM_VSCROLL()

ON_BN_CLICKED(IDC_OPENAVI, OnBnClickedOpenavi)

ON_BN_CLICKED(IDC_BUTCLOSE, OnBnClickedButclose)

ON_BN_CLICKED(IDC_BUTMINUS, OnBnClickedButminus)

ON_BN_CLICKED(IDC_BUTPLUS, OnBnClickedButplus)

ON_BN_CLICKED(IDC_BUTP5, OnBnClickedButp5)

ON_BN_CLICKED(IDC_BUTM5, OnBnClickedButm5)

ON_BN_CLICKED(IDC_BUTSAVE, OnBnClickedButsave)

ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)

ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)

ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)

ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)

ON_BN_CLICKED(IDC_TEST, &CAVIcnvDlg::OnBnClickedTest)

END_MESSAGE_MAP()

// CAVIcnvDlg message handlers

void CAVIcnvDlg::OnTimer(UINT nIDEvent) {

if(nIDEvent == timer) {

if(en) OnBnClickedButplus();

}

CDialog::OnTimer(nIDEvent); // Call base class handler.

}

BOOL CAVIcnvDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

brSlider.SetRange(-100, 255);

brSlider.SetPos(bri);

coSlider.SetRange(0, 1000);

coSlider.SetPos(con);

opened = false;

frame = 0;

GetDlgItem(IDC_BUTCLOSE)->EnableWindow(FALSE);

timer = SetTimer(1, 40, 0);

::msgList = &msgList;

return TRUE; // return TRUE unless you set the focus to a control

}

void CAVIcnvDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

void CAVIcnvDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

PaintFrame();

}

}

// The system calls this function to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CAVIcnvDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

void CAVIcnvDlg::OnBnClickedOpenavi()

{

if (opened) CloseAVI();

char szFilters[] = "AVI Files (*.avi)|*.avi|MPG Files (*.mpg)|*.mpg||";

CString str;

CFileDialog srcDlg (TRUE, "avi", "*.avi", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

if( srcDlg.DoModal ()!=IDOK ) { AVIname = ""; return; }

else AVIname = srcDlg.GetPathName();

if (Failed(AVIFileOpen( &pAVI, AVIname, OF_READ, NULL))) return;

opened = true;

ProcFile(); // open stream

ProcStream(); // open frame gragger

ViewFrame();

ViewImage();

return;

//////////////////////////////////////////////////////////////////////////////////////////////////////

if (!Failed(AVIFileInfo(pAVI, &AVIinfo, sizeof(AVIFILEINFO)))) {

ViewFileInfo();

pavistream = NULL;

if (!Failed(AVIFileGetStream(pAVI, &pavistream, streamtypeVIDEO, 0))) {

if (!pavistream) AddErr("Can not open AVI stream.");

else {

if (!Failed(AVIStreamInfo(pavistream, &streaminfo, sizeof(AVISTREAMINFO)))) {

ViewStreamInfo();

LONG lStreamSize;

if (Failed(AVIStreamFormatSize(pavistream, 0, &lStreamSize))) return;

if (lStreamSize > sizeof(bi)) { AddErr("Stream BMP Format too large."); return; }

lStreamSize = sizeof(bi);

if (Failed(AVIStreamReadFormat(pavistream, 0, &bi, &lStreamSize))) return; // Read format

ViewStreamFormat();

binew = bi;

binew.biCompression = BI_RGB;

binew.biBitCount = 24;

binew.biHeight = HEIGHT;

binew.biWidth = WIDTH;

binew.biSizeImage = binew.biHeight * binew.biWidth * 24;

PGETFRAME pgf = AVIStreamGetFrameOpen(pavistream, &binew);

if (!pgf) {

AddErr("New format error.");

return;

}

for (int i = 0; i<256; i++) cl[i*4]=cl[i*4+1]=cl[i*4+2]=cl[i*4+3]=0;

DWORD rs = GetLastError();

LPVOID frm;

BYTE b[1000];

frm = (LPBYTE)AVIStreamGetFrame(pgf, 0);

memcpy(b,frm,1000);

rs = GetLastError();

Failed(AVIStreamGetFrameClose(pgf));

}

}

AVIStreamRelease(pavistream);

}

}

AVIFileRelease(pAVI);

}

BOOL CAVIcnvDlg::Failed(HRESULT fn)

{

switch (fn) {

case AVIERR_OK : return FALSE;

case AVIERR_NODATA : AddErr("The file does not contain a stream corresponding to the values of fccType and lParam."); break;

case AVIERR_BADFORMAT : AddErr("The file couldn't be read, indicating a corrupt file or an unrecognized format."); break;

case AVIERR_MEMORY : AddErr("The file could not be opened because of insufficient memory."); break;

case AVIERR_FILEREAD : AddErr("A disk error occurred while reading the file."); break;

case AVIERR_FILEOPEN : AddErr("A disk error occurred while opening the file."); break;

case REGDB_E_CLASSNOTREG

: AddErr("According to the registry, the type of file specified in AVIFileOpen does not have a handler to process it."); break;

default : AddErr("Unknown error."); break;

}

return TRUE;

}

void CAVIcnvDlg::AddErr(LPTSTR err) {

AddMsg(err);

}

void CAVIcnvDlg::ViewFileInfo(AVIFILEINFO* fi, LPCTSTR nm) {

/* AVIFILEINFO:

DWORD dwMaxBytesPerSec;

DWORD dwFlags;

DWORD dwCaps;

DWORD dwStreams;

DWORD dwSuggestedBufferSize;

DWORD dwWidth;

DWORD dwHeight;

DWORD dwScale;

DWORD dwRate;

DWORD dwLength;

DWORD dwEditCount;

char szFileType[64];

*/

if(!fi) fi = &AVIinfo;

if(!nm) nm = AVIname;

CString str = FileInfoStr(fi, nm);

AddMsg(str);

GetDlgItem(IDC_STATE)->SetWindowText(str);

}

void CAVIcnvDlg::AddMsg(LPCTSTR msg) {

msgList.AddString(msg);

while(msgList.GetCount()>11) msgList.DeleteString(0);

}

void CAVIcnvDlg::ViewStreamInfo(AVISTREAMINFO* si) {

/* AVISTREAMINFO:

DWORD fccType;

DWORD fccHandler;

DWORD dwFlags;

DWORD dwCaps;

WORD wPriority;

WORD wLanguage;

DWORD dwScale;

DWORD dwRate;

DWORD dwStart;

DWORD dwLength;

DWORD dwInitialFrames;

DWORD dwSuggestedBufferSize;

DWORD dwQuality;

DWORD dwSampleSize;

RECT rcFrame;

DWORD dwEditCount;

DWORD dwFormatChangeCount;

char szName[64];

*/

// CString str = StreamInfoStr(si);

// str.Format("STREAM: %c%c%c%c, start=%u, fps=%u, %u:%u %u X %u, len=%u",

// ((char*)&streaminfo.fccHandler)[0],((char*)&streaminfo.fccHandler)[1],((char*)&streaminfo.fccHandler)[2],((char*)&streaminfo.fccHandler)[3],

// streaminfo.dwStart,streaminfo.dwRate/streaminfo.dwScale,

// streaminfo.rcFrame.left,streaminfo.rcFrame.top,streaminfo.rcFrame.right,streaminfo.rcFrame.bottom,streaminfo.dwLength);

AddMsg(StreamInfoStr(si));

}

void CAVIcnvDlg::ViewStreamFormat(BITMAPINFOHEADER* bi) {

/*typedef struct tagBITMAPINFOHEADER {

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;*/

if(bi) AddMsg(BitMapInfoStr(bi));

}

void CAVIcnvDlg::ProcFile(void)

{

if (Failed(AVIFileInfo(pAVI, &AVIinfo, sizeof(AVIFILEINFO)))) return;

ViewFileInfo();

if (Failed(AVIFileGetStream(pAVI, &pavistream, streamtypeVIDEO, 0))) return;

if (!pavistream) { AddErr("Can not open AVI stream."); return; }

}

void CAVIcnvDlg::ProcStream(void)

{

if (Failed(AVIStreamInfo(pavistream, &streaminfo, sizeof(AVISTREAMINFO)))) return;

ViewStreamInfo();

LONG lStreamSize;

if (Failed(AVIStreamFormatSize(pavistream, 0, &lStreamSize))) return;

if (Failed(AVIStreamReadFormat(pavistream, 0, &bi, &lStreamSize))) return; // Read bi format

frames = AVIStreamLength(pavistream);

isize = bi.biWidth * bi.biHeight * bi.biBitCount / 8; // ?? = bi.biSizeImage

ViewStreamFormat();

HRESULT hr;

LONG plBytes;

LONG plSamples;

LPVOID lpOld;

lpOld = new char[bi.biSizeImage];

hr = AVIStreamRead(pavistream, 0, 1, lpOld, bi.biSizeImage,

&plBytes, &plSamples);

bi.biSize = 40;

if(sortTab) delete[] sortTab; // ?????

sortTab = new int[frames]; // ??????

for(int i = 0; i<(int)frames; i++) sortTab[i] = i;

bi.biCompression = BI_RGB; // decompress frames to RGB

binew = bi;

binew.biCompression = BI_RGB;

binew.biBitCount = 24;

if(LeftRight()) binew.biWidth /= 2;

else binew.biHeight /= 2;

binew.biSizeImage = ((((UINT)binew.biBitCount * binew.biWidth + 31) & ~31) / 8) * binew.biHeight;

if(img) delete [] img;

img = new BYTE[binew.biSizeImage];

pgf = AVIStreamGetFrameOpen(pavistream, &bi);

if (!pgf) { AddErr("GetFrameOpen error."); return; }

ViewFrame();

}

void CAVIcnvDlg::ProcFrames(void)

{

ViewFrame(); return;

LPVOID frm;

frm = (LPBYTE)AVIStreamGetFrame(pgf, 0);

ViewImage();

}

void CAVIcnvDlg::ViewImage(void)

{return;

CDC* pDC = GetDC();

int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

int sc = StretchDIBits( pDC->GetSafeHdc(), 490, 100,

VWIDTH, 100,//VHEIGHT,

0, 0, WIDTH, HEIGHT, (LPVOID)img,

(BITMAPINFO*)&binew, DIB_RGB_COLORS, SRCCOPY);

SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

ReleaseDC(pDC);

}

BOOL CAVIcnvDlg::ViewFrame(void)

{

frm = (LPBYTE)AVIStreamGetFrame(pgf, sortTab[frame]);

if (!frm) return FALSE;

ConvertFrame();

PaintFrame();

return TRUE;

}

void CAVIcnvDlg::OnBnClickedButclose()

{

CloseAVI();

}

void CAVIcnvDlg::OnBnClickedButminus()

{

frame--;

if (!ViewFrame()) frame++;

ViewState();

}

void CAVIcnvDlg::OnBnClickedButplus()

{

frame++;

if (!ViewFrame()) frame--;

ViewState();

}

void CAVIcnvDlg::ViewState(void)

{

CString str;

str.Format("Frame: %u",frame);

AddMsg(str);

}

void CAVIcnvDlg::View20Frames(void)

{

LPVOID frm;

CDC* pDC = GetDC();

int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

for (int i = -5; i<6; i++) {

if (i==0) continue;

frm = (LPBYTE)AVIStreamGetFrame(pgf, i+frame);

if (!frm) continue;

int sc = StretchDIBits( pDC->GetSafeHdc(), 10+(i+5)*37, 10+290,

VWIDTH/10, VHEIGHT/10,

0, 0, WIDTH, HEIGHT, frm,

(BITMAPINFO*)&binew, DIB_RGB_COLORS, SRCCOPY);

}

SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

ReleaseDC(pDC);

}

//FindWindow

void CAVIcnvDlg::OnBnClickedButp5()

{

// TODO: Add your control notification handler code here

//////////////////////////////////////////////////////////////

HWND hh = ::FindWindow(NULL,"honestech DVR - Screen");

//////////////////////////////////////////////////////////////

frame+=5;

// if(frame >= frames) frames

if (!ViewFrame()) frame-=5;

ViewState();

}

void CAVIcnvDlg::OnBnClickedButm5()

{

// TODO: Add your control notification handler code here

frame-=5;

if (!ViewFrame()) frame+=5;

ViewState();

}

void CAVIcnvDlg::Histogram256RGB(void) {

EnableWindow(FALSE);

memset(histo256,0,sizeof(DWORD)*256);

memset(frmsum, 0, FRMSUMS*sizeof(frmsum[0]));

frames = 0;

int nfrm = 0;

int size = WIDTH*HEIGHT*3;

LPVOID frm;

while(frm = (LPBYTE)AVIStreamGetFrame(pgf, nfrm)) {

DWORD sum = BSum((LPBYTE)frm,size);

nfrm++;

}

int lev = 255;

for (lev = 255; lev>=0; lev--) if (histo256[lev]>3) break;

int zz = 3;

for (; lev>=0; lev--) {

if (histo256[lev]==0) zz--; else zz = 3;

if (zz==0) break;

}

level = lev;

size = 0;

ViewHisto();

EnableWindow(TRUE);

}

void CAVIcnvDlg::CloseAVI(void) {

Failed(AVIStreamGetFrameClose(pgf));

AVIStreamRelease(pavistream);

AVIFileRelease(pAVI);

opened = false;

if(sortTab) delete[] sortTab;

sortTab = NULL;

frames = 0;

frame = 0;

}

void CAVIcnvDlg::ViewHisto(void) {

CDC* pDC = GetDC();

// SetDCBrushColor(RGB(40,40,200));

int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

for (int i = 0; i<256; i++) {

pDC->MoveTo(370,276-i);

pDC->LineTo(371+((histo256[i]>100)?100:histo256[i]),276-i);

}

pDC->MoveTo(370,276-level);

pDC->LineTo(370+105,276-level);

SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

ReleaseDC(pDC);

}

void CAVIcnvDlg::GetImage(void) {

EnableWindow(FALSE);

int bfrm = 0;

int ifrm = 0;

int nfrm = 0;

int size = WIDTH*HEIGHT*3;

int sz = WIDTH*HEIGHT;

LPBYTE frm;

memset(si,0,sz*sizeof(si[0]));

memset(bk,0,sz*sizeof(bk[0]));

while(frm = (LPBYTE)AVIStreamGetFrame(pgf, nfrm)) {

DWORD sum = BSum((LPBYTE)frm,size)/size;

if ((int)sum>=level) {

for (int i = 0; i<sz; i++) si[i] += (frm[i*3]+frm[i*3+1]+frm[i*3+2]);

ifrm++;

}

else {

for (int i = 0; i<sz; i++) bk[i] += (frm[i*3]+frm[i*3+1]+frm[i*3+2]);

bfrm++;

}

nfrm++;

}

if (!ifrm) ifrm = 1;

if (!bfrm) bfrm = 1;

if (!nfrm) nfrm = 1;

int min = 100000;

int max = 0;

for (int i = 0; i<sz; i++) {

bk[i] /= bfrm;

int s = si[i] / ifrm - bk[i];

if (s<0) s = 0;

if (min>s) min = s;

if (max<s) max = s;

si[i] = s;

}

int k = 51200/(max - min);

for (int i = 0; i<sz; i++) {

img[i*3] = img[i*3+1] = img[i*3+2] = (((si[i] - min) * k) >> 8) + 50;

}

EnableWindow(TRUE);

}

void CAVIcnvDlg::OnBnClickedButsave()

{

char szFilters[] = "BMP Files (*.bmp)|*.bmp|";

CString str;

CFileDialog dstDlg (FALSE, "bmp", "*.bmp", OFN_OVERWRITEPROMPT*0, szFilters, this);

if( dstDlg.DoModal ()!=IDOK ) { BMPname = ""; return; }

else BMPname = dstDlg.GetPathName();

BITMAPFILEHEADER bfh;

bfh.bfType = 0x4d42;

bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +

(1 << (binew.biBitCount))*sizeof(RGBQUAD)*0 + binew.biSizeImage;

bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +

(1 << (binew.biBitCount))*sizeof(RGBQUAD)*0;

bfh.bfReserved1 = 0;

bfh.bfReserved2 = 0;

int fh;

if( (fh = _open( BMPname, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY, _S_IREAD | _S_IWRITE)) != -1 )

{

size_t asz = _write(fh, &bfh, sizeof(BITMAPFILEHEADER));

asz += _write(fh, &binew, sizeof(BITMAPINFOHEADER) + (1 << (binew.biBitCount))*sizeof(RGBQUAD)*0);

asz += _write(fh, img, binew.biSizeImage);

_close( fh );

}

}

void CAVIcnvDlg::GetLevel(void) {

DWORD centre = 0;

for (int i = 0; i<256; i++) centre += i*histo256[i];

level = (BYTE)(centre/frames) + 1;

}

void CAVIcnvDlg::GetSumImg(void) {

///////////////////////////////////////////////////////////////////////////////////////////////////////////

EnableWindow(FALSE);

int bfrm = 0;

int ifrm = 0;

int size = WIDTH*HEIGHT*3;

int sz = WIDTH*HEIGHT;

LPBYTE frm;

memset(si,0,sz*sizeof(si[0]));

memset(bk,0,sz*sizeof(bk[0]));

int nfrm = 0;

DWORD bksum = 0;

double xbk = 0;

DWORD frsum = 0;

while(frm = (LPBYTE)AVIStreamGetFrame(pgf, nfrm)) {

if (nfrm<50) {

for (int i = 0; i<sz; i++) {

bk[i] += frm[i*3];

bk[i] += frm[i*3+1];

bk[i] += frm[i*3+2];

}

}

else {

if (nfrm==50) {

for (int i = 0; i<sz; i++) {

bk[i] /= 50;

bksum += bk[i];

}

bksum += bkup;

}

DWORD sum = BSum((LPBYTE)frm,size);

if (sum>bksum) {

for (int i = 0; i<sz; i++) {

si[i] += frm[i*3];

si[i] += frm[i*3+1];

si[i] += frm[i*3+2];

}

ifrm++;

}

}

nfrm++;

}

int min = 100000;

int max = 0;

if (!ifrm) ifrm = 1;

for (int i = 0; i<sz; i++) {

int s = si[i] / ifrm - bk[i];

if (s<0) s = 0;

if (min>s) min = s;

if (max<s) max = s;

si[i] = s;

}

if (max==min) max++;

int k = 51200/(max - min);

for (int i = 0; i<sz; i++) {

img[i*3] = img[i*3+1] = img[i*3+2] = (((si[i] - min) * k) >> 8) + 50;

}

CString str;

str.Format("FRAMES: %u LEVEL: %u",ifrm,bkup/100000);

AddMsg(str);

EnableWindow(TRUE);

}

void CAVIcnvDlg::OnBnClickedButton2()

{

//down

bkup -= 1000000;

if (bkup<0) bkup = 0;

else {

CString str;

str.Format("LEVEL: %u",bkup/100000);

AddMsg(str);

}

}

void CAVIcnvDlg::OnBnClickedButton3()

{

// UP

bkup += 1000000;

CString str;

str.Format("LEVEL: %u",bkup/100000);

AddMsg(str);

}

void CAVIcnvDlg::ReGet(void)

{

if (opened) CloseAVI();

if (Failed(AVIFileOpen( &pAVI, AVIname, OF_READ, NULL))) return;

opened = true;

ProcFile();

GetSumImg();

ViewImage();

}

void CAVIcnvDlg::OnBnClickedButton4()

{

ReGet();

}

////////////////////

BYTE b = 255;

BYTE ba[4096];

void CAVIcnvDlg::OnBnClickedButton1() {

if(!en) {

GetDlgItem(IDC_OPENAVI)->EnableWindow(false);

en = true;

GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Stop"));

}

else {

GetDlgItem(IDC_OPENAVI)->EnableWindow(true);

en = false;

GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Play"));

}

return;

HANDLE h;

h = CreateFile("LPT1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS, // OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, NULL);

if(h == INVALID_HANDLE_VALUE) MSG("CreateFile");

COMMCONFIG CC;

DWORD dwSize = sizeof(COMMCONFIG);

if (!GetCommConfig(h, &CC, &dwSize)) MSG("GetCommConfig");

DWORD EvtMask;

if (!GetCommMask(h, &EvtMask )) MSG("GetCommMask");

if (!SetupComm( h, 4096, 4096)) MSG("SetupComm");

if (!CommConfigDialog( "PRN", m_hWnd, &CC)) MSG("CommConfigDialog");

memset(ba,0,4096);

dwSize = 4096;

if (!WriteFile( h, ba, 4096, &dwSize, NULL)) MSG("WriteFile");

b ^= 255;

CString str;

str.Format("PRINT: b = %x",b);

AddMsg(str);

if (!CloseHandle(h)) MSG("CloseHandle");

}

void CAVIcnvDlg::Sort(void) {

if(!frames) return;

DWORD* sum = new DWORD[frames];

int size = bi.biWidth * bi.biHeight * bi.biBitCount / 8;

for (int i = 0; i<frames; i++) {

LPVOID frm = AVIStreamGetFrame(pgf, i);

sum[i] = BSum((LPBYTE)frm, size);

}

int index = 0;

for(int i = 0; i<frames; i++) {

DWORD max = 0;

int imax = 0;

for(int j = 0; j<frames; j++) {

if(sum[j]>max) { max = sum[j]; imax = j; }

}

sortTab[index++] = imax;

sum[imax] = 0;

}

delete[] sum;

}

void CAVIcnvDlg::OnBnClickedButton5()

{

Sort();

}

void CAVIcnvDlg::OnBnClickedButton6()

{

frame = 0;

ViewFrame();

}

void CAVIcnvDlg::PaintFrame(void) {

if(!img) return;

CDC* pDC = GetDC();

int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

int sc = StretchDIBits( pDC->GetSafeHdc(), 10, 10,

// VWIDTH, VHEIGHT,

binew.biWidth, binew.biHeight,

0, 0, binew.biWidth, binew.biHeight, img,

(BITMAPINFO*)&binew, DIB_RGB_COLORS, SRCCOPY);

SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

ReleaseDC(pDC);

}

void CAVIcnvDlg::OnVScroll( UINT code, UINT pos, CScrollBar* pwin) {

if (pwin == (CScrollBar*)&brSlider) {

bri = brSlider.GetPos();

SetView();

PaintFrame();

} else

if (pwin == (CScrollBar*)&coSlider) {

con = coSlider.GetPos();

SetView();

PaintFrame();

}

}

void CAVIcnvDlg::SetView(void) {return;

// memcpy(img, frm, isize);

LPBYTE pb = (LPBYTE)frm + bi.biSize;

for(int i = 0; i<isize; i++) { // ?????? isize

int x = (pb[i] * con)/100 + bri;

if(x>255) x = 255;

if(x<0) x = 0;

img[i] = x;

}

}

void CAVIcnvDlg::ConvertFrame(void) { // frm -> img

BYTE* src = ((BYTE*)frm) + bi.biSize;

BYTE* dst = (BYTE*)img;

int dst_ln = ((binew.biBitCount * binew.biWidth + 31) & ~31) / 8;

int dst_sz = binew.biBitCount * binew.biWidth / 8;

int src_ln = ((bi.biBitCount * bi.biWidth + 31) & ~31) / 8;

BYTE* d = src;

for(int j = 0; j<-bi.biHeight; j++) {

d[j*src_ln + 299] = 250;

d[j*src_ln + 300] = 250;

d[j*src_ln + 301] = 250;

}

//memcpy(dst, src, bi.biSizeImage/2);

bool rz = LeftRight();

if(LeftRight())

for(int j = 0; j < binew.biHeight / 2; j++) {

memcpy(dst, src, dst_sz); // bi.biWidth / 2

dst += dst_ln;

src += src_ln;

memcpy(dst, src + dst_sz, dst_sz);

dst += dst_ln;

src += src_ln;

}

else

for(int j = 0; j < binew.biHeight / 2; j++) {

memcpy(dst, src, dst_sz); // bi.biWidth / 2

dst += dst_ln;

src += src_ln;

memcpy(dst, src + (binew.biHeight*src_ln), dst_sz);

dst += dst_ln;

src += src_ln;

}

// ((BITMAPINFO*)img)->bmiHeader.biWidth /= 2;

if(((CButton*)GetDlgItem(IDC_VLINES))->GetCheck() == BST_CHECKED) {

dst = img;

for(int j = 0; j<8; j++) {

memset(dst+((j*2+20)*dst_ln), 250, dst_sz);

memset(dst+((j*2+41)*dst_ln), 250, dst_sz);

memset(dst+((j*2+21)*dst_ln), 0, dst_sz);

memset(dst+((j*2+40)*dst_ln), 0, dst_sz);

}

}

}

bool CAVIcnvDlg::NewFrame(int step) {

return false;

}

bool CAVIcnvDlg::LeftRight(void) {

return ((double)bi.biWidth / (double)bi.biHeight) > 1.0;

}

void CAVIcnvDlg::OnBnClickedTest() {

AddMsg(_T("---------------------------------------------------------------------"));

if(!avi.OpenInFile()) return;

ViewFileInfo(&(avi.m_inFileInfo), avi.m_inFileName);

if(!avi.OpenInStream()) return;

ViewStreamInfo(&(avi.m_inStreamInfo));

ViewBitMapInfo(&(avi.m_biIn));

// if(!avi.OpenGetFrame()) return;

SaveSmall(avi.m_inStream, _T("xxx.avi"));

}

124

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]