日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

librtmp协议分析---RTMP_SendPacket函数

發(fā)布時(shí)間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 librtmp协议分析---RTMP_SendPacket函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

接下來我們分析RTMP_SendPacket函數(shù)。我們先了解一下rtmp的消息格式chunk。

RTMP的head組成

RTMP的head在協(xié)議中的表現(xiàn)形式是chunk head,前面已經(jīng)說到一個(gè)Message + head可以分成一個(gè)和多個(gè)chunk,為了區(qū)分這些chunk,肯定是需要一個(gè)chunk head的,具體的實(shí)現(xiàn)就把Message ?head的信息和chunk head的信息合并在一起以chunk head的形式表現(xiàn)。?
? ? ? ? 一個(gè)完整的chunk的組成如下圖所示


Chunk basic header:?
該字段包含chunk的stream ID和 type 。chunk的Type決定了消息頭的編碼方式。該字段的長度完全依賴于stream ID,該字段是一個(gè)可變長的字段。?



Chunk Msg Header:0, 3 ,7, 11?
該字段包含了將要發(fā)送的消息的信息(或者是一部分,一個(gè)消息拆成多個(gè)chunk的情況下是一部分)該字段的長度由chunk basic header中的type決定。



Extend Timestamp: 0 ,4 bytes
該字段發(fā)送的時(shí)候必須是正常的時(shí)間戳設(shè)置成0xffffff時(shí),當(dāng)正常時(shí)間戳不為0xffffff時(shí),該字段不發(fā)送。當(dāng)時(shí)間戳比0xffffff小該字段不發(fā)送,當(dāng)時(shí)間戳比0xffffff大時(shí)該字段必須發(fā)送,且正常時(shí)間戳設(shè)置成0xffffff。


Chunk Data
實(shí)際數(shù)據(jù)(Payload),可以是信令,也可以是媒體數(shù)據(jù)。


總結(jié)如下圖所示:




6.1.2 塊消息頭
有四種格式的塊消息ID,供塊流基本頭中的fmt 字段選擇。一個(gè)實(shí)現(xiàn)應(yīng)該使用最緊致的方式來表示塊消息頭。

6.1.2.1 類型0
0 類型的塊長度為11 字節(jié)。在一個(gè)塊流的開始和時(shí)間戳返回的時(shí)候必須有這種塊。


時(shí)間戳:3 字節(jié)
對于0 類型的塊。消息的絕對時(shí)間戳在這里發(fā)送。如果時(shí)間戳大于或等于16777215(16 進(jìn)制0x00ffffff),該值必須為16777215,并且擴(kuò)展時(shí)間戳必須出現(xiàn)。否則該值就是整個(gè)的時(shí)間戳。


6.1.2.2. 類型1
類型1 的塊占7 個(gè)字節(jié)長。消息流ID 不包含在本塊中。塊的消息流ID 與先前的塊相同。具有可變大小消息的流,在第一個(gè)消息之后的每個(gè)消息的第一個(gè)塊應(yīng)該使用這個(gè)格式。


6.1.2.3. 類型2
類型2 的塊占3 個(gè)字節(jié)。既不包含流ID 也不包含消息長度。本塊使用的流ID 和消息長度與先前的塊相同。具有固定大小消息的流,在第一個(gè)消息之后的每個(gè)消息的第一個(gè)塊應(yīng)該使用這個(gè)格式。


6.1.2.4 類型3
類型3 的塊沒有頭。流ID,消息長度,時(shí)間戳都不出現(xiàn)。這種類型的塊使用與先前塊相同的數(shù)據(jù)。當(dāng)一個(gè)消息被分成多個(gè)塊,除了第一塊以外,所有的塊都應(yīng)使用這種類型。示例可參考6.2.2 節(jié)中的例2 。由相同大小,流ID,和時(shí)間間隔的流在類型2 的塊之后應(yīng)使用這種塊。示例可參考6.2.1 節(jié)中的例1 。如果第一個(gè)消息和第二個(gè)消息的時(shí)間增量與第一個(gè)消息的時(shí)間戳相同,那么0類型的塊之后必須是3 類型的塊而,不需要類型2 的塊來注冊時(shí)間增量。如果類型3 的塊在類型0 的塊之后,那么類型3 的時(shí)間戳增量與0 類型的塊的時(shí)間戳相同。

時(shí)間戳增量:3 字節(jié)
對于類型1 的塊和類型2 的塊,本字段表示先前塊的時(shí)間戳與當(dāng)前塊的時(shí)間戳的差值。如果增量大于等于1677215(16 進(jìn)制0x00ffffff),這個(gè)值必須是16777215 ,并且擴(kuò)展時(shí)間戳必須出現(xiàn)。否則這個(gè)值就是整個(gè)的增量。


消息長度:3 字節(jié)
對于類型0 或類型1 的塊本字段表示消息的長度。注意,這個(gè)值通常與負(fù)載長度是不相同的。The chunk payload length is the?maximum chunk size for all but the last chunk, and the remainder (which may be?the entire length, for small messages) for the last chunk.


消息類型ID:1 字節(jié)
對于0 類型和1 類型的塊,本字段發(fā)送消息類型。


消息流ID:4 字節(jié)
對于0 類型的塊,本字段存儲(chǔ)消息流ID。通常,在一個(gè)塊流中的消息來自于同一個(gè)消息流。雖然,由于不同的消息可能復(fù)用到一個(gè)塊流中而使頭壓縮無法有效實(shí)施。但是,如果一個(gè)消息流關(guān)閉而另一個(gè)消息流才打開,那么通過發(fā)送一個(gè)新的0 類型的塊重復(fù)使用一個(gè)存在的塊流也不是不可以。


6.1.3. 擴(kuò)展時(shí)間戳
只有當(dāng)塊消息頭中的普通時(shí)間戳設(shè)置為0x00ffffff 時(shí),本字段才被傳送。如果普通時(shí)間戳的值小于0x00ffffff,那么本字段一定不能出現(xiàn)。如果時(shí)間戳字段不出現(xiàn)本字段也一定不能出現(xiàn)。類型3 的塊一定不能含有本字段。本字段在塊消息頭之后,塊時(shí)間之前。


代碼分析如下:

[cpp]?view plaincopy print?
  • int?RTMP_SendPacket(RTMP?*r,?RTMPPacket?*packet,?int?queue)??
  • {??
  • ????const?RTMPPacket?*prevPacket?=?r->m_vecChannelsOut[packet->m_nChannel];??
  • ????uint32_t?last?=?0;??
  • ????int?nSize;??
  • ????int?hSize,?cSize;??
  • ????char?*header,?*hptr,?*hend,?hbuf[RTMP_MAX_HEADER_SIZE],?c;??
  • ????uint32_t?t;??
  • ????char?*buffer,?*tbuf?=?NULL,?*toff?=?NULL;??
  • ????int?nChunkSize;??
  • ????int?tlen;??
  • ??
  • ????//?前一個(gè)packet存在且不是完整的ChunkMsgHeader,因此有可能需要調(diào)整塊消息頭的類型??
  • ????//fmt字節(jié)??
  • ????/*case?0:chunk?msg?header?長度為11?
  • ?????*?case?1:chunk?msg?header?長度為7?
  • ?????*?case?2:chunk?msg?header?長度為3?
  • ?????*?case?3:chunk?msg?header?長度為0?
  • ????*/??
  • ????if?(prevPacket?&&?packet->m_headerType?!=?RTMP_PACKET_SIZE_LARGE)??
  • ????{??
  • ????????/*?compress?a?bit?by?using?the?prev?packet's?attributes?*/??
  • ????????//?獲取ChunkMsgHeader類型,前一個(gè)Chunk與當(dāng)前Chunk比較??
  • ????????//?如果前后兩個(gè)塊的大小、包類型及塊頭類型都相同,則將塊頭類型fmt設(shè)為2,??
  • ????????//?即可省略消息長度、消息類型id、消息流id??
  • ????????//?可以參考官方協(xié)議:流的分塊?---?6.1.2.3節(jié)??
  • ????????if?(prevPacket->m_nBodySize?==?packet->m_nBodySize&&?prevPacket->m_packetType?==?packet->m_packetType??
  • ????????&&?packet->m_headerType?==?RTMP_PACKET_SIZE_MEDIUM)??
  • ????????????packet->m_headerType?=?RTMP_PACKET_SIZE_SMALL;??
  • ??
  • ????????//?前后兩個(gè)塊的時(shí)間戳相同,且塊頭類型fmt為2,則相應(yīng)的時(shí)間戳也可省略,因此將塊頭類型置為3??
  • ????????//?可以參考官方協(xié)議:流的分塊?---?6.1.2.4節(jié)??
  • ????????if?(prevPacket->m_nTimeStamp?==?packet->m_nTimeStamp?&&?packet->m_headerType?==?RTMP_PACKET_SIZE_SMALL)??
  • ????????????packet->m_headerType?=?RTMP_PACKET_SIZE_MINIMUM;??
  • ????????last?=?prevPacket->m_nTimeStamp;//?前一個(gè)包的時(shí)間戳??
  • ????}??
  • ??
  • ????//?塊頭類型fmt取值0、1、2、3,超過3就表示出錯(cuò)(fmt占二個(gè)字節(jié))??
  • ????if?(packet->m_headerType?>?3)?/*?sanity?*/??
  • ????{??
  • ????????RTMP_Log(RTMP_LOGERROR,?"sanity?failed!!?trying?to?send?header?of?type:?0x%02x.",?(unsigned?char)packet->m_headerType);??
  • ????????return?FALSE;??
  • ????}??
  • ??
  • ????//?塊頭初始大小?=?基本頭(1字節(jié))?+?塊消息頭大小(11/7/3/0)?=?[12,?8,?4,?1]??
  • ????//?塊基本頭是1-3字節(jié),因此用變量cSize來表示剩下的0-2字節(jié)??
  • ????//?nSize?表示塊頭初始大小,?hSize表示塊頭大小??
  • ????nSize?=?packetSize[packet->m_headerType];??
  • ????hSize?=?nSize;??
  • ????cSize?=?0;??
  • ????//?時(shí)間戳增量??
  • ????t?=?packet->m_nTimeStamp?-?last;??
  • ??
  • ????if?(packet->m_body)??
  • ????{??
  • ????????//?m_body是指向負(fù)載數(shù)據(jù)首地址的指針;“-”號用于指針前移??
  • ????????header?=?packet->m_body?-?nSize;??
  • ????????//?塊頭的首指針??
  • ????????hend?=?packet->m_body;??
  • ????????//?塊頭的尾指針??
  • ????}??
  • ????else??
  • ????{??
  • ????????header?=?hbuf?+?6;??
  • ????????hend?=?hbuf?+?sizeof(hbuf);??
  • ????}??
  • ??
  • ????if?(packet->m_nChannel?>?319)//?塊流id(cs?id)大于319,則塊基本頭占3個(gè)字節(jié)??
  • ????????cSize?=?2;??
  • ????else?if?(packet->m_nChannel?>?63)//?塊流id(cs?id)在64與319之間,則塊基本頭占2個(gè)字節(jié)??
  • ????????cSize?=?1;??
  • ????//?ChunkBasicHeader的長度比初始長度還要長??
  • ????if?(cSize)??
  • ????{??
  • ????????header?-=?cSize;//?header指向塊頭??
  • ????????hSize?+=?cSize;//?hSize加上ChunkBasicHeader的長度(比初始長度多出來的長度)??
  • ????}??
  • ??
  • ????//?nSize?>?1表示塊消息頭至少有3個(gè)字節(jié),即存在timestamp字段??
  • ????//?相對TimeStamp大于0xffffff,此時(shí)需要使用ExtendTimeStamp??
  • ????if?(nSize?>?1?&&?t?>=?0xffffff)??
  • ????{??
  • ????????header?-=?4;??
  • ????????hSize?+=?4;??
  • ????}??
  • ??
  • ????hptr?=?header;??
  • ????c?=?packet->m_headerType?<<?6;//?把ChunkBasicHeader的Fmt類型左移6位??
  • ??
  • ????//?設(shè)置basic?header的第一個(gè)字節(jié)值,前兩位為fmt.?可以參考官方協(xié)議:流的分塊?---?6.1.1節(jié)??
  • ????switch?(cSize)??
  • ????{??
  • ????case?0://?把ChunkBasicHeader的低6位設(shè)置成ChunkStreamID(?cs?id?)??
  • ????????c?|=?packet->m_nChannel;??
  • ????????break;??
  • ????case?1://?同理,但低6位設(shè)置成000000??
  • ????????break;??
  • ????case?2://?同理,但低6位設(shè)置成000001??
  • ????????c?|=?1;??
  • ????????break;??
  • ????}??
  • ????*hptr++?=?c;//?可以拆分成兩句*hptr=c;?hptr++,此時(shí)hptr指向第2個(gè)字節(jié)??
  • ??
  • ????//?設(shè)置basic?header的第二(三)個(gè)字節(jié)值??
  • ????if?(cSize)??
  • ????{??
  • ????????int?tmp?=?packet->m_nChannel?-?64;//?將要放到第2字節(jié)的內(nèi)容tmp??
  • ????????*hptr++?=?tmp?&?0xff;//?獲取低位存儲(chǔ)與第2字節(jié)??
  • ????????if?(cSize?==?2)//?ChunkBasicHeader是最大的3字節(jié)時(shí),獲取高位存儲(chǔ)于最后1個(gè)字節(jié)(注意:排序使用大端序列,和主機(jī)相反)??
  • ????????????*hptr++?=?tmp?>>?8;??
  • ????}??
  • ??
  • ????if?(nSize?>?1)//?ChunkMsgHeader長度為11、7、3,?都含有timestamp(3字節(jié))??
  • ????{??
  • ????????//?將時(shí)間戳(相對或絕對)轉(zhuǎn)化為3個(gè)字節(jié)存入hptr,如果時(shí)間戳超過0xffffff,則后面還要填入Extend?Timestamp??
  • ????????hptr?=?AMF_EncodeInt24(hptr,?hend,?t?>?0xffffff???0xffffff?:?t);??
  • ????}??
  • ??
  • ????if?(nSize?>?4)//?ChunkMsgHeader長度為11、7,都含有?msg?length?+?msg?type?id??
  • ????{??
  • ????????//?將消息長度(msg?length)轉(zhuǎn)化為3個(gè)字節(jié)存入hptr??
  • ????????hptr?=?AMF_EncodeInt24(hptr,?hend,?packet->m_nBodySize);??
  • ????????*hptr++?=?packet->m_packetType;??
  • ????}??
  • ????//?ChunkMsgHeader長度為11,?含有msg?stream?id(?小端)??
  • ????if?(nSize?>?8)??
  • ????????hptr?+=?EncodeInt32LE(hptr,?packet->m_nInfoField2);??
  • ??
  • ????if?(nSize?>?1?&&?t?>=?0xffffff)//?如果時(shí)間戳大于0xffffff,則需要寫入Extend?Timestamp??
  • ????????hptr?=?AMF_EncodeInt32(hptr,?hend,?t);??
  • ??
  • ????//?到此為止,已經(jīng)將塊頭填寫好了??
  • ????//?此時(shí)nSize表示負(fù)載數(shù)據(jù)的長度,?buffer是指向負(fù)載數(shù)據(jù)區(qū)的指針??
  • ????nSize?=?packet->m_nBodySize;??
  • ????buffer?=?packet->m_body;??
  • ????nChunkSize?=?r->m_outChunkSize;//Chunk大小,默認(rèn)是128字節(jié)??
  • ??
  • ????RTMP_Log(RTMP_LOGDEBUG2,?"%s:?fd=%d,?size=%d",?__FUNCTION__,?r->m_sb.sb_socket,?nSize);??
  • ????/*?send?all?chunks?in?one?HTTP?request?,使用HTTP協(xié)議?*/??
  • ????if?(r->Link.protocol?&?RTMP_FEATURE_HTTP)??
  • ????{??
  • ????????//?nSize:Message負(fù)載長度;nChunkSize:Chunk長度;??
  • ????????//?例nSize:307,nChunkSize:128;??
  • ????????//?可分為(307?+?128?-?1)/128?=?3個(gè)??
  • ????????//?為什么加?nChunkSize?-?1?因?yàn)槌〞?huì)只取整數(shù)部分!??
  • ????????int?chunks?=?(nSize?+?nChunkSize?-?1)?/?nChunkSize;??
  • ????????if?(chunks?>?1)//?Chunk個(gè)數(shù)超過一個(gè)??
  • ????????{??
  • ????????????//?注意:ChunkBasicHeader的長度?=?cSize?+?1??
  • ????????????//?消息分n塊后總的開銷:??
  • ????????????//?n個(gè)ChunkBasicHeader,1個(gè)ChunkMsgHeader,1個(gè)Message負(fù)載??
  • ????????????//?實(shí)際上只有第一個(gè)Chunk是完整的,剩下的只有ChunkBasicHeader??
  • ????????????tlen?=?chunks?*?(cSize?+?1)?+?nSize?+?hSize;??
  • ????????????tbuf?=?malloc(tlen);??
  • ????????????if?(!tbuf)??
  • ????????????????return?FALSE;??
  • ????????????toff?=?tbuf;??
  • ????????}??
  • ????}??
  • ??
  • ????//?消息的負(fù)載?+?頭??
  • ????while?(nSize?+?hSize)??
  • ????{??
  • ????????int?wrote;??
  • ??
  • ????????if?(nSize?<?nChunkSize)//?消息負(fù)載大小?<?Chunk大小(不用分塊)??
  • ????????????nChunkSize?=?nSize;//?Chunk可能小于設(shè)定值??
  • ??
  • ????????RTMP_LogHexString(RTMP_LOGDEBUG2,?(uint8_t?*)header,?hSize);??
  • ????????RTMP_LogHexString(RTMP_LOGDEBUG2,?(uint8_t?*)buffer,?nChunkSize);??
  • ????????//?如果r->Link.protocol采用Http協(xié)議,則將RTMP包數(shù)據(jù)封裝成多個(gè)Chunk,然后一次性發(fā)送。??
  • ????????//?否則每封裝成一個(gè)塊,就立即發(fā)送出去??
  • ????????if?(tbuf)??
  • ????????{??
  • ????????????//?將從Chunk頭開始的nChunkSize?+?hSize個(gè)字節(jié)拷貝至toff中,??
  • ????????????//?這些拷貝的數(shù)據(jù)包括塊頭數(shù)據(jù)(hSize字節(jié))和nChunkSize個(gè)負(fù)載數(shù)據(jù)??
  • ????????????memcpy(toff,?header,?nChunkSize?+?hSize);??
  • ????????????toff?+=?nChunkSize?+?hSize;??
  • ????????}??
  • ????????else//?負(fù)載數(shù)據(jù)長度不超過設(shè)定的塊大小,不需要分塊,因此tbuf為NULL;或者r->Link.protocol不采用Http??
  • ????????{??
  • ????????????//?直接將負(fù)載數(shù)據(jù)和塊頭數(shù)據(jù)發(fā)送出去??
  • ????????????wrote?=?WriteN(r,?header,?nChunkSize?+?hSize);??
  • ????????????if?(!wrote)??
  • ????????????????return?FALSE;??
  • ????????}??
  • ????????nSize?-=?nChunkSize;//?消息負(fù)載長度?-?Chunk負(fù)載長度??
  • ????????buffer?+=?nChunkSize;//?buffer指針前移1個(gè)Chunk負(fù)載長度??
  • ????????hSize?=?0;//?重置塊頭大小為0,后續(xù)的塊只需要有基本頭(或加上擴(kuò)展時(shí)間戳)即可??
  • ??
  • ????????//?如果消息負(fù)載數(shù)據(jù)還沒有發(fā)完,準(zhǔn)備填充下一個(gè)塊的塊頭數(shù)據(jù)??
  • ????????if?(nSize?>?0)??
  • ????????{??
  • ????????????header?=?buffer?-?1;??
  • ????????????hSize?=?1;??
  • ????????????if?(cSize)??
  • ????????????{??
  • ????????????????header?-=?cSize;??
  • ????????????????hSize?+=?cSize;??
  • ????????????}??
  • ????????????*header?=?(0xc0?|?c);??
  • ????????????if?(cSize)??
  • ????????????{??
  • ????????????????int?tmp?=?packet->m_nChannel?-?64;??
  • ????????????????header[1]?=?tmp?&?0xff;??
  • ????????????????if?(cSize?==?2)??
  • ????????????????????header[2]?=?tmp?>>?8;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????if?(tbuf)??
  • ????{??
  • ????????int?wrote?=?WriteN(r,?tbuf,?toff?-?tbuf);??
  • ????????free(tbuf);??
  • ????????tbuf?=?NULL;??
  • ????????if?(!wrote)??
  • ????????????return?FALSE;??
  • ????}??
  • ??
  • ????/*?we?invoked?a?remote?method?*/??
  • ????if?(packet->m_packetType?==?0x14)??
  • ????{??
  • ????????AVal?method;??
  • ????????char?*ptr;??
  • ????????ptr?=?packet->m_body?+?1;??
  • ????????AMF_DecodeString(ptr,?&method);??
  • ????????RTMP_Log(RTMP_LOGDEBUG,?"Invoking?%s",?method.av_val);??
  • ????????/*?keep?it?in?call?queue?till?result?arrives?*/??
  • ????????if?(queue)??
  • ????????{??
  • ????????????int?txn;??
  • ????????????ptr?+=?3?+?method.av_len;??
  • ????????????txn?=?(int)AMF_DecodeNumber(ptr);??
  • ????????????AV_queue(&r->m_methodCalls,?&r->m_numCalls,?&method,?txn);??
  • ????????}??
  • ????}??
  • ??
  • ????if?(!r->m_vecChannelsOut[packet->m_nChannel])??
  • ????r->m_vecChannelsOut[packet->m_nChannel]?=?malloc(sizeof(RTMPPacket));??
  • ????memcpy(r->m_vecChannelsOut[packet->m_nChannel],?packet,?sizeof(RTMPPacket));??
  • ????return?TRUE;??
  • }??

  • 總結(jié)

    以上是生活随笔為你收集整理的librtmp协议分析---RTMP_SendPacket函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美男女激情 | 涩涩成人网 | 日韩中文网 | 一区在线免费观看 | 国久久 | 欧美日韩在线观看一区二区三区 | 中文字幕免费高清在线观看 | 欧美大片免费 | 亚洲一区二区三区加勒比 | 自拍视频网址 | 日韩第六页 | 中文字幕免费视频 | 久久激情婷婷 | 欧美日韩亚洲高清 | 亚洲va韩国va欧美va | 欧美一区二区高清视频 | 成年人性生活免费视频 | 雨宫琴音一区二区三区 | 国产av国片偷人妻麻豆 | xxxx96| 亚洲精品久久久久久动漫器材一区 | 国产精品亲子伦对白 | 日韩中文字幕网址 | 老熟女毛茸茸浓毛 | 日韩亚洲精品视频 | 真实偷拍激情啪啪对白 | 中文免费av | 少妇久久久 | 色人天堂 | 欧美男女交配视频 | 在线成年人视频 | 日本bdsm视频 | 国产日韩欧美在线观看 | 欧美激情五月 | ts人妖另类精品视频系列 | 亚洲播播| 日韩wwww | 久久不射电影网 | 日韩成人激情 | 久久婷婷五月国产色综合激情 | 日本激情网址 | 久久98| 亚洲欧美国产一区二区三区 | 亚洲欧美久久久 | 国产精品调教视频 | 福利视频一区二区三区 | 亚洲人成电影网站 | 亚洲精品~无码抽插 | 国产美女裸体无遮挡免费视频 | 亚洲欧美日韩精品久久 | 国产伦精品一区二区三区四区免费 | 欧美日韩在线成人 | 国产精品swag | 在线观看国产精品一区 | 免费久久精品视频 | 久草电影在线 | 在线色导航 | 奇米精品一区二区三区在线观看一 | 亚洲成人第一 | 亚洲精华液一区二区 | 亚洲av无码成人精品区 | 91精品视频网 | 美女午夜影院 | 波兰性xxxxx极品hd | 日韩免费播放 | av五月| 白石茉莉奈黑人 | 亚洲天堂影院在线观看 | 成人一区二区三区仙踪林 | 日本作爱视频 | 日本高清不卡在线观看 | 国产三级视频在线播放 | 99在线免费观看 | 午夜生活片 | 精品无码一区二区三区爱欲 | 日本少妇喷水视频 | 久久精品66 | 国产一区中文 | 十大黄台在线观看 | 欧美一区二区三区久久综合 | 亚洲精品在线中文字幕 | 三级黄毛片 | 日韩字幕在线观看 | 可以看的av网站 | 熟女肥臀白浆大屁股一区二区 | 国产精品国产三级国产普通话对白 | 香蕉a | 午夜精品在线免费观看 | 人成精品 | 99色综合网| 特淫毛片| 成年人免费看的视频 | 青青草毛片 | 久久一级大片 | 免费成年人视频 | 精品免费看 | 神马午夜场 | 青青草免费在线观看 | 国产精品拍拍 |