
- •«Санкт-петербургский государственный университет телекоммуникаций им. Проф. М.А. Бонч-бруевича»
- •Реферат
- •Содержание
- •Нормативные ссылки
- •Определения, обозначения и сокращения
- •1 Необходимые условия для объемного воспроизведения изображений
- •1.2 Бинокулярные признаки
- •2 Методы, реализующие пространственное восприятие
- •2.1 Методы визуализации на основе физических свойств
- •Источники света
- •2.2. Визуализация пространственного восприятия на основе бинокулярных признаков
- •3 Система передачи объемного телевидения
- •3.1 Система attest
- •3.2 Современное состояние 3d решений
- •4 Экспериментальная система вещания стереотелевидения
- •Dtu-235 - портативный dvb-t измерительный приемник [53].
- •П.В. Шмаков. Основы цветного и объемного телевидения. Изд-во «Советское радио». М. 1954 г.
- •Чеканов д. Очки nVidia GeForce 3d Vision: игры в стерео. Http://www.Thg.Ru/graphic/nvidia_geforce_3d_vision/nvidia_geforce_3d_vision-01.Html.
- •Приложение а
- •Приложение б
Приложение б
Программная реализация кодера и декодера для формата 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"));
}