﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ts,ps,mpeg2 decoder and analysis</title><link>http://www.cppblog.com/dvb-dvb/</link><description>mepg 2, iptv, stream parse,mov,mxf,gxf,ac3,aac </description><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 04:31:35 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 04:31:35 GMT</pubDate><ttl>60</ttl><item><title>Videowindow: directshow 播放画面刷新问题</title><link>http://www.cppblog.com/dvb-dvb/archive/2010/03/12/Videowindow.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Fri, 12 Mar 2010 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2010/03/12/Videowindow.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/109479.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2010/03/12/Videowindow.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/109479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/109479.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5C281008j%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:新宋体;
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@新宋体";
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
mso-hyphenate:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:.5pt;
mso-fareast-language:AR-SA;}
h1
{mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
mso-pagination:widow-orphan;
mso-outline-level:1;
font-size:24.0pt;
font-family:宋体;
mso-bidi-font-family:宋体;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<h1><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;; font-weight: normal;" lang="EN-US">Videowindow:
directshow</span><span style="font-size: 10.5pt; font-weight: normal;">播放画面刷新问题</span><span style="font-size: 10.5pt; font-family: &quot;times new roman&quot;; font-weight: normal;" lang="EN-US">,<o:p></o:p></span></h1>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="AR-SA">开始播放后画面会出来，一切正常。现在的问题是</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="AR-SA">当别的未最大化的窗口半遮或全遮住视频窗口，画面</span><span style="font-family: 宋体;">不</span><span style="font-family: 宋体;" lang="AR-SA">都能正常刷新</span><span lang="EN-US">,</span><span lang="EN-US"> </span><span style="font-family: 宋体;" lang="AR-SA">只有拖动一下</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;" lang="AR-SA">画面才会出来</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但是</span><span lang="EN-US">:</span><span style="font-family: 宋体;" lang="AR-SA">当此</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;" lang="AR-SA">最小化，再恢复时</span><span lang="EN-US">,</span><span lang="EN-US"> </span><span style="font-family: 宋体;" lang="AR-SA">能正常刷新</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">我出现的问题</span><span lang="EN-US">,</span><span style="font-family: 宋体;">和下列问题都不相同</span><span lang="EN-US">,</span><span style="font-family: 宋体;">导致处理方法也不相同</span><span lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">大多数刷新问题</span><span lang="EN-US">,</span><span style="font-family: 宋体;">都可以从下面这个帖子</span><span lang="EN-US">,</span><span style="font-family: 宋体;">去解决</span><span lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a  href="http://blog.csdn.net/arthurlee/archive/2008/10/09/3043977.aspx">http://blog.csdn.net/arthurlee/archive/2008/10/09/3043977.aspx</a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><a  href="http://www.qqgb.com/Program/VC/VCJQ/Program_176331.html">http://www.qqgb.com/Program/VC/VCJQ/Program_176331.html</a></span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><em><span lang="EN-US">pVidWin-&gt;
put_Owner((OAHWND)GetDlgItem(IDC_VW_FRAME)-&gt; GetSafeHwnd()); &nbsp; <br>
2</span></em><em><span style="font-family: 宋体;" lang="AR-SA">、</span><span lang="EN-US">GetDlgItem(IDC_VW_FRAME)-&gt;
ModifyStyle(0, &nbsp; &nbsp; &nbsp; WS_CLIPCHILDREN); &nbsp; <br>
3</span></em><em><span style="font-family: 宋体;" lang="AR-SA">、</span><span lang="EN-US">OnPaint &nbsp; &nbsp; &nbsp; </span></em><em><span style="font-family: 宋体;" lang="AR-SA">不用动</span><span lang="EN-US"> &nbsp; <br>
4</span></em><em><span style="font-family: 宋体;" lang="AR-SA">、</span><span lang="EN-US">OnEraseBkgnd &nbsp; &nbsp; &nbsp; </span></em><em><span style="font-family: 宋体;" lang="AR-SA">加如下代码</span><span lang="EN-US"> &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RECT &nbsp; &nbsp; &nbsp; rect;
&nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetDlgItem(IDC_VW_FRAME)-&gt;
GetWindowRect(&amp;rect); &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ScreenToClient(&amp;rect); &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDC-&gt; &nbsp;
ExcludeClipRect(&amp;rect); &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; &nbsp; &nbsp;
CDialog::OnEraseBkgnd(pDC); &nbsp;</span></em><em><span lang="EN-US"><o:p></o:p></span></em></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">可是我的窗口不要上面这四条</span><span lang="EN-US">,</span><span style="font-family: 宋体;">只要把窗口属性设置成</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">DWORD</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"> <span style="color: black;">m_dwExStyle</span>=<span style="color: black;">WS_EX_LEFT</span> | <span style="color: black;">WS_EX_LTRREADING</span>
| <span style="color: black;">WS_EX_RIGHTSCROLLBAR</span>| <span style="color: black;">WS_EX_WINDOWEDGE</span>;</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">m_pPlayWnd</span>-&gt;<span style="color: black;">CreateEx</span>(<span style="color: black;">m_dwExStyle</span>,<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">oClassName</span>,<span style="color: black;">_T</span>(<span style="color: red;">"Play"</span>),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">WS_CHILD</span>|<span style="color: black;">WS_VISIBLE</span>|<span style="color: black;">WS_CLIPCHILDREN</span>|
<span style="color: black;">WS_CLIPSIBLINGS</span>|<span style="color: black;">WS_POPUP</span>,</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="AR-SA">我的程序是这样的：一个</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;" lang="AR-SA">里面</span><span lang="AR-SA"> </span><span lang="EN-US">new </span><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">CPlaybackwnd </span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; color: blue;" lang="EN-US">class</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"> <span style="color: black;">CPlaybackwnd</span> : <span style="color: blue;">public</span> <span style="color: black;">CWnd</span></span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在</span><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">CPlaybackwnd</span><span style="font-size: 9pt; font-family: 新宋体; color: black;">这个里面<span lang="EN-US">, </span>增加<span lang="EN-US">,m_pVW</span></span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">-&gt;<span style="color: black;">put_WindowStyle
,, <o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">m_pVW</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">-&gt;<span style="color: black;">put_Owner</span>((<span style="color: black;">OAHWND</span>)(<span style="color: black;">GetSafeHwnd</span>()));</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但是</span><span lang="EN-US">,</span><span style="font-family: 宋体;">当把</span><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">playbackwnd</span><span style="font-size: 9pt; font-family: 新宋体; color: black;">的属性<span lang="EN-US">,</span>设置成</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;">的</span><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">WS_POPUP, WS_CHILD</span><span style="font-size: 9pt; font-family: 新宋体; color: black;">后<span lang="EN-US">,</span>窗口移动时位置就不对了<span lang="EN-US">,<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; color: black;">我在</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;">里面</span><span style="font-size: 9pt; font-family: 新宋体; color: black;">增加了<span lang="EN-US">,</span></span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体; color: blue;" lang="EN-US">void</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"> <span style="color: black;">CD</span></span><span lang="EN-US">ialog</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">::<span style="color: black;">OnWindowPosChanged</span>(<span style="color: black;">WINDOWPOS</span>* <span style="color: black;">lpwndpos</span>)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">__super</span>::<span style="color: black;">OnWindowPosChanged</span>(<span style="color: black;">lpwndpos</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">if</span> (<span style="color: black;">m_pPlayWnd</span>)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">int</span>
<span style="color: black;">x</span> = </span><span lang="EN-US">m_nWnd_x</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"> + <span style="color: black;">lpwndpos</span>-&gt;<span style="color: black;">x</span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">int</span>
<span style="color: black;">y</span> = </span><span lang="EN-US">m_nWnd_y </span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">+ <span style="color: black;">lpwndpos</span>-&gt;<span style="color: black;">y</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">int</span> <span style="color: black;">cx</span>
= </span><span lang="EN-US">m_nWnd_cx</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">int</span> <span style="color: black;">cy</span>
= </span><span lang="EN-US">m_nWnd_cy;</span><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">m_pPlayWnd</span>-&gt;<span style="color: black;">MoveWindow</span>(<span style="color: black;">x</span>,<span style="color: black;">y</span>,<span style="color: black;">cx</span>,<span style="color: black;">cy</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体;" lang="EN-US">}</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">但是</span><span lang="EN-US">,</span><span style="font-family: 宋体;">这个程序在</span><span lang="EN-US">win2000</span><span style="font-family: 宋体;">下会出现问题</span><span lang="EN-US">,</span><span style="font-family: 宋体;">其它操作系统是好的</span><span lang="EN-US">.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在</span><span lang="EN-US">win2000</span><span style="font-family: 宋体;">下</span><span lang="EN-US">,</span><span style="font-family: 宋体;">窗口坐标是乱了</span><span lang="EN-US">, </span><span style="font-family: 宋体;">即</span><span lang="EN-US">dialog</span><span style="font-family: 宋体;">和</span><span style="font-size: 9pt; font-family: 新宋体; color: black;" lang="EN-US">playbackwnd</span><span style="font-size: 9pt; font-family: 新宋体; color: black;">的相对位置错误了<span lang="EN-US">,</span>目前还没有解决<span lang="EN-US">.</span></span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/dvb-dvb/aggbug/109479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2010-03-12 09:20 <a href="http://www.cppblog.com/dvb-dvb/archive/2010/03/12/Videowindow.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MXF HeadMediaData,MXF Preface MXF文件格式, MXF文件解析,MXF Parse</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Wed, 09 Dec 2009 00:59:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/102830.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/102830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/102830.html</trackback:ping><description><![CDATA[<div class="postText">
<p>MXF class列举:</p>
<p><br></p>
<p>class CMXFDataStruct<br>{<br>public:<br>&nbsp;CMXFDataStruct(void);<br>&nbsp;~CMXFDataStruct(void);</p>
<p>&nbsp;BYTE *pGeneraltion_UID;<br>&nbsp;BYTE *pInstance_ID; </p>
<p>&nbsp;CMarkup _ElementXML;<br>&nbsp;CString _strElementName;<br>&nbsp;CString _strTypeBase;<br>};<br>typedef std::list&lt; CMXFDataStruct *&gt; MXFDATASTRUCTLIST;</p>
<p>typedef struct MPCDeviceTag<br>{<br>&nbsp;char &nbsp;szDeviceName[16];&nbsp; /*device host name for load balance.*/<br>&nbsp;int &nbsp;nType;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*device type for reserved.*/<br>&nbsp;char&nbsp;szVersion[16];&nbsp;&nbsp;/*reserved for device version. 4.2.35.6*/<br>&nbsp;BYTE&nbsp;&nbsp;&nbsp; bPDVersion;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* PD Version*/<br>&nbsp;BYTE&nbsp;&nbsp;&nbsp; bVixVersion;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vix Version*/<br>&nbsp;DWORD&nbsp;&nbsp;nIndex;<br>}MPCDEVICE;<br>#define MPC_DEVICE_TOTAL_COUNT 4<br>typedef std::list&lt; MPCDEVICE &gt; MPCDEVICELIST;</p>
<p><br>//mxf packet header(16 BYTES)<br>typedef struct MXF_PACKETHEADTAG_<br>{<br>&nbsp;unsigned char sync1;<br>&nbsp;unsigned char sync2;<br>&nbsp;unsigned char sync3;<br>&nbsp;unsigned char sync4;</p>
<p>&nbsp;unsigned char content[9];<br>&nbsp;unsigned char PackKind;<br>&nbsp;unsigned char State;<br>&nbsp;unsigned char reserver;<br>&nbsp;unsigned char BER_size;//the length <br>&nbsp;unsigned char len[3];//the length = packet length(16) + payload length<br>}MXF_PACKETHEAD, *PMXF_PACKETHEAD;</p>
<p><br>//mxf Partition packet (16 BYTES)<br>typedef struct MXF_PARTITIONTAG_<br>{<br>&nbsp;unsigned char Major_ver[2];<br>&nbsp;unsigned char Min_ver[2];<br>&nbsp;unsigned char KAG_size[4];<br>&nbsp;unsigned char This_Partition[8];</p>
<p>&nbsp;unsigned char Pre_Partition[8];<br>&nbsp;unsigned char Foot_Partition[8];<br>&nbsp;unsigned char HeadByteCount[8];<br>&nbsp;BYTE IndexByteCount[8];<br>&nbsp;BYTE indexSID[4];<br>&nbsp;BYTE BodyOffset[8];<br>&nbsp;BYTE BodySID[4];<br>&nbsp;BYTE Operational[16];</p>
<p>}MXF_PARTITION, *PMXF_PARTITION;</p>
<p>//mxf Partition packet (16 BYTES)<br>typedef struct MXF_Local_TAG_<br>{&nbsp;<br>&nbsp;BYTE LocalNumber[4];<br>&nbsp;BYTE LocalSize[4];<br>&nbsp;BYTE Guid[16];<br>}MXF_Local_TAG, *PMXF_Local_TAG;</p>
<p>//mxf Partition packet (16 BYTES)<br>typedef struct MXF_Local_TAG2_<br>{&nbsp;<br>&nbsp;BYTE Local_tag[2];<br>&nbsp;BYTE Guid[16];<br>}MXF_Local_TAG2, *PMXF_Local_TAG2;</p>
<p><br>enum Find_condition_mxf<br>{<br>&nbsp;g_nFind_Identification = 1,<br>&nbsp;g_nFind_pack,<br>&nbsp;g_nFind_track,<br>&nbsp;g_nFind_sequence,<br>&nbsp;g_nFind_SourceClip,<br>&nbsp;g_nFind_multipl_desc,<br>&nbsp;g_nFind_sub_descriptor,<br>&nbsp;g_nFind_Essence_container_data<br>};</p>
<p>typedef struct MXF_RP224_TAG_ // for Sequence<br>{&nbsp;<br>&nbsp;BYTE CheckPart;<br>&nbsp;BYTE Smpte_Index;<br>&nbsp;LPTSTR lpContent;// Content[51];<br>&nbsp;LPTSTR lpDescribe;// Describe[51]; // 16 * 3 + 1 <br>}MXF_RP224_TAG, *PMXF_RP224_TAG;</p>
<p>&nbsp;</p>
<p>class CMXF_SourceClip :public CMXFDataStruct // for SourceClip<br>{<br>public:&nbsp;<br>&nbsp;CMXF_SourceClip();<br>&nbsp;~CMXF_SourceClip(); </p>
<p>&nbsp;BYTE *pSourcePackageID;<br>&nbsp;BYTE ElementType;<br>&nbsp;DWORD Source_trackID;<br>};</p>
<p>typedef std::list&lt; CMXF_SourceClip *&gt; MXF_SOURCECLIP_LIST;</p>
<p>class CMXF_Sequence:public CMXFDataStruct // for Sequence<br>{<br>public:&nbsp;<br>&nbsp;CMXF_Sequence();<br>&nbsp;~CMXF_Sequence(); &nbsp;<br>&nbsp;BYTE Seq_Type;<br>&nbsp;MXF_SOURCECLIP_LIST ListSourceClip;<br>};</p>
<p>typedef std::list&lt; CMXF_Sequence *&gt; MXF_SEQUENCE_LIST;</p>
<p>class CMXF_Track :public CMXFDataStruct // for track<br>{<br>public:&nbsp;<br>&nbsp;CMXF_Track();<br>&nbsp;~CMXF_Track(); <br>&nbsp;CMXF_Sequence *pSequence;&nbsp;<br>&nbsp;DWORD Track_Number; <br>&nbsp;BYTE&nbsp; Track_Type; // 0=UNKNOWN, 3= timecode trick , 4= picture, 5= sound, 6= data,<br>&nbsp; &nbsp;DWORD Track_ID;<br>};</p>
<p>typedef std::list&lt; CMXF_Track *&gt; MXF_TRACK_LIST;</p>
<p>class CMXF_Base_Descriptor :public CMXFDataStruct // Base_Descriptor<br>{&nbsp;<br>public:<br>&nbsp;CMXF_Base_Descriptor();<br>&nbsp;~CMXF_Base_Descriptor();<br>&nbsp;BYTE *pEsssence_Container;<br>&nbsp;BYTE Smpte_Index;<br>}; <br>class CMXF_Sub_descriptor:public CMXF_Base_Descriptor //Material_pack or source pack<br>{<br>public:&nbsp;<br>&nbsp;CMXF_Sub_descriptor();<br>&nbsp;~CMXF_Sub_descriptor(); <br>&nbsp;DWORD Link_Track_ID;<br>};</p>
<p>typedef std::list&lt; CMXF_Sub_descriptor *&gt; MXF_SUB_DESCRIPTOR_LIST;</p>
<p>class CMXF_Multiple_desc :public CMXF_Base_Descriptor //Multiple descriptor <br>{&nbsp;<br>public:<br>&nbsp;CMXF_Multiple_desc();<br>&nbsp;~CMXF_Multiple_desc(); <br>&nbsp;MXF_SUB_DESCRIPTOR_LIST ListSubDesc;<br>&nbsp;};</p>
<p>class CMXF_Package :public CMXFDataStruct //Material_pack or source pack<br>{&nbsp;<br>public:<br>&nbsp;CMXF_Package();<br>&nbsp;~CMXF_Package();</p>
<p>&nbsp;CMXF_Multiple_desc *pMultiple_desc;<br>&nbsp;BYTE *pPackageUID;</p>
<p>&nbsp;MXF_TRACK_LIST Listtrack;<br>&nbsp;BYTE IsMaterial_pack; //0_unknow ,1_Material package, 2_ source package.<br>};&nbsp; <br>class CMXF_SourcePackage_ :public CMXF_Package // source pack<br>{&nbsp;<br>public:<br>&nbsp;CMXF_SourcePackage_();<br>&nbsp;~CMXF_SourcePackage_();<br>};</p>
<p>class CMXF_Material_Package_ :public CMXF_Package //Material_pack <br>{&nbsp;<br>public:<br>&nbsp;CMXF_Material_Package_();<br>&nbsp;~CMXF_Material_Package_();&nbsp; <br>};</p>
<p>typedef std::list&lt; CMXF_Package *&gt; MXF_PACK_LIST;</p>
<p>&nbsp;</p>
<p>class CMXF_EssenceContainerData :public CMXFDataStruct//EssenceContainerData<br>{<br>public:<br>&nbsp;CMXF_EssenceContainerData();<br>&nbsp;~CMXF_EssenceContainerData();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;DWORD BodySID;<br>&nbsp;DWORD IndexSID;<br>&nbsp;BYTE *pLinkedPackageUID;</p>
<p>};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>typedef std::list&lt; CMXF_EssenceContainerData *&gt; MXF_ESSENCECONTAINERDATA_LIST;</p>
<p>class CMXF_Content_storage :public CMXFDataStruct //Content_storage<br>{&nbsp;<br>public:<br>&nbsp;CMXF_Content_storage();<br>&nbsp;~CMXF_Content_storage();</p>
<p>&nbsp;MXF_PACK_LIST listPackage;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;MXF_ESSENCECONTAINERDATA_LIST listEssenceContainerData;<br>};</p>
<p>class CMXF_Identification :public CMXFDataStruct//Identification<br>{<br>public:<br>&nbsp;CMXF_Identification();<br>&nbsp;~CMXF_Identification();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>};<br><br>typedef std::list&lt; CMXF_Identification *&gt; MXF_IDENTIFICATION_LIST;</p>
<p>class CMXF_Preface :public CMXFDataStruct//Material_pack or source pack<br>{<br>public:<br>&nbsp;CMXF_Preface();<br>&nbsp;~CMXF_Preface();</p>
<p>&nbsp;MXF_IDENTIFICATION_LIST listIdentification;<br>&nbsp;CMXF_Content_storage Content_storage;<br>};</p>
<p>class CMXF_Production_Framework :public CMXFDataStruct//CMXF_Production_Framework<br>{<br>public:<br>&nbsp;CMXF_Production_Framework();<br>&nbsp;~CMXF_Production_Framework();</p>
<p>};</p>
<p><br></p>
<p>class CMXFBaseTable :<br>&nbsp;&nbsp;&nbsp; public CMXFBaseFun<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; CMXFBaseTable(void);<br>&nbsp;&nbsp;&nbsp; ~CMXFBaseTable(void);<br>&nbsp;&nbsp;&nbsp; BOOL Init();<br><br>&nbsp;&nbsp;&nbsp; int Prase_Identification(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_Preface(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_sequence(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_RealData(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_SourceClip(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_TimeCode_Component(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_Content_storage(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_Material_pack(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_Track(BYTE *pBuf,DWORD PayloadLen,CString strPackageName);<br>&nbsp;&nbsp;&nbsp; int PraseEssence_Container_data(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int PraseMetadata_CDCI_Essence_Desc(BYTE *pBuf,DWORD PayloadLen,BYTE nMpeg_desc = 0);<br>&nbsp;&nbsp;&nbsp; int Prase_SourcePack(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int PraseSound_Essence_desc(BYTE *pBuf,DWORD PayloadLen,BYTE nIsPbuf47 = 0);<br>&nbsp;&nbsp;&nbsp; int Prase_Multiple_desc(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_Generic_pack(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &amp;CurOffset,BOOL ISMaterial_pack);<br>&nbsp;&nbsp;&nbsp;
int Prase_File_Descriptor(BYTE *pBuf,DWORD PayloadLen,CString
strPackageName,DWORD &amp;CurOffset,CMXF_Base_Descriptor
*pMulti_desc,BOOL bDefaultIsError = TRUE);<br>&nbsp;&nbsp;&nbsp; int
Prase_Generic_Picture(BYTE *pBuf,DWORD PayloadLen,CString
strPackageName,DWORD &amp;CurOffset,BOOL bDefaultIsError = TRUE);<br>&nbsp;&nbsp;&nbsp;
int CDCIEssenceDescriptorType(BYTE *pBuf,DWORD PayloadLen,CString
strPackageName,DWORD &amp;CurOffset,BOOL bDefaultIsError = TRUE);<br>&nbsp;&nbsp;&nbsp;
int Prase_Generic_Sound(BYTE *pBuf,DWORD PayloadLen,CString
strPackageName,DWORD &amp;CurOffset,BOOL bDefaultIsError = TRUE);<br><br>&nbsp;&nbsp;&nbsp; int Prase_Unknow_Sound(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &amp;CurOffset,BOOL bDefaultIsError = TRUE);<br>&nbsp;&nbsp;&nbsp;
int Mpeg_Video_Descriptor(BYTE *pBuf,DWORD PayloadLen,CString
strPackageName,DWORD &amp;CurOffset,BOOL bDefaultIsErro = TRUE);<br><br>&nbsp;&nbsp;&nbsp; int Prase_DM_Segment(BYTE *pBuf,DWORD PayloadLen);<br>&nbsp;&nbsp;&nbsp; int Prase_DM_SourceClip(BYTE *pBuf,DWORD PayloadLen);<br><br>&nbsp;&nbsp;&nbsp; void Release_all_list();<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; TracksMap *m_pTracksMap;<br>protected:<br>&nbsp;&nbsp;&nbsp; CMXF_Preface *m_pPreface;<br><br>&nbsp;&nbsp;&nbsp; //For previous package,It is not parsed.<br>&nbsp;&nbsp;&nbsp; MXF_SEQUENCE_LIST m_Unknow_seqList;<br><br>&nbsp;&nbsp;&nbsp; //For previous package,Its ID not found.<br>&nbsp;&nbsp;&nbsp; MXF_SOURCECLIP_LIST m_Unknow_SourClipList;<br><br>&nbsp;&nbsp;&nbsp; MXF_SUB_DESCRIPTOR_LIST m_Unknow_SubDescList;<br><br>private:<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; CheckGeneration_UID(CString strLogName,BYTE *pBuf,DWORD PayloadLen);</p>
</div><img src ="http://www.cppblog.com/dvb-dvb/aggbug/102830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-12-09 08:59 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MXF文件格式,MXF KLV,MXF文件基本知识,MXF文件 术语 概念</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/12/04/MXF.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Fri, 04 Dec 2009 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/12/04/MXF.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/102541.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/12/04/MXF.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/102541.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/102541.html</trackback:ping><description><![CDATA[新兴的媒体格式——MXF<br><br>　　MXF格式已经被推出几年了， 从当初一个陌生的不为人们 重视的格式
逐渐获得了业内人士的认知和认可， 现如今正被广泛应用于广播电视与后期制作领域， 且有不断扩大之势， 松下公司推出的基于PII卡的
无磁带式标清摄像机， 它所采用的媒体格式， 正是MXF。<br>　　什么是MXF？ MXF如何为我们提供便利？ MXF与IMX格式的关系？ 所有的多媒体文件格式 都会向MXF靠拢吗？ 所有的MXF文件都是兼容的吗？ 我们需要一步步来解释这些问题。<br><br>问题1：什么是 MXF?<br>
MXF 是英文 Material Exchange Format（文件交换格式）的词头缩写，
这个名字本身就道出了它的作用是为数据的发送者和接收者 建立不同数据格式转换的通用标准。 它可在专业广播电视环境下 转换媒体文件，
本质上是一种外壳格式。 为什么这样说呢？象PC平台的AVI多媒体格式， 它是一种对音视频 进行中等压缩和打包， 介乎于压缩和无压缩之间的
文件格式。 但MXF超出了一般AVI的范畴。例如： MXF被设计可用于 包装MPEG2数据流、 DV数据流、 YUV数据流、 PCM音频文件
以及几种格式的数据库文件（同步或非同步模式）。 MXF可以同时处理打包多条轨道的 音视频和数据库文件， 它被设计为既支持流媒体传输
又支持文件的传输。所以它可以改善网络环境 因缺乏标准的文件格式 而受阻碍的局面。 实际上， 在MXF出现之前， 有过类似的格式，
例如OMF（Open Media Frame） 开放媒体框架格式， 它就是一个包含多轨媒体信息的 文件格式，
但OMF更象是AVI是为了编辑而设计，缺少MXF的网络流动性。<br><br>问题2： MXF 对我们有什么帮助？<br>　　目前没有任何一种文
件外壳格式 可以满足广播制作的所有需求。 而MXF被设计为可以满足绝大数当前 和未来的媒体交换的需求。我们期望看到媒体在 不同的载体上交换，
包括：音视频服务器、 离线和近线存储系统、 编辑工作站、 录像设备 （带有以太网文件传出能力）、流媒文件格式等。
最重要的是MXF允许不同的公司 （应用程序） 间不需依赖特定的文件格式 就能交换资源。 当然，这只是一个美好的愿望， 但是，著名的公司的行动
已经使我们看到了希望， 品尼高公司（Pinnacle） 最早在Liquid后期编辑系列产品中
就支持了这个格式，因为它需要用OMF在它的非编系统和 播出系统 （例如Palladium） 间建立无缝的桥梁，
爱维德（Avid）在最新的Xpress编辑系统中 也表明支持MXF （要知道， 它一直是OMF最强的支持者）， 而苹果公司著名的非编软件
Final Cut Pro最新推出的5.0版本中， 已经可以直接导入MXF了。<br><br>问题3： MXF 会取代现在已广泛使用的 文件格式吗？<br>
也许需要等一段时间， 就象物理学家牛顿提出的惯性定律： 除非受到外力， 物体不会改变他们的状态。 现如今，
MPEG、AVI、GXF、QuikeTime和DIF 广泛应用于硬盘和磁带存储。 如果将所有的格式在短时间内
都转换为MXF，那需要巨大的外界力量。 MXF将首先被新设备使用， 包括对音视频设备 和非线性设备的升级 （例如PII摄像机）。
MXF也可能被做为存储格式使用， 但需要与其他文件格式共存， 直到那些格式都转化为MXF， 所以MXF的普及需要一定的时间。<br><br>问题4： 所有的MXF文件都相互兼容吗？<br>
不， 因为MXF是一个外壳格式 而不是压缩格式， 所以并不能保证每一款MXF文件
都能被任何一种解码器识别。例如，将D10格式的MPEG-2文件转换为 MXF文件， 而接收端的设备只装配了 DV25 格式的解码器，
此时，MXF是不兼容的（就象我们家中的Media Player播放器 也经常不能观看一些特殊编码的 AVI文件一样）。
要做到真正的兼容，发送端和接受端设备必须支持相同的 音视频压缩或无压缩格式 以及数据格式。 MXF的操作规范定义了各种 MXF 的特性，
压缩类型， 数据结构，例如： 一个规范允许支持 D10 MPEG-2 和多轨音频格式， 另一种规范则支持DV格式 （SMTPE
314M）。当然，SMPTE将不断增加新的 MXF 支持的格式以满足行业的需求。 问题的重点是：
MXF虽然不能保证100%的兼容，当从长远讲它正在向这方面努力。<br><br>问题5： MXF与IMX的关系<br>　　IMX是索尼公司为一种
带宽的 磁带格式起的名字， 这种磁带被用于索尼公司那些支持MPEG D10格式 或D10数据流的产品 （SMPTE 365M和SMPTE
356M）， 它们以50M/秒的速率传输数据 （在有些产品上达到 30M或40M的速率）。例如：索尼MSW-2000系列就是支持MPEG
D10格式的 IMX录像机。 D10数据流是一种只包含一系列MPEG-2 I帧的格式，这些I帧具备相同的数据量， 这种格式非常适合录像设备。
这种MPEG格式同样也是SDTI-CP传输协议 （SMPTE 331M）中一种标准的压缩格式。 IMX本身不是指文件格式或压缩格式，
它仅仅是一个带宽的类型， 这一点和MXF很相象。 所以，如果有一天推出MXF的录像带， 也没有什么新鲜。<br><br>问题6： 在MXF中KLV是如何 做为一个尺度的？<br>　　KLV代表关键帧（key）， 长度（length） 和取值（value）。 它起源于最初的程式化概念。 KLV做为一种连续的、 关联的包含分段信息的数据包 被使用多年了。 <br>
所以， KLV打包方式提供了一种 分割用户数据和确认用户数据类型 （key）的方式。 长度信息表明了 实际数据的字节长度。 SMPTE
336M定义了 KLV被应用的规范。 关键帧是SMPTE一个普遍的标准 （SMPTE 298M）。 所以， 关键帧定义了特定音频的参数值类型。
MXF是不同类型的连续的 KLV序列的组合， 包括： 音频、 视频、 索引标志、 文件头和所有的索引数据。<br><br>问题7： MXF的主要应用方向 是文件存储吗？<br>
不， MXF主要是一种交换格式， 虽然它确实做为 一种磁盘格式被使用， 但这个文件标准主要是 为了在流转中兼容。 下面的事例表明为什么以
MXF本格式储存不具备优势。 设想传输一个混合音频 和视频的MXF文件， 一台非线性编辑设备
为接受上面的MXF文件，必须确定MXF文件中的音视频数据， 并将它们做为 分割的文件重新写在硬盘中 （例如：分割为音频的 WAV文件和
MPEG-2的MXF文件）。选择数据指针时也需要从 MXF文件中将数据指针 移出到本地的数据库中， 这样反复地重复多步操作，
将原来简单的媒体格式读取 复杂化了，所以基于这种原因， 纯粹的硬盘上的 MXF文件不具有太大的使用价值。<br><br>　　但另一方面 MXF文件分区的实际字段大小 又使它在磁盘存储中 具备一定的优势。 在一些系统中需要4K的字段空间 （或其他数量）去读写文件， MXF不必把分区按4K分割， 所以一些版本的 MXF文件在储存时 可以减少硬盘的读写次数。<br>　　这就是说， 当把大量的媒体文件和 数据结构按MXF存取时， MXF还是有优势的， 所以它适合大量的网络转移。 实际工作中为确保兼容性， 需要将MXF做为文件 或数据流来交换， 并允许操作规范间的转换。<br><br>问题8： MXF同时支持文件 和数据流传输吗？<br>　　是的。 数据流和文件传输 意味着同时支持在一个源头 向一个或不同的终端发送信息。 它们有各自的应用领域， 并可以共存。 文件和数据流又不同的用途：<br>文件：<br>　　（1） 通过不同步式网络发送 （例如以太网和局域网）<br>　　（2） 100%的兼容通讯协议，如FTP<br>　　（3） 同步数据传输， 包括低于或高于实时的速率<br>　　（4） 点到点或一点到多点的传输<br>数据流：<br>　　（1） 素材被做为数据流 通过线缆以特定的速率 发送给一个或多个终端工作站， 通常是通过专门的、 不兼容的协议 （如UDP）来实现。 虽然数据流可以通过 兼容性很好的TCP方式传输， 但对许多处理数据流的 应用程序来说， 那是不实用的。<br>　　（2） 数据流通常带着 时钟基准信号被发送， 以便可以立即在 终端工作站上被解码。<br>　　（3） 任何在通道内的错误 可以使用附加的ECC 或其他类型的校错方式被校正。<br><br>&gt; 对大多数应用程序来说， 文件传输有它的优势， 因为它可保证传输100%的兼容。<br>&gt; 流传输方式则在 需要实时传输的领域 被广泛使用。<br><br>问题9： MXF与AAF的关系？<br>
AAF是高级编著格式， 它是被AAF协会的会员设计制定的。 AAF文件是通过MXF的规范被创建的， 可以被支持AAF的程序打开。 此外，
MXF文件可嵌入到AAF中， AAF扩展了MXF的用途， 但它没有实质的进步。 AAF主要用于承载那些 复杂的媒体片断的合成信息。<br><br>问题10： 我们研究MXF的意图是什么？<br>　　我们支持MXF， 是为了获得它的便利：<br>　　（1） 使用FTP或其他方式 在前端设备上导入导出MXF文件。<br>　　（2） 通过转码工作站 将现有的媒体文件加一个外壳， 使它获得最大的兼容性， 通过局域网或万维网 以不同的格式接受他们， 包括MXF本身。 大多数转换工作比实时还快， 如果转换过程中 没有重新编码的过程， 文件质量就不会有任何损失。<br>　　（3） 向近线或离线存储设备存取文件<br><br>　　当然， 会不断有更多的厂商将 MXF的特性加入到他们的产品中， 但同时也应看到， MXF并非一个包治百病得万能格式， 用其所能， 才能体现其真正价值。<br>本文为转载: 原出处为: <a  href="http://www.kmplayer.com/forums/archive/index.php/t-11293.html">http://www.kmplayer.com/forums/archive/index.php/t-11293.html</a><br><img src ="http://www.cppblog.com/dvb-dvb/aggbug/102541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-12-04 16:25 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/12/04/MXF.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MXF分析工具,MXF文件解析工具,MXF Parse tool,MXF log</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/12/01/MXFParse.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Tue, 01 Dec 2009 00:36:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/12/01/MXFParse.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/102309.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/12/01/MXFParse.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/102309.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/102309.html</trackback:ping><description><![CDATA[<div class="postText">
请下载MXF分析工具, 如有问题,请看"About"的联系地址.<br><br><a  href="http://www.cnitblog.com/Files/dvb-dvb/Demuxer.rar">/Files/dvb-dvb/Demuxer.rar</a><br><br>
<div src_cetemp="/images/cnitblog_com/dvb-dvb/8114/r_MXF_Interface.JPG" align="center"><img  src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/8114/r_MXF_Interface.JPG" border="0"></div>
<br><br>分析log如下:<br>Found MXF SYNC ,offset=0<br>&nbsp;Find stream media info in InputPin<br>&nbsp;Head_Partition:
Packet_len=00000088 maj=0x1 Min=0x2 KAG_size=0x200 This_p=0x0 Pre_P=0x0
Foot_P=0x1aa200 Head Byte count =0x1c00 Index Byte count=0x0 ISID=0x0
BOffset=0x0 BID=0x1 Operation Par
.06.0e.2b.34.04.01.01.01.0d.01.02.01.01.01.09.00 FileOffset 0x0<br>&nbsp; Number=0x3 size=0x10<br>&nbsp; essenceContainer: .06.0e.2b.34.04.01.01.02.0d.01.03.01.02.04.60.01: My error,no parse in RP224<br>&nbsp; essenceContainer: .06.0e.2b.34.04.01.01.01.0d.01.03.01.02.06.01.00: My error,no parse in RP224<br>&nbsp; essenceContainer: .06.0e.2b.34.04.01.01.03.0d.01.03.01.02.7f.01.00: My error,no parse in RP224<br>&nbsp;Fill_items:len=00000150,FileOffset 0x9c<br>&nbsp; Prase_Primer_pack: Packet_len=00000974 Number=86<br>&nbsp;:000,Tag 0x01.02:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.08.00.00.00<br>&nbsp;:001,Tag 0x02.01:UID .06.0e.2b.34.01.01.01.02.04.07.01.00.00.00.00.00<br>&nbsp;:002,Tag 0x02.02:UID .06.0e.2b.34.01.01.01.02.07.02.02.01.01.03.00.00<br>&nbsp;:003,Tag 0x06.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.03.03.00.00<br>&nbsp;:004,Tag 0x06.02:UID .06.0e.2b.34.01.01.01.02.05.30.04.04.01.00.00.00<br>&nbsp;:005,Tag 0x10.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.09.00.00<br>&nbsp;:006,Tag 0x11.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.03.01.00.00.00<br>&nbsp;:007,Tag 0x11.02:UID .06.0e.2b.34.01.01.01.02.06.01.01.03.02.00.00.00<br>&nbsp;:008,Tag 0x12.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.04.00.00<br>&nbsp;:009,Tag 0x15.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.05.00.00<br>&nbsp;:010,Tag 0x15.02:UID .06.0e.2b.34.01.01.01.02.04.04.01.01.02.06.00.00<br>&nbsp;:011,Tag 0x15.03:UID .06.0e.2b.34.01.01.01.01.04.04.01.01.05.00.00.00<br>&nbsp;:012,Tag 0x19.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.05.01.00.00<br>&nbsp;:013,Tag 0x19.02:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.05.02.00.00<br>&nbsp;:014,Tag 0x27.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.06.01.00.00.00<br>&nbsp;:015,Tag 0x2f.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.03.00.00<br>&nbsp;:016,Tag 0x30.01:UID .06.0e.2b.34.01.01.01.01.04.06.01.01.00.00.00.00<br>&nbsp;:017,Tag 0x30.02:UID .06.0e.2b.34.01.01.01.01.04.06.01.02.00.00.00.00<br>&nbsp;:018,Tag 0x30.04:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.01.02.00.00<br>&nbsp;:019,Tag 0x30.05:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.01.03.00.00<br>&nbsp;:020,Tag 0x30.06:UID .06.0e.2b.34.01.01.01.05.06.01.01.03.05.00.00.00<br>&nbsp;:021,Tag 0x32.01:UID .06.0e.2b.34.01.01.01.02.04.01.06.01.00.00.00.00<br>&nbsp;:022,Tag 0x32.02:UID .06.0e.2b.34.01.01.01.01.04.01.05.02.01.00.00.00<br>&nbsp;:023,Tag 0x32.03:UID .06.0e.2b.34.01.01.01.01.04.01.05.02.02.00.00.00<br>&nbsp;:024,Tag 0x32.04:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.07.00.00.00<br>&nbsp;:025,Tag 0x32.05:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.08.00.00.00<br>&nbsp;:026,Tag 0x32.06:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.09.00.00.00<br>&nbsp;:027,Tag 0x32.07:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0a.00.00.00<br>&nbsp;:028,Tag 0x32.08:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0b.00.00.00<br>&nbsp;:029,Tag 0x32.09:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0c.00.00.00<br>&nbsp;:030,Tag 0x32.0a:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0d.00.00.00<br>&nbsp;:031,Tag 0x32.0b:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0e.00.00.00<br>&nbsp;:032,Tag 0x32.0c:UID .06.0e.2b.34.01.01.01.01.04.01.03.01.04.00.00.00<br>&nbsp;:033,Tag 0x32.0d:UID .06.0e.2b.34.01.01.01.02.04.01.03.02.05.00.00.00<br>&nbsp;:034,Tag 0x32.0e:UID .06.0e.2b.34.01.01.01.01.04.01.01.01.01.00.00.00<br>&nbsp;:035,Tag 0x32.0f:UID .06.0e.2b.34.01.01.01.02.05.20.01.02.00.00.00.00<br>&nbsp;:036,Tag 0x32.10:UID .06.0e.2b.34.01.01.01.02.04.01.02.01.01.01.02.00<br>&nbsp;:037,Tag 0x32.11:UID .06.0e.2b.34.01.01.01.02.04.18.01.01.00.00.00.00<br>&nbsp;:038,Tag 0x32.12:UID .06.0e.2b.34.01.01.01.02.04.01.03.01.06.00.00.00<br>&nbsp;:039,Tag 0x32.13:UID .06.0e.2b.34.01.01.01.02.04.18.01.02.00.00.00.00<br>&nbsp;:040,Tag 0x32.14:UID .06.0e.2b.34.01.01.01.02.04.18.01.03.00.00.00.00<br>&nbsp;:041,Tag 0x32.15:UID .06.0e.2b.34.01.01.01.05.04.05.01.13.00.00.00.00<br>&nbsp;:042,Tag 0x32.16:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.08.00.00.00<br>&nbsp;:043,Tag 0x32.17:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.07.00.00.00<br>&nbsp;:044,Tag 0x32.18:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.09.00.00.00<br>&nbsp;:045,Tag 0x33.01:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.0a.00.00.00<br>&nbsp;:046,Tag 0x33.02:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.05.00.00.00<br>&nbsp;:047,Tag 0x33.03:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.06.00.00.00<br>&nbsp;:048,Tag 0x33.04:UID .06.0e.2b.34.01.01.01.01.04.01.05.03.03.00.00.00<br>&nbsp;:049,Tag 0x33.05:UID .06.0e.2b.34.01.01.01.01.04.01.05.03.04.00.00.00<br>&nbsp;:050,Tag 0x33.06:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.05.00.00.00<br>&nbsp;:051,Tag 0x33.07:UID .06.0e.2b.34.01.01.01.02.04.18.01.04.00.00.00.00<br>&nbsp;:052,Tag 0x33.08:UID .06.0e.2b.34.01.01.01.02.04.01.05.01.10.00.00.00<br>&nbsp;:053,Tag 0x33.09:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.07.00.00.00<br>&nbsp;:054,Tag 0x33.0b:UID .06.0e.2b.34.01.01.01.05.03.01.02.01.0a.00.00.00<br>&nbsp;:055,Tag 0x3b.02:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.04.00.00<br>&nbsp;:056,Tag 0x3b.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.01.00.00<br>&nbsp;:057,Tag 0x3b.05:UID .06.0e.2b.34.01.01.01.02.03.01.02.01.05.00.00.00<br>&nbsp;:058,Tag 0x3b.06:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.04.00.00<br>&nbsp;:059,Tag 0x3b.07:UID .06.0e.2b.34.01.01.01.02.03.01.02.01.04.00.00.00<br>&nbsp;:060,Tag 0x3b.08:UID .06.0e.2b.34.01.01.01.04.06.01.01.04.01.08.00.00<br>&nbsp;:061,Tag 0x3b.09:UID .06.0e.2b.34.01.01.01.05.01.02.02.03.00.00.00.00<br>&nbsp;:062,Tag 0x3b.0a:UID .06.0e.2b.34.01.01.01.05.01.02.02.10.02.01.00.00<br>&nbsp;:063,Tag 0x3b.0b:UID .06.0e.2b.34.01.01.01.05.01.02.02.10.02.02.00.00<br>&nbsp;:064,Tag 0x3c.01:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.02.01.00.00<br>&nbsp;:065,Tag 0x3c.02:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.03.01.00.00<br>&nbsp;:066,Tag 0x3c.03:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.04.00.00.00<br>&nbsp;:067,Tag 0x3c.04:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.05.01.00.00<br>&nbsp;:068,Tag 0x3c.05:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.07.00.00.00<br>&nbsp;:069,Tag 0x3c.06:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.03.00.00<br>&nbsp;:070,Tag 0x3c.07:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.0a.00.00.00<br>&nbsp;:071,Tag 0x3c.08:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.06.01.00.00<br>&nbsp;:072,Tag 0x3c.09:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.01.00.00.00<br>&nbsp;:073,Tag 0x3c.0a:UID .06.0e.2b.34.01.01.01.01.01.01.15.02.00.00.00.00<br>&nbsp;:074,Tag 0x3d.01:UID .06.0e.2b.34.01.01.01.04.04.02.03.03.04.00.00.00<br>&nbsp;:075,Tag 0x3d.02:UID .06.0e.2b.34.01.01.01.04.04.02.03.01.04.00.00.00<br>&nbsp;:076,Tag 0x3d.03:UID .06.0e.2b.34.01.01.01.05.04.02.03.01.01.01.00.00<br>&nbsp;:077,Tag 0x3d.04:UID .06.0e.2b.34.01.01.01.01.04.02.01.01.03.00.00.00<br>&nbsp;:078,Tag 0x3d.05:UID .06.0e.2b.34.01.01.01.01.04.02.01.01.01.00.00.00<br>&nbsp;:079,Tag 0x3d.06:UID .06.0e.2b.34.01.01.01.02.04.02.04.02.00.00.00.00<br>&nbsp;:080,Tag 0x3d.07:UID .06.0e.2b.34.01.01.01.05.04.02.01.01.04.00.00.00<br>&nbsp;:081,Tag 0x3d.08:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.01.00.00.00<br>&nbsp;:082,Tag 0x3d.09:UID .06.0e.2b.34.01.01.01.05.04.02.03.03.05.00.00.00<br>&nbsp;:083,Tag 0x3d.0a:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.01.00.00.00<br>&nbsp;:084,Tag 0x3d.0b:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.02.00.00.00<br>&nbsp;:085,Tag 0x3d.0c:UID .06.0e.2b.34.01.01.01.05.04.02.07.01.00.00.00.00<br>&nbsp;:086,Tag 0x3d.0d:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.06.00.00.00<br>&nbsp;:087,Tag 0x3d.0e:UID .06.0e.2b.34.01.01.01.05.04.02.03.01.05.00.00.00<br>&nbsp;:088,Tag 0x3d.0f:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.03.00.00.00<br>&nbsp;:089,Tag 0x3d.10:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.02.00.00.00<br>&nbsp;:090,Tag 0x3d.11:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.03.00.00.00<br>&nbsp;:091,Tag 0x3d.12:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.04.00.00.00<br>&nbsp;:092,Tag 0x3d.13:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.05.00.00.00<br>&nbsp;:093,Tag 0x3e.01:UID .06.0e.2b.34.01.01.01.03.04.03.03.02.00.00.00.00<br>&nbsp;:094,Tag 0x3f.01:UID .06.0e.2b.34.01.01.01.04.06.01.01.04.06.0b.00.00<br>&nbsp;:095,Tag 0x3f.05:UID .06.0e.2b.34.01.01.01.04.04.06.02.01.00.00.00.00<br>&nbsp;:096,Tag 0x3f.06:UID .06.0e.2b.34.01.01.01.04.01.03.04.05.00.00.00.00<br>&nbsp;:097,Tag 0x3f.07:UID .06.0e.2b.34.01.01.01.04.01.03.04.04.00.00.00.00<br>&nbsp;:098,Tag 0x3f.08:UID .06.0e.2b.34.01.01.01.04.04.04.04.01.01.00.00.00<br>&nbsp;:099,Tag 0x3f.09:UID .06.0e.2b.34.01.01.01.05.04.04.04.01.06.00.00.00<br>&nbsp;:100,Tag 0x3f.0a:UID .06.0e.2b.34.01.01.01.05.04.04.04.02.05.00.00.00<br>&nbsp;:101,Tag 0x3f.0b:UID .06.0e.2b.34.01.01.01.05.05.30.04.06.00.00.00.00<br>&nbsp;:102,Tag 0x3f.0c:UID .06.0e.2b.34.01.01.01.05.07.02.01.03.01.0a.00.00<br>&nbsp;:103,Tag 0x3f.0d:UID .06.0e.2b.34.01.01.01.05.07.02.02.01.01.02.00.00<br>&nbsp;:104,Tag 0x3f.0e:UID .06.0e.2b.34.01.01.01.05.04.04.04.01.07.00.00.00<br>&nbsp;:105,Tag 0x40.01:UID .06.0e.2b.34.01.01.01.01.01.02.01.01.01.00.00.00<br>&nbsp;:106,Tag 0x41.01:UID .06.0e.2b.34.01.01.01.02.01.04.01.02.01.00.00.00<br>&nbsp;:107,Tag 0x44.01:UID .06.0e.2b.34.01.01.01.01.01.01.15.10.00.00.00.00<br>&nbsp;:108,Tag 0x44.02:UID .06.0e.2b.34.01.01.01.01.01.03.03.02.01.00.00.00<br>&nbsp;:109,Tag 0x44.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.05.00.00<br>&nbsp;:110,Tag 0x44.04:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.05.00.00<br>&nbsp;:111,Tag 0x44.05:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.01.03.00.00<br>&nbsp;:112,Tag 0x47.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.03.00.00<br>&nbsp;:113,Tag 0x48.01:UID .06.0e.2b.34.01.01.01.02.01.07.01.01.00.00.00.00<br>&nbsp;:114,Tag 0x48.02:UID .06.0e.2b.34.01.01.01.02.01.07.01.02.01.00.00.00<br>&nbsp;:115,Tag 0x48.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.04.00.00<br>&nbsp;:116,Tag 0x48.04:UID .06.0e.2b.34.01.01.01.02.01.04.01.03.00.00.00.00<br>&nbsp;:117,Tag 0x49.01:UID .06.0e.2b.34.01.01.01.02.05.30.04.02.00.00.00.00<br>&nbsp;:118,Tag 0x49.02:UID .06.0e.2b.34.01.01.01.05.07.02.01.03.01.0b.00.00<br>&nbsp;:119,Tag 0x4b.01:UID .06.0e.2b.34.01.01.01.02.05.30.04.05.00.00.00.00<br>&nbsp;:120,Tag 0x4b.02:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.03.00.00<br>&nbsp;:121,Tag 0x61.01:UID .06.0e.2b.34.01.01.01.05.06.01.01.04.02.0c.00.00<br>&nbsp;:122,Tag 0x61.02:UID .06.0e.2b.34.01.01.01.04.01.07.01.05.00.00.00.00<br>&nbsp;:123,Tag 0x61.03:UID .06.0e.2b.34.01.01.01.05.01.07.01.06.00.00.00.00<br>&nbsp;:124,Tag 0x80.00:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.02.00.00<br>&nbsp;:125,Tag 0x80.01:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.03.00.00<br>&nbsp;:126,Tag 0x80.04:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.06.00.00<br>&nbsp;:127,Tag 0x80.05:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.07.00.00<br>&nbsp;:128,Tag 0x80.06:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.08.00.00<br>&nbsp;:129,Tag 0x80.07:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.09.00.00<br>&nbsp;:130,Tag 0x80.08:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.0b.00.00<br>&nbsp;:131,Tag 0xff.fd:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.0a.00.00<br>&nbsp;:132,Tag 0xff.fe:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.05.00.00<br>&nbsp;:133,Tag 0xff.ff:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.04.00.00<br>&nbsp;Prase Primer pack OK !<br>&nbsp;Preface: Packet_len=0xd6,<br>&nbsp; Instance_ID is: .77.fc.f7.df.5f.51.3a.41.88.70.82.22.52.ac.16.1a<br>&nbsp;Last_modified_data : 2007_04_27 10:08:22 164<br>&nbsp;Version :1.2<br>&nbsp; Primary_Package :Get Material UID .bd.29.2f.3f.81.e1.b3.47.b1.24.59.a3.83.29.1f.f5<br>&nbsp;Identification_Number :0x2, nItemSize:0x10<br>&nbsp;Identification[0] .36.09.8a.da.89.9c.56.46.9e.aa.46.8d.42.82.bb.2c<br>&nbsp;Identification[1] .4b.1a.0e.95.e9.f5.7f.4d.87.af.46.3a.81.6b.11.95<br>&nbsp;Content_Storage Instance_ID is: .f0.a2.28.27.99.23.96.47.9a.05.42.54.62.d6.ee.5d<br>&nbsp;Operational_Pattern :.06.0e.2b.34.04.01.01.01.0d.01.02.01.01.01.09.00<br>&nbsp;EssenceContain_Number :0x3, nItemSize:0x10<br>&nbsp;EssenceContain[0] : is the same!<br>&nbsp;EssenceContain[1] : is the same!<br>&nbsp;EssenceContain[2] : is the same!<br>&nbsp;DM Schemes_Number :0x0, nItemSize:0x0<br>&nbsp;Parse Preface end!<br>&nbsp;Identification: Packet_len=0x100,<br>&nbsp; Instance ID : .36.09.8a.da.89.9c.56.46.9e.aa.46.8d.42.82.bb.2c<br>&nbsp;Identification, This: Generaltion_UID is: .a6.b8.92.dd.37.f0.c3.4b.b8.ea.4b.6e.41.9e.26.b1<br>&nbsp; Company name : Snell &amp; Wilcox<br>&nbsp; Product name : MXF Desktop - MXF Wrap Wizard<br>&nbsp; Product version: 1.2.0.233.1<br>&nbsp; Version string: 1.2<br>&nbsp; Product UID: .f4.9f.fc.e9.46.5d.49.b4.be.8b.fc.fd.37.35.8f.0f<br>&nbsp; modified data : 2007_04_27 10:08:22 145<br>&nbsp; Toolkit version: 1.2.1.314.1<br>&nbsp; Platform :MXF Express (Windows XP)<br>&nbsp;Prase_Identification end!<br>&nbsp;Identification: Packet_len=0x100,<br>&nbsp; Instance ID : .4b.1a.0e.95.e9.f5.7f.4d.87.af.46.3a.81.6b.11.95<br>&nbsp;Identification, This:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp; Company name : Snell &amp; Wilcox<br>&nbsp; Product name : MXF Desktop - MXF Wrap Wizard<br>&nbsp; Product version: 1.2.0.233.1<br>&nbsp; Version string: 1.2<br>&nbsp; Product UID: .f4.9f.fc.e9.46.5d.49.b4.be.8b.fc.fd.37.35.8f.0f<br>&nbsp; modified data : 2007_04_27 10:08:22 164<br>&nbsp; Toolkit version: 1.2.1.314.1<br>&nbsp; Platform :MXF Express (Windows XP)<br>&nbsp;Prase_Identification end!<br>&nbsp;Content_storage: Packet_len=0x5c,<br>&nbsp; Instance_ID Is Same<br>&nbsp;Packages:nItemNumber:0x2, nItemSize:0x10<br>&nbsp;Packages[0]&nbsp; Package ID is the same !<br>&nbsp;Packages[1]&nbsp; Package ID is :.93.50.b4.e0.09.5c.ac.42.84.dc.97.c7.01.2c.68.13<br>&nbsp;EssenceContainer data:nItemNumber:0x1, nItemSize:0x10<br>&nbsp;data[0]&nbsp; Essence_container_data ID is :.14.87.bb.d8.7c.a7.bd.4b.b8.21.33.f6.aa.7a.c9.7b<br>&nbsp;Prase_Content_storage end<br>&nbsp;Material_pack: Packet_len=0x8c,<br>&nbsp;Instance ID:.bd.29.2f.3f.81.e1.b3.47.b1.24.59.a3.83.29.1f.f5<br>&nbsp; Package ID: .06.0a.2b.34.01.01.01.01.01.01.0d.11.13.00.00.00.38.11.5e.3c.16.42.05.80.a9.53.00.50.8d.74.d6.01<br>&nbsp; Package create date : 2007_04_27 10:08:22 145<br>&nbsp; Package Modified date: 2007_04_27 10:08:22 164<br>&nbsp;Track_Number :0x3, nItemSize:0x10<br>&nbsp;Track[0] id:.7f.0a.6c.89.67.ff.63.40.8d.65.e5.cc.cb.f6.f8.9e<br>&nbsp;Track[1] id:.de.88.58.f3.3c.fb.3e.41.a0.8b.1d.b4.36.d5.3a.aa<br>&nbsp;Track[2] id:.a1.f6.05.58.07.49.c5.4e.bd.67.20.c6.a6.be.00.29<br>&nbsp;Instance_ID is same<br>&nbsp;Parse Material_pack end<br>&nbsp;Parse_Track_timeLine: Packet_len=0x64,<br>&nbsp;Instance_ID: .7f.0a.6c.89.67.ff.63.40.8d.65.e5.cc.cb.f6.f8.9e<br>&nbsp; Track ID :1<br>&nbsp; Track Number:0x0<br>&nbsp; Track name : Timecode<br>&nbsp;Edit rate_ 25:1<br>&nbsp; Origin:<br>&nbsp; Sequence:.89.02.37.37.ea.3c.ea.4e.b0.72.f9.ff.6c.11.16.9d<br>&nbsp;Instance_ID is same<br>&nbsp;Parse_Track_timeLine end<br>&nbsp;Sequence: Packet_len=0x64,<br>&nbsp;Instance_ID .89.02.37.37.ea.3c.ea.4e.b0.72.f9.ff.6c.11.16.9d<br>&nbsp;Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp;&nbsp; Data Definition:12M Timecode Track (inactive user bits)_ _ _Identifies a SMPTE 12M Timecode track with inactive user bits<br>&nbsp; Duration: .00.00.00.00.00.00.01.13<br>&nbsp;sequence:Component:0x1, nItemSize:0x10<br>&nbsp;SourceClip[0] id:.2b.1c.6c.bd.c3.a2.3e.48.ad.6c.0f.d0.55.54.48.19<br>&nbsp;Instance_ID is same<br>&nbsp;Prase_sequence end<br>&nbsp;TimeCode: Packet_len=0x5f,<br>&nbsp; Instance ID: .2b.1c.6c.bd.c3.a2.3e.48.ad.6c.0f.d0.55.54.48.19<br>&nbsp;TimeCode:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp;&nbsp; Data Definition:12M Timecode Track (inactive user bits)_ _ _Identifies a SMPTE 12M Timecode track with inactive user bits<br>&nbsp; Duration: .00.00.00.00.00.00.01.13<br>&nbsp; Rounded Timecode base:25<br>&nbsp; Start TimeCode:<br>&nbsp; Drop frame:0<br>&nbsp;Parse TimeCode end<br>&nbsp;Parse_Track_timeLine: Packet_len=0x62,<br>&nbsp;Instance_ID: .de.88.58.f3.3c.fb.3e.41.a0.8b.1d.b4.36.d5.3a.aa<br>&nbsp; Track ID :2<br>&nbsp; Track Number:0x0<br>&nbsp; Track name : Picture<br>&nbsp;Edit rate_ 25:1<br>&nbsp; Origin:<br>&nbsp; Sequence:.8b.ec.da.d9.a5.70.7d.40.b4.97.40.20.34.c8.04.92<br>&nbsp;Instance_ID is same<br>&nbsp;Parse_Track_timeLine end<br>&nbsp;Sequence: Packet_len=0x64,<br>&nbsp;Instance_ID .8b.ec.da.d9.a5.70.7d.40.b4.97.40.20.34.c8.04.92<br>&nbsp;Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp;&nbsp; Data Definition:Picture Essence Track_ _ _Identifies a picture essence track<br>&nbsp; Duration: .00.00.00.00.00.00.01.13<br>&nbsp;sequence:Component:0x1, nItemSize:0x10<br>&nbsp;SourceClip[0] id:.00.e7.14.51.43.28.01.4c.b5.b6.e6.f4.bc.b7.b7.b0<br>&nbsp;Instance_ID is same<br>&nbsp;Prase_sequence end<br>&nbsp;SourceClip: Packet_len=0x80,<br>&nbsp;Instance_ID .00.e7.14.51.43.28.01.4c.b5.b6.e6.f4.bc.b7.b7.b0<br>&nbsp; Generation ID: .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp;&nbsp; Data Definition:Picture Essence Track_ _ _Identifies a picture essence track<br>&nbsp; Start Position:<br>&nbsp; Duration: .00.00.00.00.00.00.01.13<br>&nbsp; Source PackageID:.06.0a.2b.34.01.01.01.01.01.01.0d.11.13.00.00.00.34.11.5e.3c.16.42.05.80.96.17.00.50.8d.74.d6.01<br>&nbsp; Source TrackID:2<br>&nbsp;Instance_ID is same<br>&nbsp; Current track number is zero,warning!<br>&nbsp;Parse SourceClip end<br>&nbsp;Parse_Track_timeLine: Packet_len=0x5e,<br>&nbsp;Instance_ID: .a1.f6.05.58.07.49.c5.4e.bd.67.20.c6.a6.be.00.29<br>&nbsp; Track ID :3<br>&nbsp; Track Number:0x0<br>&nbsp; Track name : Sound<br>&nbsp;Edit rate_ 25:1<br>&nbsp; Origin:<br>&nbsp; Sequence:.8d.9d.2a.fd.2f.2b.aa.4a.8b.78.99.30.11.cb.7d.01<br>&nbsp;Instance_ID is same<br>&nbsp;Parse_Track_timeLine end<br>&nbsp;Sequence: Packet_len=0x64,<br>&nbsp;Instance_ID .8d.9d.2a.fd.2f.2b.aa.4a.8b.78.99.30.11.cb.7d.01<br>&nbsp;Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b<br>&nbsp;&nbsp; Data Definition:Sound Essence Track_ _ _Identifies a sound essence track<br>&nbsp; Duration: .00.00.00.00.00.00.01.13<br>&nbsp;sequence:Component:0x1, nItemSize:0x10<br>&nbsp;SourceClip[0] id:.6c.29.6b.a2.12.49.6e.4c.8b.1e.ac.ec.6f.64.da.85<br>&nbsp;Instance_ID is same
</div><img src ="http://www.cppblog.com/dvb-dvb/aggbug/102309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-12-01 08:36 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/12/01/MXFParse.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络流量监测,网卡信息,Unit cast receive,Socket Sniffe</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/11/23/netcard.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 23 Nov 2009 07:17:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/11/23/netcard.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/101696.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/11/23/netcard.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/101696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/101696.html</trackback:ping><description><![CDATA[网络流量监测,网卡信息,Unit cast receive,Socket Sniffe<br>枚举用户有几个网卡,名称,IP值,<br><br><a href="http://www.cppblog.com/Files/dvb-dvb/Jieshou.rar"></a><a  href="http://www.cppblog.com/Files/dvb-dvb/Receive.rar">http://www.cppblog.com/Files/dvb-dvb/Receive.rar</a><br><br><img src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/JieShou.JPG" alt="" border="0" width="613" height="196"><br><br>如有问题,请迅速与本人联系! <img src ="http://www.cppblog.com/dvb-dvb/aggbug/101696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-11-23 15:17 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/11/23/netcard.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Huffman code下载, Huffman算法下载, Huffman源码下载</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/11/14/Huffman.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Sat, 14 Nov 2009 04:24:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/11/14/Huffman.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/100909.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/11/14/Huffman.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/100909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/100909.html</trackback:ping><description><![CDATA[<a href="http://www.cnitblog.com/Files/dvb-dvb/HuffmanCode.rar"><u><font color=#0000ff>/Files/dvb-dvb/HuffmanCode.rar</font></u></a><br><br>这个是最新的huffman code (encoder and decoder) , 但是效率有待提升.<br>&nbsp;一直占cpu 50% , 扫描两遍文件,一遍建立huffman code,另一遍,用二进制替换,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,有两个问题没有解决<br>&nbsp; 1,动态建立huffman tree node value.仅仅扫描一遍,<br>&nbsp; 2,根据node的值去排序得到frequence时,这个值到底取1个byte,还是2个byte.<br>
<div id=header>
<div class=wrapper>
<div id=g_description>
<p>本文主要介绍如何使用Huffman算法来对文本进行压缩和解压缩.本文提供完整的eclipse工程，包括测试样例和压缩文件格式viso文档。</p>
</div>
<div style="CLEAR: both"></div>
</div>
</div>
<!-- /editable --><!-- /wrapper --><!-- /header -->
<div id=main-content>
<div class=wrapper>
<div class=content-item>
<div id=g_body>
<h3>Huffman算法简介</h3>
<p>Huffman算法是一种基于统计的压缩方法。它的本质就是对文本文件中的字符进行重新编码，对于使用频率越高的字符，其编码也越短。但是任何2个字符的编码，是不能出现向前包含的。也就是说字符A的编码的前段，不可能为字符B的编码。经过编码后的文本文件，主要包含2个部分：Huffman码表部分和压缩内容部分。解压缩的时候，先把Huffman码表取出来，然后对压缩内容部分各个字符进行逐一解码,形成源文件。</p>
<p>由此可见，使用Huffman算法的关键是形成Huffman码表。怎样才能生成一个&#8220;使用频率越高的字符，其编码也越短&#8221;的码表呢?这里就要用到 Huffman树的数据结构。当把一棵Huffman树生成后，码表也就生成了。以下举例说明，假定我们的原始文本为"abcbbcccc"</p>
<p>Huffman树生成步骤:</p>
<p>1.扫描源文件，对字符频率进行统计。</p>
<p>对于我们的样例，统计结果是:a:1&nbsp; b:3 c:5 (按频率升序排列)</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: center"><a style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em; BACKGROUND-COLOR: transparent; BORDER-RIGHT-WIDTH: 0px" href="http://chencwf.googlepages.com/huf1.JPG/huf1-full;init:.JPG" imageanchor="1"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" tabIndex=0 src="file:///D:/download/code/buildffmpeg/huffman_2/chencwf/huffman4_files/huf1-medium.jpg" closure="" hashcode=""></a></p>
<p>&nbsp;</p>
<p>2.从上述队列中取出频率最低的2个节点，合并成一个频率为2节点频率之和的树枝节点X，加入到原队列中，加入后，继续保持队列按频率升序排列.</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: center"><a style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em; BACKGROUND-COLOR: transparent; BORDER-RIGHT-WIDTH: 0px" href="http://chencwf.googlepages.com/huf2.JPG/huf2-full;init:.JPG" imageanchor="1"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" tabIndex=0 src="file:///D:/download/code/buildffmpeg/huffman_2/chencwf/huffman4_files/huf2-medium.jpg" closure="" hashcode=""></a></p>
<p>3.重复步骤2，直到队列中只有一个节点。</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: center"><a style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em; BACKGROUND-COLOR: transparent; BORDER-RIGHT-WIDTH: 0px" href="http://chencwf.googlepages.com/huf3.JPG/huf3-full;init:.JPG" imageanchor="1"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" tabIndex=0 src="file:///D:/download/code/buildffmpeg/huffman_2/chencwf/huffman4_files/huf3-medium.jpg" closure="" hashcode=""></a></p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: left">4.这样，我们就形成了一棵Huffman树。叶子节点为字符，从树根节点到叶子节点的路径即为该字符的Huffman编码。从一个节点导航到其左孩子，该段路径为0，导航到右孩子，该段路径为1.所以，a字符的编码就是00,b字符的编码为01,c字符的编码为1，符合"使用频率越高的字符，编码越短"的要求。理论论证过程见&lt;算法导论&gt;P233</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: left">5.Huffman码表生成后，原文本"abcbbcccc"就变成了0001101011111的位串，按每个字符占用2个byte计算，大小由原来的18个字节(9*2),共144个bit,变成了13个bit,2个字节。达到了压缩的目的。</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: left">解压缩过程:</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: left">解压缩也分成2部分进行，首先是根据压缩文件中的Huffman码表，在内存中生成一棵Huffman树，然后，根据Huffman树，对压缩内容进行解压缩。比如如果压缩内容为位串0001101011111，那么从树根节点起，因为第一个bit为0，先转向左子树，第二个bit为0,再转向左子树,到达叶子a,所以解码出来的第一个字符就是a,每次解压一个字符，都从根节点起，根据bit流，向左或向右转，直到到达叶子节点，也就是解压出来的字符。一直重复此过程，直到所有的字符都被解压缩。&nbsp;</p>
<h3>压缩文件格式</h3>
<p>使用Huffman压缩算法对文本文件压缩后，就形成了一个压缩文件，该压缩文件包含2部分，一部分为Huffman码表，也就是Huffman 树，第二部分为根据码表生成的内容位串。如何设计Huffman树的存储格式呢?本文采用从上到下，从左到右分层遍历节点，顺序存储的方式。如下图:</p>
<p class=separator style="CLEAR: both; TEXT-ALIGN: center"><a style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em; BACKGROUND-COLOR: transparent; BORDER-RIGHT-WIDTH: 0px" href="http://chencwf.googlepages.com/huf4.JPG/huf4-full;init:.JPG" imageanchor="1"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" tabIndex=0 src="file:///D:/download/code/buildffmpeg/huffman_2/chencwf/huffman4_files/huf4-medium.jpg" closure="" hashcode=""></a></p>
<p>也就是说，对于前述的Huffman树，其持久化形式为:0xfffe 0xfffe 0x0063&nbsp; 0x0061&nbsp; 0x0062,其中0xfffe代表树枝节点,而0x0061,0x0062,0x0063分别为a,b,c的Unicode码。因为所有的树枝节点的值都是0xfffe，所有树枝节点都有2个孩子，节点排列方式是按从上到下，从左到右分层排列，所以能根据此持久化字节数组，把Huffman树在内存中重新生成。</p>
<p>另外为了升级版本，嵌入了magic number和version。</p>
<h3>完整工程下载</h3>
<p>本文涉及到的完整的eclipse工程，可以从<a href="http://chencwf.googlepages.com/Huffman.rar"><u><font color=#0000ff>这里</font></u></a>下载。注:内含测试样例《平凡的世界》文本文件，体积较大，请使用下载工具下载。另外，本程序中采用了泛型，请在至少在JDK1.5版本上编译运行。</p>
<h3>代码简要说明</h3>
<p>1.HuffmanTextEncoder类完成压缩功能，可直接运行，压缩测试用文本文件。</p>
<p>2.HuffmanTextDecoder类完成解压缩功能，可直接运行，解压缩 压缩后的文本文件。</p>
<p>3.BitReader,工具类，实现对BufferedInputStream的按位读取。</p>
<p>4.BitWriter,工具类，实现按位写入的功能。该类来自网络。</p>
<p>5.MinHeap&lt;T&gt; ,模板工具类，实现了一个最小堆。生成Huffman树时使用。</p>
<h3>压缩效果</h3>
<p>使用本程序对《平凡的世界》做压缩测试，压缩前为文本文件，大小为1.7M,压缩后为二进制文件，大小接近1M（988,817byte）,而 zip压缩后体积为920,997byte,比zip差，压缩文件存储格式待改善。另外，因为从Huffman压缩算法的原理可知，该算法对字符重复率高的文本最有效，比如长篇小说或者英文小说。</p>
</div>
</div>
以上内容为转载:&nbsp;&nbsp; <a href="http://chencwf.googlepages.com/huffman"><u><font color=#0000ff>http://chencwf.googlepages.com/huffman</font></u></a></div>
</div>
&nbsp;<br>以下为自己的内容: <br><br>&nbsp;DETAIL:&nbsp; 35:v:2f,p: 42.<br>&nbsp;&nbsp;&nbsp; INFO:&nbsp;&nbsp; Sort After.size = 0<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 0:v:fffe,p:228,xx=&nbsp;&nbsp;&nbsp; 0,yy=&nbsp;&nbsp;&nbsp; 0.<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 1:v:fffe,p: 92,xx=&nbsp;&nbsp;&nbsp; 1,yy=&nbsp;&nbsp;&nbsp; 0.0<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 2:v:fffe,p: 42,xx=&nbsp;&nbsp;&nbsp; 2,yy=&nbsp;&nbsp;&nbsp; 0.00<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 3:v:fffe,p: 19,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 0.000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 4:v:fffe,p:&nbsp; 9,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 0.0000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 5:v:fffe,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 0.00000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 6:v:fffe,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 0.000000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 7:v:&nbsp; 53,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 0.0000000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 8:v:&nbsp; 47,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 1.0000001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp;&nbsp; 9:v:fffe,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 1.000001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 10:v:&nbsp; 3d,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 2.0000010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 11:v:&nbsp; 3b,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 3.0000011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 12:v:&nbsp; 6c,p:&nbsp; 5,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 1.00001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 13:v:&nbsp; 65,p: 10,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 1.0001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 14:v:fffe,p: 23,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 1.001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 15:v:&nbsp; 74,p: 11,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 2.0010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 16:v:&nbsp;&nbsp; d,p: 12,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 3.0011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 17:v:fffe,p: 50,xx=&nbsp;&nbsp;&nbsp; 2,yy=&nbsp;&nbsp;&nbsp; 1.01<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 18:v:fffe,p: 24,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 2.010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 19:v:fffe,p: 12,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 4.0100<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 20:v:fffe,p:&nbsp; 6,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 4.01000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 21:v:&nbsp; 66,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 4.010000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 22:v:&nbsp; 67,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 5.010001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 23:v:&nbsp; 63,p:&nbsp; 6,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 5.01001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 24:v:&nbsp;&nbsp; a,p: 12,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 5.0101<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 25:v:&nbsp; 20,p: 26,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 3.011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 26:v:fffe,p:136,xx=&nbsp;&nbsp;&nbsp; 1,yy=&nbsp;&nbsp;&nbsp; 1.1<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 27:v:fffe,p: 58,xx=&nbsp;&nbsp;&nbsp; 2,yy=&nbsp;&nbsp;&nbsp; 2.10<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 28:v:fffe,p: 26,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 4.100<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 29:v:fffe,p: 12,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 6.1000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 30:v:fffe,p:&nbsp; 6,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 6.10000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 31:v:fffe,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 6.100000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 32:v:&nbsp; 7b,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 6.1000000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 33:v:&nbsp; 70,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp;&nbsp; 7.1000001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 34:v:&nbsp; 78,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 7.100001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 35:v:fffe,p:&nbsp; 6,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 7.10001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 36:v:&nbsp; 61,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 8.100010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 37:v:&nbsp; 4c,p:&nbsp; 3,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp;&nbsp; 9.100011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 38:v:fffe,p: 14,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 7.1001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 39:v:&nbsp; 64,p:&nbsp; 7,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 8.10010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 40:v:&nbsp;&nbsp; 9,p:&nbsp; 7,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp;&nbsp; 9.10011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 41:v:fffe,p: 32,xx=&nbsp;&nbsp;&nbsp; 3,yy=&nbsp;&nbsp;&nbsp; 5.101<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 42:v:fffe,p: 16,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 8.1010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 43:v:fffe,p:&nbsp; 8,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp; 10.10100<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 44:v:fffe,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 10.101000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 45:v:fffe,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 10.1010000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 46:v:&nbsp; 6d,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 8,yy=&nbsp;&nbsp; 10.10100000<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 47:v:&nbsp; 7d,p:&nbsp; 1,xx=&nbsp;&nbsp;&nbsp; 8,yy=&nbsp;&nbsp; 11.10100001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 48:v:&nbsp; 77,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 11.1010001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 49:v:fffe,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 11.101001<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 50:v:&nbsp; 41,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 12.1010010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 51:v:&nbsp; 29,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 13.1010011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 52:v:fffe,p:&nbsp; 8,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp; 11.10101<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 53:v:fffe,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 12.101010<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 54:v:&nbsp; 28,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 14.1010100<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 55:v:&nbsp; 6f,p:&nbsp; 2,xx=&nbsp;&nbsp;&nbsp; 7,yy=&nbsp;&nbsp; 15.1010101<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 56:v:&nbsp; 73,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 13.101011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 57:v:fffe,p: 16,xx=&nbsp;&nbsp;&nbsp; 4,yy=&nbsp;&nbsp;&nbsp; 9.1011<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 58:v:fffe,p:&nbsp; 8,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp; 12.10110<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 59:v:&nbsp; 75,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 14.101100<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 60:v:&nbsp; 23,p:&nbsp; 4,xx=&nbsp;&nbsp;&nbsp; 6,yy=&nbsp;&nbsp; 15.101101<br>&nbsp;&nbsp;&nbsp; DETAIL:&nbsp; 61:v:&nbsp; 22,p:&nbsp; 8,xx=&nbsp;&nbsp;&nbsp; 5,yy=&nbsp;&nbsp; 13.10111<br><br><br>asdfasdfasdf<img height=573 alt="" src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/huffman_tree.JPG" width=866 border=0>
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/100909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-11-14 12:24 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/11/14/Huffman.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TS 流文件 字节对齐 切割工具 (二)</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/11/09/100479.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 09 Nov 2009 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/11/09/100479.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/100479.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/11/09/100479.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/100479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/100479.html</trackback:ping><description><![CDATA[有时候录制的ts都比较大,想切割下来,慢慢分析,就给大家推荐这个工具<br>本来还能切割成188 或者 204的整数倍的,增加校验的.呵呵.<br><br>1,增加了输入文件的拖动,<br>2,增加了输出文件的名称的跟随<br><br><a href="http://www.cnitblog.com/Files/dvb-dvb/FileDivider.rar"><u><font color=#0000ff>/Files/dvb-dvb/FileDivider.rar</font></u></a><br><br><br><img height=464 alt="" src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/FileDivider.JPG" width=614 border=0>
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/100479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-11-09 17:34 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/11/09/100479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mpeg2解压缩的详细过程 介绍。</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/11/03/Mpeg2.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Tue, 03 Nov 2009 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/11/03/Mpeg2.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/100034.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/11/03/Mpeg2.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/100034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/100034.html</trackback:ping><description><![CDATA[<div class=post>
<div class=postTitle>&nbsp;</div>
<div class=postText>
<p>MPEG-1流比特层次结构分析总结<br>1．简要介绍Mpeg<br>Mpeg 是Motion Picture Expert Group的缩写。活动图像专家组是在1988年由ISO和IEC联合成立的专家组，负责开发电视图像数据和声音数据的编码，解码和它们的同步等标准。到目前为止已经开发和正在开发的MPEG标准有很多，主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.</p>
<p>其中的Mpeg-1处理的是标准图像交换格式（standard interchange format,SIF）或者称为源输入格式（Source Input Format,SIF）的电视，将模拟的图像信息，通过编码成为数字图像信息，原始输入可以是NTSC制式352pixels * 240lines * 30frames/second, PAL制352pixels * 288lines*25frames/second，压缩后的数字图像信息的速率为1.5Mb/s.这个标注是1992年正是的发布的，是针对当时具有这种数据传输速率的CD-ROM和网络而开发的，用于在CD-ROM上存储数字影视和在网络上传输数字影视。<br>MPEG-1的标准号为ISO/IEC 11172,标准名：&#8220;信息技术——用于数据速率大约高达1.5Mb/s的数字存储替的电视图像和伴音编码&#8221;<br>本文主要是对Mpeg-1Video数据流的结构进行分析，并将怎样得到Mpeg-1流中的数据部分进行的阐述。ISO/IEC 11172-2</p>
<p>2．Mpeg-1数据流分析<br>编码后的视频序列是一个如同计算机网络的OSI模型下的数据序列一样，数据被分成很多层的概念。</p>
<p>视频序列层－画面组层－画面层－片层－宏块层－块层<br>层次的关系很明显，越往后越是底层，越接近实际的数据。</p>
<p>2.1视频序列层（VideoStream）<br>视频序列是以一个序列标题开始，之后可以跟着一个或者多个画面组。最后以Sequence_end_code结束。紧挨着每一个画面组之前可以有一个序列标题。也就是说每个画面组，都可以有一个自己的序列标题。<br>序列标题是一个以sequence_header_code开始，后跟着一系列数据元素的结构。是视频流中用来解码的重要的参数之一。其中定义了量化矩阵（load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可选的intra_quantizer_matrix和 non_intra_quantizer_ matrix）以及其它的一些重要的数据元素，其中量化矩阵是可以在视频流中重复的量化矩阵中变化的，并且在每次变化后，量化矩阵重新定义。其它的元素必须与第一个序列标题中的值相同。<br>整个视频序列的结构可以用下面的代码表示：<br>Video_Stream{<br>unsigned int h_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int v_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_height;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in mblocks.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_width;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in mblocks.&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char aspect_ratio;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for aspect ratio.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char picture_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for picture rate.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int bit_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit rate.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_buffer_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minimum buffer size.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN const_param_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Contrained parameter flag. */<br>&nbsp; unsigned char intra_quant_matrix[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization matrix for<br>&nbsp; intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char non_intra_quant_matrix[8][8];&nbsp; /* Quanitization matrix for <br>&nbsp; non intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; GoP group;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current group of pict.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Pict picture;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current picture.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Slice slice;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current slice.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Macroblock mblock;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current macroblock.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Block block;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current block.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int state;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* State of decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int bit_offset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit offset in stream.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int *buffer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to next byte in<br>&nbsp; buffer.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int buf_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Length of remaining buffer.*/<br>&nbsp; unsigned int *buf_start;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to buffer start.&nbsp;&nbsp; */<br>&nbsp; int max_buf_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Max lenght of buffer.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past predictive frame.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *future;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Future predictive frame.&nbsp;&nbsp; */<br>&nbsp; PictImage *current;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current frame.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *ring[RING_BUF_SIZE];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Ring buffer of frames.&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Video_Stream;&nbsp;&nbsp; <br>具体的序列标题的结构的部分是这样的：<br>序列<br>sequence_header{<br>SEQ_START_CODE 0x000001b3;&nbsp; /* 常量 ,作用使用来定位视频序列的序列头 */&nbsp;&nbsp; <br>unsigned int h_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int v_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_height;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in mblocks.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_width;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in mblocks.&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char aspect_ratio;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for aspect ratio.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char picture_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for picture rate.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int bit_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit rate.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_buffer_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minimum buffer size.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN const_param_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Contrained parameter flag. */<br>&nbsp; unsigned char load_intra_quantizer_matrix;<br>unsigned char intra_quant_matrix[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization matrix for intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个结构是可选的，要看load_intra_quantizer_matrix的值，为真则有这个部分，否则没有，因为<br>intra_quant_matrix是量化表的值，而Sequence_header结构在视频序列中是可重复的，即在每个画面组之前都有可能再次给出一个sequence_header,并且可以在新的sequence_header 中重新定义量化表*/<br>unsigned char load_non_intra_quantizer_matrix;<br>&nbsp; unsigned char non_intra_quant_matrix[8][8];&nbsp; /* Quanitization matrix for non intracoded frames. 也是可选。愿意于intra_quant_matrix可选的原因相同。当load_non_intra_quant_matrix的值为真的时候需要定义。&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; <br>}</p>
<p>由上面的分析，可以看出来的是：<br>video_sequence(){<br>next_start_code()<br>do{<br>sequence_header();<br>do{<br>group_of_pictures() ;画面组<br>}while (nextbits()==GROUP_START_CODE)<br>}while(nextbits()==SEQUENCE_HEADER_CODE)<br>SEQUENCE_END_CODE<br>};</p>
<p>正是由于视频序列中存在很多开始码，或者称之为定位码、同步码。用来告诉解码器目前数据的区域信息，所以解码器才可以正确的处理各个数据区的数据，下面就是视频序列中的开始码的罗列：<br>#define SEQ_END_CODE 0x000001b7<br>#define SEQ_START_CODE 0x000001b3<br>#define GOP_START_CODE 0x000001b8<br>#define PICTURE_START_CODE 0x00000100<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>#define EXT_START_CODE 0x000001b5<br>#define USER_START_CODE 0x000001b2<br>这些开始码都是一些特殊的32bits的比特序列，在视频码流中不会出现的。他们的起着标志的作用，具体可以从名称上面看出来。<br>其中EXT_START_CODE和USER_START_CODE在每个层里面都会出现，用来标志扩展数据区和用户数据区，用来添加任意的数据，直到下一个开始码结束。<br>2.2画面组层（GOP）<br>在软件xmplay1.1中的定义<br>typedef struct GoP {<br>&nbsp; BOOLEAN drop_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Flag indicating dropped frame. */<br>&nbsp; unsigned int tc_hours;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Hour component of time code.&nbsp;&nbsp; */<br>&nbsp; unsigned int tc_minutes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minute component of time code. */<br>&nbsp; unsigned int tc_seconds;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Second component of time code. */<br>&nbsp; unsigned int tc_pictures;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Picture counter of time code.&nbsp; */<br>&nbsp; BOOLEAN closed_gop;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Indicates no pred. vectors to<br>&nbsp;&nbsp;&nbsp; previous group of pictures.&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN broken_link;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* B frame unable to be decoded.&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} GoP;</p>
<p>当然每个画面组层都是开始与标志码：GOP_START_CODE<br>该层次语法上的定义是<br>group_of_pictures{<br>GOP_START_CODE<br>Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures<br>Closed_gop;<br>Broken_link;<br>Next_start_code;<br>If(nextbits==extension_start_code){<br>Extension_start_code;<br>While(nextbits()==&#8221;0000 0000 0000 0000 0000 0001&#8221;){<br>Group_extension_data;<br>}<br>next_start_code()<br>}<br>if(nextbits==user_data_start_code){<br>user_data_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>user_data;<br>}<br>next_start_code()<br>}<br>do{<br>picture()<br>}while(nextbits==picture_start_code)<br>}</p>
<p>Mpeg流最终显示出来是一系列的画面，而画面组是mpeg流中可以独立编码的最小的单位，每个画面组由一个标题和一系列画面组成。GOP标题包含了时间和编辑的信息。<br>Mpeg画面组中必须至少有一个I帧画面，可以有数目可变的B帧和P帧画面，也可以没有P和B帧。画面组的第一幅编码画面是I画面，该画面之后跟随着任意数目的I或P画面，每对I、P画面之间可以插入任意数目的B画面。<br>画面组是画面的集合，每幅画面按照显示的顺序相邻。<br>画面组中的画面有两种排列顺序：<br>1．按比特流顺序 必须以I帧开头，后面可按任何的次序，跟上任意数目的I，P或B画面。<br>2．按显示顺序必须以I或B画面打头，且以I或P画面结束，最小的画面组由一个I画面组成。</p>
<p>从编码角度，可以精确的陈述的是，画面组以一个画面组标题开始，以最先出现的下一个画面组标题或者下一个序列标题或者序列结束码结束。</p>
<p>Mepg流中的标志码也就是开始码，对正确的分割和识别码流的成分起到了至关重要的作用。</p>
<p>2.3画面层（Pictures）<br>画面组层中的一幅幅画面就是画面层的数据了。包含了一幅画面的所有编码信息。一幅画面同样始于画面的标题。标题以画面开始码（PICTURE_START_CODE 0x00000100）打头。<br>解析画面单元的语法结构：<br>picture(){<br>picture_start_code<br>temprol_reference&nbsp;&nbsp;&nbsp;&nbsp; /*时序编号，通常一组画面的编号都在1024以内，如果超过那么在1025幅画面出复位为0，重新计数。*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>picture_coding_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>vbv_delay/*对于固定比特率的视频流，vbv_delay用与解码过程开始和随机存取之后，以保证在第一幅画面被显示之前，解码器已经读到正确数目的比特数。*/<br>if((picture_coding_type==2) || picture_coding_type==3){<br>full_pel_foward_vector /*全象素前向矢量，给定前向矢量的精度，在P和B画面的标题中出现*/<br>forward_f_code<br>}<br>if(picture_coding_type==3){<br>full_pel_backward_vector<br>back_f_code<br>}<br>while(nextbits()==&#8217;1&#8217;){<br>extra_bit_picture<br>extra_information_picture<br>}<br>extra_bit_picture<br>next_start_code</p>
<p>if(nextbits()==extension_start_code){<br>extension_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>picture_extension_data<br>}<br>next_start_code()<br>}<br>if(nextbits()==user_data_start_code){<br>user_data_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>user_data<br>}<br>next_start_code()<br>}<br>do {<br>slice()<br>}while(nextbits()==slice_start_code)<br>}</p>
<p><br>整个画面单元结构是这样的：<br>typedef struct pict {<br>&nbsp; unsigned int temp_ref;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Temporal reference.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int code_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Frame type: P, B, I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_delay;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Buffer delay.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN full_pel_forw_vector;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. vectors specified in full<br>&nbsp;&nbsp;&nbsp; pixel values flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int forw_r_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used for vector decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int forw_f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used for vector decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN full_pel_back_vector;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back vectors specified in full <br>&nbsp;&nbsp;&nbsp; pixel values flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int back_r_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int back_f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *extra_info;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extra bit picture info.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Pict;</p>
<p>可以看出整个pictures层的bit流结构中由标题和pictures数据组成。<br>标题中提供了必要的画面信息数据和运动矢量的信息。</p>
<p>2.4片层(Slice)<br>片是任意数目宏块组成的序列，其中宏块必须从画面的左上位置开始，按照光栅扫描的方向从左到右，从上到下排列。片中至少包涵一个宏块，片与片之间没有重叠，也没有间隙。</p>
<p>片层的解析语法：<br>首先给出识别出Slice层数据的头标slice_start_code<br>『<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>』<br>slice{<br>slice_start_code /*从中可以计算出slice_vertical_position&nbsp; 片中第一个宏块，以宏块为单位的垂直位置*/<br>quantizer_scale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*设置量化步长尺寸。1－31*/<br>while(nextbits()==&#8217;1&#8217;){<br>extra_bit_slice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;1&#8217;<br>extra_information_slice<br>}<br>extra_bit_scale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;0&#8217;<br>do{<br>macroblock()<br>}while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0000&#8217;)<br>next_start_code()<br>}</p>
<p>typedef struct slice {<br>&nbsp; unsigned int vert_pos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vertical position of slice. */<br>&nbsp; unsigned int quant_scale;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization scale.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *extra_info;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extra bit slice info.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Slice;</p>
<p><br>[此贴子已经被作者于2008-7-19 17:51:53编辑过]<br>--&nbsp; 作者：cdmalcl<br>--&nbsp; 发布时间：2008-7-19 17:49:34<br>--&nbsp; <br>每个片由一个开始码开始，开始后DC系数和矢量解码的预测值都被复位，片开始部位的位置的水平位置由片中第一个宏块的宏块地址决定。这些措施使得在一幅画面内任何一片都可以单独编码而不需要前一片的信息。当解码是出现错误，即可以从后继的片重新开始。<br>所以，当数据在无错的环境中，可以一幅画面就作为一片，但是如果是有错的环境，则每行宏块作为一片会更加合理。</p>
<p>表2&nbsp; 256&#215;192画面内的片划分（每行宏块作为一个片，每个片的高度都是16pixels）<br>1开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1结束<br>2开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2结束<br>3开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3结束<br>4开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4结束<br>5开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5结束<br>6开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6结束<br>7开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7结束<br>8开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8结束<br>9开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9结束<br>10开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10结束<br>11开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11结束<br>12开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12结束<br>13开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13结束<br>实际情况中片不宜太多，因为片标题，以及新片所需要尽心重新编码花费的开销很大。<br>片始于片标题，片标题又始于片开始码，片开始码是可以在一个范围中取得得，这个范围就是<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>片开始码得最后8为可以给出片得垂直位置，即以宏块为单位从画面顶部位置为1开始算起，片中第一个宏块的垂直位置。宏块有一个行号可以作为它得定位数据，这个行号的计算方法是：片垂直位置－1<br>宏块的垂直位置最大为175。片中第一个宏块的水平位置，可以由该宏块的地址偏移计算出来，所以不需要依赖画面内的任何其他的宏块的信息。<br>--&nbsp; 作者：cdmalcl<br>--&nbsp; 发布时间：2008-7-19 17:49:59<br>--&nbsp; <br>2.5宏块层(Macroblock)<br>宏块是包含16pixels*16lines的亮度分量部分，以及在空间位置上对应的两个8pixels*8lines的色度分量部分，一个宏块有4个亮度块和2个色度块。宏块可以指源图像或者重构图像的数据，或者是量化后的DCT系数。<br>宏块中块的顺序如下：<br>表1&nbsp; 宏块中块的排列</p>
<p>01<br>23</p>
<p><br>4</p>
<p>5</p>
<p>Y分量Cb分量Cr分量</p>
<p>宏块的数据分析语法描述：</p>
<p>macroblock(){<br>while(nextbits()==&#8217;0000 0001 111&#8217;){<br>macroblock_stuffing /*宏块填料，为了防止下溢出，由编码器填入的数据，有它固定的11位bit格式就是&#8217;0000 0001 111&#8217;,当然解决下溢出的方法还有很多，编码器可以在标题之前就加入填料位，或者可以减小quant_scale获得更多的编码系数等等*/<br>}<br>while(nextbits()==&#8217;0000 0001 000&#8217;){<br>macroblock_escape&nbsp; /*固定模式的bit串，当macroblock_address与previous_macroblock_address的差大于33时将用到该码。使得后继的macroblock_increment所表示的值加33。<br>}<br>macroblock_address_increment&nbsp;&nbsp; /*用于表示macroblock_address和previous_macorblock_ address之间的差值。最大值为33，当前两者差大于33时用macroblock_escape补充。 Macroblock_address表示的是宏块在画面中的绝对位置，最左上角的宏块的macroblock_address为 0，previous_macroblock_address指示片中最后一个非跳空宏块的位置。<br>macroblock_type&nbsp; <br>if(macroblock_motion_forward){<br>motion_horizontal_forward_code<br>if((forward_f!=1) &amp;&amp; (motion_horizontal_forward_code!=0))<br>motion_horizontal_forward_r<br>motion_vertical_forward_code<br>if((forward_f!=1) &amp;&amp; (motion_vertical_forward_code!=0))<br>motion_vertical_forward_r<br>}<br>if(macroblock_motion_backward){<br>motion_horizontal_backward_code<br>if((backward_f!=1) &amp;&amp; (motion_horizontal_backward_code!=0))<br>motion_horizontal_backward_r<br>motion_vertical_backward_code<br>if((backward_f!=1) &amp;&amp; (motion_vertical_backward_code!=0))<br>motion_vertical_backward_r<br>}<br>if(macroblock_pattern)<br>coded_block_pattern /*可以得到宏块宏块的pattern_code[i](i=0:5)，从而确定该宏块接收到的块的种类有哪些。*/<br>for(i=0;i&lt;6;i++)<br>block(i)<br>if(picture_coding_type==4)<br>end_of_marcoblock<br>}<br>片被分为16pixels*16lines的象素宏块。每个宏块都有它的标题。包含了宏块的地址、类型、量化器标尺信息等等。标题之后是该宏块的6个块的数据。</p>
<p>在Xmplay代码中给出的macrblock的定义：<br>typedef struct macroblock {<br>&nbsp; int mb_address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Macroblock address.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int past_mb_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Previous mblock address.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_h_forw_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. horiz. motion vector code. */<br>&nbsp; unsigned int motion_h_forw_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_v_forw_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. vert. motion vector code.&nbsp; */<br>&nbsp; unsigned int motion_v_forw_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decdoinge vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_h_back_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back horiz. motion vector code.&nbsp; */<br>&nbsp; unsigned int motion_h_back_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_v_back_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back vert. motion vector code.&nbsp;&nbsp; */<br>&nbsp; unsigned int motion_v_back_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int cbp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Coded block pattern.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN mb_intra;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Intracoded mblock flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN bpict_past_forw;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past B frame forw. vector flag.&nbsp; */<br>&nbsp; BOOLEAN bpict_past_back;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past B frame back vector flag.&nbsp;&nbsp; */<br>&nbsp; int past_intra_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Addr of last intracoded mblock.&nbsp; */<br>&nbsp; int recon_right_for_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past right forw. vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_down_for_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past down forw. vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_right_back_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past right back vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_down_back_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past down back vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Macroblock;<br>2.6块层(Block)<br>块是一个正交的8pixels*8lines的亮度或者色度分量，块可以指源画面数据或者相应的编码数据元素。<br>8*8单位象素的源画面数据经过DCT变换后的成为了相应的DCT系数块。<br>块的具体结构为（xmplay源码中的结构定义）：<br>typedef struct block {<br>&nbsp; short int dct_recon[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Reconstructed dct coeff matrix. */<br>&nbsp; short int dct_dc_y_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past lum. dc dct coefficient.&nbsp;&nbsp; */<br>&nbsp; short int dct_dc_cr_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past cr dc dct coefficient.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; short int dct_dc_cb_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past cb dc dct coefficient.&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Block;</p>
<p>解析块的语法结构是：<br>block(i){<br>if(pattern_code[i]){<br>if(macroblock_intra){<br>if(i&lt;4){<br>dct_dc_size_luminance<br>if(dc_size_luminance!=0)<br>dct_dc_differential<br>}<br>else{<br>dct_dc_size_chrominance<br>if(dc_size_chrominance!=0)<br>dct_dc_differential<br>}<br>}<br>else{<br>dct_coeff_first<br>}<br>if(picture_coding_type!=4){<br>while(nextbits()!=&#8217;10&#8217;)<br>dct_coeff_next<br>end_of_block<br>}<br>}<br><a href="http://www.ds0101.net/bbs/TopicOther.asp?t=5&amp;BoardID=19&amp;id=889"><u><font color=#0000ff>http://www.ds0101.net/bbs/TopicOther.asp?t=5&amp;BoardID=19&amp;id=889</font></u></a>&nbsp;, 引用的原址。</p>
</div>
<div class=postfoot>posted on 2009-07-14 14:49 <a href="http://www.cnitblog.com/dvb-dvb/"><u><font color=#0000ff>TS,MPEG2,dvbc专家</font></u></a> 阅读(438) <a href="file:///D:/download/doc2/blog_doc/cnitblog-dvb/www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html#Post"><u><font color=#0000ff>评论(4)</font></u></a> &nbsp;<a href="http://www.cnitblog.com/dvb-dvb/admin/EditPosts.aspx?postid=60070"><u><font color=#0000ff>编辑</font></u></a>&nbsp;<a href="http://www.cnitblog.com/dvb-dvb/AddToFavorite.aspx?id=60070"><u><font color=#0000ff>收藏</font></u></a> <a href="http://www.cnitblog.com/dvb-dvb/services/trackbacks/60070.aspx"><u><font color=#0000ff>引用</font></u></a> </div>
</div>
<img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/60070.html?webview=1" width=1> <!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html"
dc:identifier="http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html"
dc:title="Mpeg2解压缩的详细过程 介绍。"
trackback:ping="http://www.cnitblog.com/dvb-dvb/services/trackbacks/60070.aspx" />
</rdf:rdf>
--><script type=text/javascript>
//<![cdata[
Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script>
<div id=AjaxHolder_UpdatePanel1><a name=pagedcomment></a><a name=评论><br></a>
<div id=comments><a name=评论></a>
<h3><a name=评论>评论</a></h3>
<a name=评论></a>
<div class=post><a name=评论></a>
<div class=postTitle><a name=评论></a><a title="permalink: re: Mpeg2解压缩的详细过程 介绍。" href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#60072"><u><font color=#0000ff>#</font></u></a>&nbsp;<a name=60072></a>re: Mpeg2解压缩的详细过程 介绍。 <span>2009-07-14 14:57 </span><a id=AjaxHolder_Comments_CommentList_ctl00_NameLink href="http://www.fankevancl.cn/" target=_blank><u><font color=#0000ff>凡客诚品</font></u></a> </div>
<div class=postText>来学习好东西:)&nbsp;&nbsp;<a onclick='return SetReplyAuhor("凡客诚品")' href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#post"><u><font color=#0000ff>回复</font></u></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.cnitblog.com/comment?author=%e5%87%a1%e5%ae%a2%e8%af%9a%e5%93%81" target=_blank><u><font color=#0000ff>更多评论</font></u></a> <br><a id=AjaxHolder_Comments_CommentList_ctl00_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl00_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: Mpeg2解压缩的详细过程 介绍。" href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#60077"><u><font color=#0000ff>#</font></u></a>&nbsp;<a name=60077></a>re: Mpeg2解压缩的详细过程 介绍。 <span>2009-07-14 15:01 </span><a id=AjaxHolder_Comments_CommentList_ctl01_NameLink href="http://www.dell-book.cn/baidu.html" target=_blank><u><font color=#0000ff>戴尔电脑</font></u></a> </div>
<div class=postText>看看&nbsp;&nbsp;<a onclick='return SetReplyAuhor("戴尔电脑")' href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#post"><u><font color=#0000ff>回复</font></u></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.cnitblog.com/comment?author=%e6%88%b4%e5%b0%94%e7%94%b5%e8%84%91" target=_blank><u><font color=#0000ff>更多评论</font></u></a> <br><a id=AjaxHolder_Comments_CommentList_ctl01_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl01_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: Mpeg2解压缩的详细过程 介绍。" href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#60086"><u><font color=#0000ff>#</font></u></a>&nbsp;<a name=60086></a>re: Mpeg2解压缩的详细过程 介绍。 <span>2009-07-14 17:12 </span><a id=AjaxHolder_Comments_CommentList_ctl02_NameLink href="http://www.cnitblog.com/dvb-dvb/" target=_blank><u><font color=#0000ff>TS,MPEG2,dvbc专家</font></u></a> </div>
<div class=postText>请各位对照着code看看，那更有趣 ！&nbsp;&nbsp;<a onclick='return SetReplyAuhor("TS,MPEG2,dvbc专家")' href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#post"><u><font color=#0000ff>回复</font></u></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.cnitblog.com/comment?author=TS%2cMPEG2%2cdvbc%e4%b8%93%e5%ae%b6" target=_blank><u><font color=#0000ff>更多评论</font></u></a> <br><a id=AjaxHolder_Comments_CommentList_ctl02_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl02_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: Mpeg2解压缩的详细过程 介绍。" href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#61161"><u><font color=#0000ff>#</font></u></a>&nbsp;<a name=61161></a>re: Mpeg2解压缩的详细过程 介绍。<a name=Post></a> <span>2009-09-01 17:24 </span><a id=AjaxHolder_Comments_CommentList_ctl03_NameLink target=_blank>Guest</a> </div>
<div class=postText>好东西。&nbsp;&nbsp;<a onclick='return SetReplyAuhor("Guest")' href="file:///dvb-dvb/archive/2009/07/14/Mpeg2decode.html#post"><u><font color=#0000ff>回复</font></u></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.cnitblog.com/comment?author=Guest" target=_blank><u><font color=#0000ff>更多评论</font></u></a> </div>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/100034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-11-03 08:58 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/11/03/Mpeg2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 （2）</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/10/26/99449.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 26 Oct 2009 00:54:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/10/26/99449.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99449.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/10/26/99449.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99449.html</trackback:ping><description><![CDATA[<form id="Form1" name="Form1" onsubmit="javascript:return webform_onsubmit();" action="59865.aspx" method="post">
    <div id="main">
    <div class="post">
    <div class="postTitle"><a id="viewpost1_TitleUrl" href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/bmpfileformat.html">BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 （2）</a> </div>
    <div class="postText">&nbsp;
    <p><span><a href="http://blog.csdn.net/LaPizza/archive/2008/11/06/3235318">http://blog.csdn.net/LaPizza/archive/<st1:chsdate year="2008" month="11" day="6" islunardate="False" isrocdate="False" w:st="on">2008/11/06</st1:chsdate>/3235318</a>. = 原创,</span></p>
    <p><span>BMP</span><span>文件头格式</span><span> <span>bmp</span></span><span>文件二进制解析</span><span>,bmp</span><span>文件解析</span><span>,bmp</span><span>存储格式</span><span> </span></p>
    <p><span>下面的表格是我整理的</span><span>BMP</span><span>文件头的格式。</span></p>
    <p><span>方便大家查询。</span></p>
    <p>&nbsp;</p>
    <p><span>Bmp</span><span>的文件头是</span><span> 54 , </span><span>以下都是</span><span>24 bit,</span></p>
    <p><span>如果</span><span> </span><span>图像大小是</span><span> 720 * 480 ,</span><span>那么文件大小是</span><span>: 54 + 720 * 480 *3 </span><span>很好理解</span><span>,</span></p>
    <p><span>如果</span><span> </span><span>图像大小是</span><span> <span>333 * 333</span></span><span>那么文件大小就不是</span><span>: 54 + 333 * 333 *3 </span><span>了</span><span>,</span><span>奇怪么</span><span>?,<br><br>&nbsp;&nbsp;&nbsp;总算引出高人了，我就公布答案吧：&nbsp;<br><span>&nbsp;&nbsp;&nbsp;如果</span><span> </span><span>图像大小是</span><span>&nbsp;<span>1*7&nbsp; </span></span><span>那么文件大小就是</span><span>: 54&nbsp;+&nbsp;1*7*3 + 7*n&nbsp;</span><span>了</span><span>,<br></span><span>&nbsp;&nbsp;&nbsp;如果</span><span> </span><span>图像大小是</span><span>&nbsp;<span>3*5&nbsp; </span></span><span>那么文件大小就是</span><span>: 54&nbsp;+&nbsp;3*5*3 +&nbsp;5*n&nbsp;</span><span>了</span><span>,<br></span><span>&nbsp;&nbsp;&nbsp;如果</span><span> </span><span>图像大小是</span><span>&nbsp;11<span>*77&nbsp; </span></span><span>那么文件大小就是</span><span>: 54&nbsp;+&nbsp;11*77*3 +&nbsp;77*n&nbsp;</span><span>了</span><span>,<br></span>&nbsp;&nbsp;&nbsp;总之是如果width * high * 3&nbsp; + high * n&nbsp;！＝ 4的倍数， 那么文件大小就是 54&nbsp;+&nbsp;&nbsp;width * high * 3 + high*n&nbsp; 了。<br><br>&nbsp;&nbsp;&nbsp;n的取值范围是 0 ～～3&nbsp;&nbsp;&nbsp;直到算下来，size是4的倍数。<br></span></p>
    <p><br>&nbsp;</p>
    <img alt="" src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/bmp.JPG" border="0" width="800" height="494"> </div>
    <div class="postfoot">posted on 2009-07-06 08:55 <a href="http://www.cnitblog.com/dvb-dvb/">TS,MPEG2,dvbc专家</a> 阅读(441) <a href="http://www.cppblog.com/dvb-dvb/admin/EditPosts.aspx?postid=99449#Post">评论(8)</a> &nbsp;<a href="http://www.cnitblog.com/dvb-dvb/admin/EditPosts.aspx?postid=59865">编辑</a>&nbsp;<a href="http://www.cnitblog.com/dvb-dvb/AddToFavorite.aspx?id=59865">收藏</a> <a href="http://www.cnitblog.com/dvb-dvb/services/trackbacks/59865.aspx">引用</a> </div>
    </div>
    <img src="http://www.cnitblog.com/dvb-dvb/aggbug/59865.html?webview=1" width="1" height="1"> <!--
    <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
    <rdf:description
    rdf:about="http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/bmpfileformat.html"
    dc:identifier="http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/bmpfileformat.html"
    dc:title="BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 （2）"
    trackback:ping="http://www.cnitblog.com/dvb-dvb/services/trackbacks/59865.aspx" />
    </rdf:rdf>
    --><script type="text/javascript">
//<![cdata[
sys.webforms.pagerequestmanager._initialize('ajaxholder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script>
    <div id="AjaxHolder_UpdatePanel1"><a name="pagedcomment"></a><a name="评论"><br>
    </a>
    <div id="comments">
    <a name="评论">    </a>
    <h3><a name="评论">评论</a></h3>
    <a name="评论">    </a>
    <div class="post">
    <a name="评论">    </a>
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59878">#</a>&nbsp;<a name="59878"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-06 10:59 </span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.99booker.cn/" target="_blank">99读书人</a> </div>
    <div class="postText">不错&nbsp;&nbsp;<a onclick="'return" setreplyauhor("99读书人")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=99%e8%af%bb%e4%b9%a6%e4%ba%ba" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59882">#</a>&nbsp;<a name="59882"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-06 11:20 </span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> </div>
    <div class="postText">为什么图像区大小,必须是4倍数,还没有理解. 请浏览者提供为什么,谢谢!&nbsp;&nbsp;<a onclick="'return" setreplyauhor("ts,mpeg2,dvbc专家")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=TS%2cMPEG2%2cdvbc%e4%b8%93%e5%ae%b6" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59892">#</a>&nbsp;<a name="59892"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-06 19:45 </span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="http://www.51kids.com/" target="_blank">童装</a> </div>
    <div class="postText">写得好！&nbsp;&nbsp;<a onclick="'return" setreplyauhor("童装")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=%e7%ab%a5%e8%a3%85" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59902">#</a>&nbsp;<a name="59902"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-07 11:34 </span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="http://www.jie12530.cn/12530.htm" target="_blank">12530彩铃</a> </div>
    <div class="postText">写的不错&nbsp;&nbsp;<a onclick="'return" setreplyauhor("12530彩铃")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=12530%e5%bd%a9%e9%93%83" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59903">#</a>&nbsp;<a name="59903"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-07 11:35 </span><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="http://www.fankevancl.cn/" target="_blank">凡客诚品</a> </div>
    <div class="postText">写得好！&nbsp;&nbsp;<a onclick="'return" setreplyauhor("凡客诚品")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=%e5%87%a1%e5%ae%a2%e8%af%9a%e5%93%81" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#59925">#</a>&nbsp;<a name="59925"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-08 08:30 </span><a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> </div>
    <div class="postText">不错的话,我将继续!!!&nbsp;&nbsp;<a onclick="'return" setreplyauhor("ts,mpeg2,dvbc专家")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=TS%2cMPEG2%2cdvbc%e4%b8%93%e5%ae%b6" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 " href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#60055">#</a>&nbsp;<a name="60055"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 <span>2009-07-13 12:35 </span><a id="AjaxHolder_Comments_CommentList_ctl06_NameLink" target="_blank">hongquan</a> </div>
    <div class="postText">图像区数据必须是4的倍数是为了效率而设置的。在32bit的机器上，如果读取数据的时候不是32bit alignment的话，那么cpu需要先读取数据然后再做转换，这样的话会在效率上有所损失，这应该就是为什么需要时4字节对齐的原因。而对于一个bitmap的话4byte对齐带来的空间损耗是很小的，最多3个字节而已。&nbsp;&nbsp;<a onclick="'return" setreplyauhor("hongquan")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=hongquan" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl06_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl06$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl06_EditLink"></a> </div>
    </div>
    <br>
    <div class="post">
    <div class="postTitle"><a title="permalink: re: bmp文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 （2）" href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#60069">#</a>&nbsp;<a name="60069"></a>re: BMP文件头格式 bmp文件二进制解析,bmp文件解析,bmp存储格式 （2）<a name="Post"></a> <span>2009-07-14 13:55 </span><a id="AjaxHolder_Comments_CommentList_ctl07_NameLink" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> </div>
    <div class="postText">并不是仅仅多3个字节，我已经更新blog内容了。请浏览。&nbsp;&nbsp;<a onclick="'return" setreplyauhor("ts,mpeg2,dvbc专家")' href="http://www.cppblog.com/dvb-dvb/archive/2009/07/06/59865.aspx#post">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnitblog.com/comment?author=TS%2cMPEG2%2cdvbc%e4%b8%93%e5%ae%b6" target="_blank">更多评论</a> <br><a id="AjaxHolder_Comments_CommentList_ctl07_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl07$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl07_EditLink"></a> </div>
    </div>
    </div>
    </div>
    </div>
    <p id="footer">&nbsp;</p>
</form><img src ="http://www.cppblog.com/dvb-dvb/aggbug/99449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-10-26 08:54 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/10/26/99449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>direct show,filter,elecard_demux做网络播放器，主要格式：h264/avc，</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/10/23/99306.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Fri, 23 Oct 2009 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/10/23/99306.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99306.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/10/23/99306.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99306.html</trackback:ping><description><![CDATA[<p>&nbsp;用的elecard的ax文件，自己写source filter，播放mpeg2还可以，h264就不行了，关键请问题如下：</p>
<p>source仿照系统的asyncflt。cpp。.h ：</p>
<p>&nbsp;问题出在elecard的demux上面，<br>&nbsp;首先，elecard公司写demux filter的时候，肯定只是基于文件的---&gt;&nbsp; to h264来说，</p>
<p>to, mpeg2来说，都是可以的，<br>&nbsp;原因如下： 如果是mpeg2, demux filter 先读取一段数据去parse,找psi，如果找到了，就可以connect了，</p>
<p>因为是读文件的，读了一些数据为了connect， 所以connect 以后，必需调用 SetFilePointer(*g_pHFile,0,NULL,FILE_BEGIN);<br>&nbsp;要不然，开头的那一段就无法播放了</p>
<p>但是： 如果是h264， 他先读取一段数据去parse,找psi，就算找到了，也不connect： 如果找到了，而且也是文件末尾了，那就connect</p>
<p>成功， 奶奶的，可是我的这个是网络数据流，那有文件末尾， </p>
<p>他有个 set position的函数，connect 后，就 set 0 了</p>
<p>&nbsp;建立完整个 graph 之后继续播放，不在乎之前的那点数据的－－－你知道， 前面的那个数据是多大呢16M</p>
<p>&nbsp;DVB 标清的话，用不了多少就可以搜完台，用不了 16MB</p>
<p>关键是我怎么知道它到底读多少数据就 parse完了呢，难道让我一直等么？，</p>
<p>最早，标清我只要3M的数据，就必需建立graph了，现在h264,高清的，4M，根本不够了，</p>
<p>于是，我的code这样写了，呵呵：HRESULT SetPointer(LONGLONG llPos)<br>&nbsp;{<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;if (g_bIsConnect == 0)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if (llPos &gt;= (1024 * 1024 * 14))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DbgLog((LOG_TRACE, 1, TEXT("\n--Set File Pointer = ld"),llPos));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return S_FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;如果connect成功： SetPointer就 永远返回ok<br>&nbsp;这样就可以播放了，<br>&nbsp;不过，浪费了我14M的数据，唉，<br>code如后：</p>
<p>if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = CoCreateInstance(CLSID_CEleCardMpegMultiplexer, NULL, CLSCTX_INPROC, <br>&nbsp;&nbsp;IID_IBaseFilter, (LPVOID *)&amp;pMPG2Splitter) ;</p>
<p>&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = m_pGraph-&gt;AddFilter(pMPG2Splitter,L"EleCard Mpeg2 DeMultiplexer");</p>
<p>&nbsp;pPinInTSSplitter = xMyFindPin(pMPG2Splitter,L"Input",0,CLSID_NULL_USER1);</p>
<p>&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = m_pGraph-&gt;Connect(pPinOutSTWrapper,pPinInTSSplitter);</p>
<p><br>&nbsp;if (strcmp(m_strFileFormat,"H264") == 0)<br>&nbsp;{ <br>&nbsp;&nbsp;pPinOutTSSplitter_V= xMyFindPin(pMPG2Splitter,L"264",1,MEDIATYPE_Video);<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;pPinOutTSSplitter_V= xMyFindPin(pMPG2Splitter,L"Video",1,MEDIATYPE_Video);<br>&nbsp;}</p>
<p>if (strcmp(m_strFileFormat,"H264") == 0)<br>&nbsp;{ <br>&nbsp;&nbsp;if (SUCCEEDED(hr)) <br>&nbsp;&nbsp;&nbsp;hr = CoCreateInstance(CLSID_CH264VideoDecoder, NULL, CLSCTX_INPROC, &nbsp;&nbsp;&nbsp;</p>
<p>IID_IBaseFilter, (LPVOID *)&amp;pFIDVDVideoDecorder) ;<br>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;hr = m_pGraph-&gt;AddFilter(pFIDVDVideoDecorder,L"EleCard MPEG2 Video Decoder");</p>
<p>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;pIDVDVideoDecorderInpin = xMyFindPin(pFIDVDVideoDecorder,L"In",0,MEDIATYPE_Video);</p>
<p>&nbsp;&nbsp;if(pIDVDVideoDecorderInpin)<br>&nbsp;&nbsp;&nbsp;hr = m_pGraph-&gt;Connect(pPinOutTSSplitter_V,pIDVDVideoDecorderInpin);</p>
<p>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;pIDVDVideoDecorderOutpin = xMyFindPin(pFIDVDVideoDecorder,L"Out",1,MEDIATYPE_Video);<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;if (SUCCEEDED(hr)) &nbsp;<br>&nbsp;&nbsp;&nbsp;hr = CoCreateInstance(CLSID_CEleCardVideoDec, NULL, CLSCTX_INPROC, <br>&nbsp;&nbsp;&nbsp;IID_IBaseFilter, (LPVOID *)&amp;pFIDVDVideoDecorder) ;<br>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;hr = m_pGraph-&gt;AddFilter(pFIDVDVideoDecorder,L"EleCard MPEG2 Video Decoder");</p>
<p>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;pIDVDVideoDecorderInpin = xMyFindPin(pFIDVDVideoDecorder,L"MPEG In",0,MEDIATYPE_Video);</p>
<p>&nbsp;&nbsp;if(pIDVDVideoDecorderInpin)<br>&nbsp;&nbsp;&nbsp;hr = m_pGraph-&gt;Connect(pPinOutTSSplitter_V,pIDVDVideoDecorderInpin);</p>
<p><br>&nbsp;&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;&nbsp;pIDVDVideoDecorderOutpin = xMyFindPin(pFIDVDVideoDecorder,L"Video Out",1,MEDIATYPE_Video);</p>
<p>&nbsp;}</p>
<p>&nbsp;</p>
<p><br>static const GUID CLSID_CEleCardMpegMultiplexer = <br>{0x136DCBF5,0x3874,0x4B70,0xAE,0x3E,0x15,0x99,0x7d,0x63,0x34,0xf7};<br>&nbsp;//&nbsp; 136DCBF5-&nbsp; 3874 - 4B70 - AE&nbsp;&nbsp; 3E - 15&nbsp;&nbsp; 99&nbsp;&nbsp; 7D&nbsp;&nbsp; 63&nbsp;&nbsp; 34&nbsp;&nbsp; F7</p>
<p>static const GUID CLSID_CEleCardVideoDec=<br>{0xf50b3f13,0x19c4,0x11cf,0xaa,0x9a,0x02,0x60,0x8c,0x9b,0xab,0xa2};<br>//{F50B3F13-19C4-11CF-&nbsp; AA9A-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02&nbsp;&nbsp; 60&nbsp;&nbsp; 8C&nbsp;&nbsp; 9B&nbsp;&nbsp; AB&nbsp;&nbsp; A2}</p>
<p>static const GUID CLSID_CMoonlightAudioDec=<br>{0xe32c3b01,0xc81b,0x4d01,0x8a,0xd4,0x2b,0x93,0xf7,0xfa,0x54,0x4c};</p>
<p>static const GUID CLSID_CH264VideoDecoder=<br>{0x6A270473,0x9994,0x4aeb,0x80,0x1f,0xbb,0x2c,0x4e,0x56,0xee,0x38};<br>// 6A270473-&nbsp; 9994-&nbsp; 4AEB-&nbsp; 80&nbsp;&nbsp; 1F-&nbsp; BB&nbsp;&nbsp; 2C&nbsp;&nbsp; 4E&nbsp;&nbsp; 56&nbsp;&nbsp; EE&nbsp;&nbsp; 38}<br></p>
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-10-23 16:37 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/10/23/99306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>directshow,filter: 什么时候调用 m_pGraphBuilder-&gt;RemoveFilter</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/10/21/99262.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Wed, 21 Oct 2009 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/10/21/99262.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99262.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/10/21/99262.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99262.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99262.html</trackback:ping><description><![CDATA[<p><br>directshow,filter: 什么时候调用 m_pGraphBuilder-&gt;RemoveFilter</p>
<p>code如下： 如果用下列函数，调用系统自带的File Source，就无需 调用 m_pGraph-&gt;RemoveFilter，只要</p>
<p>调用 pFIFileSource-&gt;release();就可以了。</p>
<p>但是，如果不是系统的，必需用m_pGraphBuilder-&gt;RemoveFilter（），否则，filter的析构函数不会被调</p>
<p>用。</p>
<p><br>if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = CoCreateInstance(CLSID_AsyncSample, NULL, CLSCTX_INPROC, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IBaseFilter, (LPVOID *)</p>
<p>&amp;pFIFileSource) ;<br>&nbsp;if (SUCCEEDED(hr))<br>&nbsp;&nbsp;hr = m_pGraphBuilder-&gt;AddFilter(pFIFileSource,L"Sample File Source");</p>
<p>&nbsp;IFileSourceFilter *pAVIFileSource = NULL;</p>
<p>&nbsp;if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = pFIFileSource-&gt;QueryInterface(IID_IFileSourceFilter,(void **)</p>
<p>&amp;pAVIFileSource);</p>
<p><br>同样： <br>if (SUCCEEDED(hr))&nbsp;<br>&nbsp;&nbsp;hr = CoCreateInstance(CLSID_MYSocketSource, NULL, CLSCTX_INPROC, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IBaseFilter, (LPVOID *)</p>
<p>&amp;pFIFileSource) ;<br>&nbsp;if (SUCCEEDED(hr))<br>&nbsp;&nbsp;hr = m_pGraphBuilder-&gt;AddFilter(pFIFileSource,L"MY Socket Source");</p>
<p><br>...<br>最后必需用m_pGraphBuilder-&gt;RemoveFilter（），否则，filter的析构函数不会被调用。否则有很大的内</p>
<p>存泄露。</p>
<p>不知道是什么原因：</p>
<p>因为&nbsp; <a href="http://www.directshow.cn/">www.directshow.cn</a>： 这个网址不行了，所以贴出下列code，请大家分享。<br><br><br>HRESULT ConnectPins( IGraphBuilder* pGraphBuilder,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBaseFilter* pOutput, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBaseFilter* pInput, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nOutIndex, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nInIndex)<br>{<br>&nbsp;HRESULT hr = NOERROR;<br>&nbsp;ULONG cFetched = 0;<br>&nbsp;IEnumPins* pEnumPins = 0;<br>&nbsp;IPin* pPinOutput = 0;<br>&nbsp;IPin* pPinInput = 0;</p>
<p>&nbsp;//enum output filter pins.<br>&nbsp;hr = pOutput-&gt;EnumPins(&amp;pEnumPins);<br>&nbsp;if(FAILED(hr))<br>&nbsp;{<br>&nbsp;&nbsp;return hr;<br>&nbsp;}<br>&nbsp;//if the pin to connect is not the first one, we must skip nOutIndex-1 pins.<br>&nbsp;if(nOutIndex&gt;1)<br>&nbsp;{<br>&nbsp;&nbsp;hr = pEnumPins-&gt;Skip(nOutIndex-1);<br>&nbsp;&nbsp;if(FAILED(hr))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;pEnumPins-&gt;Release();<br>&nbsp;&nbsp;&nbsp;return hr;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;//now we can get the output pin we wanted.<br>&nbsp;hr = pEnumPins-&gt;Next(1,&amp;pPinOutput,&amp;cFetched);<br>&nbsp;if(FAILED(hr))<br>&nbsp;{<br>&nbsp;&nbsp;pEnumPins-&gt;Release();<br>&nbsp;&nbsp;return hr;<br>&nbsp;}<br>&nbsp;pEnumPins-&gt;Release();</p>
<p>&nbsp;//enum input filter pins.<br>&nbsp;hr = pInput-&gt;EnumPins(&amp;pEnumPins);<br>&nbsp;if(FAILED(hr))<br>&nbsp;{<br>&nbsp;&nbsp;pPinOutput-&gt;Release();<br>&nbsp;&nbsp;return hr;<br>&nbsp;}<br>&nbsp;//if input pin is not the first to connect, we must skip nInIndex-1 pins.<br>&nbsp;if(nInIndex&gt;1)<br>&nbsp;{<br>&nbsp;&nbsp;hr = pEnumPins-&gt;Skip(nInIndex-1);<br>&nbsp;&nbsp;if( FAILED(hr) )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;pPinOutput-&gt;Release();<br>&nbsp;&nbsp;&nbsp;pEnumPins-&gt;Release();<br>&nbsp;&nbsp;&nbsp;return hr;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;//now we can get the input pin we wanted.<br>&nbsp;hr = pEnumPins-&gt;Next(1,&amp;pPinInput,&amp;cFetched);<br>&nbsp;if(FAILED(hr))<br>&nbsp;{<br>&nbsp;&nbsp;pPinOutput-&gt;Release();<br>&nbsp;&nbsp;pEnumPins-&gt;Release();<br>&nbsp;&nbsp;return hr;<br>&nbsp;}<br>&nbsp;pEnumPins-&gt;Release();</p>
<p>&nbsp;//now connect from output pin to input pin.<br>&nbsp;hr = pGraphBuilder-&gt;Connect(pPinOutput,pPinInput);<br>&nbsp;pPinOutput-&gt;Release();<br>&nbsp;pPinInput-&gt;Release();<br>&nbsp;return hr;<br>}<br>IPin* xMyFindPin(IBaseFilter *pFilter, const WCHAR achName[])<br>{<br>&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFound = FALSE;<br>&nbsp;IEnumPins&nbsp; *pEnum;<br>&nbsp;IPin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pPin;<br>&nbsp;PIN_INFO pininfo;</p>
<p>&nbsp;if(pFilter==NULL)<br>&nbsp;&nbsp;return NULL;<br>&nbsp;pFilter-&gt;EnumPins(&amp;pEnum);<br>&nbsp;while(pEnum-&gt;Next(1, &amp;pPin, 0) == S_OK)<br>&nbsp;{<br>&nbsp;&nbsp;pPin-&gt;QueryPinInfo(&amp;pininfo);<br>&nbsp;&nbsp;pininfo.pFilter-&gt;Release();<br>&nbsp;&nbsp;if (bFound = (0 == wcscmp(pininfo.achName,achName)))<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;pPin-&gt;Release();<br>&nbsp;}<br>&nbsp;pEnum-&gt;Release();<br>&nbsp;return (bFound ? pPin : 0);&nbsp; <br>}<br>static const GUID&nbsp; CLSID_NULL_USER1=<br>{0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};</p>
<p>HRESULT GetUnconnectedPin( IBaseFilter *pFilter,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PIN_DIRECTION PinDir,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPin **ppPin,GUID gMajortype,WCHAR *achName)<br>{<br>&nbsp;*ppPin = 0;<br>&nbsp;IEnumPins *pEnum = 0;<br>&nbsp;IPin *pPin = 0;<br>&nbsp;HRESULT hr = pFilter-&gt;EnumPins( &amp;pEnum );<br>&nbsp;if( FAILED( hr ) )<br>&nbsp;{<br>&nbsp;&nbsp;return hr;<br>&nbsp;}<br>&nbsp;while( pEnum-&gt;Next( 1, &amp;pPin, NULL ) == S_OK )<br>&nbsp;{<br>&nbsp;&nbsp;PIN_DIRECTION ThisPinDir;<br>&nbsp;&nbsp;pPin-&gt;QueryDirection( &amp;ThisPinDir );<br>&nbsp;&nbsp;if( ThisPinDir == PinDir )<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;IPin *pTmp = 0;<br>&nbsp;&nbsp;&nbsp;hr = pPin-&gt;ConnectedTo( &amp;pTmp );<br>&nbsp;&nbsp;&nbsp;if( SUCCEEDED( hr ) )<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;pTmp-&gt;Release( );<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;PIN_INFO pininfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;pPin-&gt;QueryPinInfo(&amp;pininfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;pininfo.pFilter-&gt;Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;if(achName &amp;&amp; (wcslen(achName)&gt;= wcslen(pininfo.achName)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcscpy(achName,pininfo.achName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if(gMajortype==CLSID_NULL_USER1)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEnum-&gt;Release( );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ppPin = pPin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return S_OK;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumMediaTypes* pTypeEnum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr = pPin-&gt;EnumMediaTypes (&amp;pTypeEnum);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr =pTypeEnum-&gt;Reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AM_MEDIA_TYPE* pMediaType;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ul ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr = pTypeEnum-&gt;Next(1, &amp;pMediaType, &amp;ul) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (FAILED(hr) || 0 == ul) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTypeEnum-&gt;Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//pEnum-&gt;Release( );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pTmp)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTmp-&gt;Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pMediaType-&gt;majortype == gMajortype)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pMediaType-&gt;subtype == MEDIASUBTYPE_DVSD)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pTypeEnum-&gt;Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEnum-&gt;Release( );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ppPin = pPin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return S_OK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while (1) ;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;if(pTmp)<br>&nbsp;&nbsp;&nbsp;&nbsp;pTmp-&gt;Release();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;pPin-&gt;Release( );<br>&nbsp;}<br>&nbsp;pEnum-&gt;Release( );</p>
<p>&nbsp;return E_FAIL;<br>}</p>
<img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/62038.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/" target=_blank>TS,MPEG2,dvbc专家</a> 2009-10-21 13:36 <a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/21/directshow.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/21/directshow.html">http://www.cnitblog.com/dvb-dvb/archive/2009/10/21/directshow.html</a> 
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-10-21 13:36 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/10/21/99262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vlc学习计划（6~~9）</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/10/16/99263.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Fri, 16 Oct 2009 01:16:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/10/16/99263.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99263.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/10/16/99263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99263.html</trackback:ping><description><![CDATA[<p><br>&nbsp;第一部分 变量及宏定义<br>　　1．消息映射宏<br>　　 vlc_module_begin();<br>　　 &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br>　　vlc_module_end();<br>　　2．结构中包含函数<br>　　 struct input_thread_t<br>　　{<br>　　 VLC_COMMON_MEMBERS<br>　　 /* Thread properties */<br>　　 vlc_bool_t b_eof;<br>　　 vlc_bool_t b_out_pace_control;<br>　　 /* Access module */<br>　　 module_t * p_access;<br>　　 ssize_t (* pf_read ) ( input_thread_t *, byte_t *, size_t );<br>　　 int (* pf_set_program )( input_thread_t *, pgrm_descriptor_t * );<br>　　 int (* pf_set_area )( input_thread_t *, input_area_t * );<br>　　 void (* pf_seek ) ( input_thread_t *, off_t );<br>　　}<br>　　3．宏与换行符妙用<br>　　#define VLC_COMMON_MEMBERS /** \name VLC_COMMON_MEMBERS * these members are common for all vlc objects */ <a>/**@{*/</a> int i_object_id; int </p>
<p>i_object_type; char *psz_object_type; char *psz_object_name; /** Just a reminder so that people don't cast garbage */ int </p>
<p>be_sure_to_add_VLC_COMMON_MEMBERS_to_struct; <a>/**@}*/</a><br>　　#define VLC_OBJECT( x ) \<br>　　((vlc_object_t *)(x))+<br>　　0*(x)- be_sure_to_add_VLC_COMMON_MEMBERS_to_struct<br>　　struct vlc_object_t<br>　　{<br>　　 VLC_COMMON_MEMBERS<br>　　};//定义一个结构来使用宏定义的公共成员<br>　　4．定义导出函数<br>　　#ifndef __PLUGIN__<br>　　# define VLC_EXPORT( type, name, args ) type name args<br>　　#else<br>　　# define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_<br>　　 extern module_symbols_t* p_symbols;<br>　　#endif<br>　　5．定义回调函数<br>　　typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */<br>　　 char const *, /* variable name */<br>　　 vlc_value_t, /* old value */<br>　　 vlc_value_t, /* new value */<br>　　 void * ); /* callback data */<br>　　6．函数作为参数的定义方式<br>　　 Int Fun(int n,int (*pf)(int ,int),char *pstr)<br>　　{ int j =10;<br>　　pf(n,j);<br>　　}<br>　　7．回调函数的声明<br>　　必须声明为global，或者static<br>　　Int vlc_callback_t (int ,int)<br>　　{。。。。。。。。。。。}<br>　　<br>　　8．回调函数的使用<br>　　 Fun(0, vlc_callback_t,&#8221;test&#8221;);<br>　　9．函数表达式<br>　　#define input_BuffersInit(a) __input_BuffersInit(VLC_OBJECT(a))<br>　　void * __input_BuffersInit( vlc_object_t * );<br>　　#define module_Need(a,b,c,d) __module_Need(VLC_OBJECT(a),b,c,d)<br>　　VLC_EXPORT( module_t *, __module_Need, ( vlc_object_t *, const char *, const char *, vlc_bool_t ) );<br>　　10．定义函数<br>　　 /* Dynamic array handling: realloc array, move data, increment position */<br>　　#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) do { if( i_oldsize ) { (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) </p>
<p>); } else { (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) ); } if( (i_oldsize) - (i_pos) ) { memmove( (p_ar) + (i_pos) + 1, (p_ar) + </p>
<p>(i_pos), ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); } (p_ar)[i_pos] = elem; (i_oldsize)++; } while( 0 )<br>　　应用为：<br>　　 INSERT_ELEM( p_new- p_libvlc- pp_objects,<br>　　 p_new- p_libvlc- i_objects,<br>　　 p_new- p_libvlc- i_objects,<br>　　 p_new );<br>　　11．改变地址的方式传递其值<br>　　stream_t *input_StreamNew( input_thread_t *p_input )<br>　　{ stream_t *s = vlc_object_create( p_input, sizeof( stream_t ) );<br>　　 input_stream_sys_t *p_sys;<br>　　 if( s )<br>　　 {<br>　　 s- p_sys = malloc( sizeof( input_stream_sys_t ) );<br>　　 p_sys = (input_stream_sys_t*)s- p_sys;<br>　　 p_sys- p_input = p_input;<br>　　 }<br>　　return s;//注解：s- p_sys改变了<br>　　}<br>　　 第二部分 程序框架实现<br>　　1．播放列表文件src/playlist/playlist.c的线程<br>　　playlist_t * __playlist_Create ( vlc_object_t *p_parent )函数中创建的线程，线程函数为<br>　　static void RunThread ( playlist_t *p_playlist )<br>　　 线程思路分析：<br>　　 在RunThread里面执行循环，如果没有任务执行，则适当的延迟，如果接到p_playlist- i_status != PLAYLIST_STOPPED的条件，则调用PlayItem( </p>
<p>p_playlist )函数，在PlayItem( p_playlist )函数中从新创建输入线程。<br>　　通过void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command,int i_arg )接收来自GUI界面的各种命令，然后设置p_playlist- </p>
<p>i_status的状态，由该状态改变该播放列表文件主循环线程的执行。<br>　　2．输入文件SRC/INPUT/INPUT.C的输入线程<br>　　 input_thread_t *__input_CreateThread( vlc_object_t *p_parent,<br>　　 input_item_t *p_item )函数中创建的线程，线程函数为<br>　　static int RunThread( input_thread_t *p_input )<br>　　 线程思路分析：<br>　　由 input_thread_t结构的成员分析是接收文件流还是网络流，如果是文件流，则调用file module 的读函数(pf_read)和打开函数(--).如果是network 则打</p>
<p>开network module 的打开函数和读函数（pf_read)。<br>　　 在 RunThread线程函数中接收数据和调用demux 或者decode etc处理。<br>　　一旦产生新的输入，则在播放列表线程中会首先结束该输入线程，然后从新创建新的输入线程。<br>　　3．视频输出文件src/video_output/ video_output.c的线程<br>　　vout_thread_t * __vout_Create( vlc_object_t *p_parent,<br>　　 unsigned int i_width, unsigned int i_height,<br>　　 vlc_fourcc_t i_chroma, unsigned int i_aspect )函数中创建的线程，线程函数为<br>　　static void RunThread( vout_thread_t *p_vout)<br>　　线程思路分析：<br>　　 在RunThread里面执行循环，任务是显示视频。<br>　　4．在modules\gui\wxwindows\wxwindows.cpp中的GUI线程<br>　　static void Run( intf_thread_t *p_intf ) 函数中创建的线程，线程函数为<br>　　 static void Init( intf_thread_t *p_intf )<br>　　线程思路分析：<br>　　 在Init( intf_thread_t *p_intf )里面执行循环，创建新的GUI实例。Instance-》OnInit()（CreateDialogsProvider）-》DialogsProvider为运行的对话</p>
<p>框。<br>　　 接收网络文件的步骤<br>　　OnOpenNet( wxCommandEvent&amp; event )打开网络文件的步骤。打开OpenDialog对话框，点击Ok后调用OpenDialog::OnOk( wxCommandEvent&amp; WXUNUSED(event) </p>
<p>)函数，调用playlist_Command函数改变播放列表线程的状态。<br>　　 激活线程分析：<br>　　 在wxwindow.cpp中的消息映射中 set_callbacks( OpenDialogs, Close ); 则设置了module_t- pf_activate= OpenDialogs函数，<br>　　 在module.c 的__module_Need( vlc_object_t *p_this, const char *psz_capability,<br>　　 const char *psz_name, vlc_bool_t b_strict )<br>　　函数中用到了pf_activate激活GUI对话框；<br>　　 在video_output.c 的static void RunThread( vout_thread_t *p_vout)线程中，也用到了pf_activate激活GUI对话框；<br>　　5．开始所有module 的精髓<br>　　 消息映射宏<br>　　 vlc_module_begin();<br>　　 set_callbacks( NetOpen, NULL );<br>　　vlc_module_end();<br>　　然后设置模块结构的成员函数为：<br>　　#define set_callbacks( activate, deactivate ) p_submodule- pf_activate = activate; p_submodule- pf_deactivate = deactivate<br>　　在__module_Need函数中启动pf_activate 激活相应的module。</p>
<p><br>网络数据流接收处理分析<br>　　1、在input.c(src\input)文件中的主线程循环<br>　　 Thread in charge of processing the network packets and demultiplexing<br>　　RunThread( input_thread_t *p_input )<br>　　{<br>　　 InitThread( p_input ) ；<br>　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>　　 input_SelectES( p_input, p_input-&gt;stream.p_newly_selected_es );<br>　　 &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>　　 /* Read and demultiplex some data. */<br>　　 i_count = p_input-&gt;pf_demux( p_input );<br>　　}<br>　　2、在下列函数中：<br>　　分离出access , demux , name字符串 ;<br>　　根据分离出的access 字符串通过module_Need函数找到acess 指针模块；<br>　　根据分离出的demux 字符串通过module_Need函数找到demux 指针模块；<br>　　static int InitThread( input_thread_t * p_input )<br>　　{<br>　　 msg_Dbg( p_input, "access `%s', demux `%s', name `%s'",<br>　　 p_input-&gt;psz_access, p_input-&gt;psz_demux, p_input-&gt;psz_name );<br>　　 /* Find and open appropriate access module */<br>　　 p_input-&gt;p_access = module_Need( p_input, "access",<br>　　 p_input-&gt;psz_access, VLC_TRUE );<br>　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>　　 while( !input_FillBuffer( p_input ) )<br>　　 &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>　　 /* Find and open appropriate demux module */<br>　　 p_input-&gt;p_demux =<br>　　 module_Need( p_input, "demux",<br>　　 (p_input-&gt;psz_demux &amp;&amp; *p_input-&gt;psz_demux) ?<br>　　 p_input-&gt;psz_demux : "$demux",<br>　　 (p_input-&gt;psz_demux &amp;&amp; *p_input-&gt;psz_demux) ?<br>　　 VLC_TRUE : VLC_FALSE );<br>　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>　　}<br>　　3、在ps.c (module\demux\mpeg)文件中<br>　　a.通过消息映射宏赋值启动函数Activate；<br>　　b.通过函数Activate赋值p_input-&gt;pf_demux = Demux;<br>　　c. 通过函数module_Need( p_input, "mpeg-system", NULL, 0 ) 激活p_input-&gt;p_demux_data-&gt;mpeg.pf_read_ps( p_input, &amp;p_data )函数（pf_read_ps）</p>
<p>;<br>　　d.在InitThread函数中激活；<br>　　 static int Activate( vlc_object_t * p_this )<br>　　{<br>　　 /* Set the demux function */<br>　　p_input-&gt;pf_demux = Demux;<br>　　p_input-&gt;p_private = (void*)&amp;p_demux-&gt;mpeg;<br>　　 p_demux-&gt;p_module = module_Need( p_input, "mpeg-system", NULL, 0 );<br>　　}<br>　　4、在system.c (module\demux\mpeg)文件中<br>　　 赋值解码模块mpeg_demux_t的成员函数；<br>　　 static int Activate ( vlc_object_t *p_this )<br>　　{<br>　　 static mpeg_demux_t mpeg_demux =<br>　　 { NULL, ReadPS, ParsePS, DemuxPS, ReadTS, DemuxTS };<br>　　 mpeg_demux.cur_scr_time = -1;<br>　　 memcpy( p_this-&gt;p_private, &amp;mpeg_demux, sizeof( mpeg_demux ) );<br>　　 return VLC_SUCCESS;<br>　　}<br>　　并且申明函数static ssize_t ReadPS( input_thread_t * p_input, data_packet_t ** pp_data )；<br>　　5、在ps.c (module\demux\mpeg)文件中<br>　　Demux( input_thread_t * p_input )<br>　　{<br>　　i_result = p_input-&gt;p_demux_data-&gt;mpeg.pf_read_ps( p_input, &amp;p_data );<br>　　 p_input-&gt;p_demux_data-&gt;mpeg.pf_demux_ps( p_input, p_data );<br>　　}<br>　　进行读取数据和分离工作；<br>　　6、在system.c (module\demux\mpeg)文件中<br>　　数据走向图如下<br>　　ReadPS-&gt; PEEK-&gt; input_Peek(src\input\input_ext-plugins.c)-&gt; input_FillBuffert 通过 i_ret = p_input-&gt;pf_read( p_input,<br>　　 (byte_t *)p_buf + sizeof(data_buffer_t)<br>　　 + i_remains,<br>　　 p_input-&gt;i_bufsize );<br>　　input_thread_t结构的pf_read函数成员如果是为udp.c(modules\access)的RTPChoose函数<br>　　则在开启access（UDP 模块）时通过module_need 激活；<br>　　激活网络读数据模块 RTPChoose（modules\access\ udp.c)-&gt;Read-&gt;net_Read(src\misc\net.c)；<br>　　7、在input_programs.c(src\input)文件中<br>　　 运行解码器对ES流解码<br>　　 int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es )<br>　　{<br>　　 p_es-&gt;p_dec = input_RunDecoder( p_input, p_es );<br>　　<br>　　}<br>　　input_SelectES（src\input\input_programs.c）-&gt;input_RunDecoder（src \input\input_dec.c）-&gt;DecoderThread-&gt;DecoderDecode -</p>
<p>&gt;vout_DisplayPicture</p>
<p>&nbsp;</p>
<p><br>从接收到数据流到播放视频的过程分析</p>
<p>&nbsp;&nbsp; 从网络接收到流-&gt;对数据流进行视频和音频分离-&gt;对视频用解码器解码-&gt;显示解码后的视频流</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 视频显示部分走势线：分离-&gt;解码-&gt;新的VOUT缓冲区-&gt;VOUT线程</p>
<p>Demux(modules\demux\mpeg\ps.c)-&gt;DemuxPs(modules\demux\mpeg\system.c)-&gt; ParsePS-&gt;input_SelectES(src\input\input_programs.c)-&gt;input_RunDecoder</p>
<p>(src\input\input_dec.c)-&gt;CreateDecoder-&gt;</p>
<p>vout_new_buffer-&gt;vout_Request(src\video_output\video_output.c)-&gt;vout_Create-&gt;RunThread-&gt;vout_RenderPicture(src\video_output\vout_pictures.c)-</p>
<p>&gt;pf_display</p>
<p>&nbsp;</p>
<p>注意：p_dec-&gt;pf_vout_buffer_new = vout_new_buffer的pf_vout_buffer_new在ffmpeg_NewPictBuf（modules\codec\ffmpeg\video.c）函数中激活</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 解码部分走势线：</p>
<p>Demux(modules\demux\mpeg\ps.c)-&gt;DemuxPs(modules\demux\mpeg\system.c)-&gt; ParsePS-&gt;input_SelectES(src\input\input_programs.c)-&gt;input_RunDecoder</p>
<p>(src\input\input_dec.c)-&gt;CreateDecoder-&gt;</p>
<p><br>DecoderThread</p>
<p>&nbsp; 注意：在解码线程中对数据流（AUDIO 或者VIDEO）进行解码</p>
<p>详细资料 <a href="http://developers.videolan.org/vlc/">http://developers.videolan.org/vlc/</a>&nbsp;&nbsp;&nbsp; VLC API documentation&nbsp; 或者VLC developer documentation</p>
<p>&nbsp;<br>Chapter 5.&nbsp; The video output layer<br>Data structures and main loop</p>
<p>Important data structures are defined in include/video.h and include/video_output.h. The main data structure is picture_t, which describes </p>
<p>everything a video decoder thread needs. Please refer to this file for more information. Typically, p_data will be a pointer to YUV planar </p>
<p>picture.</p>
<p>Note also the subpicture_t structure. In fact the VLC SPU decoder only parses the SPU header, and converts the SPU graphical data to an </p>
<p>internal format which can be rendered much faster. So a part of the "real" SPU decoder lies in src/video_output/video_spu.c.</p>
<p>The vout_thread_t structure is much more complex, but you needn't understand everything. Basically the video output thread manages a heap of </p>
<p>pictures and subpictures (5 by default). Every picture has a status (displayed, destroyed, empty...) and eventually a presentation time. The </p>
<p>main job of the video output is an infinite loop to : [this is subject to change in the near future]</p>
<p>&nbsp;&nbsp; 1.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Find the next picture to display in the heap.<br>&nbsp;&nbsp; 2.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Find the current subpicture to display.<br>&nbsp;&nbsp; 3.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Render the picture (if the video output plug-in doesn't support YUV overlay). Rendering will call an optimized YUV plug-in, which will </p>
<p>also do the scaling, add subtitles and an optional picture information field.<br>&nbsp;&nbsp; 4.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep until the specified date.<br>&nbsp;&nbsp; 5.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display the picture (plug-in function). For outputs which display RGB data, it is often accomplished with a buffer switching. p_vout-</p>
<p>&gt;p_buffer is an array of two buffers where the YUV transform takes place, and p_vout-&gt;i_buffer_index indicates the currently displayed buffer.<br>&nbsp;&nbsp; 6.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Manage events. </p>
<p>Methods used by video decoders</p>
<p>The video output exports a bunch of functions so that decoders can send their decoded data. The most important function is vout_CreatePicture </p>
<p>which allocates the picture buffer to the size indicated by the video decoder. It then just needs to feed (void *) p_picture-&gt;p_data with the </p>
<p>decoded data, and call vout_DisplayPicture and vout_DatePicture upon necessary.</p>
<p>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; picture_t * vout_CreatePicture ( vout_thread_t *p_vout, int i_type, int i_width, int i_height ) : Returns an allocated picture buffer. </p>
<p>i_type will be for instance YUV_420_PICTURE, and i_width and i_height are in pixels.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Warning</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If no picture is available in the heap, vout_CreatePicture will return NULL.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_LinkPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Increases the refcount of the picture, so that it doesn't get accidently </p>
<p>freed while the decoder still needs it. For instance, an I or P picture can still be needed after displaying to decode interleaved B pictures.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_UnlinkPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Decreases the refcount of the picture. An unlink must be done for every </p>
<p>link previously made.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_DatePicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Gives the picture a presentation date. You can start working on a picture </p>
<p>before knowing precisely at what time it will be displayed. For instance to date an I or P picture, you must wait until you have decoded all </p>
<p>previous B pictures (which are indeed placed after - decoding order != presentation order).<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Tells the video output that a picture has been completely decoded and </p>
<p>is ready to be rendered. It can be called before or after vout_DatePicture.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_DestroyPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Marks the picture as empty (useful in case of a stream parsing error).<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subpicture_t * vout_CreateSubPicture ( vout_thread_t *p_vout, int i_channel, int i_type ) : Returns an allocated subpicture buffer. </p>
<p>i_channel is the ID of the subpicture channel, i_type is DVD_SUBPICTURE or TEXT_SUBPICTURE, i_size is the length in bytes of the packet.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_DisplaySubPicture ( vout_thread_t *p_vout, subpicture_t *p_subpic ) : Tells the video output that a subpicture has been completely </p>
<p>decoded. It obsoletes the previous subpicture.<br>&nbsp;&nbsp;&nbsp; *</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vout_DestroySubPicture ( vout_thread_t *p_vout, subpicture_t *p_subpic ) : Marks the subpicture as empty. </p>
<p>&nbsp;</p>
<p><br>VLC（五） 视频播放的基本原理</p>
<p>&nbsp;&nbsp;&nbsp; 当初Roger看VLC代码花了不少时间，其中很大的原因是不太了解视频播放的基本原理。现在看来，几乎所有的视频播放器，如VLC、MPlayer、 Xine，包括</p>
<p>DirectShow，在播放视频的原理和架构上都是非常相似的，理解这个对理解VLC的源码会有事半功倍的效果。</p>
<p>&nbsp;&nbsp;&nbsp; 大致的来说，播放一个视频分为4个步骤：</p>
<p>&nbsp;&nbsp;&nbsp; 1.&nbsp; acess 访问，或者理解为接收、获取、得到</p>
<p>&nbsp;&nbsp;&nbsp; 2. demux 解复用，就是把通常合在一起的音频和视频分离(还有可能的字幕)&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 3. decode 解码，包括音频和视频的解码</p>
<p>&nbsp;&nbsp;&nbsp; 4. output 输出，也分为音频和视频的输出（aout和vout）</p>
<p>&nbsp;&nbsp;&nbsp; 拿播放一个UDP组播的MPEG TS流来说吧，access部分负责从网络接收组播流，放到VLC的内存缓冲区中，access模块关注IP协议，如是否IPv6、组播地址、组</p>
<p>播协议、端口等信息；如果检测出来是RTP协议（RTP协议在UDP头部简单得加上了固定12个字节的信息），还要分析RTP头部信息。这部分可以参看VLC源码 </p>
<p>/modules/access/udp.c 。在同目录下还可以看到大量的access模块，如file、http、dvd、ftp、smb、tcp、dshow、mms、v4l&#8230;等等</p>
<p>&nbsp;&nbsp;&nbsp; 而demux部分首先要解析TS流的信息。TS格式是MPEG2协议的一部分，概括地说，TS通常是固定188字节的一个packet，一个TS流可以包含多个program（节目）</p>
<p>，一个program又可以包含多个视频、音频、和文字信息的ES流；每个ES流会有不同的PID标示。而又为了可以分析这些ES流，TS有一些固定的PID用来间隔发送</p>
<p>program和es流信息的表格：PAT和PMT表。关于TS格式的详细信息可以去google一下。</p>
<p>&nbsp;&nbsp;&nbsp; VLC专门做了一个独立的库libdvbpsi来解析和编码TS流，而调用它的代码可以参见VLC源码 /modules/demux/ts.c。</p>
<p>&nbsp;&nbsp;&nbsp; 其实之所以需要demux，是因为音视频在制作的时候实际上都是独立编码的，得到的是分开的数据，为了传输方便必须要用某种方式合起来，这就有了各种封</p>
<p>装格式也就有了demux。</p>
<p>&nbsp;&nbsp;&nbsp; demux分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间，而且冗余度较高的数据，通常在制作的时候就会进</p>
<p>行某种压缩。这就是我们熟知的音视频编码格式，包括MPEG1（VCD）、MPEG2（DVD）、MPEG4、H.264、rmvb等等。音视频解码器的作用就是把这些压缩了的数据还</p>
<p>原成原始的音视频数据。VLC解码MPEG2使用了一个独立的库libmpeg2，调用它的源文件是 /modules/codec/libmpeg2.c。VLC关于编解码的模块都放</p>
<p>在/modules/codec目录下，其中包括著名的庞大的 ffmpeg。</p>
<p>&nbsp;&nbsp;&nbsp; 解码器，例如视频解码器输出的是一张一张的类似位图格式的图像，但是要让人从屏幕看得到，还需要一个视频输出的模块。当然可以像一个Win32窗口程序</p>
<p>那样直接把图像画到窗口DC上——VLC的一个输出模块WinGDI就是这么干的，但是通常这太慢了，而且消耗大量的CPU。在Windows下比较好的办法是用DirectX的接</p>
<p>口，会自动调用显卡的加速功能。</p>
<p>&nbsp;&nbsp;&nbsp; 这样的功能分解使得模块化更容易一点，每个模块住需要专注于自己的事；从整体来说功能强大而且灵活。</p>
<p>&nbsp;&nbsp;&nbsp; 但是事情总是不会那么简单。就拿access来说，媒体的访问是分层的，如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多个层次的协议。有些视频格式包括了</p>
<p>传输、封装格式和编辑码格式如MPEG系列，有些封装格式是独立的容器，但是很多人会误解它是编解码格式，如mkv、avi这些。</p>
<p>&nbsp;&nbsp;&nbsp; 音频和视频在demux之后就是独立的，但是需要有一套机制把它们同步起来。同时我们需要有一套机制来控制速度、暂停、停止、跳进，获取各种媒体信息，</p>
<p>这些都是很复杂而又很重要的事情。</p>
<p>&nbsp;&nbsp;&nbsp; 另外也许需要在某个地方插入一些修改，来实现某种效果。如音频的EQ，视频的亮度调整之类的，VLC专门设计了access_filter、audio_filter和</p>
<p>video_filter类型的模块来做这一类事情。</p>
<p>&nbsp;&nbsp;&nbsp; VLC比较独特的地方是集成了原来的VLS的功能，这依赖于VLC中stream_output类型的模块，它们可以把正在播放的视频以某种方式重新转码和发送出去，如</p>
<p>http、UDP、文件等等。</p>
<p>&nbsp;&nbsp;&nbsp; MPlayer的结构与此是类似的，如/stream目录对应的是access的功能，/mpdemux对应的demux功能，/libmpcodecs是解码器，/libvo和/libao2分别是视频和音</p>
<p>频的输出。</p>
<p>&nbsp;&nbsp;&nbsp; DirectShow也是类似的，不过分类更多一些更复杂一点。DirectShow里面的模块叫做&#8220;filter&#8221;，filter之间通过&#8221;pin&#8221;来连接。access的模块对应于</p>
<p>DirectShow中的Source FIlter，这一类Filter只有输出pin没有输入pin。demux模块对应于splitter filter，这种filter有一个输入pin，多个输出pin。解码模</p>
<p>块是一类transform filter，有一个输入pin、一个输出pin，输出模块对应于readering filter，有一个输入pin，没有输出pin。当然transform filter不一定是</p>
<p>解码器，也可能是某种其他的处理。</p>
<p>&nbsp;&nbsp;&nbsp; 回到VLC的话题。每一类的模块数量都很多，那么在打开某一个视频时，VLC如何决定采用哪一个呢？哈哈，这个以后再说 ^_^</p>
<p>&nbsp;&nbsp;&nbsp; 另外给出一个VLC的API Document，有点老了不过挺值得一看的，在VLC wiki上找不到了，就贴出来：<a href="http://rogerfd.cn/doc/vlcapi.htm">http://rogerfd.cn/doc/vlcapi.htm</a></p>
<p>&nbsp;&nbsp; </p>
<p>————————————————————————</p>
<p>作者： roger</p>
<p>Blog： <a href="http://rogerfd.cn/">http://rogerfd.cn</a></p>
<p>Email：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#103;&#101;&#114;&#57;&#57;&#55;&#48;&#55;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">roger99707@163.com</a></p>
<p>本文欢迎转载和引用，请保留本说明并注明出处</p>
<img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/61895.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/" target=_blank>TS,MPEG2,dvbc专家</a> 2009-10-16 09:16 <a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/16/61895.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/16/61895.html">http://www.cnitblog.com/dvb-dvb/archive/2009/10/16/61895.html</a> 
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-10-16 09:16 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/10/16/99263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vlc学习计划（1~~5）</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/10/12/99264.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 12 Oct 2009 01:07:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/10/12/99264.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99264.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/10/12/99264.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99264.html</trackback:ping><description><![CDATA[<p><br>一 videolan-howto-en-html<br>　　该文档完全描述了VideoLAN "流"的解决方法.<br>　　VideoLAN 项目包括两个软件.<br>　　 1) VLC:以前是视频流接收的客户端,但是现在也可以作为服务端工作.<br>　　 2) VLS:视频服务端,能发送 MPEG-1, MPEG-2 and MPEG-4 files, DVDs, digital satellite </p>
<p>channels, digital terrestial television channels and live videos on the network in unicast or </p>
<p>multicast.<br>　　1.VLC 在REDHAT 下的安装<br>　　从下面的链接中下载 vlc的包和包所需要的库,把他们都放在同一个目录.<br>　　<a href="http://www.videolan.org/vlc/download-redhat.html">http://www.videolan.org/vlc/download-redhat.html</a><br>　　<br>　　 源代码安装:<br>　　 源代码安装需要的库如下:<br>　　 libdvbpsi (compulsory) ,<br>　　 mpeg2dec (compulsory) ,<br>　　 libdvdcss if you want to be able to read encrypted DVDs ,<br>　　 libdvdplay if you want to have DVD menu navigation ,<br>　　 a52dec if you want to be able to decode the AC3 (i.e. A52) sound format often used in </p>
<p>DVDs ,<br>　　 ffmpeg, libmad, faad2 if you want to read MPEG 4 / DivX files ,<br>　　 libogg &amp; libvorbis if you want to read Ogg Vorbis files .<br>　　2.VLC在命令行下接收流<br>　　Receive an unicast stream<br>　　% vlc -vvv udp:<br>　　Receive a multicast stream<br>　　% vlc -vvv udp:@239.255.12.42<br>　　where 239.255.12.42 is the multicast IP address you want to join.<br>　　Receive an HTTP/FTP/MMS stream<br>　　Use one of the following command lines:<br>　　% vlc -vvv <a href="http://example/stream.xyz">http://example/stream.xyz</a><br>　　where <a href="http://example/stream.xyz">http://example/stream.xyz</a> is the HTTP address of the stream;<br>　　% vlc -vvv <a href="ftp://example/stream.xyz">ftp://example/stream.xyz</a><br>　　where <a href="ftp://example/stream.xyz">ftp://example/stream.xyz</a> is the FTP address of the stream;<br>　　% vlc -vvv ms://viptvr.yacast.fr/encoderfranceinfo<br>　　where mms://viptvr.yacast.fr/encoderfranceinfo is the MMS address of the stream.<br>　　Receive a RTP stream available through RTSP<br>　　% vlc -vvv rtsp://www.hardradio.com/tonbeme.mov<br>　　where rtsp://www.hardradio.com/tonbeme.mov is the address of the stream.<br>　　Receive a stream described by an SDP file<br>　　% vlc -vvv <a href="http://server.example.org/stream.sdp">http://server.example.org/stream.sdp</a><br>　　3.VLC在命令行下发送流<br>　　% vlc -vvv video1.xyz --sout udp:192.168.0.42 --ttl 12<br>　　where:<br>　　 *video1.xyz is the file you want to stream,<br>　　 *192.168.0.42 is either:<br>　　 o the IP address of the machine you want to unicast to;<br>　　 o or the DNS name the machine you want to unicast to;<br>　　 o or a multicast IP address.<br>　　 *12 is the value of the TTL (Time To Live) of your IP packets (which means that the </p>
<p>stream will be able to cross 11 routers).<br>　　If you want to stream the file continuously, add the --loop option.<br>　　4.VLC 高级应用(VLC's stream output (transcoding, multiple streaming, etc...))<br>　　 语法: Please refer to the" command line interface" chapter of the "VLC user guide "to </p>
<p>learn the syntax of VLC's stream output.<br>　　 例子:<br>　　 ----编码方面的例子<br>　　Transcode the input stream and send it to a multicast IP address with the associated SAP </p>
<p>announce:<br>　　% vlc -vvv input_stream --sout '#transcode</p>
<p>{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:<br>　　standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}'<br>　　Display the input stream, transcode it and send it to a multicast IP address with the </p>
<p>associated SAP announce:<br>　　% vlc -vvv input_stream --sout '#duplicate{dst=display,dst=<br>　　"transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:<br>　　standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}"}'<br>　　Transcode the input stream, display the transcoded stream and send it to a multicast IP </p>
<p>address with the associated SAP announce:<br>　　% vlc -vvv input_stream --sout '#transcode</p>
<p>{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:<br>　　duplicate{dst=display,dst=standard</p>
<p>{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}}'<br>　　--多种流的例子<br>　　Send a stream to a multicast IP address and a unicast IP address:<br>　　% vlc -vvv input_stream --sout '#duplicate{dst=<br>　　standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"},<br>　　dst=standard{access=udp,mux=ts,url=192.168.1.2}}'<br>　　Display the stream and send it to two unicast IP addresses:<br>　　% vlc -vvv input_stream --sout '#duplicate{dst=display,dst=<br>　　standard{access=udp,mux=ts,url=192.168.1.12},<br>　　dst=standard{access=udp,mux=ts,url=192.168.1.42}}'<br>　　Send parts of a multiple program input stream:<br>　　% vlc -vvv multiple_program_input_stream<br>　　--sout '#duplicate{dst=standard</p>
<p>{access=udp,mux=ts,url=239.255.12.42},select="program=12345",<br>　　dst=standard{access=udp,mux=ts,url=239.255.12.43}, select="video,program=1234-2345"}'<br>　　This command sends the program of the input stream which id is 12345 to 239.255.12.42 and </p>
<p>all video programs with id between 1234 and 2345 to 239.255.12.43.<br>　　Transcoding and multiple streaming<br>　　Transcode the input stream, display the transcoded stream and send it to a multicast IP </p>
<p>address with the associated SAP announce and an unicast IP address:<br>　　% vlc -vvv input_stream --sout '#transcode</p>
<p>{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:<br>　　duplicate{dst=display,dst=standard</p>
<p>{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"},<br>　　dst=standard{access=udp,mux=ts,url=192.168.1.2}}'<br>　　Display the input stream, transcode it and send it to two unicast IP addresses:<br>　　% vlc -vvv input_stream --sout '#duplicate{dst=display,<br>　　dst="transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:<br>　　duplicate{dst=standard{access=udp,mux=ts,url=192.168.1.2},<br>　　dst=standard{access=udp,mux=ts,url=192.168.1.12}"}'<br>　　Send the input stream to a multicast IP address and the transcoded stream to another </p>
<p>multicast IP address with the associated SAP announces:<br>　　% vlc -vvv input_stream --sout '#duplicate{dst=<br>　　standard{access=udp,mux=ts,url=239.255.1.2,sap,name="OriginalStream"},<br>　　dst="transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:<br>　　standard{access=udp,mux=ts,url=239.255.1.3,sap,name="TranscodedStream"}"}'<br>&nbsp;<br>此文章为转载，原文出处为，<a href="http://www.wangchao.net.cn/bbsdetail_58052.html">http://www.wangchao.net.cn/bbsdetail_58052.html</a></p>
<p>&nbsp;<br>.1.在RH9上的安装需要<br>　　 1).RH9的升级包.<br>　　 2).FC2的RPM包<br>　　 详细说明清参见:http://www.videolan.org/vlc/download-redhat.html<br>　　 以上VLC 版本为:0.7.2<br>　　2.下载RH9的升级包<br>　　 <a href="http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/redhat/rh9/">http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/redhat/rh9/</a><br>　　3.下载FC2的RPM包<br>　　 <a href="http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/fedora/fc2/">http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/fedora/fc2/</a><br>　　 二进制包为: vlc-binary.tar.gz<br>　　4.将RH9的升级包和 vlc-binary.tar.gz放在同一个目录.<br>　　 ~#tar -zxvf vlc-binary.tar.gz<br>　　 ~#tar -zxvf redhat9-updates.tar.gz<br>　　5.安装<br>　　 ~#rpm -Uv vlc/* --force --nodeps<br>　　6.使用<br>　　 1) 在REDHAT-&gt;AUDIO AND VIDEO-&gt;VLAN MEDIA PLAYER 可以打开<br>　　 2)或者在BASH 中打开vlc,使用命令行选项直接启动,参见videolan-how-to-en.<br>　　7.未测试出的功能<br>　　 在局域网内的同一网段内的两台PC上不能用MULTICAST 进行VIDEO<br>　　 传输.</p>
<p><br>一．rm格式的播放器：<br>　　下载地址：<a href="http://www.real.com/linux/?src=020923home_cn_cn">http://www.real.com/linux/?src=020923home_cn_cn</a><br>　　安装方式：~#./realplayer.bin<br>　　 打开方式：<br>　　命令行：~#realplay<br>　　 ＧＵＩ：redhat-&gt;audio and video-&gt;other app-&gt;realplayer<br>　　二．mp3 播放器：xmms-1.2.8.tar.gz<br>　　 安装方式：./configure &amp; make &amp;make install<br>　　三． 经验:从源码编译安装Mplayer 1.0pre5<br>　　来自：<a href="http://yangchengkai.blogchina.com/blog/refer.177855.html">http://yangchengkai.blogchina.com/blog/refer.177855.html</a><br>　　Mplayer/gmplayer是目前Linux下广范使用的媒体播放器,一个字--强!但由于它一般以Tarball的格式</p>
<p>发布,安装比较BT,许多朋友都在找rpm的版本,但来源不同的rpm版本往往无法自己定制许多特性,比如中文</p>
<p>支持等,而且容易造成rpm包的依赖问题,所以有不少朋友最终对 Mplayer又爱又恨...-_-!!<br>　　其实自己编译mplayer并不是什么太难的事,只是过程比较麻烦,但基本还是遵循tarball的安装步骤,有</p>
<p>关这个的文章Sir里已经有了不少,自己这篇就不打算往Sir里贴了,且留在这里和大家分享...:)<br>　　首先是下载最新的mplayer的tarball,即1.0pre5:<br>　　<a href="http://www4.mplayerhq.hu/homepage/design7/dload.html">http://www4.mplayerhq.hu/homepage/design7/dload.html</a><br>　　接下来是下载解码器包,一般只要下载Essential Codes就足够了,要放rmvb需要reallib的解码器,我一</p>
<p>般用xine放rmvb:<br>　　<a href="http://www4.mplayerhq.hu/homepage/design7/codecs.html">http://www4.mplayerhq.hu/homepage/design7/codecs.html</a><br>　　还有mplayer的字体文件:<br>　　<a href="http://www4.mplayerhq.hu/homepage/design7/dload.html">http://www4.mplayerhq.hu/homepage/design7/dload.html</a><br>　　这里大家不用到"其他字体"里下载中文字体,待会可以用simsun.ttf替代.<br>　　当然,还要下载Skin文件给gmplayer用:<br>　　<a href="http://ftp5.mplayerhq.hu/mplayer/Skin/">http://ftp5.mplayerhq.hu/mplayer/Skin/</a><br>　　建议用default blue或者neutron,当然,你也可以下载其他的Skin.<br>　　我们先把下载的所有文件cp到/opt/目录下,然后开始具体安装步骤.<br>　　1.首先安装解码器:<br>　　tar -jxvf essential-20040916.tar.bz2<br>　　tar -jxvf rp9codecs-20040626.tar.bz2<br>　　cp -rf rp9codecs-20040626/* essential-20040916/<br>　　mv essential-20040916 /usr/lib/codes<br>　　以上命令把解码器包安装到了/usr/lib/codes,其实就是把解压后的目录ren&amp;mv了过去.<br>　　2.编译安装mplayer:<br>　　tar -jxvf MPlayer-1.0pre5.tar.bz2<br>　　cd MPlayer-1.0pre5<br>　　./configure --enable-gui --with-codecsdir=/usr/lib/codecs --with-</p>
<p>win32libdir=/usr/lib/codecs --with-reallibdir=/usr/lib/codecs --language=zh_CN<br>　　以上几个参数解释一下:<br>　　--enable-gui:打开图形界面支持,就是gmplayer<br>　　--with-codecsdir=/usr/lib/codecs:指明解码器的目录<br>　　--with-win32libdir=/usr/lib/codecs:指明windows的媒体文件解码器目录位置<br>　　--with-reallibdir=/usr/lib/codecs:指明real媒体文件的解码器目录位置,要用gmplayer放rmvb必须</p>
<p>指定这条.<br>　　--language=zh_CN:设定系统界面语言为中文<br>　　在configure之前可以运行./configure --help查看支持的特性设定,可以根据自己需求选择,以上只是</p>
<p>最基本的啦.<br>　　make<br>　　make install<br>　　3.安装字体文件:<br>　　tar -jxvf font-arial-iso-8859-1.tar.bz2<br>　　mv font-arial-iso-8859-1/ /usr/local/share/mplayer/font/<br>　　cd /usr/local/share/mplayer/font/<br>　　如果你的系统用simsun美化过,则直接<br>　　ln -s ***/simsun.ttf subfont.ttf<br>　　注意,这里的***是指simsun的具体位置,为了保险起见,建议在~/.mplayer/里也做同样的链接.<br>　　要是系统没有美化过,试试<br>　　ln -s /usr/share/fonts/zh_CN/TrueType/gbsn001p.ttf subfont.ttf<br>　　这样中文字幕就搞定了.<br>　　4.安装Skin:<br>　　超级简单,把skin包解压后mv到/usr/local/share/mplayer/Skin就可以了,注意一定要有一个skin叫做</p>
<p>default,不然gmplayer无法运行.<br>　　OK,目前为止所有工作结束,运行gmplayer/mplayer看看,Enjoy it!:)<br>　　PS:要是你用xine,在setup里可以把codes的目录指定同mplayer一样,这样可以节省点空间^_^<br>　　５.nvidia driver 驱动安装：</p>
<p><br>&nbsp;</p>
<img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/61768.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/" target=_blank>TS,MPEG2,dvbc专家</a> 2009-10-12 09:07 <a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/12/61768.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/10/12/61768.html">http://www.cnitblog.com/dvb-dvb/archive/2009/10/12/61768.html</a> 
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-10-12 09:07 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/10/12/99264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>绑定网卡ip的进程_无法关闭</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/09/27/99265.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Sun, 27 Sep 2009 06:34:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/09/27/99265.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99265.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/09/27/99265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99265.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>这个是一个用</span><span>UDP socket </span><span>发生数据的软件，结果网线松了，肯定</span><span>ip</span><span>地址就不存在了，结果程序就无法退出了，</span></p>
<p><span>结果在</span><span>windows</span><span>任务管理器里面，直接杀进程都杀不死，</span></p>
<p><span>这个程序大致运作如下：</span><span> </span><span>因为一台机器上有多个网卡，</span><span> </span><span>比如一快网卡联内网，另一快网卡联外网，所有，输出数据的时候必需绑定某个网卡的</span><span>ip</span><span>，网线松了，</span><span>ip</span><span>没有了，程序就死机了，</span><span> </span><span>请大家帮我，</span></p>
<p><span>结果我用下列的例子，也没有成功。</span></p>
<font style="BACKGROUND-COLOR: #ffffff"><a href="http://www.cnitblog.com/wufajiaru/archive/2009/09/24/61548.html">http://www.cnitblog.com/wufajiaru/archive/2009/09/24/61548.html</a><br><br><br><font style="BACKGROUND-COLOR: #d4d0c8">tskill和taskkill，其中我遇到一个进程无法用tskill结束，最后用taskkill 带/F参数强制结束成功。<br><br>TASKKILL /PID 1230 /PID 1241 /PID 1253 /T</font><br></font><img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/61597.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/" target=_blank>TS,MPEG2,dvbc专家</a> 2009-09-27 14:34 <a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/archive/2009/09/27/61597.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/09/27/61597.html">http://www.cnitblog.com/dvb-dvb/archive/2009/09/27/61597.html</a> 
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-09-27 14:34 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/09/27/99265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vlc 播放视频的过程分析 {7} pcr,pts</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/09/23/99266.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Wed, 23 Sep 2009 00:48:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/09/23/99266.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99266.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/09/23/99266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99266.html</trackback:ping><description><![CDATA[<p>最近用vlc的0.9.9播放一段视频，出现了下列警告： </p>
<font style="BACKGROUND-COLOR: #ffffff">decoder is leaking pictures, resetting the heap</font><br><br><br>/*****************************************************************************<br>&nbsp;* RunThread: video output thread<br>&nbsp;*****************************************************************************<br>&nbsp;* Video output thread. This function does only returns when the thread is<br>&nbsp;* terminated. It handles the pictures arriving in the video heap and the<br>&nbsp;* display device events.<br>&nbsp;*****************************************************************************/<br>static void RunThread( vout_thread_t *p_vout)<br><br>在这个函数里面，看到下列code， 很难理解了，&nbsp; <br>!p_picture-&gt;b_force &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p_picture != p_last_picture &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display_date &lt; current_date + p_vout-&gt;render_time &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b_drop_late )<br><br><br>这个p_vout-&gt;render_time ,到底是怎么算出来的。<br><br>到底，pcr,pts,出现了什么错误，导致不能播放，还没有搞清楚。<br><br>以下内容为转载：<br><a href="http://www.wangchao.net.cn/bbsdetail_61529.html">http://www.wangchao.net.cn/bbsdetail_61529.html</a><br><br>vout_DatePicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Gives the picture a presentation date. You can start working on a picture before knowing precisely at what time it will be displayed. For instance to date an I or P picture, you must wait until you have decoded all previous B pictures (which are indeed placed after - decoding order != presentation order). <br>　　vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Tells the video output that a picture has been completely decoded and is ready to be rendered. It can be called before or after vout_DatePicture. <br>　　 vout_DestroyPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Marks the picture as empty (useful in case of a stream parsing error).<br><br>不过上面这个内容说的很简洁了，不详细。 <br><br><br><img height=1 src="http://www.cnitblog.com/dvb-dvb/aggbug/61531.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/" target=_blank>TS,MPEG2,dvbc专家</a> 2009-09-23 08:48 <a style="TEXT-DECORATION: none" href="http://www.cnitblog.com/dvb-dvb/archive/2009/09/23/61531.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/09/23/61531.html">http://www.cnitblog.com/dvb-dvb/archive/2009/09/23/61531.html</a> 
<img src ="http://www.cppblog.com/dvb-dvb/aggbug/99266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-09-23 08:48 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/09/23/99266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>得到位置点的坐标和颜色 RGB值，</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/08/24/99267.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 24 Aug 2009 01:09:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/08/24/99267.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99267.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/08/24/99267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99267.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99267.html</trackback:ping><description><![CDATA[<br>有时候想得到屏幕上某个点的位置，和某个点的 RGB的值，就给大家推荐这个工具<br>估计增加下列功能：<br>1，显示所点击的位置。<br>2，全屏显示，去掉边和菜单栏等。<br><br><a href="http://www.cnitblog.com/Files/dvb-dvb/GetColor.rar">/Files/dvb-dvb/GetColor.rar</a><br><br><img alt="" src="http://www.cnitblog.com/images/cnitblog_com/dvb-dvb/Getcolor.JPG" border="0" width="739" height="445">
<img src="http://www.cnitblog.com/dvb-dvb/aggbug/60943.html" width="1" height="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-24 09:09 <a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/24/rgb.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/24/rgb.html">http://www.cnitblog.com/dvb-dvb/archive/2009/08/24/rgb.html</a>  <img src ="http://www.cppblog.com/dvb-dvb/aggbug/99267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-24 09:09 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/08/24/99267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎么得到h264的frame rate</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/08/12/99268.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Wed, 12 Aug 2009 02:33:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/08/12/99268.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99268.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/08/12/99268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99268.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99268.html</trackback:ping><description><![CDATA[<h1><br></h1>
<div class="t_msgfontfix">
<table cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="t_msgfont" id="postmessage_24914">nFrame_rate = sps-&gt;time_scale / sps-&gt;num_units_in_tick ; <br>
            但是这个值，我得到的是 50， 其它的分析工具得到的都是25，<br>
            有人说，看time_scale 是<span href="http://bbs.chinavideo.org/tag.php?name=frame" onclick="tagshow(event)" class="t_tag">frame</span>,还是field，可是标准上没有这么说，我看的是中文版的，</td>
        </tr>
    </tbody>
</table>
</div>
<br><br><br>今天又发现一个奇怪的事情：<br>如果h264的 profile是 main,那么在vui parameters里面，<br>num_units_in_tick:1200 time_scale:60000， nFrame_rate = sps-&gt;time_scale / sps-&gt;num_units_in_tick ; 50 fps －－－ ok.<br>但是，如果profile 是high,那么值是这样：<br>num_units_in_tick:48 time_scale:16777216 ，Frame_rate:349525 fps <br>奇怪的，我的code到底那里错误了，<br>第二，若说我的code错误了，那sps里面包含，vui parameters，以前的任何值都没有错误呀，偏偏这两个值错误了，<br><br>若果换一个high的h264文件，那值是这样的，<br>num_units_in_tick:384 time_scale:16777217 fixed_frame_rate_flag:1 Frame_rate:43690 ，<br>用其它的分析工具看，num_units_in_tick ＝ 1， time_scale ＝ 50，50 fps，<br>我到底怎么排除这个错误呢。<br><br><img src="http://www.cnitblog.com/dvb-dvb/aggbug/60739.html" width="1" height="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-12 10:33 <a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/12/60739.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/12/60739.html">http://www.cnitblog.com/dvb-dvb/archive/2009/08/12/60739.html</a> <img src ="http://www.cppblog.com/dvb-dvb/aggbug/99268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-12 10:33 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/08/12/99268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>h264 : 关于level_idc和Profile_IDC的解释</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/08/10/99269.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Mon, 10 Aug 2009 00:48:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/08/10/99269.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99269.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/08/10/99269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99269.html</trackback:ping><description><![CDATA[<p><font style="background-color: #d4d0c8;">这个帖子是转贴：因为下列内容，没有再h264的标准上出现，所以要转， 我翻变了下列标准，都没有找到，希望网友告知我，这些内容到底在那个标准文档里面。<br>我已经翻阅的： <br>H.264官方中文版.pdf&nbsp;&nbsp;&nbsp; <br>H.264和MPEG-4视频压缩.pdf&nbsp;<br>H.264编解码手册.rar <br>T-REC-H.264-200503-S!!PDF-E.pdf<br><br><br><a href="http://bbs.chinavideo.org/viewthread.php?tid=1986">http://bbs.chinavideo.org/viewthread.php?tid=1986</a><br><br></font></p>
<div id="threadtitle">
<h1><font style="background-color: #d4d0c8;">关于level_idc和Profile_IDC的解释</font></h1>
</div>
<div class="t_msgfontfix">
<table cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="t_msgfont" id="postmessage_5612">我在帖子上经常看到问题,现发表在这,大家可以参考一下:<font style="font-size: 9pt;"></font><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Class</font></em><font style="font-size: 9pt;">: Numeric (Integer)</font></font></font><br><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Description</font></em><font style="font-size: 9pt;">: Set bitstream Profile IDC. Default is 88.</font></font></font><br><em><font style="font-size: 9pt;"><font face="Times New Roman "><font color="#000000"></font></font></font></em><br><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Note</font></em><font style="font-size: 9pt;">: Some profiles cannot support certain features. See MPEG-4 AVC for supported features for each profile. Reference software may perform tests for certain features for profile conformance, but it is possible that certain validations are missing. See Annex A of H.264/AVC.</font></font></font><br><font style="font-size: 9pt;"><font face="Times New Roman "><font color="#000000"></font></font></font><br>
            <table class="t_table" style="width: 98%;" cellspacing="0">
                <tbody>
                    <tr>
                        <td colspan="2"><font color="#000000"><font face="Times New Roman "><strong><em><font style="font-size: 9pt;">Options:</font></em></strong><em><font style="font-size: 9pt;"></font></em></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">66</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">Baseline</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">77</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">Main</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">88</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">Extended</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">100</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">High (FRExt)</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">110</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">High 10 (FRExt)</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">122</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">High 4:2:2 (FRExt)</font></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">144</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">High 4:4:4 (FRExt)</font></font></font><br></td>
                    </tr>
                </tbody>
            </table>
            <br><font style="font-size: 9pt;"></font><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Class</font></em><font style="font-size: 9pt;">: Numeric (Integer)</font></font></font><br><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Description</font></em><font style="font-size: 9pt;">: Set bitstream Level IDC. Default is 21.</font></font></font><br><em><font style="font-size: 9pt;"><font face="Times New Roman "><font color="#000000"></font></font></font></em><br><font color="#000000"><font face="Times New Roman "><em><font style="font-size: 9pt;">Note</font></em><font style="font-size: 9pt;">: Similar with the ProfileIDC, LevelIDC sets certain restrictions during the encoding process, such as resolution supported, maximum number of references, <span class="t_tag" onclick="tagshow(event)" href="http://bbs.chinavideo.org/tag.php?name=frame">frame</span> rate etc. See Annex A of H.264/AVC.</font></font></font><br><font style="font-size: 9pt;"><font face="Times New Roman "><font color="#000000"></font></font></font><br>
            <table class="t_table" style="width: 98%;" cellspacing="0">
                <tbody>
                    <tr>
                        <td colspan="2"><font color="#000000"><font face="Times New Roman "><strong><em><font style="font-size: 9pt;">Options:</font></em></strong><em><font style="font-size: 9pt;"></font></em></font></font><br></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">10</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">1&nbsp; &nbsp;&nbsp; &nbsp; (supports only QCIF format and below with 380160 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">11</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">1.1&nbsp; &nbsp; (CIF and below. 768000 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">12</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">1.2&nbsp; &nbsp; (CIF and below. 1536000 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">13</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">1.3&nbsp; &nbsp; (CIF and below. 3041280 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">20</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">2&nbsp; &nbsp;&nbsp; &nbsp; (CIF and below. 3041280 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">21</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">2.1&nbsp; &nbsp; (Supports HHR formats. Enables Interlace support. 5068800 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">22</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">2.2&nbsp; &nbsp; (Supports SD/4CIF formats. Enables Interlace support. 5184000 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">30</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">3&nbsp; &nbsp;&nbsp; &nbsp; (Supports SD/4CIF formats. Enables Interlace support. 10368000 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">31</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">3.1&nbsp; &nbsp; (Supports 720p HD format. Enables Interlace support. 27648000 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">32</font></font></font></em><br></td>
                        <td width="86%"><font color="#000000"><font face="Times New Roman "><font style="font-size: 9pt;">3.2&nbsp; &nbsp; (Supports SXGA format. Enables Interlace support. <font style="font-size: 9pt;">55296000 samples/sec)</font></font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">40</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">4&nbsp; &nbsp;&nbsp; &nbsp; (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">41</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">4.1&nbsp; &nbsp; (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">42</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">4.2&nbsp; &nbsp; (Supports 2Kx1K format. Frame coding only. 125829120 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">50</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">5&nbsp; &nbsp;&nbsp; &nbsp; (Supports 3672x1536 format. Frame coding only. 150994944 samples/sec)</font></font><br></font></td>
                    </tr>
                    <tr>
                        <td width="13%"><em><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">51</font></font></font></em><br></td>
                        <td width="86%"><font style="font-size: 9pt;"><font color="#000000"><font face="Times New Roman ">5.1&nbsp; &nbsp; (Supports 4096x2304 format. Frame coding only. 251658240 samples/sec)</font></font><br></font></td>
                    </tr>
                </tbody>
            </table>
            <br>附件有更多的详细介绍&gt;&gt;&gt;&gt;</td>
        </tr>
    </tbody>
</table>
</div>
<p><font style="background-color: #d4d0c8;"><br></font>&nbsp;</p>
<img src="http://www.cnitblog.com/dvb-dvb/aggbug/60682.html" width="1" height="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-10 08:48 <a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/10/h264level_idc.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/08/10/h264level_idc.html">http://www.cnitblog.com/dvb-dvb/archive/2009/08/10/h264level_idc.html</a> <img src ="http://www.cppblog.com/dvb-dvb/aggbug/99269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-08-10 08:48 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/08/10/99269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哥伦布编码的解析过程,golomb 编码,golomb 变长编码算法</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/07/28/99270.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Tue, 28 Jul 2009 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/07/28/99270.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99270.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/07/28/99270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99270.html</trackback:ping><description><![CDATA[<span>golomb </span><span>变长编码算法</span><span> <br></span><br>
<p><span>哥伦布编码的解析过程</span></p>
<p><span>golomb </span><span>编码主要是针对整数进行编码，减少整数使用的空间位数</span><span><br></span><span>在</span><span>golomb</span><span>编码时，有一个可以变化的参数</span><span>m<br></span><br>本人的算法如下，很简便的！<br>&nbsp; </p>
<p align="left"><span>int </span><span>My_get_se_golomb_31</span><span>()</span></p>
<p align="left"><span>{</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>int</span> <span>b</span> = 0;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>int</span> <span>nValue</span> = 0;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>b</span> = <span>My_get_ue_golomb_31</span>();</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>nValue</span> = <span>b</span> / 2;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>if</span> (<span>b</span> &gt; 1 &amp;&amp; <span>b</span>%2 ==0)</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>nValue</span> = <span>nValue</span> * (-1);</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>return</span> <span>nValue</span>;</span></p>
<p align="left"><span>}</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span>int</span><span> <span>&nbsp;My_get_ue_golomb_31</span>()</span></p>
<p align="left"><span>{</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>int</span> <span>b</span> = 0;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>int</span> <span>i</span> = 0;</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>do</span> </span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>i</span> ++;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>if</span> (<span>i</span> &lt;32)</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>b</span> = <span>Bitstream_get</span>(<span>i</span>,<span>FALSE</span>);</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>else</span></span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>outlog</span>(<span>"SPS: nreserved should is zero."</span>);</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>break</span>;</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>} <span>while</span>(!<span>b</span>);</span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>Bitstream_get</span>(<span>i</span>);</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>b</span> = (1 &lt;&lt;(<span>i</span> - 1)) -1 + <span>Bitstream_get</span>(<span>i</span>-1);<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align="left"><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>return</span> <span>b</span>;</span></p>
<p><span>}</span></p>
<p><br><br><br><br>&nbsp; </p>
<h3><span></span>&nbsp;</h3>
<p><span><span><a onmousedown="CA.q('blog_entryview_share_topright');" href="javascript:void(0);" data-ext="{v:'1',xpt:'#{$_xpt}'}" data-abstracts="#{#main-content@innerText&lt;51}" data-url="http://ludajun.blog.sohu.com/67100601.html" data-title="#{@entryTitle}" data-sharetype="31" entrytitle="golomb 变长编码算法"></a></span></span><a href="http://ludajun.blog.sohu.com/"><span id="itemId_67100601">http://ludajun.blog.sohu.com/</span></a></p>
<p>&nbsp;</p>
<p>&nbsp;<span>例如：取</span><span>m = 1, </span><span>对整数</span><span>x = </span><span>４进行编码</span><span>, </span><span>算法如下</span><span><br>b = 2</span><span>的ｍ次方</span><span><br>q = int((x-1)/ b)<br>r = x - qb - 1<br><br></span><span>由此计算出</span><span> q = 1, r = 1<br></span><span>二进制编码为</span><span>q </span><span>个</span><span>　</span><span>１，</span><span>　</span><span>１</span><span>　</span><span>个０，</span><span>　</span><span>然后是</span><span>r</span><span>的二进制编码</span><span><br></span><span>所以编码为：</span><span>101<br><br></span><span>解码思路：</span><span><br></span><span>先算出所给整数的位数</span><span>n<br></span><span>然后从高位</span><span>--</span><span>〉低位找到第一个０所在的位置</span><span>i</span><span>，这样就能</span><span> q = n - i, r = </span><span>ｘ的第０位到第ｉ－１位所表示的数字（由低位－－〉高位）</span><span><br></span><span>最终解码结果为</span><span>qb + 1 + r<br><br>python </span><span>实现的</span><span>　</span><span>算法：</span><span><br>from math import log<br><br>m = 1<br><br>def compress(x):<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> q = (x - 1) &gt;&gt; m<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> r = x - (q &lt;&lt; m) - 1<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> result = ((((1 &lt;&lt; q) - 1) &lt;&lt; 1) &lt;&lt; m) | r<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> return result<br><br>def uncompress(x):<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> if x == 0:<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> return 1<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> #</span><span>计算</span><span>x</span><span>的位数</span><span><br></span><span>&nbsp;&nbsp;&nbsp;</span><span> n = int(log(x, 2))<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> if n == 0:<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> return x + 1<br></span><span>&nbsp;&nbsp;&nbsp;</span><span> for i in range(n, -1, -1):<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> if (x &amp; (1 &lt;&lt; i)) == 0:<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> q = n - i<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> r = x &amp; (1 &lt;&lt; i - 1)<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> return r + 1 + (q &lt;&lt; m)</span></p>
<img src="http://www.cnitblog.com/dvb-dvb/aggbug/60423.html" width="1" height="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-07-28 17:32 <a href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/28/60423.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/28/60423.html">http://www.cnitblog.com/dvb-dvb/archive/2009/07/28/60423.html</a> <img src ="http://www.cppblog.com/dvb-dvb/aggbug/99270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-07-28 17:32 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/07/28/99270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mpeg2解压缩的详细过程 介绍。</title><link>http://www.cppblog.com/dvb-dvb/archive/2009/07/14/99271.html</link><dc:creator>TS,MPEG2,dvbc专家</dc:creator><author>TS,MPEG2,dvbc专家</author><pubDate>Tue, 14 Jul 2009 06:49:00 GMT</pubDate><guid>http://www.cppblog.com/dvb-dvb/archive/2009/07/14/99271.html</guid><wfw:comment>http://www.cppblog.com/dvb-dvb/comments/99271.html</wfw:comment><comments>http://www.cppblog.com/dvb-dvb/archive/2009/07/14/99271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dvb-dvb/comments/commentRss/99271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dvb-dvb/services/trackbacks/99271.html</trackback:ping><description><![CDATA[<p>MPEG-1流比特层次结构分析总结<br>1．简要介绍Mpeg<br>Mpeg是Motion Picture Expert Group的缩写。活动图像专家组是在1988年由ISO和IEC联合成立的专家组，负责开发电视图像数据和声音数据的编码，解码和它们的同步等标准。到目前为止已经开发和正在开发的MPEG标准有很多，主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.</p>
<p>其中的Mpeg-1处理的是标准图像交换格式（standard interchange format,SIF）或者称为源输入格式（Source Input Format,SIF）的电视，将模拟的图像信息，通过编码成为数字图像信息，原始输入可以是NTSC制式352pixels * 240lines * 30frames/second, PAL制352pixels * 288lines*25frames/second，压缩后的数字图像信息的速率为1.5Mb/s.这个标注是1992年正是的发布的，是针对当时具有这种数据传输速率的CD-ROM和网络而开发的，用于在CD-ROM上存储数字影视和在网络上传输数字影视。<br>MPEG-1的标准号为ISO/IEC 11172,标准名：&#8220;信息技术——用于数据速率大约高达1.5Mb/s的数字存储替的电视图像和伴音编码&#8221;<br>本文主要是对Mpeg-1Video数据流的结构进行分析，并将怎样得到Mpeg-1流中的数据部分进行的阐述。ISO/IEC 11172-2</p>
<p>2．Mpeg-1数据流分析<br>编码后的视频序列是一个如同计算机网络的OSI模型下的数据序列一样，数据被分成很多层的概念。</p>
<p>视频序列层－画面组层－画面层－片层－宏块层－块层<br>层次的关系很明显，越往后越是底层，越接近实际的数据。</p>
<p>2.1视频序列层（VideoStream）<br>视频序列是以一个序列标题开始，之后可以跟着一个或者多个画面组。最后以Sequence_end_code结束。紧挨着每一个画面组之前可以有一个序列标题。也就是说每个画面组，都可以有一个自己的序列标题。<br>序列标题是一个以sequence_header_code开始，后跟着一系列数据元素的结构。是视频流中用来解码的重要的参数之一。其中定义了量化矩阵（load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可选的intra_quantizer_matrix和non_intra_quantizer_ matrix）以及其它的一些重要的数据元素，其中量化矩阵是可以在视频流中重复的量化矩阵中变化的，并且在每次变化后，量化矩阵重新定义。其它的元素必须与第一个序列标题中的值相同。<br>整个视频序列的结构可以用下面的代码表示：<br>Video_Stream{<br>unsigned int h_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int v_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_height;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in mblocks.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_width;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in mblocks.&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char aspect_ratio;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for aspect ratio.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char picture_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for picture rate.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int bit_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit rate.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_buffer_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minimum buffer size.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN const_param_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Contrained parameter flag. */<br>&nbsp; unsigned char intra_quant_matrix[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization matrix for<br>&nbsp; intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char non_intra_quant_matrix[8][8];&nbsp; /* Quanitization matrix for <br>&nbsp; non intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; GoP group;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current group of pict.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Pict picture;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current picture.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Slice slice;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current slice.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Macroblock mblock;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current macroblock.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; Block block;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current block.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int state;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* State of decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int bit_offset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit offset in stream.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int *buffer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to next byte in<br>&nbsp; buffer.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int buf_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Length of remaining buffer.*/<br>&nbsp; unsigned int *buf_start;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to buffer start.&nbsp;&nbsp; */<br>&nbsp; int max_buf_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Max lenght of buffer.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past predictive frame.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *future;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Future predictive frame.&nbsp;&nbsp; */<br>&nbsp; PictImage *current;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Current frame.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; PictImage *ring[RING_BUF_SIZE];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Ring buffer of frames.&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Video_Stream;&nbsp;&nbsp; <br>具体的序列标题的结构的部分是这样的：<br>序列<br>sequence_header{<br>SEQ_START_CODE 0x000001b3;&nbsp; /* 常量 ,作用使用来定位视频序列的序列头 */&nbsp;&nbsp; <br>unsigned int h_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int v_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in pixels.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_height;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vert. size in mblocks.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int mb_width;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Horiz. size in mblocks.&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char aspect_ratio;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for aspect ratio.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned char picture_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Code for picture rate.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int bit_rate;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Bit rate.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_buffer_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minimum buffer size.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN const_param_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Contrained parameter flag. */<br>&nbsp; unsigned char load_intra_quantizer_matrix;<br>unsigned char intra_quant_matrix[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization matrix for intracoded frames.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个结构是可选的，要看load_intra_quantizer_matrix的值，为真则有这个部分，否则没有，因为<br>intra_quant_matrix是量化表的值，而Sequence_header结构在视频序列中是可重复的，即在每个画面组之前都有可能再次给出一个sequence_header,并且可以在新的sequence_header 中重新定义量化表*/<br>unsigned char load_non_intra_quantizer_matrix;<br>&nbsp; unsigned char non_intra_quant_matrix[8][8];&nbsp; /* Quanitization matrix for non intracoded frames. 也是可选。愿意于intra_quant_matrix可选的原因相同。当load_non_intra_quant_matrix的值为真的时候需要定义。&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; <br>}</p>
<p>由上面的分析，可以看出来的是：<br>video_sequence(){<br>next_start_code()<br>do{<br>sequence_header();<br>do{<br>group_of_pictures() ;画面组<br>}while (nextbits()==GROUP_START_CODE)<br>}while(nextbits()==SEQUENCE_HEADER_CODE)<br>SEQUENCE_END_CODE<br>};</p>
<p>正是由于视频序列中存在很多开始码，或者称之为定位码、同步码。用来告诉解码器目前数据的区域信息，所以解码器才可以正确的处理各个数据区的数据，下面就是视频序列中的开始码的罗列：<br>#define SEQ_END_CODE 0x000001b7<br>#define SEQ_START_CODE 0x000001b3<br>#define GOP_START_CODE 0x000001b8<br>#define PICTURE_START_CODE 0x00000100<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>#define EXT_START_CODE 0x000001b5<br>#define USER_START_CODE 0x000001b2<br>这些开始码都是一些特殊的32bits的比特序列，在视频码流中不会出现的。他们的起着标志的作用，具体可以从名称上面看出来。<br>其中EXT_START_CODE和USER_START_CODE在每个层里面都会出现，用来标志扩展数据区和用户数据区，用来添加任意的数据，直到下一个开始码结束。<br>2.2画面组层（GOP）<br>在软件xmplay1.1中的定义<br>typedef struct GoP {<br>&nbsp; BOOLEAN drop_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Flag indicating dropped frame. */<br>&nbsp; unsigned int tc_hours;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Hour component of time code.&nbsp;&nbsp; */<br>&nbsp; unsigned int tc_minutes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Minute component of time code. */<br>&nbsp; unsigned int tc_seconds;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Second component of time code. */<br>&nbsp; unsigned int tc_pictures;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Picture counter of time code.&nbsp; */<br>&nbsp; BOOLEAN closed_gop;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Indicates no pred. vectors to<br>&nbsp;&nbsp;&nbsp; previous group of pictures.&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN broken_link;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* B frame unable to be decoded.&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} GoP;</p>
<p>当然每个画面组层都是开始与标志码：GOP_START_CODE<br>该层次语法上的定义是<br>group_of_pictures{<br>GOP_START_CODE<br>Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures<br>Closed_gop;<br>Broken_link;<br>Next_start_code;<br>If(nextbits==extension_start_code){<br>Extension_start_code;<br>While(nextbits()==&#8221;0000 0000 0000 0000 0000 0001&#8221;){<br>Group_extension_data;<br>}<br>next_start_code()<br>}<br>if(nextbits==user_data_start_code){<br>user_data_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>user_data;<br>}<br>next_start_code()<br>}<br>do{<br>picture()<br>}while(nextbits==picture_start_code)<br>}</p>
<p>Mpeg流最终显示出来是一系列的画面，而画面组是mpeg流中可以独立编码的最小的单位，每个画面组由一个标题和一系列画面组成。GOP标题包含了时间和编辑的信息。<br>Mpeg画面组中必须至少有一个I帧画面，可以有数目可变的B帧和P帧画面，也可以没有P和B帧。画面组的第一幅编码画面是I画面，该画面之后跟随着任意数目的I或P画面，每对I、P画面之间可以插入任意数目的B画面。<br>画面组是画面的集合，每幅画面按照显示的顺序相邻。<br>画面组中的画面有两种排列顺序：<br>1．按比特流顺序 必须以I帧开头，后面可按任何的次序，跟上任意数目的I，P或B画面。<br>2．按显示顺序必须以I或B画面打头，且以I或P画面结束，最小的画面组由一个I画面组成。</p>
<p>从编码角度，可以精确的陈述的是，画面组以一个画面组标题开始，以最先出现的下一个画面组标题或者下一个序列标题或者序列结束码结束。</p>
<p>Mepg流中的标志码也就是开始码，对正确的分割和识别码流的成分起到了至关重要的作用。</p>
<p>2.3画面层（Pictures）<br>画面组层中的一幅幅画面就是画面层的数据了。包含了一幅画面的所有编码信息。一幅画面同样始于画面的标题。标题以画面开始码（PICTURE_START_CODE 0x00000100）打头。<br>解析画面单元的语法结构：<br>picture(){<br>picture_start_code<br>temprol_reference&nbsp;&nbsp;&nbsp;&nbsp; /*时序编号，通常一组画面的编号都在1024以内，如果超过那么在1025幅画面出复位为0，重新计数。*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>picture_coding_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>vbv_delay/*对于固定比特率的视频流，vbv_delay用与解码过程开始和随机存取之后，以保证在第一幅画面被显示之前，解码器已经读到正确数目的比特数。*/<br>if((picture_coding_type==2) || picture_coding_type==3){<br>full_pel_foward_vector /*全象素前向矢量，给定前向矢量的精度，在P和B画面的标题中出现*/<br>forward_f_code<br>}<br>if(picture_coding_type==3){<br>full_pel_backward_vector<br>back_f_code<br>}<br>while(nextbits()==&#8217;1&#8217;){<br>extra_bit_picture<br>extra_information_picture<br>}<br>extra_bit_picture<br>next_start_code</p>
<p>if(nextbits()==extension_start_code){<br>extension_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>picture_extension_data<br>}<br>next_start_code()<br>}<br>if(nextbits()==user_data_start_code){<br>user_data_start_code<br>while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0001&#8217;){<br>user_data<br>}<br>next_start_code()<br>}<br>do {<br>slice()<br>}while(nextbits()==slice_start_code)<br>}</p>
<p><br>整个画面单元结构是这样的：<br>typedef struct pict {<br>&nbsp; unsigned int temp_ref;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Temporal reference.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int code_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Frame type: P, B, I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int vbv_delay;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Buffer delay.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN full_pel_forw_vector;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. vectors specified in full<br>&nbsp;&nbsp;&nbsp; pixel values flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int forw_r_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used for vector decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int forw_f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used for vector decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN full_pel_back_vector;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back vectors specified in full <br>&nbsp;&nbsp;&nbsp; pixel values flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int back_r_size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int back_f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *extra_info;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extra bit picture info.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *ext_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extension data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *user_data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* User data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Pict;</p>
<p>可以看出整个pictures层的bit流结构中由标题和pictures数据组成。<br>标题中提供了必要的画面信息数据和运动矢量的信息。</p>
<p>2.4片层(Slice)<br>片是任意数目宏块组成的序列，其中宏块必须从画面的左上位置开始，按照光栅扫描的方向从左到右，从上到下排列。片中至少包涵一个宏块，片与片之间没有重叠，也没有间隙。</p>
<p>片层的解析语法：<br>首先给出识别出Slice层数据的头标slice_start_code<br>『<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>』<br>slice{<br>slice_start_code /*从中可以计算出slice_vertical_position&nbsp; 片中第一个宏块，以宏块为单位的垂直位置*/<br>quantizer_scale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*设置量化步长尺寸。1－31*/<br>while(nextbits()==&#8217;1&#8217;){<br>extra_bit_slice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;1&#8217;<br>extra_information_slice<br>}<br>extra_bit_scale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;0&#8217;<br>do{<br>macroblock()<br>}while(nextbits()!=&#8217;0000 0000 0000 0000 0000 0000&#8217;)<br>next_start_code()<br>}</p>
<p>typedef struct slice {<br>&nbsp; unsigned int vert_pos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Vertical position of slice. */<br>&nbsp; unsigned int quant_scale;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Quantization scale.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; char *extra_info;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Extra bit slice info.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Slice;</p>
<p><br>[此贴子已经被作者于2008-7-19 17:51:53编辑过]<br>--&nbsp; 作者：cdmalcl<br>--&nbsp; 发布时间：2008-7-19 17:49:34<br>--&nbsp; <br>每个片由一个开始码开始，开始后DC系数和矢量解码的预测值都被复位，片开始部位的位置的水平位置由片中第一个宏块的宏块地址决定。这些措施使得在一幅画面内任何一片都可以单独编码而不需要前一片的信息。当解码是出现错误，即可以从后继的片重新开始。<br>所以，当数据在无错的环境中，可以一幅画面就作为一片，但是如果是有错的环境，则每行宏块作为一片会更加合理。</p>
<p>表2&nbsp; 256&#215;192画面内的片划分（每行宏块作为一个片，每个片的高度都是16pixels）<br>1开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1结束<br>2开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2结束<br>3开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3结束<br>4开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4结束<br>5开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5结束<br>6开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6结束<br>7开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7结束<br>8开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8结束<br>9开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9结束<br>10开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10结束<br>11开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11结束<br>12开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12结束<br>13开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13结束<br>实际情况中片不宜太多，因为片标题，以及新片所需要尽心重新编码花费的开销很大。<br>片始于片标题，片标题又始于片开始码，片开始码是可以在一个范围中取得得，这个范围就是<br>#define SLICE_MIN_START_CODE 0x00000101<br>#define SLICE_MAX_START_CODE 0x000001af<br>片开始码得最后8为可以给出片得垂直位置，即以宏块为单位从画面顶部位置为1开始算起，片中第一个宏块的垂直位置。宏块有一个行号可以作为它得定位数据，这个行号的计算方法是：片垂直位置－1<br>宏块的垂直位置最大为175。片中第一个宏块的水平位置，可以由该宏块的地址偏移计算出来，所以不需要依赖画面内的任何其他的宏块的信息。<br>--&nbsp; 作者：cdmalcl<br>--&nbsp; 发布时间：2008-7-19 17:49:59<br>--&nbsp; <br>2.5宏块层(Macroblock)<br>宏块是包含16pixels*16lines的亮度分量部分，以及在空间位置上对应的两个8pixels*8lines的色度分量部分，一个宏块有4个亮度块和2个色度块。宏块可以指源图像或者重构图像的数据，或者是量化后的DCT系数。<br>宏块中块的顺序如下：<br>表1&nbsp; 宏块中块的排列</p>
<p>01<br>23</p>
<p><br>4</p>
<p>5</p>
<p>Y分量Cb分量Cr分量</p>
<p>宏块的数据分析语法描述：</p>
<p>macroblock(){<br>while(nextbits()==&#8217;0000 0001 111&#8217;){<br>macroblock_stuffing /*宏块填料，为了防止下溢出，由编码器填入的数据，有它固定的11位bit格式就是&#8217;0000 0001 111&#8217;,当然解决下溢出的方法还有很多，编码器可以在标题之前就加入填料位，或者可以减小quant_scale获得更多的编码系数等等*/<br>}<br>while(nextbits()==&#8217;0000 0001 000&#8217;){<br>macroblock_escape&nbsp; /*固定模式的bit串，当macroblock_address与previous_macroblock_address的差大于33时将用到该码。使得后继的macroblock_increment所表示的值加33。<br>}<br>macroblock_address_increment&nbsp;&nbsp; /*用于表示macroblock_address和previous_macorblock_ address之间的差值。 最大值为33，当前两者差大于33时用macroblock_escape补充。 Macroblock_address表示的是宏块在画面中的绝对位置，最左上角的宏块的macroblock_address为0，previous_macroblock_address指示片中最后一个非跳空宏块的位置。<br>macroblock_type&nbsp; <br>if(macroblock_motion_forward){<br>motion_horizontal_forward_code<br>if((forward_f!=1) &amp;&amp; (motion_horizontal_forward_code!=0))<br>motion_horizontal_forward_r<br>motion_vertical_forward_code<br>if((forward_f!=1) &amp;&amp; (motion_vertical_forward_code!=0))<br>motion_vertical_forward_r<br>}<br>if(macroblock_motion_backward){<br>motion_horizontal_backward_code<br>if((backward_f!=1) &amp;&amp; (motion_horizontal_backward_code!=0))<br>motion_horizontal_backward_r<br>motion_vertical_backward_code<br>if((backward_f!=1) &amp;&amp; (motion_vertical_backward_code!=0))<br>motion_vertical_backward_r<br>}<br>if(macroblock_pattern)<br>coded_block_pattern /*可以得到宏块宏块的pattern_code[i](i=0:5)，从而确定该宏块接收到的块的种类有哪些。*/<br>for(i=0;i&lt;6;i++)<br>block(i)<br>if(picture_coding_type==4)<br>end_of_marcoblock<br>}<br>片被分为16pixels*16lines的象素宏块。每个宏块都有它的标题。包含了宏块的地址、类型、量化器标尺信息等等。标题之后是该宏块的6个块的数据。</p>
<p>在Xmplay代码中给出的macrblock的定义：<br>typedef struct macroblock {<br>&nbsp; int mb_address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Macroblock address.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int past_mb_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Previous mblock address.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_h_forw_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. horiz. motion vector code. */<br>&nbsp; unsigned int motion_h_forw_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_v_forw_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Forw. vert. motion vector code.&nbsp; */<br>&nbsp; unsigned int motion_v_forw_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decdoinge vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_h_back_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back horiz. motion vector code.&nbsp; */<br>&nbsp; unsigned int motion_h_back_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int motion_v_back_code;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Back vert. motion vector code.&nbsp;&nbsp; */<br>&nbsp; unsigned int motion_v_back_r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Used in decoding vectors.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; unsigned int cbp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Coded block pattern.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN mb_intra;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Intracoded mblock flag.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; BOOLEAN bpict_past_forw;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past B frame forw. vector flag.&nbsp; */<br>&nbsp; BOOLEAN bpict_past_back;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past B frame back vector flag.&nbsp;&nbsp; */<br>&nbsp; int past_intra_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Addr of last intracoded mblock.&nbsp; */<br>&nbsp; int recon_right_for_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past right forw. vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_down_for_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past down forw. vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_right_back_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past right back vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; int recon_down_back_prev;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past down back vector.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Macroblock;<br>2.6块层(Block)<br>块是一个正交的8pixels*8lines的亮度或者色度分量，块可以指源画面数据或者相应的编码数据元素。<br>8*8单位象素的源画面数据经过DCT变换后的成为了相应的DCT系数块。<br>块的具体结构为（xmplay源码中的结构定义）：<br>typedef struct block {<br>&nbsp; short int dct_recon[8][8];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Reconstructed dct coeff matrix. */<br>&nbsp; short int dct_dc_y_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past lum. dc dct coefficient.&nbsp;&nbsp; */<br>&nbsp; short int dct_dc_cr_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past cr dc dct coefficient.&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp; short int dct_dc_cb_past;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Past cb dc dct coefficient.&nbsp;&nbsp;&nbsp;&nbsp; */<br>} Block;</p>
<p>解析块的语法结构是：<br>block(i){<br>if(pattern_code[i]){<br>if(macroblock_intra){<br>if(i&lt;4){<br>dct_dc_size_luminance<br>if(dc_size_luminance!=0)<br>dct_dc_differential<br>}<br>else{<br>dct_dc_size_chrominance<br>if(dc_size_chrominance!=0)<br>dct_dc_differential<br>}<br>}<br>else{<br>dct_coeff_first<br>}<br>if(picture_coding_type!=4){<br>while(nextbits()!=&#8217;10&#8217;)<br>dct_coeff_next<br>end_of_block<br>}<br>}<br><a href="http://www.ds0101.net/bbs/TopicOther.asp?t=5&amp;BoardID=19&amp;id=889">http://www.ds0101.net/bbs/TopicOther.asp?t=5&amp;BoardID=19&amp;id=889</a>&nbsp;, 引用的原址。</p>
<img src="http://www.cnitblog.com/dvb-dvb/aggbug/60070.html" width="1" height="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://www.cnitblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-07-14 14:49 <a href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html">http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html</a> <img src ="http://www.cppblog.com/dvb-dvb/aggbug/99271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dvb-dvb/" target="_blank">TS,MPEG2,dvbc专家</a> 2009-07-14 14:49 <a href="http://www.cppblog.com/dvb-dvb/archive/2009/07/14/99271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>