青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ts,ps,mpeg2 decoder and analysis

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

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

MPEG-1流比特層次結構分析總結
1.簡要介紹Mpeg
Mpeg 是Motion Picture Expert Group的縮寫。活動圖像專家組是在1988年由ISO和IEC聯合成立的專家組,負責開發電視圖像數據和聲音數據的編碼,解碼和它們的同步等標準。到目前為止已經開發和正在開發的MPEG標準有很多,主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.

其中的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上存儲數字影視和在網絡上傳輸數字影視。
MPEG-1的標準號為ISO/IEC 11172,標準名:“信息技術——用于數據速率大約高達1.5Mb/s的數字存儲替的電視圖像和伴音編碼”
本文主要是對Mpeg-1Video數據流的結構進行分析,并將怎樣得到Mpeg-1流中的數據部分進行的闡述。ISO/IEC 11172-2

2.Mpeg-1數據流分析
編碼后的視頻序列是一個如同計算機網絡的OSI模型下的數據序列一樣,數據被分成很多層的概念。

視頻序列層-畫面組層-畫面層-片層-宏塊層-塊層
層次的關系很明顯,越往后越是底層,越接近實際的數據。

2.1視頻序列層(VideoStream)
視頻序列是以一個序列標題開始,之后可以跟著一個或者多個畫面組。最后以Sequence_end_code結束。緊挨著每一個畫面組之前可以有一個序列標題。也就是說每個畫面組,都可以有一個自己的序列標題。
序列標題是一個以sequence_header_code開始,后跟著一系列數據元素的結構。是視頻流中用來解碼的重要的參數之一。其中定義了量化矩陣(load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可選的intra_quantizer_matrix和 non_intra_quantizer_ matrix)以及其它的一些重要的數據元素,其中量化矩陣是可以在視頻流中重復的量化矩陣中變化的,并且在每次變化后,量化矩陣重新定義。其它的元素必須與第一個序列標題中的值相同。
整個視頻序列的結構可以用下面的代碼表示:
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;  
具體的序列標題的結構的部分是這樣的:
序列
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.         這個結構是可選的,要看load_intra_quantizer_matrix的值,為真則有這個部分,否則沒有,因為
intra_quant_matrix是量化表的值,而Sequence_header結構在視頻序列中是可重復的,即在每個畫面組之前都有可能再次給出一個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可選的原因相同。當load_non_intra_quant_matrix的值為真的時候需要定義。    */
  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
};

正是由于視頻序列中存在很多開始碼,或者稱之為定位碼、同步碼。用來告訴解碼器目前數據的區域信息,所以解碼器才可以正確的處理各個數據區的數據,下面就是視頻序列中的開始碼的羅列:
#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的比特序列,在視頻碼流中不會出現的。他們的起著標志的作用,具體可以從名稱上面看出來。
其中EXT_START_CODE和USER_START_CODE在每個層里面都會出現,用來標志擴展數據區和用戶數據區,用來添加任意的數據,直到下一個開始碼結束。
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;

當然每個畫面組層都是開始與標志碼: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流中可以獨立編碼的最小的單位,每個畫面組由一個標題和一系列畫面組成。GOP標題包含了時間和編輯的信息。
Mpeg畫面組中必須至少有一個I幀畫面,可以有數目可變的B幀和P幀畫面,也可以沒有P和B幀。畫面組的第一幅編碼畫面是I畫面,該畫面之后跟隨著任意數目的I或P畫面,每對I、P畫面之間可以插入任意數目的B畫面。
畫面組是畫面的集合,每幅畫面按照顯示的順序相鄰。
畫面組中的畫面有兩種排列順序:
1.按比特流順序 必須以I幀開頭,后面可按任何的次序,跟上任意數目的I,P或B畫面。
2.按顯示順序必須以I或B畫面打頭,且以I或P畫面結束,最小的畫面組由一個I畫面組成。

從編碼角度,可以精確的陳述的是,畫面組以一個畫面組標題開始,以最先出現的下一個畫面組標題或者下一個序列標題或者序列結束碼結束。

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

2.3畫面層(Pictures)
畫面組層中的一幅幅畫面就是畫面層的數據了。包含了一幅畫面的所有編碼信息。一幅畫面同樣始于畫面的標題。標題以畫面開始碼(PICTURE_START_CODE 0x00000100)打頭。
解析畫面單元的語法結構:
picture(){
picture_start_code
temprol_reference     /*時序編號,通常一組畫面的編號都在1024以內,如果超過那么在1025幅畫面出復位為0,重新計數。*/                                   
picture_coding_type                        
vbv_delay/*對于固定比特率的視頻流,vbv_delay用與解碼過程開始和隨機存取之后,以保證在第一幅畫面被顯示之前,解碼器已經讀到正確數目的比特數。*/
if((picture_coding_type==2) || picture_coding_type==3){
full_pel_foward_vector /*全象素前向矢量,給定前向矢量的精度,在P和B畫面的標題中出現*/
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)
}


整個畫面單元結構是這樣的:
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;

可以看出整個pictures層的bit流結構中由標題和pictures數據組成。
標題中提供了必要的畫面信息數據和運動矢量的信息。

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

片層的解析語法:
首先給出識別出Slice層數據的頭標slice_start_code

#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af

slice{
slice_start_code /*從中可以計算出slice_vertical_position  片中第一個宏塊,以宏塊為單位的垂直位置*/
quantizer_scale       /*設置量化步長尺寸。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;


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

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

01
23


4

5

Y分量Cb分量Cr分量

宏塊的數據分析語法描述:

macroblock(){
while(nextbits()==’0000 0001 111’){
macroblock_stuffing /*宏塊填料,為了防止下溢出,由編碼器填入的數據,有它固定的11位bit格式就是’0000 0001 111’,當然解決下溢出的方法還有很多,編碼器可以在標題之前就加入填料位,或者可以減小quant_scale獲得更多的編碼系數等等*/
}
while(nextbits()==’0000 0001 000’){
macroblock_escape  /*固定模式的bit串,當macroblock_address與previous_macroblock_address的差大于33時將用到該碼。使得后繼的macroblock_increment所表示的值加33。
}
macroblock_address_increment   /*用于表示macroblock_address和previous_macorblock_ address之間的差值。最大值為33,當前兩者差大于33時用macroblock_escape補充。 Macroblock_address表示的是宏塊在畫面中的絕對位置,最左上角的宏塊的macroblock_address為 0,previous_macroblock_address指示片中最后一個非跳空宏塊的位置。
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的象素宏塊。每個宏塊都有它的標題。包含了宏塊的地址、類型、量化器標尺信息等等。標題之后是該宏塊的6個塊的數據。

在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)
塊是一個正交的8pixels*8lines的亮度或者色度分量,塊可以指源畫面數據或者相應的編碼數據元素。
8*8單位象素的源畫面數據經過DCT變換后的成為了相應的DCT系數塊。
塊的具體結構為(xmplay源碼中的結構定義):
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;

解析塊的語法結構是:
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解壓縮的詳細過程 介紹。 2009-07-14 14:57 凡客誠品
來學習好東西:)  回復  更多評論
  

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

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

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

評論

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

ts,ps,mpeg2 decoder and analysis,ts分析.
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品123| 亚洲精品综合久久中文字幕| 亚洲综合精品一区二区| 亚洲精品专区| 欧美视频观看一区| 亚洲欧美激情四射在线日| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲一区在线免费| 中文精品视频一区二区在线观看| 国产精品久久久久999| 久久www免费人成看片高清| 欧美怡红院视频| 亚洲国产精选| 99伊人成综合| 国产亚洲精品v| 欧美mv日韩mv国产网站| 欧美激情一二区| 欧美一区免费视频| 浪潮色综合久久天堂| 亚洲视频在线观看一区| 欧美一区二区三区的| 亚洲人屁股眼子交8| 亚洲视频电影图片偷拍一区| 国产一区二区三区在线观看免费| 欧美成人蜜桃| 国产精品国产精品国产专区不蜜| 麻豆av福利av久久av| 欧美日韩在线精品| 亚洲在线中文字幕| 欧美中文字幕在线视频| 99精品热视频| 欧美在线黄色| 亚洲淫性视频| 久久久久久久久蜜桃| 亚洲视频在线看| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲色图综合久久| 久久久亚洲国产天美传媒修理工 | 一区二区视频免费在线观看 | 久久精品人人做人人爽| 欧美人与禽性xxxxx杂性| 久久久精品2019中文字幕神马| 欧美成人精品一区| 久久综合伊人77777尤物| 国产精品草莓在线免费观看| 女人香蕉久久**毛片精品| 国产精品一区久久久久| 亚洲精品麻豆| 国产一二精品视频| 亚洲性视频网址| 宅男在线国产精品| 欧美国产日韩二区| 亚洲成色精品| 亚洲国产日韩在线| 欧美在线视频全部完| 欧美一级淫片aaaaaaa视频| 欧美日韩亚洲国产一区| 亚洲国产精品ⅴa在线观看| 经典三级久久| 久久国产一区二区| 久久琪琪电影院| 国产在线观看精品一区二区三区 | 在线视频一区二区| 在线视频精品一| 欧美日韩欧美一区二区| 亚洲激情婷婷| 一区二区三区 在线观看视频| 免费在线观看精品| 欧美国产丝袜视频| 在线免费观看日韩欧美| 老牛影视一区二区三区| 欧美国产视频一区二区| 亚洲精品老司机| 欧美久色视频| 99国产精品久久久久久久成人热| 一区二区冒白浆视频| 欧美三级视频在线观看| 亚洲一区高清| 久久综合国产精品台湾中文娱乐网| 国精品一区二区三区| 久久夜色撩人精品| 亚洲国产91精品在线观看| aa日韩免费精品视频一| 欧美日韩国产在线观看| 亚洲一区二区日本| 久久亚洲综合色| 国产日韩亚洲欧美综合| 99国产精品久久久久久久| 欧美日韩免费区域视频在线观看| 一本大道久久a久久精品综合| 性欧美超级视频| 激情欧美一区二区| 欧美激情欧美激情在线五月| 在线视频日韩精品| 久久亚洲国产成人| 日韩午夜在线电影| 国产伦精品一区二区三区高清版| 久久久精品国产免费观看同学| 亚洲高清资源综合久久精品| 亚洲欧美日韩精品| 亚洲福利久久| 国产精品视频内| 六月婷婷一区| 亚洲你懂的在线视频| 欧美福利视频在线| 亚洲欧美影院| 亚洲三级电影在线观看| 国产欧美激情| 欧美日韩国产麻豆| 久久成人18免费网站| 99国产精品久久久| 亚洲第一区在线观看| 久久福利电影| 亚洲桃花岛网站| 亚洲国产精品久久久| 国产欧美一区视频| 欧美精品一区二区三区蜜臀| 久久精品成人欧美大片古装| 99精品黄色片免费大全| 欧美韩国日本综合| 久久综合久久久| 亚洲欧美日韩一区二区| 亚洲精品久久久久| 伊人成人开心激情综合网| 国产精品日韩精品欧美在线| 欧美激情自拍| 裸体女人亚洲精品一区| 久久精品99国产精品酒店日本| 一区二区欧美在线| 亚洲美女一区| 亚洲国产欧美一区二区三区久久| 久久综合九色综合网站| 久久久久国产一区二区| 亚洲在线一区| 亚洲欧美日韩国产综合| 亚洲视频欧洲视频| 一区二区三区视频免费在线观看| 亚洲国产日韩欧美在线动漫| 在线观看一区视频| 一区二区亚洲精品| 伊人夜夜躁av伊人久久| 国内精品免费在线观看| 国产一区二区三区高清在线观看| 国产精品美女一区二区在线观看| 欧美日韩在线播放一区二区| 欧美日韩久久精品| 欧美午夜精品久久久久久久| 欧美性jizz18性欧美| 欧美午夜www高清视频| 欧美三日本三级少妇三2023| 欧美日一区二区在线观看 | 在线观看视频一区二区欧美日韩| 国产一区观看| 激情文学一区| 亚洲国产精品成人久久综合一区| 亚洲国产一区二区三区在线播 | 国产目拍亚洲精品99久久精品 | 国产亚洲精品一区二区| 国产精品一二三四区| 国产欧美日韩综合精品二区| 国产一区二区三区在线观看免费| 激情久久婷婷| 亚洲三级视频在线观看| 99热在这里有精品免费| 亚洲视频一二区| 久久精品动漫| 欧美激情亚洲另类| 一本综合久久| 久久国产精品久久久久久| 免费日韩av片| 国产精品电影在线观看| 国内精品视频666| 亚洲日本无吗高清不卡| 亚洲午夜一区二区三区| 久久aⅴ乱码一区二区三区| 欧美96在线丨欧| 99视频在线精品国自产拍免费观看 | 亚洲香蕉成视频在线观看| 久久精品国产精品亚洲精品| 免费av成人在线| 99视频日韩| 久久青草福利网站| 国产精品久久久久久福利一牛影视| 国产欧美日韩精品a在线观看| 在线免费观看一区二区三区| 亚洲一级黄色片| 免费久久精品视频| 亚洲午夜女主播在线直播| 蜜臀av一级做a爰片久久| 国产精品久久久久久福利一牛影视 | 久久九九电影| 国产精品久久77777| 亚洲激情午夜| 久久精品九九| 亚洲图片欧美一区| 欧美国产成人精品| 黄色日韩在线| 欧美在线视频日韩| 一区二区三区视频观看| 女人色偷偷aa久久天堂|