⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcdlg.cpp

📁 主要完成了对mpeg2的ES流文件的分析工作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -