📄 vcdlg.cpp
字号:
DWORD vertical_size;
DWORD vertical_size_extension;
DWORD vertical_size_value;
unsigned int scalable_mode=5;
CString s;
DWORD t;
UpdateData(TRUE);
if(m_Num_Slice==0)
{
MessageBox("Slice Number shouldn't be '0'!");
goto stop;
}
FileOpenDlg.SeekToBegin();
if(SeekHeader(1,0x01b3,0x01b3)==TRUE)
{
FileOpenDlg.Read(&t,4);
transform(&t,4);
vertical_size_value = getbits(t,13,24);
vertical_size = vertical_size_value;
}
if(SeekExtension(1,0x01b3)==TRUE)
{
vertical_size_extension = getbits(t,14,15);
vertical_size = (vertical_size_extension<<12) + vertical_size_value;
}
FileOpenDlg.SeekToBegin();
if(SeekAllExtension(5)==TRUE)
{
FileOpenDlg.Seek(-1,CFile::current);
FileOpenDlg.Read(&t,4);
transform(&t,4);
scalable_mode = getbits(t,5,6);
}
FileOpenDlg.SeekToBegin();
if(m_Num_Sequence==1) m_Num_Sequence--;
if(m_Num_Group_Picture==1) m_Num_Group_Picture--;
if(m_Num_Picture==1) m_Num_Picture--;
if(SeekHeader(m_Num_Sequence,0x01b3,0x01b3)==FALSE)
{
MessageBox("Sequence Head not found!");
goto stop;
}
if(SeekHeader(m_Num_Group_Picture,0x01b8,0x01b8)==FALSE)
{
MessageBox("Group Picture Head not found!");
goto stop;
}
if(SeekHeader(m_Num_Picture,0x0100,0x0100)==FALSE)
{
MessageBox("Picture Head not found!");
goto stop;
}
if(SeekHeader(m_Num_Slice,0x0101,0x01AF)==FALSE)
{
MessageBox("Slice Head not found!");
goto stop;
}
if(m_Num_Sequence==0) m_Num_Sequence++;
if(m_Num_Group_Picture==0) m_Num_Group_Picture++;
if(m_Num_Picture==0) m_Num_Picture++;
UpdateData(FALSE);
s.Format("\r\n第%d个序列,\r\n",m_Num_Sequence);
m_Show+=s;
s.Format("第%d个图像组,\r\n",m_Num_Group_Picture);
m_Show+=s;
s.Format("第%d帧图像,\r\n",m_Num_Picture);
m_Show+=s;
s.Format("第%d个宏块条:\r\n",m_Num_Slice);
m_Show+=s;
FileOpenDlg.Seek(-1,CFile::current);
FileOpenDlg.Read(&t,4);
transform(&t,4);
slice_vertical_postition = getbits(t,1,8);
if(vertical_size>2800)
{
n = 3;
slice_vertical_postition_extension = getbits(t,9,11);
slice_vertical_postition = (slice_vertical_postition_extension<<7) + slice_vertical_postition - 1;
}
else slice_vertical_postition = slice_vertical_postition - 1;
s.Format("\tslice_vertical_postition = %d,",slice_vertical_postition);
m_Show+=s;
s.Format("\t第一个宏块在组块中的竖直位置 = %d个宏块\r\n",slice_vertical_postition+1);
m_Show+=s;
if(scalable_mode==0) quantiser_scale_code = getbits(t,16+n,20+n);
else quantiser_scale_code = getbits(t,9+n,14+n);
s.Format("\tquantiser_scale_code = %d,",quantiser_scale_code);
m_Show+=s;
s.Format("宏块量化尺度 = %d\r\n",quantiser_scale_code);
m_Show+=s;
stop: UpdateData(FALSE);
}
bool CVCDlg::SeekHeader(DWORD num, DWORD begincode, DWORD endcode)
{
DWORD size=0;
DWORD n;
char buf[40000];
DWORD t=0;
for(;num>0;)
{
size = FileOpenDlg.Read(buf,40000);
for(n=0;n<=size-4;n++)
{
memcpy(&t,buf+n,4);
transform(&t,4);
if(t>=begincode&&t<=endcode) num--;
if(num<=0) break;
}
if(FileOpenDlg.GetPosition()>=FileSize) break;
if(n==size-3)
{
FileOpenDlg.Seek(-3,CFile::current);
}
}
if(num!=0) return(FALSE);
else
{
if(size!=0) FileOpenDlg.Seek(n-size+4,CFile::current); //size等于0,说明文件指针未移动
return(TRUE); //size不为0时,说明文件指针有移动,则需纠正位置,将其移动到头位置之后
}
}
void CVCDlg::transform(DWORD *p, int n)
{
int i;
DWORD t;
t = *p % 256;
*p = *p / 256;
for(i=1;i<n;i++) t = t * 256;
if(*p!=0) transform(p,n-1);
*p+= t;
}
DWORD CVCDlg::getbits(DWORD t, unsigned int begin_bit, unsigned int end_bit)
{
unsigned int m;
unsigned int n;
m=begin_bit-1;
if(begin_bit<1||end_bit>32||begin_bit>end_bit)
{
MessageBox("begin_bit or end_bit input error!");
exit(0);
}
for(n=0;m>0;m--,n++)
{
t=t<<1;
}
m=32-end_bit+n;
for(;m>0;m--)
{
t=t>>1;
}
return t;
}
void CVCDlg::OnBtnGetSequence()
{
// TODO: Add your control notification handler code here
DWORD horizontal_size_value;
DWORD vertical_size_value;
unsigned int frame_rate_code;
float frame_rate=20;
DWORD bit_rate_value;
unsigned int aspect_ratio_information;
float DAR=0;
float SAR;
unsigned int xcodebit;
unsigned int profile_indication;
unsigned int level_indication;
unsigned int progressive_sequence;
unsigned int chroma_format;
DWORD horizontal_size_extension;
DWORD vertical_size_extension;
DWORD bit_rate_extension;
DWORD vertical_size;
DWORD horizontal_size;
DWORD bit_rate;
DWORD display_horizontal_size;
DWORD display_vertical_size;
DWORD t;
CString s;
UpdateData(TRUE);
if(m_Num_Sequence==0)
{
MessageBox("Sequence Number shouldn't be '0'!");
goto stop;
}
FileOpenDlg.SeekToBegin();
if(SeekHeader(m_Num_Sequence,0x01b3,0x01b3)==FALSE)
{
MessageBox("Sequence Head not found!");
goto stop;
}
s.Format("\r\n第%d个序列:\r\n",m_Num_Sequence);
m_Show+=s;
FileOpenDlg.Read(&t,4);
transform(&t,4);
horizontal_size_value = getbits(t,1,12);
vertical_size_value = getbits(t,13,24);
aspect_ratio_information = getbits(t,25,28);
s.Format("\taspect_ratio_information = %d,",aspect_ratio_information);
m_Show+=s;
switch(aspect_ratio_information)
{
case 1: s.Format("宽高比为1:1,方形\r\n");m_Show+=s;break;
case 2: s.Format("宽高比为4:3\r\n");m_Show+=s;break;
case 3: s.Format("宽高比为16:9\r\n");m_Show+=s;break;
case 4: s.Format("宽高比为2.11:1\r\n");m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
frame_rate_code = getbits(t,29,32);
s.Format("\tframe_rate_code = %d,",frame_rate_code);
m_Show+=s;
switch(frame_rate_code)
{
case 1: frame_rate = 23.976;break;
case 2: frame_rate = 24;break;
case 3: frame_rate = 25;break;
case 4: frame_rate = 29.97;break;
case 5: frame_rate = 30;break;
case 6: frame_rate = 50;break;
case 7: frame_rate = 59.94;break;
case 8: frame_rate = 60;
}
s.Format("帧频 = %2.3f\r\n",frame_rate);
m_Show+=s;
FileOpenDlg.Seek(4,CFile::current); //移动文件指针向后跳32bit
bit_rate_value = getbits(t,1,18);
if(SeekExtension(1,0x01b3)==TRUE)
{
FileOpenDlg.Seek(-1,CFile::current);
FileOpenDlg.Read(&t,4);
transform(&t,4);
xcodebit = getbits(t,5,5);
profile_indication = getbits(t,6,8);
level_indication = getbits(t,9,12);
progressive_sequence = getbits(t,13,13);
chroma_format = getbits(t,14,15);
horizontal_size_extension = getbits(t,16,17);
vertical_size_extension = getbits(t,18,19);
bit_rate_extension = getbits(t,20,31);
horizontal_size = (horizontal_size_extension<<12) + horizontal_size_value;
vertical_size = (vertical_size_extension<<12) + vertical_size_value;
bit_rate = ((bit_rate_extension<<18) + bit_rate_value) / 20; //***改为KB/S为单位***//
s.Format("\t水平像素数 = %d\r\n",horizontal_size);
m_Show+=s;
s.Format("\t垂直像素数 = %d\r\n",vertical_size);
m_Show+=s;
s.Format("\t比特率 = %dKB/s\r\n",bit_rate);
m_Show+=s;
s.Format("\txcodebit = %d\r\n",xcodebit);
m_Show+=s;
if(xcodebit!=1)
{
s.Format("\tprofile_indication = %d,",profile_indication);
m_Show+=s;
switch(profile_indication)
{
case 5: s.Format("类: 简单\r\n");m_Show+=s;break;
case 4: s.Format("类: 主\r\n");m_Show+=s;break;
case 3: s.Format("类: SNR分级\r\n");m_Show+=s;break;
case 2: s.Format("类: 空域\r\n");m_Show+=s;break;
case 1: s.Format("类: 高\r\n");m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
s.Format("\tlevel_indication = %d,",level_indication);
m_Show+=s;
switch(level_indication)
{
case 10: s.Format("级: 低\r\n");m_Show+=s;break;
case 8: s.Format("级: 主\r\n");m_Show+=s;break;
case 6: s.Format("级: 高1440\r\n");m_Show+=s;break;
case 4: s.Format("级: 高\r\n");m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
}
s.Format("\tprogressive_sequence = %d,",progressive_sequence);
m_Show+=s;
if(progressive_sequence==1) s.Format("本序列仅含有逐行的帧图。\r\n");
else s.Format("本序列同时含有帧图和场图。\r\n");
m_Show+=s;
s.Format("\tchroma_format = %d,",chroma_format);
m_Show+=s;
switch(chroma_format)
{
case 1: s.Format("亮色取样结构为 4:2:0\r\n");m_Show+=s;break;
case 2: s.Format("亮色取样结构为 4:2:2\r\n");m_Show+=s;break;
case 3: s.Format("亮色取样结构为 4:4:4\r\n");m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
}
else
{
horizontal_size = horizontal_size_value;
vertical_size = vertical_size_value;
bit_rate = bit_rate_value / 20;
s.Format("\t水平像素数 = %d\r\n",horizontal_size);
m_Show+=s;
s.Format("\t垂直像素数 = %d\r\n",vertical_size);
m_Show+=s;
s.Format("\t比特率 = %dKB/s\r\n",bit_rate);
m_Show+=s;
}
if(aspect_ratio_information==1)
{
s.Format("\t样点宽高比 = 1.0\r\n");
m_Show+=s;
}
switch(aspect_ratio_information)
{
case 2: DAR=0.75;break;
case 3: DAR=9.0/16;break;
case 4: DAR=1/2.21;break;
default : goto stop;
}
if(SeekAllExtension(2)==FALSE)
{
SAR = vertical_size/(DAR * horizontal_size);
switch(aspect_ratio_information)
{
case 2: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 4:3\r\n",SAR);m_Show+=s;break;
case 3: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 16:9\r\n",SAR);m_Show+=s;break;
case 4: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 2.21:1\r\n",SAR);m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
}
else
{
FileOpenDlg.Seek(-1,CFile::current);
FileOpenDlg.Read(&t,1);
if(getbits(t,32,32)==1) FileOpenDlg.Seek(3,CFile::current);
FileOpenDlg.Read(&t,4);
transform(&t,4);
display_horizontal_size = getbits(t,1,14);
display_vertical_size = getbits(t,16,29);
SAR = display_vertical_size/(DAR * display_horizontal_size);
switch(aspect_ratio_information)
{
case 2: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 4:3\r\n",SAR);m_Show+=s;break;
case 3: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 16:9\r\n",SAR);m_Show+=s;break;
case 4: s.Format("\t样点宽高比 = %1.4f, 显示宽高比 = 2.21:1\r\n",SAR);m_Show+=s;break;
default: s.Format("\r\n");m_Show+=s;
}
}
stop: UpdateData(FALSE);
}
bool CVCDlg::SeekExtension(DWORD identifier, DWORD head) //查找头后面的第一个扩展
{
DWORD n;
DWORD t = FileOpenDlg.GetPosition();
CString s;
SeekHeader(1,head,head);
n = FileOpenDlg.GetPosition();
FileOpenDlg.Seek(t-n,CFile::current);
for(;;)
{
if(SeekHeader(1,0x01b5,0x01b5)==TRUE)
{
if(FileOpenDlg.GetPosition()>=n) {return FALSE;break;}
FileOpenDlg.Read(&t,1);
t = getbits(t,25,28);
if(t==identifier) {return TRUE;break;}
}
else {return FALSE;break;}
}
}
bool CVCDlg::SeekAllExtension(DWORD identifier)
{
DWORD t;
for(;;)
{
if(SeekHeader(1,0x01b5,0x01b5)==TRUE)
{
FileOpenDlg.Read(&t,1);
t = getbits(t,25,28);
if(t==identifier) {return TRUE;break;}
}
else {return FALSE;break;}
}
}
void CVCDlg::OnBtnSave()
{
// TODO: Add your control notification handler code here
char filters[] = "文本文件 (*.txt)|*.txt|All Files (*.*)|*.*|";
CFileDialog FileDlg(FALSE, NULL, "*.txt", NULL, filters, NULL);
CFile FileSaveDlg;
FileOpenDlg.Close();
if(FileDlg.DoModal() == IDOK)
{
FilePath = FileDlg.GetPathName();
if(strlen(FilePath)==0)
{
MessageBox(FilePath);
}
else
{
FileSaveDlg.Open(FilePath,CFile::modeCreate | CFile::modeWrite);
FileSaveDlg.Write(m_Show.GetBuffer(1),m_Show.GetLength());
}
}
}
void CVCDlg::OnChangeShow()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
void CVCDlg::OnChangeSequence()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -