• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ts,ps,mpeg2 decoder and analysis

            mepg 2, iptv, stream parse,mov,mxf,gxf,ac3,aac

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 54 評論 :: 0 Trackbacks
             

            MPEG-1流比特層次結(jié)構(gòu)分析總結(jié)
            1.簡要介紹Mpeg
            Mpeg 是Motion Picture Expert Group的縮寫。活動(dòng)圖像專家組是在1988年由ISO和IEC聯(lián)合成立的專家組,負(fù)責(zé)開發(fā)電視圖像數(shù)據(jù)和聲音數(shù)據(jù)的編碼,解碼和它們的同步等標(biāo)準(zhǔn)。到目前為止已經(jīng)開發(fā)和正在開發(fā)的MPEG標(biāo)準(zhǔn)有很多,主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.

            其中的Mpeg-1處理的是標(biāo)準(zhǔn)圖像交換格式(standard interchange format,SIF)或者稱為源輸入格式(Source Input Format,SIF)的電視,將模擬的圖像信息,通過編碼成為數(shù)字圖像信息,原始輸入可以是NTSC制式352pixels * 240lines * 30frames/second, PAL制352pixels * 288lines*25frames/second,壓縮后的數(shù)字圖像信息的速率為1.5Mb/s.這個(gè)標(biāo)注是1992年正是的發(fā)布的,是針對當(dāng)時(shí)具有這種數(shù)據(jù)傳輸速率的CD-ROM和網(wǎng)絡(luò)而開發(fā)的,用于在CD-ROM上存儲數(shù)字影視和在網(wǎng)絡(luò)上傳輸數(shù)字影視。
            MPEG-1的標(biāo)準(zhǔn)號為ISO/IEC 11172,標(biāo)準(zhǔn)名:“信息技術(shù)——用于數(shù)據(jù)速率大約高達(dá)1.5Mb/s的數(shù)字存儲替的電視圖像和伴音編碼”
            本文主要是對Mpeg-1Video數(shù)據(jù)流的結(jié)構(gòu)進(jìn)行分析,并將怎樣得到Mpeg-1流中的數(shù)據(jù)部分進(jìn)行的闡述。ISO/IEC 11172-2

            2.Mpeg-1數(shù)據(jù)流分析
            編碼后的視頻序列是一個(gè)如同計(jì)算機(jī)網(wǎng)絡(luò)的OSI模型下的數(shù)據(jù)序列一樣,數(shù)據(jù)被分成很多層的概念。

            視頻序列層-畫面組層-畫面層-片層-宏塊層-塊層
            層次的關(guān)系很明顯,越往后越是底層,越接近實(shí)際的數(shù)據(jù)。

            2.1視頻序列層(VideoStream)
            視頻序列是以一個(gè)序列標(biāo)題開始,之后可以跟著一個(gè)或者多個(gè)畫面組。最后以Sequence_end_code結(jié)束。緊挨著每一個(gè)畫面組之前可以有一個(gè)序列標(biāo)題。也就是說每個(gè)畫面組,都可以有一個(gè)自己的序列標(biāo)題。
            序列標(biāo)題是一個(gè)以sequence_header_code開始,后跟著一系列數(shù)據(jù)元素的結(jié)構(gòu)。是視頻流中用來解碼的重要的參數(shù)之一。其中定義了量化矩陣(load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可選的intra_quantizer_matrix和 non_intra_quantizer_ matrix)以及其它的一些重要的數(shù)據(jù)元素,其中量化矩陣是可以在視頻流中重復(fù)的量化矩陣中變化的,并且在每次變化后,量化矩陣重新定義。其它的元素必須與第一個(gè)序列標(biāo)題中的值相同。
            整個(gè)視頻序列的結(jié)構(gòu)可以用下面的代碼表示:
            Video_Stream{
            unsigned int h_size;                         /* Horiz. size in pixels.     */
              unsigned int v_size;                         /* Vert. size in pixels.      */
              unsigned int mb_height;                      /* Vert. size in mblocks.     */
              unsigned int mb_width;                       /* Horiz. size in mblocks.    */
              unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
              unsigned char picture_rate;                  /* Code for picture rate.     */
              unsigned int bit_rate;                       /* Bit rate.                  */
              unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
              BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
              unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for
              intracoded frames.         */
              unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for
              non intracoded frames.     */
              char *ext_data;                              /* Extension data.            */
              char *user_data;                             /* User data.                 */
              GoP group;                                   /* Current group of pict.     */
              Pict picture;                                /* Current picture.           */
              Slice slice;                                 /* Current slice.             */
              Macroblock mblock;                           /* Current macroblock.        */
              Block block;                                 /* Current block.             */
              int state;                                   /* State of decoding.         */
              int bit_offset;                              /* Bit offset in stream.      */
              unsigned int *buffer;                        /* Pointer to next byte in
              buffer.                    */
              int buf_length;                              /* Length of remaining buffer.*/
              unsigned int *buf_start;                     /* Pointer to buffer start.   */
              int max_buf_length;                          /* Max lenght of buffer.      */
              PictImage *past;                             /* Past predictive frame.     */
              PictImage *future;                           /* Future predictive frame.   */
              PictImage *current;                          /* Current frame.             */
              PictImage *ring[RING_BUF_SIZE];              /* Ring buffer of frames.     */
            } Video_Stream;  
            具體的序列標(biāo)題的結(jié)構(gòu)的部分是這樣的:
            序列
            sequence_header{
            SEQ_START_CODE 0x000001b3;  /* 常量 ,作用使用來定位視頻序列的序列頭 */  
            unsigned int h_size;                         /* Horiz. size in pixels.     */
              unsigned int v_size;                         /* Vert. size in pixels.      */
              unsigned int mb_height;                      /* Vert. size in mblocks.     */
              unsigned int mb_width;                       /* Horiz. size in mblocks.    */
              unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
              unsigned char picture_rate;                  /* Code for picture rate.     */
              unsigned int bit_rate;                       /* Bit rate.                  */
              unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
              BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
              unsigned char load_intra_quantizer_matrix;
            unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for intracoded frames.         這個(gè)結(jié)構(gòu)是可選的,要看load_intra_quantizer_matrix的值,為真則有這個(gè)部分,否則沒有,因?yàn)?br>intra_quant_matrix是量化表的值,而Sequence_header結(jié)構(gòu)在視頻序列中是可重復(fù)的,即在每個(gè)畫面組之前都有可能再次給出一個(gè)sequence_header,并且可以在新的sequence_header 中重新定義量化表*/
            unsigned char load_non_intra_quantizer_matrix;
              unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for non intracoded frames. 也是可選。愿意于intra_quant_matrix可選的原因相同。當(dāng)load_non_intra_quant_matrix的值為真的時(shí)候需要定義。    */
              char *ext_data;                              /* Extension data.            */
              char *user_data;                             /* User data.                 */
             
            }

            由上面的分析,可以看出來的是:
            video_sequence(){
            next_start_code()
            do{
            sequence_header();
            do{
            group_of_pictures() ;畫面組
            }while (nextbits()==GROUP_START_CODE)
            }while(nextbits()==SEQUENCE_HEADER_CODE)
            SEQUENCE_END_CODE
            };

            正是由于視頻序列中存在很多開始碼,或者稱之為定位碼、同步碼。用來告訴解碼器目前數(shù)據(jù)的區(qū)域信息,所以解碼器才可以正確的處理各個(gè)數(shù)據(jù)區(qū)的數(shù)據(jù),下面就是視頻序列中的開始碼的羅列:
            #define SEQ_END_CODE 0x000001b7
            #define SEQ_START_CODE 0x000001b3
            #define GOP_START_CODE 0x000001b8
            #define PICTURE_START_CODE 0x00000100
            #define SLICE_MIN_START_CODE 0x00000101
            #define SLICE_MAX_START_CODE 0x000001af
            #define EXT_START_CODE 0x000001b5
            #define USER_START_CODE 0x000001b2
            這些開始碼都是一些特殊的32bits的比特序列,在視頻碼流中不會出現(xiàn)的。他們的起著標(biāo)志的作用,具體可以從名稱上面看出來。
            其中EXT_START_CODE和USER_START_CODE在每個(gè)層里面都會出現(xiàn),用來標(biāo)志擴(kuò)展數(shù)據(jù)區(qū)和用戶數(shù)據(jù)區(qū),用來添加任意的數(shù)據(jù),直到下一個(gè)開始碼結(jié)束。
            2.2畫面組層(GOP)
            在軟件xmplay1.1中的定義
            typedef struct GoP {
              BOOLEAN drop_flag;                     /* Flag indicating dropped frame. */
              unsigned int tc_hours;                 /* Hour component of time code.   */
              unsigned int tc_minutes;               /* Minute component of time code. */
              unsigned int tc_seconds;               /* Second component of time code. */
              unsigned int tc_pictures;              /* Picture counter of time code.  */
              BOOLEAN closed_gop;                    /* Indicates no pred. vectors to
                previous group of pictures.    */
              BOOLEAN broken_link;                   /* B frame unable to be decoded.  */
              char *ext_data;                        /* Extension data.                */
              char *user_data;                       /* User data.                     */
            } GoP;

            當(dāng)然每個(gè)畫面組層都是開始與標(biāo)志碼:GOP_START_CODE
            該層次語法上的定義是
            group_of_pictures{
            GOP_START_CODE
            Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures
            Closed_gop;
            Broken_link;
            Next_start_code;
            If(nextbits==extension_start_code){
            Extension_start_code;
            While(nextbits()==”0000 0000 0000 0000 0000 0001”){
            Group_extension_data;
            }
            next_start_code()
            }
            if(nextbits==user_data_start_code){
            user_data_start_code
            while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
            user_data;
            }
            next_start_code()
            }
            do{
            picture()
            }while(nextbits==picture_start_code)
            }

            Mpeg流最終顯示出來是一系列的畫面,而畫面組是mpeg流中可以獨(dú)立編碼的最小的單位,每個(gè)畫面組由一個(gè)標(biāo)題和一系列畫面組成。GOP標(biāo)題包含了時(shí)間和編輯的信息。
            Mpeg畫面組中必須至少有一個(gè)I幀畫面,可以有數(shù)目可變的B幀和P幀畫面,也可以沒有P和B幀。畫面組的第一幅編碼畫面是I畫面,該畫面之后跟隨著任意數(shù)目的I或P畫面,每對I、P畫面之間可以插入任意數(shù)目的B畫面。
            畫面組是畫面的集合,每幅畫面按照顯示的順序相鄰。
            畫面組中的畫面有兩種排列順序:
            1.按比特流順序 必須以I幀開頭,后面可按任何的次序,跟上任意數(shù)目的I,P或B畫面。
            2.按顯示順序必須以I或B畫面打頭,且以I或P畫面結(jié)束,最小的畫面組由一個(gè)I畫面組成。

            從編碼角度,可以精確的陳述的是,畫面組以一個(gè)畫面組標(biāo)題開始,以最先出現(xiàn)的下一個(gè)畫面組標(biāo)題或者下一個(gè)序列標(biāo)題或者序列結(jié)束碼結(jié)束。

            Mepg流中的標(biāo)志碼也就是開始碼,對正確的分割和識別碼流的成分起到了至關(guān)重要的作用。

            2.3畫面層(Pictures)
            畫面組層中的一幅幅畫面就是畫面層的數(shù)據(jù)了。包含了一幅畫面的所有編碼信息。一幅畫面同樣始于畫面的標(biāo)題。標(biāo)題以畫面開始碼(PICTURE_START_CODE 0x00000100)打頭。
            解析畫面單元的語法結(jié)構(gòu):
            picture(){
            picture_start_code
            temprol_reference     /*時(shí)序編號,通常一組畫面的編號都在1024以內(nèi),如果超過那么在1025幅畫面出復(fù)位為0,重新計(jì)數(shù)。*/                                   
            picture_coding_type                        
            vbv_delay/*對于固定比特率的視頻流,vbv_delay用與解碼過程開始和隨機(jī)存取之后,以保證在第一幅畫面被顯示之前,解碼器已經(jīng)讀到正確數(shù)目的比特?cái)?shù)。*/
            if((picture_coding_type==2) || picture_coding_type==3){
            full_pel_foward_vector /*全象素前向矢量,給定前向矢量的精度,在P和B畫面的標(biāo)題中出現(xiàn)*/
            forward_f_code
            }
            if(picture_coding_type==3){
            full_pel_backward_vector
            back_f_code
            }
            while(nextbits()==’1’){
            extra_bit_picture
            extra_information_picture
            }
            extra_bit_picture
            next_start_code

            if(nextbits()==extension_start_code){
            extension_start_code
            while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
            picture_extension_data
            }
            next_start_code()
            }
            if(nextbits()==user_data_start_code){
            user_data_start_code
            while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
            user_data
            }
            next_start_code()
            }
            do {
            slice()
            }while(nextbits()==slice_start_code)
            }


            整個(gè)畫面單元結(jié)構(gòu)是這樣的:
            typedef struct pict {
              unsigned int temp_ref;                 /* Temporal reference.             */
              unsigned int code_type;                /* Frame type: P, B, I             */
              unsigned int vbv_delay;                /* Buffer delay.                   */
              BOOLEAN full_pel_forw_vector;          /* Forw. vectors specified in full
                pixel values flag.              */
              unsigned int forw_r_size;              /* Used for vector decoding.       */
              unsigned int forw_f;                   /* Used for vector decoding.       */
              BOOLEAN full_pel_back_vector;          /* Back vectors specified in full
                pixel values flag.              */
              unsigned int back_r_size;              /* Used in decoding.               */
              unsigned int back_f;                   /* Used in decoding.               */
              char *extra_info;                      /* Extra bit picture info.         */
              char *ext_data;                        /* Extension data.                 */
              char *user_data;                       /* User data.                      */
            } Pict;

            可以看出整個(gè)pictures層的bit流結(jié)構(gòu)中由標(biāo)題和pictures數(shù)據(jù)組成。
            標(biāo)題中提供了必要的畫面信息數(shù)據(jù)和運(yùn)動(dòng)矢量的信息。

            2.4片層(Slice)
            片是任意數(shù)目宏塊組成的序列,其中宏塊必須從畫面的左上位置開始,按照光柵掃描的方向從左到右,從上到下排列。片中至少包涵一個(gè)宏塊,片與片之間沒有重疊,也沒有間隙。

            片層的解析語法:
            首先給出識別出Slice層數(shù)據(jù)的頭標(biāo)slice_start_code

            #define SLICE_MIN_START_CODE 0x00000101
            #define SLICE_MAX_START_CODE 0x000001af

            slice{
            slice_start_code /*從中可以計(jì)算出slice_vertical_position  片中第一個(gè)宏塊,以宏塊為單位的垂直位置*/
            quantizer_scale       /*設(shè)置量化步長尺寸。1-31*/
            while(nextbits()==’1’){
            extra_bit_slice                       ‘1’
            extra_information_slice
            }
            extra_bit_scale                            ‘0’
            do{
            macroblock()
            }while(nextbits()!=’0000 0000 0000 0000 0000 0000’)
            next_start_code()
            }

            typedef struct slice {
              unsigned int vert_pos;                 /* Vertical position of slice. */
              unsigned int quant_scale;              /* Quantization scale.         */
              char *extra_info;                      /* Extra bit slice info.       */
            } Slice;


            [此貼子已經(jīng)被作者于2008-7-19 17:51:53編輯過]
            --  作者:cdmalcl
            --  發(fā)布時(shí)間:2008-7-19 17:49:34
            -- 
            每個(gè)片由一個(gè)開始碼開始,開始后DC系數(shù)和矢量解碼的預(yù)測值都被復(fù)位,片開始部位的位置的水平位置由片中第一個(gè)宏塊的宏塊地址決定。這些措施使得在一幅畫面內(nèi)任何一片都可以單獨(dú)編碼而不需要前一片的信息。當(dāng)解碼是出現(xiàn)錯(cuò)誤,即可以從后繼的片重新開始。
            所以,當(dāng)數(shù)據(jù)在無錯(cuò)的環(huán)境中,可以一幅畫面就作為一片,但是如果是有錯(cuò)的環(huán)境,則每行宏塊作為一片會更加合理。

            表2  256×192畫面內(nèi)的片劃分(每行宏塊作為一個(gè)片,每個(gè)片的高度都是16pixels)
            1開始                                                                                1結(jié)束
            2開始                                                                                2結(jié)束
            3開始                                                                                3結(jié)束
            4開始                                                                                4結(jié)束
            5開始                                                                                5結(jié)束
            6開始                                                                                6結(jié)束
            7開始                                                                                7結(jié)束
            8開始                                                                                8結(jié)束
            9開始                                                                                9結(jié)束
            10開始                                                                              10結(jié)束
            11開始                                                                              11結(jié)束
            12開始                                                                              12結(jié)束
            13開始                                                                              13結(jié)束
            實(shí)際情況中片不宜太多,因?yàn)槠瑯?biāo)題,以及新片所需要盡心重新編碼花費(fèi)的開銷很大。
            片始于片標(biāo)題,片標(biāo)題又始于片開始碼,片開始碼是可以在一個(gè)范圍中取得得,這個(gè)范圍就是
            #define SLICE_MIN_START_CODE 0x00000101
            #define SLICE_MAX_START_CODE 0x000001af
            片開始碼得最后8為可以給出片得垂直位置,即以宏塊為單位從畫面頂部位置為1開始算起,片中第一個(gè)宏塊的垂直位置。宏塊有一個(gè)行號可以作為它得定位數(shù)據(jù),這個(gè)行號的計(jì)算方法是:片垂直位置-1
            宏塊的垂直位置最大為175。片中第一個(gè)宏塊的水平位置,可以由該宏塊的地址偏移計(jì)算出來,所以不需要依賴畫面內(nèi)的任何其他的宏塊的信息。
            --  作者:cdmalcl
            --  發(fā)布時(shí)間:2008-7-19 17:49:59
            -- 
            2.5宏塊層(Macroblock)
            宏塊是包含16pixels*16lines的亮度分量部分,以及在空間位置上對應(yīng)的兩個(gè)8pixels*8lines的色度分量部分,一個(gè)宏塊有4個(gè)亮度塊和2個(gè)色度塊。宏塊可以指源圖像或者重構(gòu)圖像的數(shù)據(jù),或者是量化后的DCT系數(shù)。
            宏塊中塊的順序如下:
            表1  宏塊中塊的排列

            01
            23


            4

            5

            Y分量Cb分量Cr分量

            宏塊的數(shù)據(jù)分析語法描述:

            macroblock(){
            while(nextbits()==’0000 0001 111’){
            macroblock_stuffing /*宏塊填料,為了防止下溢出,由編碼器填入的數(shù)據(jù),有它固定的11位bit格式就是’0000 0001 111’,當(dāng)然解決下溢出的方法還有很多,編碼器可以在標(biāo)題之前就加入填料位,或者可以減小quant_scale獲得更多的編碼系數(shù)等等*/
            }
            while(nextbits()==’0000 0001 000’){
            macroblock_escape  /*固定模式的bit串,當(dāng)macroblock_address與previous_macroblock_address的差大于33時(shí)將用到該碼。使得后繼的macroblock_increment所表示的值加33。
            }
            macroblock_address_increment   /*用于表示macroblock_address和previous_macorblock_ address之間的差值。最大值為33,當(dāng)前兩者差大于33時(shí)用macroblock_escape補(bǔ)充。 Macroblock_address表示的是宏塊在畫面中的絕對位置,最左上角的宏塊的macroblock_address為 0,previous_macroblock_address指示片中最后一個(gè)非跳空宏塊的位置。
            macroblock_type 
            if(macroblock_motion_forward){
            motion_horizontal_forward_code
            if((forward_f!=1) && (motion_horizontal_forward_code!=0))
            motion_horizontal_forward_r
            motion_vertical_forward_code
            if((forward_f!=1) && (motion_vertical_forward_code!=0))
            motion_vertical_forward_r
            }
            if(macroblock_motion_backward){
            motion_horizontal_backward_code
            if((backward_f!=1) && (motion_horizontal_backward_code!=0))
            motion_horizontal_backward_r
            motion_vertical_backward_code
            if((backward_f!=1) && (motion_vertical_backward_code!=0))
            motion_vertical_backward_r
            }
            if(macroblock_pattern)
            coded_block_pattern /*可以得到宏塊宏塊的pattern_code[i](i=0:5),從而確定該宏塊接收到的塊的種類有哪些。*/
            for(i=0;i<6;i++)
            block(i)
            if(picture_coding_type==4)
            end_of_marcoblock
            }
            片被分為16pixels*16lines的象素宏塊。每個(gè)宏塊都有它的標(biāo)題。包含了宏塊的地址、類型、量化器標(biāo)尺信息等等。標(biāo)題之后是該宏塊的6個(gè)塊的數(shù)據(jù)。

            在Xmplay代碼中給出的macrblock的定義:
            typedef struct macroblock {
              int mb_address;                        /* Macroblock address.              */
              int past_mb_addr;                      /* Previous mblock address.         */
              int motion_h_forw_code;                /* Forw. horiz. motion vector code. */
              unsigned int motion_h_forw_r;          /* Used in decoding vectors.        */
              int motion_v_forw_code;                /* Forw. vert. motion vector code.  */
              unsigned int motion_v_forw_r;          /* Used in decdoinge vectors.       */
              int motion_h_back_code;                /* Back horiz. motion vector code.  */
              unsigned int motion_h_back_r;          /* Used in decoding vectors.        */
              int motion_v_back_code;                /* Back vert. motion vector code.   */
              unsigned int motion_v_back_r;          /* Used in decoding vectors.        */
              unsigned int cbp;                      /* Coded block pattern.             */
              BOOLEAN mb_intra;                      /* Intracoded mblock flag.          */
              BOOLEAN bpict_past_forw;               /* Past B frame forw. vector flag.  */
              BOOLEAN bpict_past_back;               /* Past B frame back vector flag.   */
              int past_intra_addr;                   /* Addr of last intracoded mblock.  */
              int recon_right_for_prev;              /* Past right forw. vector.         */
              int recon_down_for_prev;               /* Past down forw. vector.          */
              int recon_right_back_prev;             /* Past right back vector.          */
              int recon_down_back_prev;              /* Past down back vector.           */
            } Macroblock;
            2.6塊層(Block)
            塊是一個(gè)正交的8pixels*8lines的亮度或者色度分量,塊可以指源畫面數(shù)據(jù)或者相應(yīng)的編碼數(shù)據(jù)元素。
            8*8單位象素的源畫面數(shù)據(jù)經(jīng)過DCT變換后的成為了相應(yīng)的DCT系數(shù)塊。
            塊的具體結(jié)構(gòu)為(xmplay源碼中的結(jié)構(gòu)定義):
            typedef struct block {
              short int dct_recon[8][8];             /* Reconstructed dct coeff matrix. */
              short int dct_dc_y_past;               /* Past lum. dc dct coefficient.   */
              short int dct_dc_cr_past;              /* Past cr dc dct coefficient.     */
              short int dct_dc_cb_past;              /* Past cb dc dct coefficient.     */
            } Block;

            解析塊的語法結(jié)構(gòu)是:
            block(i){
            if(pattern_code[i]){
            if(macroblock_intra){
            if(i<4){
            dct_dc_size_luminance
            if(dc_size_luminance!=0)
            dct_dc_differential
            }
            else{
            dct_dc_size_chrominance
            if(dc_size_chrominance!=0)
            dct_dc_differential
            }
            }
            else{
            dct_coeff_first
            }
            if(picture_coding_type!=4){
            while(nextbits()!=’10’)
            dct_coeff_next
            end_of_block
            }
            }
            http://www.ds0101.net/bbs/TopicOther.asp?t=5&BoardID=19&id=889 , 引用的原址。

            posted on 2009-07-14 14:49 TS,MPEG2,dvbc專家 閱讀(438) 評論(4)  編輯 收藏 引用

            評論

            # re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 14:57 凡客誠品
            來學(xué)習(xí)好東西:)  回復(fù)  更多評論
              

            # re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 15:01 戴爾電腦
            看看  回復(fù)  更多評論
              

            # re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 17:12 TS,MPEG2,dvbc專家
            請各位對照著code看看,那更有趣 !  回復(fù)  更多評論
              

            # re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-09-01 17:24 Guest
            好東西。  回復(fù)  更多評論
            posted on 2009-11-03 08:58 TS,MPEG2,dvbc專家 閱讀(2618) 評論(1)  編輯 收藏 引用

            評論

            # re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-11-03 11:33 天龍私服
            看看,不錯(cuò)的東西。  回復(fù)  更多評論
              


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            ts,ps,mpeg2 decoder and analysis,ts分析.
            久久综合伊人77777麻豆| 久久久久久久国产免费看| 久久国产香蕉一区精品| 久久青青草原综合伊人| 色综合久久最新中文字幕| 九九久久99综合一区二区| 99国产欧美精品久久久蜜芽 | 久久久久久久久久久久中文字幕| 午夜精品久久久久久影视riav| 久久精品国产亚洲精品| 青青久久精品国产免费看| 综合久久给合久久狠狠狠97色| 精品国产乱码久久久久软件| 亚洲午夜久久久| 日韩久久久久久中文人妻| 久久99国产综合精品免费| 久久久精品免费国产四虎| 久久93精品国产91久久综合 | 亚洲人成无码www久久久| 国产69精品久久久久APP下载| 伊人久久久AV老熟妇色| 97精品伊人久久大香线蕉app| 久久久久中文字幕| 99精品久久久久久久婷婷| 超级碰久久免费公开视频| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久久午夜精品| 久久精品国产精品亚洲精品| 亚洲国产成人精品无码久久久久久综合| 2020久久精品亚洲热综合一本| 国产精品久久网| 99久久综合国产精品免费| 精品国产一区二区三区久久| 日韩亚洲国产综合久久久| 久久久久女人精品毛片| 久久久久99精品成人片| 亚洲va中文字幕无码久久| 久久久无码精品亚洲日韩软件| 天天爽天天狠久久久综合麻豆 | 久久久精品视频免费观看| 中文精品久久久久人妻不卡|