久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebRTC视频JitterBuffer详解

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebRTC视频JitterBuffer详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

WebRTC視頻JitterBuffer詳解

  • 1 WebRTC版本
  • 2 概要
  • 3 JitterBuffer結構和基本流程
  • 4 幀完整性 - PacketBuffer
    • 4.1 包緩存
    • 4.2 幀的開始和結束
    • 4.3 插入RTP數據包 - PacketBuffer::InsertPacket
    • 4.4 處理RTP填充包 - PacketBuffer::PaddingReceived
    • 4.5 丟包檢測 - PacketBuffer::UpdateMissingPackets
    • 4.6 連續包檢測 - PacketBuffer::PotentialNewFrame
    • 4.7 幀完整性檢測 - PacketBuffer::FindFrames
    • 4.8 總結
  • 5 查找參考幀 - RtpFrameReferenceFinder
    • 5.1 圖像ID - PID
    • 5.2 設置參考幀 - RtpFrameReferenceFinder::ManageFramePidOrSeqNum
    • 5.3 處理填充包 - RtpFrameReferenceFinder::PaddingReceived
    • 5.3 更新填充包狀態 - RtpFrameReferenceFinder::UpdateLastPictureIdWithPadding
    • 5.4 處理緩存的包 - RtpFrameReferenceFinder::RetryStashedFrames
    • 5.5 總結
  • 6 有序輸出 - FrameBuffer
    • 6.1 插入幀 - FrameBuffer::InsertFrame
    • 6.2 更新參考幀信息 - FrameBuffer::UpdateFrameInfoWithIncomingFrame
    • 6.3 取解碼幀 - FrameBuffer::NextFrame
    • 6.4 狀態傳播 - FrameBuffer::PropagateContinuity/FrameBuffer::PropagateDecodability
    • 6.6 總結
  • 7 抖動與延遲
    • 7.1 抖動計算
    • 7.2 延遲 - VCMTiming
      • 7.2.1 目標延遲 - googTargetDelayMs
      • 7.2.2 當前延遲 - googCurrentDelayMs
    • 7.3 平滑渲染時間 - TimestampExtrapolator
  • 8 總結

1 WebRTC版本

m74。

2 概要

舊版的視頻JitterBuffer實現在VCMJitterBuffer類中,目前已經不用,新版的JitterBuffer的功能被分散到多個模塊中,主要包括:

  • PacketBuffer:負責幀的完整性,保證組成幀的每個包序列號連續,并且有一個包標識幀的開始,有一個包標識幀的結束;
  • RtpFrameReferenceFinder:負責給每個幀設置好參考幀,同時兼顧GOP內各幀的連續性;
  • FrameBuffer:負責幀的連續性和可解碼性,這里幀的連續性是指某幀的所有參考幀都已經收到,幀的可解碼性是指某幀的所有參考幀都已經被解碼;
  • VCMJitterEstimator:計算抖動(googJitterbufferMS),用于計算目標延遲(googTargetDelayMs),用于音視頻同步;
  • VCMTiming:計算當前延遲(googCurrentDelayMs),用于計算渲染時間。

本文對照代碼描述上述模塊的主要工作過程。

3 JitterBuffer結構和基本流程

RtpVideoStreamReceiver類收到RTP包后,交給PacketBuffer類緩存、排序,PacketBuffer收集滿1個完整的幀后,交還給RtpVideoStreamReceiver類,RtpVideoStreamReceiver類將一個完整的幀交給RtpFrameReferenceFinder,RtpFrameReferenceFinder類緩存最近的GOP,每個完整幀落在一個GOP中會填充好該幀的參考幀,交還給RtpVideoStreamReceiver,RtpVideoStreamReceiver將填充好參考幀的完整幀交給FrameBuffer,FrameBuffer判斷某幀的所有參考幀都收到認為該幀連續,在某幀的所有參考幀都解碼后認為該幀可以解碼,從而可以交給解碼器。

可以認為JitterBuffer的這些模塊分三個層次分別做了RTP包的排序、GOP內幀的排序、GOP之間的排序:

  • 包的排序:PacketBuffer;
  • 幀的排序:RtpFrameReferenceFinder;
  • GOP的排序:FrameBuffer。

4 幀完整性 - PacketBuffer

4.1 包緩存

PacketBuffer類有兩個類型的包緩存:

  • std::vector data_buffer_,數據緩存,保存包原始數據,用于拼接整幀原始數據;
  • std::vector sequence_buffer_,排序緩存,保存包連續性信息,用于緩存包序列號等信息并排序成完整的幀。

連續性信息:

struct ContinuityInfo {// 包序列號.uint16_t seq_num = 0;// 是否為幀的第一個包.bool frame_begin = false;// 是否為幀的最后一個包.bool frame_end = false;// 這個槽是否已經被使用.bool used = false;// 標識當前包之前的所有包是否都已經被插入包緩存,也就是當前包之前的所有包是否連續.bool continuous = false;// 當前包是否已經用于創建一個幀.bool frame_created = false;};

4.2 幀的開始和結束

在packet_buffer.cc:348有一段注釋:

// In the case of H264 we don't have a frame_begin bit (yes,// |frame_begin| might be set to true but that is a lie). So instead// we traverese backwards as long as we have a previous packet and// the timestamp of that packet is the same as this one. This may cause// the PacketBuffer to hand out incomplete frames.// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7106

這個注釋意為H264的RTP包并沒有一個可信的幀開始標識,并貼上一個7106問題鏈接,打開這個鏈接,可以看到問題在2017年的原有描述是在RTP分包方式FUA下,本該設置的幀開始標識S并沒有被正確置位,但是在2018年4月該問題被修改成可以通過first_mb_in_slice來代替FUA S位。

但是實際上即使是到目前master的最新版本代碼(13788025c81712df7e5535931a0b1d7931da6c2d )仍然還是使用FUA S位來標識FUA分包模式下一幀的第一個包,并且我測試過的多個版本(57,64,74)都沒有出現FUA S位未正常置位的情況,可能已經在17年后的版本中被修復。

bool RtpDepacketizerH264::ParseFuaNalu(RtpDepacketizer::ParsedPayload* parsed_payload,const uint8_t* payload_data) {……bool first_fragment = (payload_data[1] & kSBit) > 0;

在這里重點強調一幀第一個包的標識是因為該標識對判斷幀的完整性有重要作用,另外,一幀的最后一個包就是簡單根據RTP頭中的marker位來標識,只有在第一個包、最后一個包都取到并且中間的所有包都連續的情況下,才認為是一個完整的幀。

4.3 插入RTP數據包 - PacketBuffer::InsertPacket

數據緩存、排序緩存這兩個包緩存都是初始長度為size_(512)的數組,一旦緩存滿會倍增容量,直到達到最大長度max_size_(2048)。

插入包的過程就是把數據填入這兩個緩存的過程,同時會判斷是否出現丟包,如果出現丟包則等待,在沒有出現丟包的情況下,會判斷是否已經獲得了完整的幀,如果已經組裝好了若干完整的幀,則通過OnAssembledFrame回調通知RtpVideoStreamReceiver。

bool PacketBuffer::InsertPacket(VCMPacket* packet) {std::vector<std::unique_ptr<RtpFrameObject>> found_frames;{rtc::CritScope lock(&crit_);// 當前包序列號uint16_t seq_num = packet->seqNum;// 當前包在包緩存(包括數據緩存和排序緩存)中的索引size_t index = seq_num % size_;// 如果是第一個包if (!first_packet_received_) {// 保存第一個包序列號first_seq_num_ = seq_num;// 接收到了第一個包狀態置位first_packet_received_ = true;} else if (AheadOf(first_seq_num_, seq_num)) { // 如果當前包比之前記錄的第一個包first_seq_num_還老// 并且之前已經清理過第一個包序列號,說明已經至少成功解碼過一幀,RtpVideoStreamReceiver::FrameDecoded// 會調用PacketBuffer::ClearTo(seq_num),清理first_seq_num_之前的所有緩存,這個時候還來一個比first_seq_num_還// 老的包,就沒有必要再留著了。if (is_cleared_to_first_seq_num_) {delete[] packet->dataPtr;packet->dataPtr = nullptr;return false;}// 相反如果沒有被清理過,則是有必要保留成第一個包的,比如發生了亂序。first_seq_num_ = seq_num;}// 如果這個槽被占用了if (sequence_buffer_[index].used) {// 如果序列號相等,則為重復包,刪除負載并丟棄。if (data_buffer_[index].seqNum == packet->seqNum) {delete[] packet->dataPtr;packet->dataPtr = nullptr;return true;}// 如果槽被占但是輸入包和對應槽的包序列號不等,說明緩存滿了,需要擴容。while (ExpandBufferSize() && sequence_buffer_[seq_num % size_].used) {}// 重新計算輸入包索引.index = seq_num % size_;// 如果對應的槽還是被占用了,還是滿,已經不行了,致命錯誤.if (sequence_buffer_[index].used) {delete[] packet->dataPtr;packet->dataPtr = nullptr;return false;}}// 如果沒有錯誤,在index對應槽位填入當前包的信息sequence_buffer_[index].frame_begin = packet->is_first_packet_in_frame(); // 第一個包標識sequence_buffer_[index].frame_end = packet->is_last_packet_in_frame(); // 最后一個包標識sequence_buffer_[index].seq_num = packet->seqNum; // 序列號sequence_buffer_[index].continuous = false; // 之前的包是否連續,這里初始為false,在FindFrames中置位sequence_buffer_[index].frame_created = false; // 是否已經用于創建一個幀,在FindFrames中置位sequence_buffer_[index].used = true; // 槽位已經被占data_buffer_[index] = *packet; // 存入數據緩存packet->dataPtr = nullptr; // 轉移了指針的所有者// 更新丟包信息,檢查收到當前包后是否有丟包導致的空洞,也就是不連續.UpdateMissingPackets(packet->seqNum);// 更新時間戳int64_t now_ms = clock_->TimeInMilliseconds();last_received_packet_ms_ = now_ms;if (packet->frameType == kVideoFrameKey)last_received_keyframe_packet_ms_ = now_ms;// 分析排序緩存,檢查是否能夠組裝出完整的幀并返回.found_frames = FindFrames(seq_num);}// 如果有完整的幀則通過回調OnAssembledFrame上報RtpVideoStreamReceiver.for (std::unique_ptr<RtpFrameObject>& frame : found_frames)assembled_frame_callback_->OnAssembledFrame(std::move(frame));return true; }

4.4 處理RTP填充包 - PacketBuffer::PaddingReceived

發送端可能在編碼器輸出碼率不足的情況下為保證發送碼率填充空包,空包不會進入排序緩存和數據緩存,但是會觸發丟包檢測和完整幀的檢測。

void PacketBuffer::PaddingReceived(uint16_t seq_num) {std::vector<std::unique_ptr<RtpFrameObject>> found_frames;{rtc::CritScope lock(&crit_);// 更新丟包信息,檢查收到當前包后是否有丟包導致的空洞,也就是不連續.UpdateMissingPackets(seq_num);// 分析排序緩存,檢查是否能夠組裝出完整的幀并返回.found_frames = FindFrames(static_cast<uint16_t>(seq_num + 1));}// 如果有完整的幀則通過回調OnAssembledFrame上報RtpVideoStreamReceiver.for (std::unique_ptr<RtpFrameObject>& frame : found_frames)assembled_frame_callback_->OnAssembledFrame(std::move(frame)); }

4.5 丟包檢測 - PacketBuffer::UpdateMissingPackets

PacketBuffer維護一個丟包緩存missing_packets_,主要用于在PacketBuffer::FindFrames中判斷某個已經完整的P幀前面是否有未完整的幀,如果有,該幀可能是I幀,也可能是P幀,這里并不會立刻把這個完整的P幀向后傳遞給RtpFrameReferenceFinder,而是暫時清除狀態,等待前面的所有幀完整后才重復檢測操作,所以這里實際上也發生了幀的排序,并產生了一定的幀間依賴。

void PacketBuffer::UpdateMissingPackets(uint16_t seq_num) {// 如果最新插入的包序列號還未設置過,這里直接設置一次.if (!newest_inserted_seq_num_)newest_inserted_seq_num_ = seq_num;const int kMaxPaddingAge = 1000;// 如果當前包的序列號新于之前的最新包序列號,沒有發生亂序if (AheadOf(seq_num, *newest_inserted_seq_num_)) {// 丟包緩存missing_packets_最大保存1000個包,這里得到當前包1000個包以前的序列號,// 也就差不多是丟包緩存里應該保存的最老的包.uint16_t old_seq_num = seq_num - kMaxPaddingAge;// 第一個>= old_seq_num的包的位置auto erase_to = missing_packets_.lower_bound(old_seq_num);// 刪除丟包緩存里所有1000個包之前的所有包(如果有的話)missing_packets_.erase(missing_packets_.begin(), erase_to);// 如果最老的包的序列號都比當前最新包序列號新,那么更新一下當前最新包序列號if (AheadOf(old_seq_num, *newest_inserted_seq_num_))*newest_inserted_seq_num_ = old_seq_num;// 因為seq_num > newest_inserted_seq_num_,這里開始統計(newest_inserted_seq_num_, sum)之間的空洞.++*newest_inserted_seq_num_;// 從newest_inserted_seq_num_開始,每個小于當前seq_num的包都進入丟包緩存,// 直到newest_inserted_seq_num_ == seq_num,也就是最新包的序列號變成了當前seq_num.while (AheadOf(seq_num, *newest_inserted_seq_num_)) {missing_packets_.insert(*newest_inserted_seq_num_);++*newest_inserted_seq_num_;}} else {// 如果當前收到的包的序列號小于當前收到的最新包序列號,則從丟包緩存中刪除(之前應該已經進入丟包緩存)missing_packets_.erase(seq_num);} }

4.6 連續包檢測 - PacketBuffer::PotentialNewFrame

PacketBuffer::PotentialNewFrame(uint16_t seq_num)函數用于檢測seq_num前的所有包是連續的,只有包連續,才進入完整幀的檢測,所以叫“潛在的新幀檢測”。

bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const {// 通過序列號獲取緩存索引size_t index = seq_num % size_;// 上個包的索引int prev_index = index > 0 ? index - 1 : size_ - 1;// 如果當前包的槽位沒有被占用,那么該包之前沒有處理過,不連續.if (!sequence_buffer_[index].used)return false;// 如果當前包的槽位的序列號和當前包序列號不一致,不連續.if (sequence_buffer_[index].seq_num != seq_num)return false;// 如果當前包已經用于創建一個幀,不連續.if (sequence_buffer_[index].frame_created)return false;// 如果當前包的幀開始標識frame_begin為true,那么該包是幀第一個包,連續.if (sequence_buffer_[index].frame_begin)return true;// 如果上個包的槽位沒有被占用,那么上個包之前沒有處理過,不連續.if (!sequence_buffer_[prev_index].used)return false;// 如果上個包已經用于創建一個幀,不連續. if (sequence_buffer_[prev_index].frame_created)return false;// 如果上個包和當前包的序列號不連續,不連續.if (sequence_buffer_[prev_index].seq_num !=static_cast<uint16_t>(sequence_buffer_[index].seq_num - 1)) {return false;}// 如果上個包的時間戳和當前包的時間戳不相等,不連續.if (data_buffer_[prev_index].timestamp != data_buffer_[index].timestamp)return false;// 排除掉以上所有錯誤后,如果上個包連續,則可以認為當前包連續.if (sequence_buffer_[prev_index].continuous)return true;// 如果上個包不連續或者有其他錯誤,就返回不連續.return false; }

從函數代碼可以看出,一個幀的第一個包當且僅當幀開始標識frame_begin == true才返回連續,而第二個包以后是否返回連續依賴于上個包是否連續,這個連續性的延展保證只要判定某個序列號連續,其之前的所有包都連續。

frame_begin在FUA分包模式下是由FUA頭的S位來設置的,所以上文說到這個標識的正確性很重要,如果S位沒有正確設置則在FUA模式下(大幀分包)會出現錯誤,所幸這個應該不會發生。

4.7 幀完整性檢測 - PacketBuffer::FindFrames


PacketBuffer::FindFrames函數會遍歷排序緩存中連續的包,檢查一幀的邊界,但是這里對VPX和H264的處理做了區分:

  • 對VPX,這個函數認為包的frame_begin可信,這樣VPX的完整一幀就完全依賴于檢測到frame_begin和frame_end這兩個包;

  • 對H264,這個函數認為包的frame_begin不可信,并不依賴frame_begin來判斷幀的開始,但是frame_end仍然是可信的,具體說H264的開始標識是通過從frame_end標識的一幀最后一個包向前追溯,直到找到一個時間戳不一樣的斷層,認為找到了完整的一個H264的幀。

另外這里對H264的P幀做了一些特殊處理,雖然P幀可能已經完整,但是如果該P幀前面仍然有丟包空洞,不會立刻向后傳遞,會等待直到所有空洞被填滿,因為P幀必須有參考幀才能正確解碼。

std::vector<std::unique_ptr<RtpFrameObject>> PacketBuffer::FindFrames(uint16_t seq_num) {std::vector<std::unique_ptr<RtpFrameObject>> found_frames;// 基本算法:遍歷所有連續包,先找到帶有frame_end標識的幀最后一個包,然后向前回溯,// 找到幀的第一個包(VPX是frame_begin, H264是時間戳不連續),組成完整一幀,// PotentialNewFrame(seq_num)檢測seq_num之前的所有包是否連續.for (size_t i = 0; i < size_ && PotentialNewFrame(seq_num); ++i) {// 當前包的緩存索引size_t index = seq_num % size_;// 如果seq_num之前所有包連續,那么seq_num自己也連續.sequence_buffer_[index].continuous = true;// 找到了幀的最后一個包.if (sequence_buffer_[index].frame_end) {size_t frame_size = 0;int max_nack_count = -1;// 幀開始序列號,從幀尾部開始.uint16_t start_seq_num = seq_num;// 幀的最小接收時間,基本是幀第一個包的接收時間.int64_t min_recv_time = data_buffer_[index].receive_time_ms;// 幀的最大接收時間,基本是最后一個包的接收時間.int64_t max_recv_time = data_buffer_[index].receive_time_ms;// 開始向前回溯,找幀的第一個包.// 幀開始的索引,從幀尾部開始.int start_index = index;// 已經測試的包數.size_t tested_packets = 0;// 當前包的時間戳.int64_t frame_timestamp = data_buffer_[start_index].timestamp;// Identify H.264 keyframes by means of SPS, PPS, and IDR.bool is_h264 = data_buffer_[start_index].codec() == kVideoCodecH264;bool has_h264_sps = false;bool has_h264_pps = false;bool has_h264_idr = false;bool is_h264_keyframe = false;// 從幀尾部的包開始回溯.while (true) {// 測試包數++++tested_packets;// 累加幀大小frame_size += data_buffer_[start_index].sizeBytes;// 獲取最大重傳數max_nack_count =std::max(max_nack_count, data_buffer_[start_index].timesNacked);// 當前包現在被標識為已經用于創建一個幀.sequence_buffer_[start_index].frame_created = true;// 獲取最小接收時間min_recv_time =std::min(min_recv_time, data_buffer_[start_index].receive_time_ms);// 獲取最大接收時間max_recv_time =std::max(max_recv_time, data_buffer_[start_index].receive_time_ms);// 如果是VPX,并且找到了frame_begin標識的第一個包,一幀完整,回溯結束.if (!is_h264 && sequence_buffer_[start_index].frame_begin)break;// 如果是H264.if (is_h264 && !is_h264_keyframe) {// 先檢測是否關鍵幀,從數據緩存獲取H264頭.const auto* h264_header = absl::get_if<RTPVideoHeaderH264>(&data_buffer_[start_index].video_header.video_type_header);if (!h264_header || h264_header->nalus_length >= kMaxNalusPerPacket)return found_frames;// 遍歷所有NALU,注意WebRTC所有IDR幀前面都會帶SPS、PPS.for (size_t j = 0; j < h264_header->nalus_length; ++j) {if (h264_header->nalus[j].type == H264::NaluType::kSps) {has_h264_sps = true; // 找到了SPS} else if (h264_header->nalus[j].type == H264::NaluType::kPps) {has_h264_pps = true; // 找到了PPS} else if (h264_header->nalus[j].type == H264::NaluType::kIdr) {has_h264_idr = true; // 找到了IDR}}// 默認sps_pps_idr_is_h264_keyframe_為false,也就是說只需要有IDR幀就認為是關鍵幀,// 而不需要等待SPS、PPS完整.if ((sps_pps_idr_is_h264_keyframe_ && has_h264_idr && has_h264_sps &&has_h264_pps) ||(!sps_pps_idr_is_h264_keyframe_ && has_h264_idr)) {is_h264_keyframe = true;}}// 如果檢測包數已經達到緩存容量,中止.if (tested_packets == size_)break;// 搜索指針向前移動一個包.start_index = start_index > 0 ? start_index - 1 : size_ - 1;// In the case of H264 we don't have a frame_begin bit (yes,// |frame_begin| might be set to true but that is a lie). So instead// we traverese backwards as long as we have a previous packet and// the timestamp of that packet is the same as this one. This may cause// the PacketBuffer to hand out incomplete frames.// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7106// 這里保留了注釋,可以看看H264不使用frame_begin的原因,實際上應該也可以.if (is_h264 && // 如果是H264(!sequence_buffer_[start_index].used || // 如果該槽位未被占用,發現斷層.data_buffer_[start_index].timestamp != frame_timestamp)) { // 如果時間戳不一致,發現斷層.break; // 結束回溯. }// 如果仍然在一幀內,開始包序列號--.--start_seq_num;}// 到這里幀的開始和結束位置已經搜索完畢,可以開始組幀.// 但是對H264 P幀,需要做另外的特殊處理,雖然P幀可能已經完整,// 但是如果該P幀前面仍然有丟包空洞,不會立刻向后傳遞,會等待直到所有空洞被填滿,// 因為P幀必須有參考幀才能正確解碼。if (is_h264) {// Warn if this is an unsafe frame.if (has_h264_idr && (!has_h264_sps || !has_h264_pps)) {RTC_LOG(LS_WARNING)<< "Received H.264-IDR frame "<< "(SPS: " << has_h264_sps << ", PPS: " << has_h264_pps<< "). Treating as "<< (sps_pps_idr_is_h264_keyframe_ ? "delta" : "key")<< " frame since WebRTC-SpsPpsIdrIsH264Keyframe is "<< (sps_pps_idr_is_h264_keyframe_ ? "enabled." : "disabled");}// 設置數據緩存中的關鍵幀標識.const size_t first_packet_index = start_seq_num % size_;RTC_CHECK_LT(first_packet_index, size_);if (is_h264_keyframe) {data_buffer_[first_packet_index].frameType = kVideoFrameKey;} else {data_buffer_[first_packet_index].frameType = kVideoFrameDelta;}// missing_packets_.upper_bound(start_seq_num) != missing_packets_.begin()// 這個條件是說在丟包的列表里搜索>start_seq_num(幀開始序列號)的第一個位置,// 發現其不等于丟包列表的開頭, 有些丟的包序列號小于start_seq_num, 也就是說P幀前面有丟包空洞, // 舉例1:// missing_packets_ = { 3, 4, 6}, start_seq_num = 5, missing_packets_.upper_bound(start_seq_num)==6// 作為一幀開始位置的序列號5,前面還有3、4這兩個包還未收到,那么對P幀來說,雖然完整,但是向后傳遞也可能是沒有意義的, // 所以這里又清除了frame_created狀態,先繼續緩存,等待丟包的空洞填滿.// 舉例2:// missing_packets_ = { 10, 16, 17}, start_seq_num = 3, missing_packets_.upper_bound(start_seq_num)==10// 作為一幀開始位置的序列號3,前面并沒有丟包,并且幀完整,那么可以向后傳遞.if (!is_h264_keyframe && missing_packets_.upper_bound(start_seq_num) !=missing_packets_.begin()) {uint16_t stop_index = (index + 1) % size_;while (start_index != stop_index) {sequence_buffer_[start_index].frame_created = false;start_index = (start_index + 1) % size_;}// 返回找到的所有完整幀.return found_frames;}}// 馬上要組幀了,清除丟包列表中到幀開始位置之前的丟包.// 對H264 P幀來說,如果P幀前面有空洞不會運行到這里,在上面已經解釋.// 對I幀來說,可以丟棄前面的丟包信息(?).missing_packets_.erase(missing_packets_.begin(),missing_packets_.upper_bound(seq_num));// 組一個幀.found_frames.emplace_back(new RtpFrameObject(this, start_seq_num, seq_num, frame_size,max_nack_count, min_recv_time, max_recv_time));} // if (sequence_buffer_[index].frame_end)// 向后擴大搜索的范圍,假設丟包、亂序,當前包的seq_num剛好填補了之前的一個空洞,// 該包并不能檢測出一個完整幀,需要這里向后移動指針到frame_end再進行回溯,直到檢測出完整幀,// 這里會繼續檢測之前緩存的因為前面有空洞而沒有向后傳遞的P幀。++seq_num;}// 返回找到的所有完整幀.return found_frames; }

4.8 總結

  • PacketBuffer::InsertPacket向包緩存插入RTP數據,并觸發幀完整性檢查;
  • PacketBuffer::PaddingReceived處理空包,并觸發幀完整性檢查;
  • PacketBuffer::UpdateMissingPackets,更新丟包信息,用于檢查P幀前面的空洞;
  • PacketBuffer::PotentialNewFrame,判斷包的連續性,只有連續的包才檢查幀完整性;
  • PacketBuffer::FindFrames,幀完整性檢查,如果得到完整幀,則通過OnAssembledFrame回調上報。

5 查找參考幀 - RtpFrameReferenceFinder


上圖描述了RtpFrameReferenceFinder的基本工作原理,顧名思義,RtpFrameReferenceFinder就是要找到每個幀的參考幀。I幀是GOP起始幀自參考,后續GOP內每個幀都要參考上一幀。

RtpFrameReferenceFinder維護最近的GOP表,收到P幀后,RtpFrameReferenceFinder找到P幀所屬的GOP,將P幀的參考幀設置為GOP內該幀的上一幀,之后傳遞給FrameBuffer。

RtpFrameReferenceFinder還保證GOP內幀的輸出連續,對H264來說,每收到一幀都判斷該幀的第一個包的序列號是否與之前GOP收到的最后一個包序列號連續,是則輸出連續幀,否則緩存等待直到連續;對VPX,只需要簡單判斷PID是否連續即可。這種連續傳遞的依賴關系會導致GOP內任一幀丟失則GOP內的剩余時間都處于卡頓狀態。

5.1 圖像ID - PID

PID(Picture ID)是每幀圖像的唯一標識,VPX定義了PID,但是H264沒有這個概念,RtpFrameReferenceFinder使用每幀的最后一個包的序列號作為H264幀的PID。

在一個GOP內,除了I幀、P幀之外,可能還有WebRTC為補償發送碼率填充的空包,也會占用一個序列號。I幀是GOP的開始,沒有連續性問題,但是要判斷當前收到的P幀是否連續則需要判斷該P幀的第一個包序列號-1是否等于該GOP當前收到的最后一個包序列號,可能是上一幀的最后一個包,也可能是一個填充包。

RtpFrameReferenceFinder定義的的GOP表結構:

keyvalue
last_seq_num:I幀最后一個包序列號,PIDlast_picture_id_gop:GOP內最新的一個幀的最后一個包的序列號, 用于設置為下一個幀的參考幀。
last_picture_id_with_padding_gop:GOP內最新一個包的序列號,有可能是last_picture_id_gop,也有可能是填充包,用于檢查幀的連續性。

5.2 設置參考幀 - RtpFrameReferenceFinder::ManageFramePidOrSeqNum

該函數用于檢查輸入幀的連續性,并且設置其參考幀。

RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFramePidOrSeqNum(RtpFrameObject* frame,int picture_id) {// 對H264,在沒有開啟generic的情況下,picture_id肯定是kNoPictureId.if (picture_id != kNoPictureId) {frame->id.picture_id = unwrapper_.Unwrap(picture_id); // 設置PIDframe->num_references = frame->frame_type() == kVideoFrameKey ? 0 : 1; // I幀自參考,P幀參考上一幀frame->references[0] = frame->id.picture_id - 1; // 參考幀是上一幀return kHandOff;}// 如果是關鍵幀,插入GOP表,key是last_seq_num,初始value是{last_seq_num, last_seq_num}if (frame->frame_type() == kVideoFrameKey) {last_seq_num_gop_.insert(std::make_pair(frame->last_seq_num(),std::make_pair(frame->last_seq_num(), frame->last_seq_num())));}// 如果GOP表空,那么就不可能找到參考幀,先緩存.if (last_seq_num_gop_.empty())return kStash;// 刪除較老的關鍵幀(PID小于last_seq_num - 100), 但是至少保留一個。auto clean_to = last_seq_num_gop_.lower_bound(frame->last_seq_num() - 100);for (auto it = last_seq_num_gop_.begin();it != clean_to && last_seq_num_gop_.size() > 1;) {it = last_seq_num_gop_.erase(it);}// 在GOP表中搜索第一個比當前幀新的關鍵幀。auto seq_num_it = last_seq_num_gop_.upper_bound(frame->last_seq_num());// 如果搜索到的關鍵幀是最老的,說明當前幀比最老的關鍵幀還老,無法設置參考幀,丟棄.if (seq_num_it == last_seq_num_gop_.begin()) {RTC_LOG(LS_WARNING) << "Generic frame with packet range ["<< frame->first_seq_num() << ", "<< frame->last_seq_num()<< "] has no GoP, dropping frame.";return kDrop;}// 如果搜索到的關鍵幀不是最老的,那么搜索到的關鍵幀的上一個關鍵幀所在的GOP里應該可以找到參考幀,// 如果當前幀是關鍵幀,seq_num_it為end(), seq_num_it--則為最后一個關鍵幀.seq_num_it--;// 保證幀的連續,不連續則先緩存.// 當前GOP的最新一個幀的最后一個包的序列號.uint16_t last_picture_id_gop = seq_num_it->second.first;// 當前GOP的最新包的序列號,可能是last_picture_id_gop, 也可能是填充包.uint16_t last_picture_id_with_padding_gop = seq_num_it->second.second;// P幀的連續性檢查.if (frame->frame_type() == kVideoFrameDelta) {// 獲得P幀第一個包的上個包的序列號.uint16_t prev_seq_num = frame->first_seq_num() - 1;// 如果P幀第一個包的上個包的序列號與當前GOP的最新包的序列號不等,說明不連續,先緩存.if (prev_seq_num != last_picture_id_with_padding_gop)return kStash;}// 現在這個幀是連續的了.RTC_DCHECK(AheadOrAt(frame->last_seq_num(), seq_num_it->first));// 獲得當前幀的最后一個包的序列號,設置為初始PID,后面還會設置一次Unwrap.frame->id.picture_id = frame->last_seq_num();// 設置幀的參考幀數,P幀才需要1個參考幀.frame->num_references = frame->frame_type() == kVideoFrameDelta;// 設置參考幀為當前GOP的最新一個幀的最后一個包的序列號,// 既然該幀是連續的,那么其參考幀自然也就是上個幀.frame->references[0] = rtp_seq_num_unwrapper_.Unwrap(last_picture_id_gop);// 如果當前幀比當前GOP的最新一個幀的最后一個包還新,則更新GOP的最新一個幀的最后一個包(first)// 以及GOP的最新包(second).if (AheadOf<uint16_t>(frame->id.picture_id, last_picture_id_gop)) {seq_num_it->second.first = frame->id.picture_id; // 更新GOP的最新一個幀的最后一個包seq_num_it->second.second = frame->id.picture_id; // 更新GOP的最新包,可能被填充包更新.}// 更新最新PID,H264無用.last_picture_id_ = frame->id.picture_id;// 更新填充包狀態.UpdateLastPictureIdWithPadding(frame->id.picture_id);// 設置當前幀的PID為Unwrap形式.frame->id.picture_id = rtp_seq_num_unwrapper_.Unwrap(frame->id.picture_id);// 該包已經設置了參考幀且連續,可以向后傳遞了.return kHandOff; }

5.3 處理填充包 - RtpFrameReferenceFinder::PaddingReceived

該函數緩存填充包,并更新填充包狀態,假如該填充包剛好填補了當前GOP的序列號空洞,則有可能有緩存的P幀進入連續狀態,所以嘗試處理一次緩存的P幀。

void RtpFrameReferenceFinder::PaddingReceived(uint16_t seq_num) {rtc::CritScope lock(&crit_);// 只保留最近100個填充包.auto clean_padding_to =stashed_padding_.lower_bound(seq_num - kMaxPaddingAge);stashed_padding_.erase(stashed_padding_.begin(), clean_padding_to);// 緩存填充包.stashed_padding_.insert(seq_num);// 更新填充包狀態.UpdateLastPictureIdWithPadding(seq_num);// 嘗試處理一次緩存的P幀,有可能序列號連續了.RetryStashedFrames(); }

5.3 更新填充包狀態 - RtpFrameReferenceFinder::UpdateLastPictureIdWithPadding

該函數檢查填充包緩存中的填充包,如果在GOP內連續則更新GOP表的last_picture_id_with_padding_gop字段,保證GOP的最新包序列號為最新的填充包序列號,以保證幀的連續性檢查能夠正確運行下去。

void RtpFrameReferenceFinder::UpdateLastPictureIdWithPadding(uint16_t seq_num) {// 獲取GOP表第一個比seq_num新的I幀.auto gop_seq_num_it = last_seq_num_gop_.upper_bound(seq_num);// 如果第一個比seq_num新的I幀在GOP表首,說明seq_num已經很老了,不處理.if (gop_seq_num_it == last_seq_num_gop_.begin())return;// 獲取seq_num所在的GOP.--gop_seq_num_it;// 計算GOP最新包的下一個連續的序列號,看看是否可以在緩存的填充包中查到。uint16_t next_seq_num_with_padding = gop_seq_num_it->second.second + 1;// 查找填充包緩存中第一個大于等于next_seq_num_with_padding的位置.auto padding_seq_num_it =stashed_padding_.lower_bound(next_seq_num_with_padding);// 如果連續的序列號都能在緩存的填充包中查到,更新GOP最新包序列號,并從填充包緩存中清除.while (padding_seq_num_it != stashed_padding_.end() &&*padding_seq_num_it == next_seq_num_with_padding) {// 更新GOP最新包的序列號為連續的填充包序列號.gop_seq_num_it->second.second = next_seq_num_with_padding;// 下個連續的填充包序列號.++next_seq_num_with_padding;// 刪除填充包緩存的當前項,指向下一個.padding_seq_num_it = stashed_padding_.erase(padding_seq_num_it);}// 在某種情況下,這個流長時間連續但是沒有獲得新的關鍵幀,當前的幀可能比上個關鍵幀// 更老(例如發生了序列號wrapping), 為防止這種情況不時的更新這個關鍵幀的PID。// 如果該GOP的關鍵幀的最后一個包的序列號(PID)早于當前包10000,更新該關鍵幀PID.if (ForwardDiff(gop_seq_num_it->first, seq_num) > 10000) {RTC_DCHECK_EQ(1ul, last_seq_num_gop_.size());// 設置新的PID為當前幀seq_num.last_seq_num_gop_[seq_num] = gop_seq_num_it->second;// 刪除舊的項.last_seq_num_gop_.erase(gop_seq_num_it);} }

5.4 處理緩存的包 - RtpFrameReferenceFinder::RetryStashedFrames

有兩種情況可以嘗試處理緩存的幀,持續的輸出帶參考幀的連續的幀。

  • 在輸出完一個連續的帶參考幀的幀后,幀緩存stashed_frames_中可能還可以輸出下一個連續的帶參考幀的幀;
  • 收到一個亂序的填充包,導致GOP中的某個P幀連續。
void RtpFrameReferenceFinder::RetryStashedFrames() {bool complete_frame = false;do {complete_frame = false;// 遍歷緩存的幀for (auto frame_it = stashed_frames_.begin();frame_it != stashed_frames_.end();) {// 調用ManageFramePidOrSeqNum來處理一個緩存幀,檢查是否可以輸出帶參考幀的連續的幀.FrameDecision decision = ManageFrameInternal(frame_it->get());// 檢查處理結果switch (decision) {case kStash: // 仍然不連續,或者沒有參考幀.++frame_it; // 檢查下一個緩存幀.break;case kHandOff: // 找到了一個帶參考幀的連續的幀.complete_frame = true;// 通過OnCompleteFrame回調輸出.frame_callback_->OnCompleteFrame(std::move(*frame_it));RTC_FALLTHROUGH();case kDrop: // 無論kHandOff、kDrop都可以從緩存中刪除了.frame_it = stashed_frames_.erase(frame_it); // 刪除并檢查下一個緩存幀.}}} while (complete_frame); // 如果能持續找到帶參考幀的連續的幀則繼續. }

5.5 總結

RtpFrameReferenceFinder緩存GOP信息,每個幀(以及填充包)進入GOP排序,如果某個幀連續,則設置其參考幀為GOP內上一幀并輸出,I幀不需要參考幀,P幀需要參考幀。

6 有序輸出 - FrameBuffer

上節的RtpFrameReferenceFinder為了設置P幀的參考幀為上一幀,保證了GOP內幀的有序,但是不保證GOP輸出的有序,這個保證是由FrameBuffer來實現。

如上圖所示,FrameBuffer按照幀的先后順序向解碼器輸出幀。FrameBuffer按順序輸出“可解碼”的幀,這里的“可解碼”意思是某幀“連續”、并且其所有參考幀都已經被解碼,這里“連續”的意思是指某個幀的所有參考幀都已經收到。I幀是自參考的,所以直接是可解碼的,但是P幀則需要等待所有參考幀,也就是上一幀被收到。

這樣,因為PacketBuffer、RtpFrameReferenceFinder這兩個類只是保證幀的完整、GOP內幀的有序,一旦當前GOP的P幀還未完整,下個GOP的I幀提前進入FrameBuffer,則會直接丟棄當前GOP的所有后續P幀。

6.1 插入幀 - FrameBuffer::InsertFrame

該函數將當前幀插入幀緩存,如果該幀的所有參考幀都已經收到,那么認為該幀是連續的,那么通過同步事件通知解碼線程取待解碼幀,同時通知參考該幀的所有幀,檢查他們的未連續參考幀數量是否已經為0,是則連續。

int64_t FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {const VideoLayerFrameId& id = frame->id;rtc::CritScope lock(&crit_);// 上一個連續的幀的PIDint64_t last_continuous_picture_id =!last_continuous_frame_ ? -1 : last_continuous_frame_->picture_id;// 檢查參考幀是否合法,不合法則返回.if (!ValidReferences(*frame)) {RTC_LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("<< id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") has invalid frame references, dropping frame.";return last_continuous_picture_id;}// 如果幀緩存溢出了.if (frames_.size() >= kMaxFramesBuffered) {// 如果是關鍵幀.if (frame->is_keyframe()) {RTC_LOG(LS_WARNING) << "Inserting keyframe (picture_id:spatial_id) ("<< id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") but buffer is full, clearing"<< " buffer and inserting the frame.";// 清理一下,繼續從當前幀開始解碼.ClearFramesAndHistory();} else {// 如果不是關鍵幀就返回.RTC_LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("<< id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") could not be inserted due to the frame "<< "buffer being full, dropping frame.";return last_continuous_picture_id;}}// 最近解碼的幀PID(H264是幀最后一個包序列號).auto last_decoded_frame = decoded_frames_history_.GetLastDecodedFrameId();// 最近解碼的幀時間戳.auto last_decoded_frame_timestamp =decoded_frames_history_.GetLastDecodedFrameTimestamp();// 如果當前幀的PID < 最近解碼幀的PID,有可能是亂序,也有可能是序列號wrapping.if (last_decoded_frame && id <= *last_decoded_frame) {// 雖然PID更小,但是時間戳更加新,可能是編碼器重置或者序列號wrapping,// 假如是關鍵幀的話還是可以繼續處理的.if (AheadOf(frame->Timestamp(), *last_decoded_frame_timestamp) &&frame->is_keyframe()) {// If this frame has a newer timestamp but an earlier picture id then we// assume there has been a jump in the picture id due to some encoder// reconfiguration or some other reason. Even though this is not according// to spec we can still continue to decode from this frame if it is a// keyframe.RTC_LOG(LS_WARNING)<< "A jump in picture id was detected, clearing buffer.";// 清理一下,繼續從當前幀開始解碼.ClearFramesAndHistory();last_continuous_picture_id = -1;} else {// 如果是真的亂序,而且不是關鍵幀,丟棄.RTC_LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("<< id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") inserted after frame ("<< last_decoded_frame->picture_id << ":"<< static_cast<int>(last_decoded_frame->spatial_layer)<< ") was handed off for decoding, dropping frame.";return last_continuous_picture_id;}}// 假如序列號發生了很大跳動,清理.if (!frames_.empty() && id < frames_.begin()->first &&frames_.rbegin()->first < id) {RTC_LOG(LS_WARNING)<< "A jump in picture id was detected, clearing buffer.";// 清理一下,繼續從當前幀開始解碼.ClearFramesAndHistory();last_continuous_picture_id = -1;}// 嘗試申請幀緩存的槽位.auto info = frames_.emplace(id, FrameInfo()).first;// 如果是重復幀,返回.if (info->second.frame) {RTC_LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("<< id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") already inserted, dropping frame.";return last_continuous_picture_id;}// 更新幀信息,主要是設置幀的還未連續的參考幀數量,并建立被參考幀與參考他的幀之間的參考關系,// 用于當被參考幀有效時,更新參考他的幀的參考幀數量(為0則連續)以及可解碼狀態.if (!UpdateFrameInfoWithIncomingFrame(*frame, info))return last_continuous_picture_id;// 如果不是被重傳的,可以用于計算時延.// timing_用于計算很多時延指標以及幀的預期渲染時間.if (!frame->delayed_by_retransmission())timing_->IncomingTimestamp(frame->Timestamp(), frame->ReceivedTime());// 保存幀到幀緩存info->second.frame = std::move(frame);// 如果該幀的未連續的參考幀數量為0,那么他本身已經連續,例如I幀,或者當前P幀參考的上個P幀已經收到.if (info->second.num_missing_continuous == 0) {// 設置"連續"狀態info->second.continuous = true;// 傳播"連續"狀態,也就是遍歷參考當前幀的所有幀,讓他們num_missing_continuous--PropagateContinuity(info);// 返回的最后連續幀PIDlast_continuous_picture_id = last_continuous_frame_->picture_id;// 現在肯定有"連續"幀,通知解碼線程干活.new_continuous_frame_event_.Set();}// 返回最后連續幀PIDreturn last_continuous_picture_id; }

6.2 更新參考幀信息 - FrameBuffer::UpdateFrameInfoWithIncomingFrame

該函數檢查某幀的參考幀是否已經連續,初始化未連續參考幀計數器num_missing_continuous、未解碼參考幀計數器num_missing_decodable,同時反向建立被參考幀與依賴幀之間的關系,方便狀態(連續、可解碼)傳播。

bool FrameBuffer::UpdateFrameInfoWithIncomingFrame(const EncodedFrame& frame,FrameMap::iterator info) {TRACE_EVENT0("webrtc", "FrameBuffer::UpdateFrameInfoWithIncomingFrame");const VideoLayerFrameId& id = frame.id;// 最新解碼的幀.auto last_decoded_frame = decoded_frames_history_.GetLastDecodedFrameId();RTC_DCHECK(!last_decoded_frame || *last_decoded_frame < info->first);struct Dependency {VideoLayerFrameId id; // PIDbool continuous; // 只有未連續參考幀數量為0,才為“連續”};std::vector<Dependency> not_yet_fulfilled_dependencies;// 遍歷當前幀的所有參考幀for (size_t i = 0; i < frame.num_references; ++i) {// 參考幀VideoLayerFrameId ref_key(frame.references[i], frame.id.spatial_layer);// 如果當前幀的參考幀與最新的解碼幀比相等或者更早,可能是被解過碼,也有可能是亂序。if (last_decoded_frame && ref_key <= *last_decoded_frame) {// 如果這個參考幀還未解碼(亂序),那么這個參考幀將不再有機會被解碼, 那么當前幀也無法被解碼,// 返回失敗,反之如果這個參考幀已經被解碼了,則屬于正常狀態。if (!decoded_frames_history_.WasDecoded(ref_key)) {int64_t now_ms = clock_->TimeInMilliseconds();if (last_log_non_decoded_ms_ + kLogNonDecodedIntervalMs < now_ms) {RTC_LOG(LS_WARNING)<< "Frame with (picture_id:spatial_id) (" << id.picture_id << ":"<< static_cast<int>(id.spatial_layer)<< ") depends on a non-decoded frame more previous than"<< " the last decoded frame, dropping frame.";last_log_non_decoded_ms_ = now_ms;}return false;}} else {// 如果如果當前幀的參考幀比最新的解碼幀更晚,那么該參考幀可能還未連續.auto ref_info = frames_.find(ref_key);// 檢查一下該參考幀是否已經連續.bool ref_continuous =ref_info != frames_.end() && ref_info->second.continuous;// 該參考幀填入當前幀還未滿足的依賴表.not_yet_fulfilled_dependencies.push_back({ref_key, ref_continuous});}}// 未連續參考幀計數器,初始化為當前幀還未滿足的依賴表大小.info->second.num_missing_continuous = not_yet_fulfilled_dependencies.size();// 未解碼參考幀計數器,初始化為當前幀還未滿足的依賴表大小.info->second.num_missing_decodable = not_yet_fulfilled_dependencies.size();// 遍歷當前幀還未滿足的依賴表for (const Dependency& dep : not_yet_fulfilled_dependencies) {// 如果某個參考幀已經連續if (dep.continuous)// 未連續參考幀計數器-1--info->second.num_missing_continuous;// 建立參考幀->依賴幀反向關系,用于傳播狀態.frames_[dep.id].dependent_frames.push_back(id);}return true; }

6.3 取解碼幀 - FrameBuffer::NextFrame

該函數從幀緩存中獲取一個可以解碼的幀,該幀必須是連續的(所有參考幀都已經收到),并且其所有參考幀都已經被解碼。對I幀來說本身是連續的且自參考,可以直接被取走,P幀則需要依賴參考幀的連續、解碼狀態。

FrameBuffer::ReturnReason FrameBuffer::NextFrame(int64_t max_wait_time_ms,std::unique_ptr<EncodedFrame>* frame_out,bool keyframe_required) {TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame");// max_wait_time_ms為最大等待時間間隔,latest_return_time_ms為最晚返回的絕對時間。int64_t latest_return_time_ms =clock_->TimeInMilliseconds() + max_wait_time_ms;int64_t wait_ms = max_wait_time_ms;int64_t now_ms = 0;do {// 當前時間now_ms = clock_->TimeInMilliseconds();{rtc::CritScope lock(&crit_);// 清除事件狀態new_continuous_frame_event_.Reset();if (stopped_)return kStopped;wait_ms = max_wait_time_ms;// 清除待解碼幀列表frames_to_decode_.clear();// 遍歷所有已經連續的幀.for (auto frame_it = frames_.begin();frame_it != frames_.end() &&frame_it->first <= last_continuous_frame_;++frame_it) {// 如果幀還未連續,或者其有參考幀還未解碼,忽略.if (!frame_it->second.continuous ||frame_it->second.num_missing_decodable > 0) {continue;}// 如果可以解碼,取到待解碼幀.EncodedFrame* frame = frame_it->second.frame.get();// 如果需要關鍵幀,但當前幀不是關鍵幀(默認keyframe_required=false), 忽略.if (keyframe_required && !frame->is_keyframe())continue;// 之前最新解碼的幀時間戳.auto last_decoded_frame_timestamp =decoded_frames_history_.GetLastDecodedFrameTimestamp();// 如果待解碼幀早于之前最新解碼的幀時間戳,亂序,不處理.if (last_decoded_frame_timestamp &&AheadOf(*last_decoded_frame_timestamp, frame->Timestamp())) {continue;}// VPX,不處理.if (frame->inter_layer_predicted) {continue;}// 收集超幀,H264只有一個完整幀,current_superframe.size()為1.std::vector<FrameMap::iterator> current_superframe;current_superframe.push_back(frame_it);// H264為true,只有一層.bool last_layer_completed =frame_it->second.frame->is_last_spatial_layer;FrameMap::iterator next_frame_it = frame_it;while (true) {// 這里面是VPX的邏輯,忽略.++next_frame_it;if (next_frame_it == frames_.end() ||next_frame_it->first.picture_id != frame->id.picture_id ||!next_frame_it->second.continuous) {break;}// Check if the next frame has some undecoded references other than// the previous frame in the same superframe.size_t num_allowed_undecoded_refs =(next_frame_it->second.frame->inter_layer_predicted) ? 1 : 0;if (next_frame_it->second.num_missing_decodable >num_allowed_undecoded_refs) {break;}// All frames in the superframe should have the same timestamp.if (frame->Timestamp() != next_frame_it->second.frame->Timestamp()) {RTC_LOG(LS_WARNING)<< "Frames in a single superframe have different"" timestamps. Skipping undecodable superframe.";break;}current_superframe.push_back(next_frame_it);last_layer_completed =next_frame_it->second.frame->is_last_spatial_layer;}// Check if the current superframe is complete.// TODO(bugs.webrtc.org/10064): consider returning all available to// decode frames even if the superframe is not complete yet.if (!last_layer_completed) {continue;}// 待解碼幀列表只有1個.frames_to_decode_ = std::move(current_superframe);// 如果未設置過渲染時間則設置渲染時間.if (frame->RenderTime() == -1) {frame->SetRenderTime(timing_->RenderTimeMs(frame->Timestamp(), now_ms));}// 檢查可以繼續等待的剩余時間.wait_ms = timing_->MaxWaitingTime(frame->RenderTime(), now_ms);// wait_ms = frame->RenderTime() - now_ms - 渲染時間 - 解碼時間// 如果wait_ms < -kMaxAllowedFrameDelayMs,說明可能解碼性能不夠,// 解碼時間過長,該幀已經來不及渲染了,忽略該幀.if (wait_ms < -kMaxAllowedFrameDelayMs)continue;// 已經獲得了待解碼幀,退出搜索.break;}} // rtc::Critscope lock(&crit_);// 更新剩余等待時間wait_ms = std::min<int64_t>(wait_ms, latest_return_time_ms - now_ms);wait_ms = std::max<int64_t>(wait_ms, 0);} while (new_continuous_frame_event_.Wait(wait_ms)); // 阻塞等待{rtc::CritScope lock(&crit_);now_ms = clock_->TimeInMilliseconds();// TODO(ilnik): remove |frames_out| use frames_to_decode_ directly.std::vector<EncodedFrame*> frames_out;// 如果獲得了可解碼幀if (!frames_to_decode_.empty()) {bool superframe_delayed_by_retransmission = false;size_t superframe_size = 0;EncodedFrame* first_frame = frames_to_decode_[0]->second.frame.get();int64_t render_time_ms = first_frame->RenderTime(); // 預期渲染時間int64_t receive_time_ms = first_frame->ReceivedTime(); // 接收時間// 檢查幀的渲染時間戳或者當前的目標延遲是否有異常,如果是則重置時間處理器,// 重新獲取幀的渲染時間.if (HasBadRenderTiming(*first_frame, now_ms)) {jitter_estimator_->Reset();timing_->Reset();render_time_ms =timing_->RenderTimeMs(first_frame->Timestamp(), now_ms);}// 遍歷所有待解碼超幀(他們應該有同樣的時間戳)for (FrameMap::iterator& frame_it : frames_to_decode_) {RTC_DCHECK(frame_it != frames_.end());EncodedFrame* frame = frame_it->second.frame.release();// 重置預期渲染時間.frame->SetRenderTime(render_time_ms);// 超幀是否經過了重傳.superframe_delayed_by_retransmission |=frame->delayed_by_retransmission();// 更新接收時間.receive_time_ms = std::max(receive_time_ms, frame->ReceivedTime());// 更新超幀總大小.superframe_size += frame->size();// 傳播可解碼性,當前幀可解碼,通知參考他的幀檢查其參考幀是否都已經被解碼,// 如果是則也可以進入可解碼狀態.PropagateDecodability(frame_it->second);// 當前可解碼幀進入已解碼幀歷史列表(實際上沒有真的被解碼,而是即將被解碼),// 早于歷史解碼幀的幀將被丟棄.decoded_frames_history_.InsertDecoded(frame_it->first,frame->Timestamp());// 刪除幀緩存開始位置到當前解碼幀位置的所有幀(因為已經沒有必要保存)frames_.erase(frames_.begin(), ++frame_it);// 輸出幀.frames_out.push_back(frame);}// 如果沒有被重傳,則可以處理延遲.if (!superframe_delayed_by_retransmission) {int64_t frame_delay;// 到達時間濾波器計算幀間延遲.if (inter_frame_delay_.CalculateDelay(first_frame->Timestamp(),&frame_delay, receive_time_ms)) {// 卡爾曼濾波器計算抖動,輸入觀測幀間延遲,輸出最優幀間延遲,也就是抖動.jitter_estimator_->UpdateEstimate(frame_delay, superframe_size);}float rtt_mult = protection_mode_ == kProtectionNackFEC ? 0.0 : 1.0;if (RttMultExperiment::RttMultEnabled()) {rtt_mult = RttMultExperiment::GetRttMultValue();}// 獲取抖動,并設置到timing_中,如果是初始狀態,當前延遲(googCurrentDelayMs)被設置成抖動.timing_->SetJitterDelay(jitter_estimator_->GetJitterEstimate(rtt_mult));// 更新當前延遲(googCurrentDelayMs),逼近googTargetDelayMs.timing_->UpdateCurrentDelay(render_time_ms, now_ms);} else {// 更新jitter_estimator_重傳的次數,會影響其獲取抖動的結果.if (RttMultExperiment::RttMultEnabled() || add_rtt_to_playout_delay_)jitter_estimator_->FrameNacked();}// 獲取詳細時間信息通知Observer.UpdateJitterDelay();UpdateTimingFrameInfo();}// 輸出待解碼幀.if (!frames_out.empty()) {if (frames_out.size() == 1) {frame_out->reset(frames_out[0]);} else {frame_out->reset(CombineAndDeleteFrames(frames_out));}return kFrameFound;}} // rtc::Critscope lock(&crit_)// 如果還有剩余時間還沒有獲得可解碼幀,可以再嘗試等一等.if (latest_return_time_ms - now_ms > 0) {// If |next_frame_it_ == frames_.end()| and there is still time left, it// means that the frame buffer was cleared as the thread in this function// was waiting to acquire |crit_| in order to return. Wait for the// remaining time and then return.return NextFrame(latest_return_time_ms - now_ms, frame_out);}return kTimeout; }

6.4 狀態傳播 - FrameBuffer::PropagateContinuity/FrameBuffer::PropagateDecodability

進入FrameBuffer的幀都帶有參考幀的信息,FrameBuffer反向建立依賴表,在每個參考幀中填入依賴幀的信息,在參考幀進入連續狀態、可解碼狀態后可以直接進行通知。

連續性傳播:

void FrameBuffer::PropagateContinuity(FrameMap::iterator start) {std::queue<FrameMap::iterator> continuous_frames;// start是連續的,先入隊continuous_frames.push(start);// 廣度優先搜索傳播幀連續性.// 廣度優先搜索的基本方法:待處理數據入隊,數據出隊處理后獲得的中間數據再次入隊,// 迭代搜索直到處理完所有的數據,也就是迭代處理鄰接的節點,直到遍歷整張圖.while (!continuous_frames.empty()) {// 連續幀出隊.auto frame = continuous_frames.front();continuous_frames.pop();// 如果最新的連續幀還未設置,或者當前連續幀比之前的最新連續幀還新,那么更新最新連續幀,// 用于NextFrame中限制遍歷幀緩存的邊界.if (!last_continuous_frame_ || *last_continuous_frame_ < frame->first) {last_continuous_frame_ = frame->first;}// 遍歷當前連續幀的所有依賴幀(依賴該連續幀的幀,這些幀的參考幀就是當前連續幀)for (size_t d = 0; d < frame->second.dependent_frames.size(); ++d) {// 檢查該依賴幀是否在幀緩存中auto frame_ref = frames_.find(frame->second.dependent_frames[d]);RTC_DCHECK(frame_ref != frames_.end());// 如果該依賴幀還在幀緩存中則檢查幀連續性,否則有可能退出廣度優先搜索.if (frame_ref != frames_.end()) {// 其未連續參考幀計數器----frame_ref->second.num_missing_continuous;// 如果未連續參考幀計數器到0,說明所有參考幀都收到了.if (frame_ref->second.num_missing_continuous == 0) {// 該依賴幀也連續了.frame_ref->second.continuous = true;// 該依賴幀入隊,在下次迭代繼續搜索其依賴幀(參考他的幀)的連續性.continuous_frames.push(frame_ref);}}}} }

可解碼性傳播:

void FrameBuffer::PropagateDecodability(const FrameInfo& info) {// 遍歷所有依賴幀.for (size_t d = 0; d < info.dependent_frames.size(); ++d) {// 檢查依賴幀是否還在幀緩存中.auto ref_info = frames_.find(info.dependent_frames[d]);RTC_DCHECK(ref_info != frames_.end());// TODO(philipel): Look into why we've seen this happen.if (ref_info != frames_.end()) {// 如果依賴幀還在幀緩存中,未解碼參考幀計數器--,// 一個幀只有在連續(num_missing_continuous==0),// 并且其所有參考幀已經被解碼(num_missing_decodable==0)的情況下,// 才能進入可解碼狀態(即將被解碼),該狀態在解碼線程中調用NextFrame時設置,// 所以這里不再使用廣度優先搜索傳播可解碼性,而只是遞減未解碼參考幀計數器.RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U);--ref_info->second.num_missing_decodable;}} }

6.6 總結

FrameBuffer緩存即將進入解碼器的幀,按照順序向解碼器輸出連續的、所有參考幀都已經被解碼的幀。

7 抖動與延遲

JitterBuffer包含Jitter與Buffer,上面幾節講了Buffer,主要用于緩存、排序、組幀、有序輸出,起到抗抖動的作用。但是網絡的具體抖動指標是多少,網絡的延遲是多少,需要其他的一些工具計算。

7.1 抖動計算

  • VCMInterFrameDelay:計算幀間延遲 = 兩幀的接收時間差 - 兩幀的發送時間差;

  • VCMJitterEstimator:通過VCMInterFrameDelay計算的幀間延遲計算出最優抖動值。


上圖描述了幀間延遲(抖動)觀測值的計算方法:jitter = tr_delta - ts_delta = (tr2 - tr1) - (ts2 - ts1),也就是兩幀的接收時間差 - 兩幀的發送時間差。

計算最優抖動的算法和GCC中使用到達時間濾波器(InterArrival)計算到達時間增量、使用過載估計器(OveruseEstimator)計算最優的到達間隔增量的算法基本一樣,都是利用卡爾曼濾波器,綜合幀間延遲的觀測值、預測值,獲得最優的幀間延遲(也就是網絡抖動),只是數據采樣的形式不太相同,GCC使用5ms的包簇(也可以稱為幀),這里直接使用視頻幀,這里不再詳述。

7.2 延遲 - VCMTiming

VCMTiming可以輸出接收端的以下參數,這些參數可以在使用瀏覽器拉流時在chrome://webrtc-internals頁面中看到。

名字含義
googDecodeMs最近一次解碼耗時.
googMaxDecodeMs最大解碼耗時,實際上是第95百分位數,也就是大于采樣集合95%的解碼延遲.
googRenderDelayMs渲染耗時,固定為10ms.
googJitterBufferMs網絡抖動,見上節.
googMinPlayoutDelayMs最小播放時延,音視頻同步器輸出的視頻幀播放應該延遲的時長.
googTargetDelayMs目標時延,googCurrentDelayMs會逼近目標延遲.
googCurrentDelayMs當前時延,用于計算視頻幀渲染時間.

7.2.1 目標延遲 - googTargetDelayMs

int VCMTiming::TargetDelayInternal() const {return std::max(min_playout_delay_ms_,jitter_delay_ms_ + RequiredDecodeTimeMs() + render_delay_ms_); }

很明顯,目標延遲基本上就是抖動+解碼時間+渲染時間,與播放延遲的最大者,也就是播放當前幀總體的期望延遲,作為當前延遲googCurrentDelayMs的參考值,并最終用于音視頻同步。

7.2.2 當前延遲 - googCurrentDelayMs

FrameBuffer每獲得一個可解碼幀會調用一次,更新當前延遲,最終用于計算渲染時間。

void VCMTiming::UpdateCurrentDelay(int64_t render_time_ms,int64_t actual_decode_time_ms) {rtc::CritScope cs(&crit_sect_);// 獲得目標延遲. uint32_t target_delay_ms = TargetDelayInternal();// render_time_ms:期望渲染時間// 期望解碼時間 = 幀期望渲染時間 - 解碼耗時 - 渲染耗時// 實際產生的延遲delayed_ms = 實際解碼時間actual_decode_time_ms - 期望解碼時間int64_t delayed_ms =actual_decode_time_ms -(render_time_ms - RequiredDecodeTimeMs() - render_delay_ms_);// 如果沒有發生延遲,退出.if (delayed_ms < 0) {return;}// 如果有延遲,上個時刻的當前延遲 + 實際產生的延遲仍然<=目標延遲if (current_delay_ms_ + delayed_ms <= target_delay_ms) {// 更新當前延遲,逼近目標延遲.current_delay_ms_ += delayed_ms;} else {// 如果上個時刻的當前延遲 + 實際產生的延遲仍然超過目標延遲,以目標延遲為上限.current_delay_ms_ = target_delay_ms;} }

7.3 平滑渲染時間 - TimestampExtrapolator

FrameBuffer每獲得一個可解碼幀,都要更新其渲染時間,渲染時間通過TimestampExtrapolator類獲得。TimestampExtrapolator也是一個卡爾曼濾波器,其輸入為輸入幀的時間戳、接收時間,輸出該幀的最優期望接收時間,參考《WebRTC音視頻同步詳解》 【3.5.1.1 期望接收時間】。

視頻幀的最終渲染時間 = 最優期望接收時間 + 當前延遲。

int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp,int64_t now_ms) const {// 如果這兩個播放延遲都是0,要求立刻渲染.if (min_playout_delay_ms_ == 0 && max_playout_delay_ms_ == 0) {// Render as soon as possible.return 0;}// 使用卡爾曼濾波器估算幀平滑時間.int64_t estimated_complete_time_ms =ts_extrapolator_->ExtrapolateLocalTime(frame_timestamp);if (estimated_complete_time_ms == -1) {estimated_complete_time_ms = now_ms;}// 當前延遲限定在(min_playout_delay_ms_, max_playout_delay_ms_)范圍內int actual_delay = std::max(current_delay_ms_, min_playout_delay_ms_);actual_delay = std::min(actual_delay, max_playout_delay_ms_);// 視頻幀的最終渲染時間 = 最優期望接收時間 + 當前延遲return estimated_complete_time_ms + actual_delay; }

8 總結

RTP包進入JitterBuffer后,最終輸出了完整、連續、可解碼的視頻幀,并攜帶了可用于最終播放的渲染時間。

總結

以上是生活随笔為你收集整理的WebRTC视频JitterBuffer详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色综合久久久无码网中文 | 黄网在线观看免费网站 | 人妻天天爽夜夜爽一区二区 | 国产激情综合五月久久 | 国产精华av午夜在线观看 | 亚洲男人av香蕉爽爽爽爽 | 日本乱偷人妻中文字幕 | 国产又爽又猛又粗的视频a片 | 国产人妻人伦精品1国产丝袜 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲国产欧美国产综合一区 | 99国产精品白浆在线观看免费 | 大胆欧美熟妇xx | 久久精品中文字幕一区 | 国产激情艳情在线看视频 | 欧美国产日韩亚洲中文 | 88国产精品欧美一区二区三区 | 欧美老妇交乱视频在线观看 | 日韩视频 中文字幕 视频一区 | 欧美日韩一区二区综合 | 精品少妇爆乳无码av无码专区 | 精品偷拍一区二区三区在线看 | 国产熟妇另类久久久久 | 亚洲自偷自拍另类第1页 | 久久99精品久久久久婷婷 | 国产精品二区一区二区aⅴ污介绍 | 又大又黄又粗又爽的免费视频 | 亚洲 日韩 欧美 成人 在线观看 | 伊人色综合久久天天小片 | 99精品无人区乱码1区2区3区 | 国产精品美女久久久网av | 一二三四在线观看免费视频 | 国产欧美亚洲精品a | 理论片87福利理论电影 | 18无码粉嫩小泬无套在线观看 | 97色伦图片97综合影院 | 大胆欧美熟妇xx | 亚洲一区二区三区播放 | 国产精品亚洲lv粉色 | 久久久久亚洲精品男人的天堂 | 亚洲成a人片在线观看无码 | 一本大道伊人av久久综合 | 国产精品内射视频免费 | 狠狠噜狠狠狠狠丁香五月 | 18禁止看的免费污网站 | 熟妇人妻中文av无码 | 日日橹狠狠爱欧美视频 | 欧美乱妇无乱码大黄a片 | 在线精品亚洲一区二区 | 天堂а√在线中文在线 | 久久久久久国产精品无码下载 | 亚洲熟妇自偷自拍另类 | 亚洲熟悉妇女xxx妇女av | 97色伦图片97综合影院 | 综合激情五月综合激情五月激情1 | 双乳奶水饱满少妇呻吟 | 丰满护士巨好爽好大乳 | 精品一区二区三区无码免费视频 | 久激情内射婷内射蜜桃人妖 | 久久99精品国产麻豆蜜芽 | 亚洲欧美综合区丁香五月小说 | 日韩 欧美 动漫 国产 制服 | 伊人色综合久久天天小片 | 亚洲日本在线电影 | 久久国产自偷自偷免费一区调 | 久久综合九色综合欧美狠狠 | 综合人妻久久一区二区精品 | 日韩少妇内射免费播放 | 亚洲综合另类小说色区 | 久久人人97超碰a片精品 | 啦啦啦www在线观看免费视频 | 荫蒂被男人添的好舒服爽免费视频 | 999久久久国产精品消防器材 | 国产三级久久久精品麻豆三级 | 亚洲の无码国产の无码步美 | 青青青手机频在线观看 | 色诱久久久久综合网ywww | 粉嫩少妇内射浓精videos | 内射爽无广熟女亚洲 | 欧美第一黄网免费网站 | 久久综合给合久久狠狠狠97色 | 青春草在线视频免费观看 | 性啪啪chinese东北女人 | 国产手机在线αⅴ片无码观看 | 狠狠色色综合网站 | 亚洲中文字幕无码一久久区 | 亚洲成在人网站无码天堂 | 国产成人无码a区在线观看视频app | 久久精品国产99久久6动漫 | 欧美肥老太牲交大战 | 99麻豆久久久国产精品免费 | 国产av一区二区精品久久凹凸 | 捆绑白丝粉色jk震动捧喷白浆 | 久久久久久久女国产乱让韩 | 色五月丁香五月综合五月 | 国产熟妇另类久久久久 | 水蜜桃av无码 | 亚洲阿v天堂在线 | 国产一区二区不卡老阿姨 | 国产人妻久久精品二区三区老狼 | 国内揄拍国内精品人妻 | 国产热a欧美热a在线视频 | 中文字幕无码人妻少妇免费 | 亚洲国产精品久久久久久 | av无码久久久久不卡免费网站 | 色五月五月丁香亚洲综合网 | 亚洲乱码中文字幕在线 | 色综合久久久无码网中文 | 无码帝国www无码专区色综合 | 精品人妻人人做人人爽夜夜爽 | 久久午夜无码鲁丝片秋霞 | 天天摸天天碰天天添 | 欧美激情内射喷水高潮 | 无码精品人妻一区二区三区av | 久久99精品国产.久久久久 | 少妇高潮一区二区三区99 | 国产成人无码a区在线观看视频app | 人人爽人人爽人人片av亚洲 | 中文无码成人免费视频在线观看 | 午夜精品久久久久久久 | 人妻夜夜爽天天爽三区 | 97久久精品无码一区二区 | 少妇无码一区二区二三区 | 免费视频欧美无人区码 | 西西人体www44rt大胆高清 | 性欧美videos高清精品 | 中文字幕无码av波多野吉衣 | 国产偷国产偷精品高清尤物 | 熟妇女人妻丰满少妇中文字幕 | 水蜜桃色314在线观看 | 亚洲一区二区三区香蕉 | 精品日本一区二区三区在线观看 | 亚洲 欧美 激情 小说 另类 | 波多野结衣一区二区三区av免费 | 亚洲精品国产a久久久久久 | 亚洲中文字幕成人无码 | 久久综合九色综合欧美狠狠 | 露脸叫床粗话东北少妇 | 亚洲爆乳无码专区 | 国产在线一区二区三区四区五区 | 一个人看的www免费视频在线观看 | 国产激情一区二区三区 | 成年美女黄网站色大免费视频 | 欧美激情一区二区三区成人 | 黑人粗大猛烈进出高潮视频 | 亚洲熟妇色xxxxx欧美老妇 | 国产成人综合色在线观看网站 | 日本www一道久久久免费榴莲 | 国产精品无码成人午夜电影 | 国产偷自视频区视频 | 日韩视频 中文字幕 视频一区 | 成人免费视频一区二区 | 无码av最新清无码专区吞精 | 国产香蕉尹人综合在线观看 | 夜精品a片一区二区三区无码白浆 | 国产精品成人av在线观看 | 国产精品无码久久av | 午夜性刺激在线视频免费 | 国产av一区二区三区最新精品 | 亚洲色偷偷男人的天堂 | 日韩精品久久久肉伦网站 | 亚洲成熟女人毛毛耸耸多 | 女人高潮内射99精品 | 免费无码的av片在线观看 | 一区二区传媒有限公司 | 久久久久se色偷偷亚洲精品av | 十八禁视频网站在线观看 | 国内丰满熟女出轨videos | 精品国产一区二区三区四区在线看 | 88国产精品欧美一区二区三区 | 樱花草在线播放免费中文 | 亚洲gv猛男gv无码男同 | 98国产精品综合一区二区三区 | 沈阳熟女露脸对白视频 | 亚洲精品一区国产 | 中文精品无码中文字幕无码专区 | 国产精品久久福利网站 | 一本精品99久久精品77 | 国精产品一品二品国精品69xx | 国产小呦泬泬99精品 | 日本大乳高潮视频在线观看 | 国产人妻精品一区二区三区 | 粗大的内捧猛烈进出视频 | 亚洲国产成人a精品不卡在线 | 国产成人精品无码播放 | 麻豆果冻传媒2021精品传媒一区下载 | 无码纯肉视频在线观看 | 无码人妻av免费一区二区三区 | 亚洲中文字幕久久无码 | 亚洲欧美日韩国产精品一区二区 | 国产成人无码a区在线观看视频app | 午夜福利一区二区三区在线观看 | 97资源共享在线视频 | 性色欲情网站iwww九文堂 | 日日摸日日碰夜夜爽av | 麻豆国产丝袜白领秘书在线观看 | 午夜精品久久久久久久 | 亚洲国产综合无码一区 | 亚洲爆乳精品无码一区二区三区 | 牛和人交xxxx欧美 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品a成v人在线播放 | 亚洲狠狠色丁香婷婷综合 | 亚洲精品国产a久久久久久 | 最近中文2019字幕第二页 | 在线a亚洲视频播放在线观看 | 性开放的女人aaa片 | 久久久久久av无码免费看大片 | 亚洲一区二区三区含羞草 | 亚洲日韩av一区二区三区四区 | 精品国产一区二区三区四区 | √8天堂资源地址中文在线 | 亚洲国产成人a精品不卡在线 | 精品厕所偷拍各类美女tp嘘嘘 | 亚无码乱人伦一区二区 | 国产乱人偷精品人妻a片 | 国产精品成人av在线观看 | 两性色午夜视频免费播放 | 无码av最新清无码专区吞精 | 国产香蕉尹人综合在线观看 | 99久久亚洲精品无码毛片 | 日本一卡2卡3卡四卡精品网站 | 欧美性猛交xxxx富婆 | 人妻中文无码久热丝袜 | 玩弄少妇高潮ⅹxxxyw | 国产精品第一国产精品 | 欧美成人午夜精品久久久 | 99国产欧美久久久精品 | 日本精品少妇一区二区三区 | 成人无码视频免费播放 | 久久久久久久人妻无码中文字幕爆 | 麻豆国产人妻欲求不满谁演的 | 爱做久久久久久 | 精品厕所偷拍各类美女tp嘘嘘 | 色综合视频一区二区三区 | 国产精品福利视频导航 | 国色天香社区在线视频 | 国产超级va在线观看视频 | 少妇性l交大片欧洲热妇乱xxx | 最新国产麻豆aⅴ精品无码 | 色综合天天综合狠狠爱 | 国产人妻久久精品二区三区老狼 | 人妻中文无码久热丝袜 | 中国女人内谢69xxxx | 亚洲中文字幕在线无码一区二区 | 亚洲日本va中文字幕 | v一区无码内射国产 | 国产人妻人伦精品 | 久久精品无码一区二区三区 | 国产一区二区三区四区五区加勒比 | 亚洲精品午夜无码电影网 | 亚洲欧美日韩国产精品一区二区 | 国产成人精品必看 | 精品乱码久久久久久久 | 国产精品久久久久无码av色戒 | 国产人妻久久精品二区三区老狼 | 国产一区二区三区影院 | 亚洲娇小与黑人巨大交 | 日本一区二区三区免费高清 | 又粗又大又硬又长又爽 | 狠狠cao日日穞夜夜穞av | 亚洲精品久久久久久久久久久 | 国产成人精品一区二区在线小狼 | 日产国产精品亚洲系列 | 色情久久久av熟女人妻网站 | 影音先锋中文字幕无码 | 久久精品国产一区二区三区肥胖 | 亚洲成色www久久网站 | 亚洲国产精品一区二区美利坚 | 久久久久久a亚洲欧洲av冫 | 亚洲精品一区国产 | 大乳丰满人妻中文字幕日本 | 双乳奶水饱满少妇呻吟 | 国产香蕉尹人视频在线 | 久久精品成人欧美大片 | a在线观看免费网站大全 | 午夜精品久久久内射近拍高清 | 成熟人妻av无码专区 | 国产香蕉尹人视频在线 | 女人被男人爽到呻吟的视频 | 亚洲熟妇色xxxxx亚洲 | 国产免费无码一区二区视频 | 人妻中文无码久热丝袜 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 丰满护士巨好爽好大乳 | 中文精品久久久久人妻不卡 | 色欲综合久久中文字幕网 | 成人无码精品一区二区三区 | 国产香蕉尹人综合在线观看 | 亚洲国产av精品一区二区蜜芽 | 国内综合精品午夜久久资源 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产亚洲欧美在线专区 | 乌克兰少妇性做爰 | 一本色道婷婷久久欧美 | 高清国产亚洲精品自在久久 | 三上悠亚人妻中文字幕在线 | 日本爽爽爽爽爽爽在线观看免 | 国产又爽又黄又刺激的视频 | 丰满妇女强制高潮18xxxx | 亚洲欧洲无卡二区视頻 | 亚洲国产精品无码一区二区三区 | 国产另类ts人妖一区二区 | 天下第一社区视频www日本 | 欧美日韩视频无码一区二区三 | 精品无码一区二区三区爱欲 | 亚洲国产精品一区二区第一页 | 国产成人无码一二三区视频 | 国产精品人人爽人人做我的可爱 | 精品人妻av区 | 国产熟女一区二区三区四区五区 | 久久精品国产一区二区三区肥胖 | 国产成人无码区免费内射一片色欲 | 精品日本一区二区三区在线观看 | 99久久精品午夜一区二区 | 欧美人与禽zoz0性伦交 | 久久99久久99精品中文字幕 | 久久国产精品萌白酱免费 | 亚洲自偷自偷在线制服 | 免费观看黄网站 | 日韩人妻无码一区二区三区久久99 | 国产亚洲精品久久久久久 | 国产内射老熟女aaaa | 日韩人妻系列无码专区 | 又色又爽又黄的美女裸体网站 | 亚洲a无码综合a国产av中文 | 东京一本一道一二三区 | 国产成人人人97超碰超爽8 | 人妻aⅴ无码一区二区三区 | 国产精品亚洲综合色区韩国 | 少妇激情av一区二区 | 中文毛片无遮挡高清免费 | 亚洲日韩精品欧美一区二区 | 精品国产青草久久久久福利 | 亚洲 高清 成人 动漫 | 亚洲欧美色中文字幕在线 | 在线观看欧美一区二区三区 | 久青草影院在线观看国产 | 欧美国产亚洲日韩在线二区 | 国产精品无码一区二区三区不卡 | 亚洲国产精品美女久久久久 | av人摸人人人澡人人超碰下载 | 免费观看黄网站 | 国产精品美女久久久 | 亚洲精品无码国产 | 国产人妻大战黑人第1集 | 男女超爽视频免费播放 | 国产无套粉嫩白浆在线 | 国产成人精品无码播放 | 99精品无人区乱码1区2区3区 | 亚洲中文字幕在线观看 | 国产热a欧美热a在线视频 | 无码国内精品人妻少妇 | 无码人妻av免费一区二区三区 | 久久精品国产一区二区三区肥胖 | v一区无码内射国产 | 中文字幕av日韩精品一区二区 | 亚洲国产精品美女久久久久 | www一区二区www免费 | 亚洲成av人片在线观看无码不卡 | 国产三级精品三级男人的天堂 | 一二三四社区在线中文视频 | 国产精品亚洲一区二区三区喷水 | 亚洲人成网站免费播放 | 国产suv精品一区二区五 | v一区无码内射国产 | 无码免费一区二区三区 | 亚洲色偷偷男人的天堂 | 亚洲精品一区二区三区四区五区 | 伊人久久大香线蕉av一区二区 | 精品一区二区三区无码免费视频 | 老熟女重囗味hdxx69 | 欧美怡红院免费全部视频 | 性色欲网站人妻丰满中文久久不卡 | 色一情一乱一伦 | 久久午夜无码鲁丝片午夜精品 | 国产亚洲精品久久久久久大师 | 国产精品高潮呻吟av久久4虎 | 一本色道久久综合亚洲精品不卡 | 成人无码精品一区二区三区 | 日韩亚洲欧美中文高清在线 | 综合人妻久久一区二区精品 | 国产熟女一区二区三区四区五区 | 无码免费一区二区三区 | 国产熟妇另类久久久久 | 无码国内精品人妻少妇 | 成人欧美一区二区三区黑人免费 | 亚洲自偷自偷在线制服 | 99麻豆久久久国产精品免费 | 正在播放老肥熟妇露脸 | 无码毛片视频一区二区本码 | 午夜理论片yy44880影院 | 国产偷自视频区视频 | 少妇被粗大的猛进出69影院 | 久久久久亚洲精品男人的天堂 | 国内精品一区二区三区不卡 | 亚洲中文字幕乱码av波多ji | 蜜桃视频插满18在线观看 | 网友自拍区视频精品 | 清纯唯美经典一区二区 | 亚洲精品一区二区三区四区五区 | 天堂亚洲2017在线观看 | 毛片内射-百度 | 亚洲另类伦春色综合小说 | v一区无码内射国产 | 色综合久久中文娱乐网 | 亚洲综合伊人久久大杳蕉 | 日本一卡2卡3卡四卡精品网站 | 国产九九九九九九九a片 | 丰满人妻一区二区三区免费视频 | 美女黄网站人色视频免费国产 | 欧美大屁股xxxxhd黑色 | 影音先锋中文字幕无码 | 久久精品国产99精品亚洲 | 强伦人妻一区二区三区视频18 | 熟妇人妻无乱码中文字幕 | 精品偷拍一区二区三区在线看 | 樱花草在线社区www | 国产精品国产自线拍免费软件 | 久久久久久a亚洲欧洲av冫 | 青青草原综合久久大伊人精品 | 日韩精品a片一区二区三区妖精 | 一本久道高清无码视频 | 大胆欧美熟妇xx | 成 人 网 站国产免费观看 | 未满小14洗澡无码视频网站 | 熟妇人妻无乱码中文字幕 | 亚洲欧美日韩成人高清在线一区 | 欧美亚洲国产一区二区三区 | 欧美日韩视频无码一区二区三 | 国产婷婷色一区二区三区在线 | 无码免费一区二区三区 | 国产激情综合五月久久 | 中文字幕无码日韩欧毛 | 亚洲va中文字幕无码久久不卡 | 亚洲欧美日韩成人高清在线一区 | 水蜜桃色314在线观看 | 久久久久国色av免费观看性色 | 亚洲国产精品毛片av不卡在线 | 久久久久久久人妻无码中文字幕爆 | 国产一区二区三区精品视频 | 国产suv精品一区二区五 | 亚洲乱码中文字幕在线 | 国产精品久久国产精品99 | 青青久在线视频免费观看 | 精品国产青草久久久久福利 | 水蜜桃av无码 | 成人动漫在线观看 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲一区二区三区香蕉 | 丁香花在线影院观看在线播放 | 成人影院yy111111在线观看 | 真人与拘做受免费视频一 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品久久国产精品99 | 丰满少妇人妻久久久久久 | 色婷婷综合激情综在线播放 | 亚洲精品一区二区三区四区五区 | 人人妻人人澡人人爽欧美一区九九 | 亚洲精品一区二区三区在线观看 | 丰满人妻被黑人猛烈进入 | 一本久久伊人热热精品中文字幕 | 人人妻人人澡人人爽欧美一区 | 激情亚洲一区国产精品 | 国内老熟妇对白xxxxhd | 欧美国产日韩亚洲中文 | 中文字幕无线码免费人妻 | 国产精品亚洲一区二区三区喷水 | 中文字幕av日韩精品一区二区 | 强奷人妻日本中文字幕 | 377p欧洲日本亚洲大胆 | 国产精品久久久 | 亚洲精品一区二区三区婷婷月 | 久久精品国产99精品亚洲 | 国产精品资源一区二区 | 久久精品丝袜高跟鞋 | 国产午夜视频在线观看 | 好爽又高潮了毛片免费下载 | 欧美激情综合亚洲一二区 | 亚洲精品一区二区三区大桥未久 | 久久99国产综合精品 | 国产精品无套呻吟在线 | 亚洲一区二区三区四区 | 中国女人内谢69xxxxxa片 | 中文久久乱码一区二区 | 久精品国产欧美亚洲色aⅴ大片 | 又大又黄又粗又爽的免费视频 | 成人动漫在线观看 | 未满成年国产在线观看 | 色婷婷综合中文久久一本 | 精品无码国产自产拍在线观看蜜 | 色欲综合久久中文字幕网 | 国产成人av免费观看 | 麻豆精品国产精华精华液好用吗 | 欧美性生交活xxxxxdddd | 麻豆国产97在线 | 欧洲 | 国产97人人超碰caoprom | 国内精品一区二区三区不卡 | 无码人妻av免费一区二区三区 | 三级4级全黄60分钟 | 国产成人综合美国十次 | 蜜桃av抽搐高潮一区二区 | 两性色午夜免费视频 | 精品久久久久香蕉网 | 麻豆国产丝袜白领秘书在线观看 | 无码纯肉视频在线观看 | 香蕉久久久久久av成人 | 无码人妻丰满熟妇区五十路百度 | 在线 国产 欧美 亚洲 天堂 | 夫妻免费无码v看片 | 亚洲国产精品美女久久久久 | 无码国产乱人伦偷精品视频 | 乱码午夜-极国产极内射 | 亚洲成av人片天堂网无码】 | 亚洲精品国产精品乱码视色 | 日韩av激情在线观看 | 任你躁国产自任一区二区三区 | 亚洲码国产精品高潮在线 | 精品少妇爆乳无码av无码专区 | 亚洲自偷精品视频自拍 | 4hu四虎永久在线观看 | 男女性色大片免费网站 | 色婷婷综合激情综在线播放 | 久久久婷婷五月亚洲97号色 | 欧美老人巨大xxxx做受 | 搡女人真爽免费视频大全 | 亚洲成a人片在线观看无码 | 无套内射视频囯产 | 两性色午夜视频免费播放 | 丰满护士巨好爽好大乳 | 久久精品国产一区二区三区肥胖 | 99视频精品全部免费免费观看 | 99久久亚洲精品无码毛片 | www一区二区www免费 | 亚洲欧美日韩国产精品一区二区 | 黑人大群体交免费视频 | 欧美性黑人极品hd | 捆绑白丝粉色jk震动捧喷白浆 | 欧美人与善在线com | 欧美阿v高清资源不卡在线播放 | 国产精品久久福利网站 | 少妇一晚三次一区二区三区 | 国产亚洲精品久久久ai换 | 四虎永久在线精品免费网址 | 精品国偷自产在线 | 亚洲人成网站在线播放942 | 99riav国产精品视频 | 久久久久亚洲精品男人的天堂 | 强伦人妻一区二区三区视频18 | 亚洲午夜福利在线观看 | 日本高清一区免费中文视频 | 国产一区二区三区精品视频 | 亚洲综合久久一区二区 | 国产精华av午夜在线观看 | 综合人妻久久一区二区精品 | 成人精品视频一区二区三区尤物 | 免费网站看v片在线18禁无码 | 国内精品人妻无码久久久影院蜜桃 | 老子影院午夜伦不卡 | 久久精品国产亚洲精品 | 国产精品欧美成人 | 国产午夜视频在线观看 | 成人欧美一区二区三区黑人 | 国产又爽又黄又刺激的视频 | ass日本丰满熟妇pics | 99riav国产精品视频 | 久久aⅴ免费观看 | 中文字幕人妻无码一夲道 | 国产激情一区二区三区 | 国产人妻精品午夜福利免费 | 无码精品国产va在线观看dvd | 国产精品无码mv在线观看 | 亚洲阿v天堂在线 | 国产无套内射久久久国产 | 日本熟妇大屁股人妻 | 亚洲色www成人永久网址 | 六月丁香婷婷色狠狠久久 | 无码精品人妻一区二区三区av | 啦啦啦www在线观看免费视频 | 色噜噜亚洲男人的天堂 | 水蜜桃亚洲一二三四在线 | 牲欲强的熟妇农村老妇女视频 | 亚洲综合精品香蕉久久网 | 少妇太爽了在线观看 | 3d动漫精品啪啪一区二区中 | 亚洲人成网站在线播放942 | 色综合天天综合狠狠爱 | 成熟妇人a片免费看网站 | 女人被男人爽到呻吟的视频 | 帮老师解开蕾丝奶罩吸乳网站 | 伊人久久大香线蕉av一区二区 | 日韩精品乱码av一区二区 | 老熟妇仑乱视频一区二区 | 欧美肥老太牲交大战 | 乌克兰少妇xxxx做受 | 精品久久久久久亚洲精品 | 亚洲成a人一区二区三区 | 久久zyz资源站无码中文动漫 | 天天躁日日躁狠狠躁免费麻豆 | 夫妻免费无码v看片 | 色窝窝无码一区二区三区色欲 | 国产97色在线 | 免 | 久久精品国产大片免费观看 | 水蜜桃色314在线观看 | 国产乱码精品一品二品 | 亚洲精品国产品国语在线观看 | 最近的中文字幕在线看视频 | 亚洲国产精品久久久天堂 | 蜜桃av抽搐高潮一区二区 | 国产精品久久久久久亚洲影视内衣 | 2020久久超碰国产精品最新 | 最新国产乱人伦偷精品免费网站 | 亚洲人成人无码网www国产 | 荡女精品导航 | 久久99精品久久久久久动态图 | 精品无码国产自产拍在线观看蜜 | 九九热爱视频精品 | 国产精品久久久久久久影院 | 国产精品第一国产精品 | 又大又硬又爽免费视频 | 在线观看免费人成视频 | 午夜精品久久久内射近拍高清 | 熟妇激情内射com | 国精产品一品二品国精品69xx | 99re在线播放 | 荫蒂被男人添的好舒服爽免费视频 | 内射后入在线观看一区 | 亚洲阿v天堂在线 | 国产av剧情md精品麻豆 | 国产精品久久久久久亚洲影视内衣 | 国色天香社区在线视频 | 久久久久久a亚洲欧洲av冫 | 亚洲精品午夜无码电影网 | 欧洲vodafone精品性 | 日本一卡二卡不卡视频查询 | 丰满人妻翻云覆雨呻吟视频 | 国产真实乱对白精彩久久 | 欧美兽交xxxx×视频 | 一本久道久久综合狠狠爱 | 宝宝好涨水快流出来免费视频 | 巨爆乳无码视频在线观看 | 亚洲伊人久久精品影院 | 亚洲成av人在线观看网址 | 亚洲色欲久久久综合网东京热 | а√资源新版在线天堂 | 成人精品视频一区二区 | 日本大香伊一区二区三区 | 免费播放一区二区三区 | 又色又爽又黄的美女裸体网站 | 亚洲精品久久久久avwww潮水 | 国产精品久久精品三级 | 性欧美大战久久久久久久 | 露脸叫床粗话东北少妇 | 亚洲国产精华液网站w | 亚洲啪av永久无码精品放毛片 | 精品久久综合1区2区3区激情 | 麻豆果冻传媒2021精品传媒一区下载 | 女人和拘做爰正片视频 | 国产精品久久久久久亚洲影视内衣 | 乱码午夜-极国产极内射 | 内射后入在线观看一区 | 欧美国产日产一区二区 | 又色又爽又黄的美女裸体网站 | 国产激情艳情在线看视频 | 99精品久久毛片a片 | 亚洲aⅴ无码成人网站国产app | 色婷婷综合激情综在线播放 | 久久久久se色偷偷亚洲精品av | 四虎影视成人永久免费观看视频 | 国产成人无码a区在线观看视频app | 国产人妻久久精品二区三区老狼 | 伦伦影院午夜理论片 | 亚洲欧美综合区丁香五月小说 | 久久久久久久女国产乱让韩 | 国产av无码专区亚洲a∨毛片 | 最新国产乱人伦偷精品免费网站 | 高清不卡一区二区三区 | 婷婷丁香六月激情综合啪 | 国产成人无码一二三区视频 | 99精品久久毛片a片 | 丰满少妇熟乱xxxxx视频 | 爆乳一区二区三区无码 | 国产精品va在线观看无码 | 欧洲精品码一区二区三区免费看 | 国产av无码专区亚洲a∨毛片 | 日韩精品无码免费一区二区三区 | 久久99精品久久久久婷婷 | 免费无码av一区二区 | 免费观看又污又黄的网站 | 国语自产偷拍精品视频偷 | 国产真实乱对白精彩久久 | 国产成人精品优优av | 精品无码av一区二区三区 | 丰满少妇弄高潮了www | 全球成人中文在线 | 久久久久国色av免费观看性色 | av无码不卡在线观看免费 | 国产乱人偷精品人妻a片 | 色婷婷综合中文久久一本 | 久久久久成人片免费观看蜜芽 | 精品国精品国产自在久国产87 | 激情人妻另类人妻伦 | 丰满肥臀大屁股熟妇激情视频 | 欧美野外疯狂做受xxxx高潮 | 激情综合激情五月俺也去 | 天天拍夜夜添久久精品 | 偷窥日本少妇撒尿chinese | 国产超碰人人爽人人做人人添 | 国产精品高潮呻吟av久久4虎 | 丝袜 中出 制服 人妻 美腿 | 久久精品国产99精品亚洲 | 亚洲精品综合一区二区三区在线 | 99久久婷婷国产综合精品青草免费 | 又粗又大又硬毛片免费看 | 国产精品久久久久久久9999 | 亚洲一区二区三区国产精华液 | 国产精品va在线观看无码 | 亚洲欧洲无卡二区视頻 | 日韩人妻无码中文字幕视频 | 亚洲日本一区二区三区在线 | 亚洲欧美色中文字幕在线 | 国产后入清纯学生妹 | 一本色道婷婷久久欧美 | а√资源新版在线天堂 | 亚洲欧洲中文日韩av乱码 | 丰满少妇人妻久久久久久 | 狠狠色欧美亚洲狠狠色www | 性欧美大战久久久久久久 | 久在线观看福利视频 | 少妇高潮一区二区三区99 | 国产内射爽爽大片视频社区在线 | 色综合久久网 | 精品成人av一区二区三区 | 亚洲国产精品一区二区美利坚 | 国产色在线 | 国产 | 国产精品-区区久久久狼 | 性做久久久久久久免费看 | 日韩精品乱码av一区二区 | 未满小14洗澡无码视频网站 | 少妇高潮一区二区三区99 | 中文字幕中文有码在线 | 爆乳一区二区三区无码 | 鲁鲁鲁爽爽爽在线视频观看 | 国内少妇偷人精品视频免费 | 97精品人妻一区二区三区香蕉 | 97资源共享在线视频 | 国产手机在线αⅴ片无码观看 | 一本精品99久久精品77 | 在线播放免费人成毛片乱码 | 麻豆国产人妻欲求不满 | 国产无av码在线观看 | 亚洲s码欧洲m码国产av | 亚洲色在线无码国产精品不卡 | 波多野结衣av在线观看 | 国产真人无遮挡作爱免费视频 | 免费乱码人妻系列无码专区 | 99久久人妻精品免费二区 | 午夜男女很黄的视频 | 乱中年女人伦av三区 | 六十路熟妇乱子伦 | 亚洲人成人无码网www国产 | 丁香啪啪综合成人亚洲 | 国产免费久久久久久无码 | 亚洲日韩精品欧美一区二区 | 免费视频欧美无人区码 | 性开放的女人aaa片 | 国产亚洲精品久久久久久久 | 国产成人av免费观看 | 国内精品一区二区三区不卡 | 国产电影无码午夜在线播放 | 国产超碰人人爽人人做人人添 | 成人性做爰aaa片免费看 | 免费网站看v片在线18禁无码 | 老司机亚洲精品影院无码 | 男人扒开女人内裤强吻桶进去 | 亚洲国产高清在线观看视频 | 国产精品久久久久影院嫩草 | 领导边摸边吃奶边做爽在线观看 | 免费无码一区二区三区蜜桃大 | 牲欲强的熟妇农村老妇女 | 日产精品高潮呻吟av久久 | 色综合久久久久综合一本到桃花网 | 在线观看免费人成视频 | 欧美丰满熟妇xxxx性ppx人交 | 国产在线精品一区二区高清不卡 | 妺妺窝人体色www在线小说 | 狠狠躁日日躁夜夜躁2020 | 综合人妻久久一区二区精品 | 久久精品国产一区二区三区 | 2020久久香蕉国产线看观看 | 扒开双腿疯狂进出爽爽爽视频 | 日本高清一区免费中文视频 | 18精品久久久无码午夜福利 | 兔费看少妇性l交大片免费 | 性色欲网站人妻丰满中文久久不卡 | 少妇激情av一区二区 | 国产精品久久久av久久久 | 日本护士毛茸茸高潮 | 性色欲情网站iwww九文堂 | 亚洲爆乳大丰满无码专区 | 鲁一鲁av2019在线 | 国产小呦泬泬99精品 | 无码国内精品人妻少妇 | 2020久久香蕉国产线看观看 | 久久亚洲国产成人精品性色 | 强伦人妻一区二区三区视频18 | 大肉大捧一进一出视频出来呀 | 亚洲国产精华液网站w | 在线精品亚洲一区二区 | 国产精品久久久久久久影院 | 黑人巨大精品欧美一区二区 | 欧美人与物videos另类 | 国产卡一卡二卡三 | 国产精品无码一区二区三区不卡 | 天天摸天天碰天天添 | 亚洲综合精品香蕉久久网 | 在线天堂新版最新版在线8 | 一本久久a久久精品亚洲 | 亲嘴扒胸摸屁股激烈网站 | 人人妻人人藻人人爽欧美一区 | 蜜臀av无码人妻精品 | 亚洲精品国产精品乱码不卡 | 亚洲性无码av中文字幕 | 日本va欧美va欧美va精品 | 国产精品-区区久久久狼 | 99久久精品无码一区二区毛片 | 亚洲日韩av片在线观看 | 欧美激情一区二区三区成人 | 国产激情一区二区三区 | 精品一二三区久久aaa片 | 中文字幕无码免费久久9一区9 | 波多野结衣aⅴ在线 | 亚洲精品成a人在线观看 | 成人一区二区免费视频 | 骚片av蜜桃精品一区 | 国内精品人妻无码久久久影院蜜桃 | 国产亚洲精品久久久久久久久动漫 | 久久精品无码一区二区三区 | 国内丰满熟女出轨videos | 日日噜噜噜噜夜夜爽亚洲精品 | 无码精品国产va在线观看dvd | 亚洲 日韩 欧美 成人 在线观看 | 久久国产精品精品国产色婷婷 | 久久综合给久久狠狠97色 | 免费人成在线视频无码 | 少妇人妻av毛片在线看 | 国内精品一区二区三区不卡 | 亚洲色成人中文字幕网站 | 东京无码熟妇人妻av在线网址 | 久久伊人色av天堂九九小黄鸭 | 女人被爽到呻吟gif动态图视看 | 国产在线一区二区三区四区五区 | 美女张开腿让人桶 | 国产成人亚洲综合无码 | 亚洲日韩av一区二区三区中文 | 午夜男女很黄的视频 | 午夜福利试看120秒体验区 | 国产精品手机免费 | 国产亚洲精品久久久久久大师 | 精品无码成人片一区二区98 | 九九综合va免费看 | 国产99久久精品一区二区 | 蜜臀aⅴ国产精品久久久国产老师 | 国产乱人偷精品人妻a片 | 波多野结衣一区二区三区av免费 | 国内综合精品午夜久久资源 | 亚洲欧洲日本无在线码 | 精品一二三区久久aaa片 | 亚洲va中文字幕无码久久不卡 | 无套内谢的新婚少妇国语播放 | 精品水蜜桃久久久久久久 | 国产精品亚洲lv粉色 | 国产特级毛片aaaaaa高潮流水 | 国产国语老龄妇女a片 | 日韩欧美中文字幕公布 | 狠狠躁日日躁夜夜躁2020 | 免费观看又污又黄的网站 | 色综合久久久无码中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 少妇被黑人到高潮喷出白浆 | 国产在线一区二区三区四区五区 | 亚洲人成网站免费播放 | 日韩视频 中文字幕 视频一区 | 亚洲国产精品久久久久久 | 久久久成人毛片无码 | 中文字幕人成乱码熟女app | 久久久精品成人免费观看 | 亚洲男女内射在线播放 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美性猛交xxxx富婆 | 精品熟女少妇av免费观看 | a片免费视频在线观看 | 无人区乱码一区二区三区 | 国产av久久久久精东av | 乱码午夜-极国产极内射 | 窝窝午夜理论片影院 | 丰满少妇人妻久久久久久 | 亚洲gv猛男gv无码男同 | 久久精品视频在线看15 | 色综合天天综合狠狠爱 | 亚洲阿v天堂在线 | 曰韩无码二三区中文字幕 | 蜜桃视频插满18在线观看 | 最近免费中文字幕中文高清百度 | 国产精品久久久久久久9999 | 国产一区二区三区四区五区加勒比 | 精品无人区无码乱码毛片国产 | 粉嫩少妇内射浓精videos | 国产成人精品视频ⅴa片软件竹菊 | 噜噜噜亚洲色成人网站 | 国产精品美女久久久 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产成人无码午夜视频在线观看 | 国产欧美亚洲精品a | 成人无码影片精品久久久 | 99久久精品午夜一区二区 | 欧美人与动性行为视频 | 亚洲国产精品一区二区美利坚 | 久久人人爽人人爽人人片av高清 | 内射欧美老妇wbb | 国产在线精品一区二区三区直播 | 国产真实乱对白精彩久久 | 亚洲热妇无码av在线播放 | 精品人妻人人做人人爽 | 国产乱码精品一品二品 | 国产色在线 | 国产 | 亚洲人成人无码网www国产 | 亚洲精品国产a久久久久久 | 东京无码熟妇人妻av在线网址 | 丰满人妻被黑人猛烈进入 | 51国偷自产一区二区三区 | 双乳奶水饱满少妇呻吟 | 亚洲人成网站免费播放 | 久久天天躁狠狠躁夜夜免费观看 | 男女性色大片免费网站 | 久久国产精品_国产精品 | 国产精品无码mv在线观看 | 日韩 欧美 动漫 国产 制服 | 国产无遮挡又黄又爽又色 | 欧美丰满老熟妇xxxxx性 | 中文字幕无码乱人伦 | 亚洲精品国偷拍自产在线观看蜜桃 | 综合网日日天干夜夜久久 | 久久午夜夜伦鲁鲁片无码免费 | 粉嫩少妇内射浓精videos | 亚洲色欲色欲欲www在线 | 久久久久av无码免费网 | 国产成人一区二区三区在线观看 | 久久久久久九九精品久 | 亚洲熟妇色xxxxx欧美老妇y | 久久午夜无码鲁丝片 | 曰韩无码二三区中文字幕 | 天天爽夜夜爽夜夜爽 | 国产人妻精品午夜福利免费 | 全黄性性激高免费视频 | 欧美性生交xxxxx久久久 | 色婷婷欧美在线播放内射 | 中文字幕无码人妻少妇免费 | 丁香啪啪综合成人亚洲 | 亚洲精品一区二区三区在线 | 免费无码的av片在线观看 | 欧美日本精品一区二区三区 | 永久免费观看国产裸体美女 | 国产成人综合美国十次 | 国产精品久久久久无码av色戒 | 亚洲成a人片在线观看无码3d | 无码人妻av免费一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 国产色视频一区二区三区 | 麻豆精品国产精华精华液好用吗 | 大地资源中文第3页 | 成人影院yy111111在线观看 | 水蜜桃av无码 | 亚洲一区二区三区国产精华液 | 无码人妻久久一区二区三区不卡 | 亚洲 欧美 激情 小说 另类 | 狂野欧美激情性xxxx | 日韩人妻系列无码专区 | 久久综合给久久狠狠97色 | 狠狠噜狠狠狠狠丁香五月 | 久激情内射婷内射蜜桃人妖 | 国产激情精品一区二区三区 | 高潮喷水的毛片 | 伊人久久大香线蕉av一区二区 | 精品欧洲av无码一区二区三区 | 性做久久久久久久免费看 | 色婷婷香蕉在线一区二区 | 一本精品99久久精品77 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产一区二区不卡老阿姨 | 欧美丰满熟妇xxxx性ppx人交 | 国产av无码专区亚洲awww | 精品成在人线av无码免费看 | 国产三级精品三级男人的天堂 | 亚洲中文字幕av在天堂 | 成年美女黄网站色大免费视频 | 久久精品女人的天堂av | 东京无码熟妇人妻av在线网址 | 日本精品人妻无码免费大全 | 我要看www免费看插插视频 | 荫蒂被男人添的好舒服爽免费视频 | 白嫩日本少妇做爰 | 久久综合久久自在自线精品自 | 巨爆乳无码视频在线观看 | 成人精品一区二区三区中文字幕 | 妺妺窝人体色www在线小说 | 中文字幕 亚洲精品 第1页 | 成人一区二区免费视频 | 99麻豆久久久国产精品免费 | 图片小说视频一区二区 | 精品一二三区久久aaa片 | 无码一区二区三区在线 | 国产av无码专区亚洲awww | 国产真人无遮挡作爱免费视频 | 波多野结衣一区二区三区av免费 | 亚洲欧洲中文日韩av乱码 | 国产午夜手机精彩视频 | 男女爱爱好爽视频免费看 | 国语自产偷拍精品视频偷 | 久久99精品久久久久久动态图 | 欧美丰满熟妇xxxx性ppx人交 | 日本一卡2卡3卡四卡精品网站 | 国产九九九九九九九a片 | 欧美丰满老熟妇xxxxx性 | 久久人妻内射无码一区三区 | 成人欧美一区二区三区黑人免费 | 久久久久久av无码免费看大片 | 亚洲热妇无码av在线播放 | 给我免费的视频在线观看 | 中文字幕色婷婷在线视频 | 亚洲一区二区三区香蕉 | 十八禁视频网站在线观看 | 荫蒂添的好舒服视频囗交 | 精品人妻人人做人人爽夜夜爽 | 国产香蕉97碰碰久久人人 | 久久久久久亚洲精品a片成人 | 高潮毛片无遮挡高清免费视频 | 欧美老妇交乱视频在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲狠狠婷婷综合久久 | 奇米影视7777久久精品 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品沙发午睡系列 | 久久精品中文闷骚内射 | 中文字幕乱码亚洲无线三区 | 亚洲乱亚洲乱妇50p | aⅴ在线视频男人的天堂 | 国产一区二区三区日韩精品 | 97夜夜澡人人双人人人喊 | 国产精品久久久 | 丰满少妇女裸体bbw | 男人和女人高潮免费网站 | 狠狠色丁香久久婷婷综合五月 | 撕开奶罩揉吮奶头视频 | 18黄暴禁片在线观看 | 成人一在线视频日韩国产 | 精品欧美一区二区三区久久久 | 久久zyz资源站无码中文动漫 | 久久zyz资源站无码中文动漫 | 中文字幕人妻无码一夲道 | 激情亚洲一区国产精品 | 国产真实乱对白精彩久久 | 漂亮人妻洗澡被公强 日日躁 | 久久国产精品精品国产色婷婷 | 成人精品一区二区三区中文字幕 | 久久久精品成人免费观看 | 少妇太爽了在线观看 | 亚洲成熟女人毛毛耸耸多 | 国产成人综合色在线观看网站 | 精品国产一区二区三区av 性色 | 国产精品无码成人午夜电影 | 国产精品无码久久av | 国产精品怡红院永久免费 | 久久久av男人的天堂 | 国内揄拍国内精品人妻 | 国产又粗又硬又大爽黄老大爷视 | 国产精品久久福利网站 | 中文字幕av伊人av无码av | 国产人妻精品一区二区三区不卡 | 日日躁夜夜躁狠狠躁 | 99精品国产综合久久久久五月天 | 中文字幕无码免费久久99 | 亚洲 高清 成人 动漫 | 久久精品无码一区二区三区 | 天堂а√在线中文在线 | 大乳丰满人妻中文字幕日本 | 国产精品-区区久久久狼 | 一个人看的www免费视频在线观看 | 无码av岛国片在线播放 | 中文字幕无码免费久久9一区9 | 色综合久久久久综合一本到桃花网 | 中文字幕无码人妻少妇免费 | 狠狠色丁香久久婷婷综合五月 | 午夜无码人妻av大片色欲 | 国产成人精品久久亚洲高清不卡 | 黑人巨大精品欧美黑寡妇 | 久久久www成人免费毛片 | 在线观看国产一区二区三区 | 亚洲一区av无码专区在线观看 | 激情亚洲一区国产精品 | 午夜时刻免费入口 | 婷婷综合久久中文字幕蜜桃三电影 | 无码人中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 图片小说视频一区二区 | 国产精品国产自线拍免费软件 | 午夜精品久久久久久久 | 日日摸日日碰夜夜爽av | 啦啦啦www在线观看免费视频 | 精品 日韩 国产 欧美 视频 | 欧美黑人性暴力猛交喷水 | 少妇人妻大乳在线视频 | 99视频精品全部免费免费观看 | 国内少妇偷人精品视频免费 | 久久99热只有频精品8 | 亚洲精品一区二区三区婷婷月 | 理论片87福利理论电影 | 丰满岳乱妇在线观看中字无码 | 午夜丰满少妇性开放视频 | 久久久久亚洲精品中文字幕 | 久久天天躁夜夜躁狠狠 | 国内精品人妻无码久久久影院 | 亚洲乱码国产乱码精品精 | 亚洲欧美日韩成人高清在线一区 | 久久人人爽人人爽人人片av高清 | 伊人久久大香线蕉亚洲 | 性色欲网站人妻丰满中文久久不卡 | 亚洲伊人久久精品影院 | 丝袜 中出 制服 人妻 美腿 | 亚洲乱码中文字幕在线 | 性做久久久久久久免费看 | 国内丰满熟女出轨videos | 熟妇人妻无码xxx视频 | 国产色xx群视频射精 | 桃花色综合影院 | 久久精品国产一区二区三区 | 中文精品久久久久人妻不卡 | 国産精品久久久久久久 | 国产69精品久久久久app下载 | 日日夜夜撸啊撸 | 日本在线高清不卡免费播放 | 在线成人www免费观看视频 | 国语精品一区二区三区 | 东北女人啪啪对白 | 国产一精品一av一免费 | 国产精品对白交换视频 | 好男人www社区 | 老熟妇仑乱视频一区二区 | 日本熟妇大屁股人妻 | 少妇人妻大乳在线视频 | 99久久精品午夜一区二区 | 色窝窝无码一区二区三区色欲 | 国产成人综合在线女婷五月99播放 | 亚洲色欲久久久综合网东京热 | 亚洲色欲色欲天天天www | 成人片黄网站色大片免费观看 | 国产亚洲精品久久久久久大师 | 亚洲午夜福利在线观看 | 香蕉久久久久久av成人 | 激情国产av做激情国产爱 | 99精品久久毛片a片 | 人妻aⅴ无码一区二区三区 | 一本无码人妻在中文字幕免费 | yw尤物av无码国产在线观看 | 婷婷丁香五月天综合东京热 | 亚洲精品中文字幕 | 久久亚洲国产成人精品性色 | 久久亚洲精品成人无码 | 男人扒开女人内裤强吻桶进去 | 日本一卡2卡3卡四卡精品网站 | 久久亚洲精品中文字幕无男同 | 2020最新国产自产精品 | 日韩av无码中文无码电影 | 无人区乱码一区二区三区 | 成熟妇人a片免费看网站 | 国产亚洲人成a在线v网站 | 国产精品成人av在线观看 | 综合激情五月综合激情五月激情1 | 久久久久久九九精品久 | 亚洲爆乳精品无码一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 日韩少妇内射免费播放 | 综合人妻久久一区二区精品 | 成人无码视频免费播放 | 午夜精品久久久内射近拍高清 | 99精品视频在线观看免费 | 日本大乳高潮视频在线观看 | 国产精品久久久久久亚洲影视内衣 | 少妇愉情理伦片bd | 久久久久久a亚洲欧洲av冫 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 老熟妇乱子伦牲交视频 | 熟女体下毛毛黑森林 | www一区二区www免费 | 无码人妻丰满熟妇区毛片18 | 天天摸天天透天天添 | 亚洲午夜福利在线观看 | 国产凸凹视频一区二区 | 最新版天堂资源中文官网 | 久久亚洲a片com人成 | 亚洲日韩av一区二区三区四区 | 国产美女精品一区二区三区 | 九九综合va免费看 | 东京热男人av天堂 | 国产小呦泬泬99精品 | 夜夜高潮次次欢爽av女 | 在线天堂新版最新版在线8 | 欧美 亚洲 国产 另类 | 亚洲伊人久久精品影院 | 成人欧美一区二区三区黑人免费 | 欧洲美熟女乱又伦 | 久久久精品456亚洲影院 | 精品午夜福利在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 午夜成人1000部免费视频 | 九九热爱视频精品 | 六十路熟妇乱子伦 | 人妻天天爽夜夜爽一区二区 | 纯爱无遮挡h肉动漫在线播放 | 图片区 小说区 区 亚洲五月 | 无码人妻丰满熟妇区毛片18 | 久久久久久av无码免费看大片 | 99久久久无码国产精品免费 | 欧美人与善在线com | 沈阳熟女露脸对白视频 | 亚洲国产成人av在线观看 | 国产精品手机免费 | 亚洲成a人片在线观看无码 | 亚洲欧洲中文日韩av乱码 | 久久亚洲日韩精品一区二区三区 | 久久综合狠狠综合久久综合88 | 丰满人妻被黑人猛烈进入 | 国产两女互慰高潮视频在线观看 | 波多野结衣高清一区二区三区 | 四虎影视成人永久免费观看视频 | 免费看男女做好爽好硬视频 | 牲欲强的熟妇农村老妇女 | 久久99精品久久久久婷婷 | 精品国产av色一区二区深夜久久 | www国产亚洲精品久久网站 | 国产午夜亚洲精品不卡 | 亚洲最大成人网站 | 国产手机在线αⅴ片无码观看 | 国产九九九九九九九a片 | 中文字幕乱妇无码av在线 | 国产成人一区二区三区在线观看 | 97精品人妻一区二区三区香蕉 | 亚洲精品午夜国产va久久成人 | 成人aaa片一区国产精品 | 欧美性猛交xxxx富婆 | 日本一区二区三区免费播放 | 国产精品.xx视频.xxtv | 亚洲综合久久一区二区 | 国产人妻精品一区二区三区 | 国产极品美女高潮无套在线观看 | 欧美日韩精品 | 成人女人看片免费视频放人 | 99久久亚洲精品无码毛片 | 中文字幕无码人妻少妇免费 | 成人性做爰aaa片免费看 | 图片小说视频一区二区 | 55夜色66夜色国产精品视频 | 中文字幕人成乱码熟女app | 学生妹亚洲一区二区 | 亚洲综合伊人久久大杳蕉 | 久久精品国产大片免费观看 | av人摸人人人澡人人超碰下载 | 狠狠色色综合网站 | 精品久久久无码中文字幕 | 国产激情艳情在线看视频 | 久久国产36精品色熟妇 | 成人免费视频视频在线观看 免费 | 人妻少妇被猛烈进入中文字幕 | 国产欧美精品一区二区三区 | 久久综合久久自在自线精品自 | 又黄又爽又色的视频 | 精品 日韩 国产 欧美 视频 | 熟女俱乐部五十路六十路av | 久久zyz资源站无码中文动漫 | 日本精品少妇一区二区三区 | 欧美肥老太牲交大战 | 曰韩少妇内射免费播放 | 国产亚洲视频中文字幕97精品 | 男女爱爱好爽视频免费看 | 久久精品人人做人人综合试看 | 亚洲国精产品一二二线 | 中文字幕无线码免费人妻 | 久久精品成人欧美大片 | 一本久道久久综合婷婷五月 | 色婷婷综合激情综在线播放 | 国产精品高潮呻吟av久久 | 中文字幕无线码免费人妻 | 久久综合给合久久狠狠狠97色 | 国产成人精品一区二区在线小狼 | 激情内射亚州一区二区三区爱妻 | 日日麻批免费40分钟无码 | 激情内射日本一区二区三区 | 国产又爽又猛又粗的视频a片 | 无码人妻av免费一区二区三区 | 国产绳艺sm调教室论坛 | 欧美亚洲日韩国产人成在线播放 | 久久久久久久人妻无码中文字幕爆 | 无码一区二区三区在线 | 麻豆果冻传媒2021精品传媒一区下载 | 国产另类ts人妖一区二区 | 久久99久久99精品中文字幕 | 永久免费观看美女裸体的网站 | 国产精品鲁鲁鲁 | 亚洲精品久久久久久久久久久 | 激情亚洲一区国产精品 | 天天做天天爱天天爽综合网 | 97精品国产97久久久久久免费 | 国产一区二区三区日韩精品 | 欧美老人巨大xxxx做受 | 少妇高潮一区二区三区99 | 青青久在线视频免费观看 | 俺去俺来也www色官网 | 亚洲国产成人av在线观看 | 久久精品丝袜高跟鞋 | 午夜精品久久久久久久久 | 综合激情五月综合激情五月激情1 | 波多野结衣av在线观看 | 爱做久久久久久 | 精品人妻av区 | 人人爽人人爽人人片av亚洲 | 成 人 网 站国产免费观看 | 国产无遮挡吃胸膜奶免费看 | 欧美日韩一区二区免费视频 | 波多野结衣av在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 日日夜夜撸啊撸 | 国产偷抇久久精品a片69 | 中文字幕无码日韩专区 | 亚洲区小说区激情区图片区 | 成人亚洲精品久久久久 | 大地资源中文第3页 | 国产一精品一av一免费 | 国产精品亚洲lv粉色 | 亚洲精品久久久久久一区二区 | 无码人妻精品一区二区三区下载 | 欧美人与牲动交xxxx | 老熟女乱子伦 | 国产综合色产在线精品 | 草草网站影院白丝内射 | 日韩亚洲欧美精品综合 | 最新版天堂资源中文官网 | yw尤物av无码国产在线观看 | 日韩av无码一区二区三区不卡 | 色综合久久久久综合一本到桃花网 | 一本久久a久久精品vr综合 | 亚洲精品国偷拍自产在线观看蜜桃 | 色综合视频一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 国产一区二区三区日韩精品 | 精品国产aⅴ无码一区二区 | 亚洲色欲色欲天天天www | 国产精品va在线播放 | 色欲人妻aaaaaaa无码 | 男女猛烈xx00免费视频试看 | 国产精品亚洲а∨无码播放麻豆 | 亚洲伊人久久精品影院 | 天海翼激烈高潮到腰振不止 | 欧美性黑人极品hd | 我要看www免费看插插视频 | 国产成人精品一区二区在线小狼 | 成人免费视频在线观看 | 国产香蕉尹人视频在线 | 理论片87福利理论电影 | 欧美日本精品一区二区三区 | 国内精品久久久久久中文字幕 | 中文字幕乱码中文乱码51精品 | 久久久久久a亚洲欧洲av冫 | 中文精品无码中文字幕无码专区 | 男人扒开女人内裤强吻桶进去 | 亚洲精品一区国产 | 亚洲熟熟妇xxxx | 无码国产激情在线观看 | 俺去俺来也在线www色官网 | 午夜福利一区二区三区在线观看 | 欧美高清在线精品一区 | 一本久久a久久精品亚洲 | 国产乱子伦视频在线播放 | 女人被男人爽到呻吟的视频 | 国产情侣作爱视频免费观看 | 亚洲经典千人经典日产 | 国内综合精品午夜久久资源 | 美女毛片一区二区三区四区 | 国产午夜福利亚洲第一 | 俄罗斯老熟妇色xxxx | 亚洲综合伊人久久大杳蕉 | 久久熟妇人妻午夜寂寞影院 | 国产精品久久久久久亚洲影视内衣 | 亚洲a无码综合a国产av中文 | 久久99精品久久久久久动态图 | 久久精品丝袜高跟鞋 | 强伦人妻一区二区三区视频18 | 中文亚洲成a人片在线观看 | 国产日产欧产精品精品app | 国产精品办公室沙发 | 国产又粗又硬又大爽黄老大爷视 | 对白脏话肉麻粗话av | 黑人大群体交免费视频 | 亚洲男人av天堂午夜在 | 日日天干夜夜狠狠爱 | 国产精品久久久久影院嫩草 | 免费国产成人高清在线观看网站 | 人妻无码久久精品人妻 | 精品一区二区三区波多野结衣 | 三上悠亚人妻中文字幕在线 | 特大黑人娇小亚洲女 | 日日麻批免费40分钟无码 | 亚洲成av人影院在线观看 | 无码人妻精品一区二区三区下载 | 最新国产麻豆aⅴ精品无码 | 久久午夜无码鲁丝片秋霞 | 精品欧美一区二区三区久久久 | 日韩精品无码免费一区二区三区 | 欧美日本免费一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 未满小14洗澡无码视频网站 | 夜先锋av资源网站 | 国产人妻精品午夜福利免费 | 国产福利视频一区二区 | 国产亚洲人成在线播放 | 亚洲爆乳大丰满无码专区 | 亚洲综合无码久久精品综合 | 波多野结衣av一区二区全免费观看 | 欧洲精品码一区二区三区免费看 | 波多野结衣乳巨码无在线观看 | 亚洲熟女一区二区三区 | aa片在线观看视频在线播放 | 高清国产亚洲精品自在久久 | 亚洲区欧美区综合区自拍区 | 亚洲精品久久久久avwww潮水 | 纯爱无遮挡h肉动漫在线播放 | 日韩亚洲欧美精品综合 | 奇米影视888欧美在线观看 | 成人性做爰aaa片免费看 | 野外少妇愉情中文字幕 | 免费看男女做好爽好硬视频 | 免费看少妇作爱视频 | 日日夜夜撸啊撸 | 亚洲精品一区二区三区在线 | 一本大道伊人av久久综合 | 日韩av无码一区二区三区不卡 | 人妻体内射精一区二区三四 | www国产亚洲精品久久久日本 | 又粗又大又硬又长又爽 | 久久久成人毛片无码 | 日韩成人一区二区三区在线观看 | 国产精品久久精品三级 | 欧美阿v高清资源不卡在线播放 | 欧美性色19p | 免费观看又污又黄的网站 | 国产精品久久精品三级 | 国产精品高潮呻吟av久久4虎 | 亚洲伊人久久精品影院 | 男人的天堂av网站 | 无码播放一区二区三区 | 一个人免费观看的www视频 | 欧美黑人性暴力猛交喷水 | 亚洲国产成人a精品不卡在线 | 两性色午夜视频免费播放 | 丰满妇女强制高潮18xxxx | 天天综合网天天综合色 | 亚洲aⅴ无码成人网站国产app | 最近的中文字幕在线看视频 | 草草网站影院白丝内射 | 蜜臀av无码人妻精品 | 亚洲午夜福利在线观看 | a在线亚洲男人的天堂 | 丰满岳乱妇在线观看中字无码 | 性欧美大战久久久久久久 | 中国女人内谢69xxxx | 一本久道久久综合婷婷五月 | 青青草原综合久久大伊人精品 | 国产三级精品三级男人的天堂 | 亚洲自偷自偷在线制服 | 久久久国产精品无码免费专区 | 亚洲区欧美区综合区自拍区 | 亚洲天堂2017无码 | 乱中年女人伦av三区 | 国内精品久久毛片一区二区 | yw尤物av无码国产在线观看 | 精品国产精品久久一区免费式 | 国产成人av免费观看 | 成人亚洲精品久久久久软件 | 亚洲综合在线一区二区三区 | 久久精品中文闷骚内射 | 日韩精品无码免费一区二区三区 | 日韩欧美中文字幕公布 | 永久免费观看美女裸体的网站 | 国産精品久久久久久久 | 免费网站看v片在线18禁无码 | 国产猛烈高潮尖叫视频免费 | 大肉大捧一进一出好爽视频 | 毛片内射-百度 | 人人澡人人妻人人爽人人蜜桃 | 天堂久久天堂av色综合 | 伊在人天堂亚洲香蕉精品区 | 好男人www社区 | 成 人 免费观看网站 | 装睡被陌生人摸出水好爽 | 377p欧洲日本亚洲大胆 | 色婷婷综合中文久久一本 | 牲欲强的熟妇农村老妇女 | 中文字幕无码日韩专区 | 国产真人无遮挡作爱免费视频 | 伊人久久大香线焦av综合影院 | 国产精品免费大片 | 日韩av无码中文无码电影 | 亚洲精品久久久久中文第一幕 | 久久久精品国产sm最大网站 | 天天躁夜夜躁狠狠是什么心态 | 台湾无码一区二区 | 亲嘴扒胸摸屁股激烈网站 | 亚洲熟妇自偷自拍另类 | 精品国精品国产自在久国产87 | 国内精品九九久久久精品 | 亚洲欧美精品伊人久久 | www国产亚洲精品久久久日本 | 宝宝好涨水快流出来免费视频 | 免费无码午夜福利片69 | 久久久www成人免费毛片 | 国内揄拍国内精品少妇国语 | 牲欲强的熟妇农村老妇女 | 男人的天堂2018无码 | 欧美国产日韩亚洲中文 | 亚洲综合无码久久精品综合 | 亚洲自偷精品视频自拍 | 一个人看的www免费视频在线观看 | 国产国语老龄妇女a片 | 成熟人妻av无码专区 | 熟妇人妻中文av无码 | 三上悠亚人妻中文字幕在线 | 欧美色就是色 | 中文毛片无遮挡高清免费 | 免费视频欧美无人区码 | 久在线观看福利视频 | 亚洲色欲久久久综合网东京热 | 一个人看的www免费视频在线观看 | 天干天干啦夜天干天2017 | 午夜丰满少妇性开放视频 | 成人片黄网站色大片免费观看 | 无码人妻黑人中文字幕 | 中文字幕亚洲情99在线 | 亚洲精品无码人妻无码 | 国产成人精品视频ⅴa片软件竹菊 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品嫩草久久久久 | av无码不卡在线观看免费 | 国产精华av午夜在线观看 | 成人无码精品1区2区3区免费看 | 牛和人交xxxx欧美 | 人人爽人人澡人人人妻 | 久久久精品成人免费观看 | 精品国精品国产自在久国产87 | 国产女主播喷水视频在线观看 | 骚片av蜜桃精品一区 | 婷婷五月综合缴情在线视频 | 中文字幕无码人妻少妇免费 | 欧美性生交xxxxx久久久 | 3d动漫精品啪啪一区二区中 | 最新国产麻豆aⅴ精品无码 | 青草青草久热国产精品 | 国产午夜视频在线观看 | 99久久精品午夜一区二区 | 国产精品亚洲五月天高清 | 日本熟妇乱子伦xxxx | 狠狠综合久久久久综合网 | 久久久亚洲欧洲日产国码αv | 日韩av无码一区二区三区 | 久久99精品国产麻豆 | 国内精品一区二区三区不卡 | 日日麻批免费40分钟无码 | 成人无码精品1区2区3区免费看 | 桃花色综合影院 | 色窝窝无码一区二区三区色欲 | 无码国产乱人伦偷精品视频 | 无码人妻出轨黑人中文字幕 | 成人精品视频一区二区三区尤物 | 丰满人妻翻云覆雨呻吟视频 | 亚洲色偷偷偷综合网 | 国产色精品久久人妻 | 一本久道久久综合狠狠爱 | 高潮喷水的毛片 | 日本熟妇大屁股人妻 | 国产精品对白交换视频 | 日韩欧美成人免费观看 | 国产办公室秘书无码精品99 | 国产三级久久久精品麻豆三级 | 国产午夜精品一区二区三区嫩草 | 成熟女人特级毛片www免费 | 美女黄网站人色视频免费国产 | 少妇无套内谢久久久久 | 国产色xx群视频射精 | 偷窥日本少妇撒尿chinese | 伊人久久大香线蕉av一区二区 | 九九在线中文字幕无码 | 日本www一道久久久免费榴莲 | av人摸人人人澡人人超碰下载 | 无码人妻黑人中文字幕 | 无码任你躁久久久久久久 | 亚洲欧美色中文字幕在线 | 国产精品鲁鲁鲁 | 欧美国产日韩久久mv | 精品国偷自产在线 | 久久久亚洲欧洲日产国码αv | 无码午夜成人1000部免费视频 | 麻豆av传媒蜜桃天美传媒 | 无码国内精品人妻少妇 | 精品亚洲成av人在线观看 | 久久久久久亚洲精品a片成人 | 又大又硬又爽免费视频 | 欧美成人家庭影院 | 人妻少妇精品无码专区动漫 | 国产麻豆精品一区二区三区v视界 | 日本一本二本三区免费 | a在线亚洲男人的天堂 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美丰满老熟妇xxxxx性 | 人人妻人人澡人人爽欧美精品 | 国产精品无码一区二区桃花视频 | 久久久久久九九精品久 | 女人高潮内射99精品 | 人人爽人人澡人人高潮 | 国产精品无码一区二区桃花视频 | 日本爽爽爽爽爽爽在线观看免 | 欧美亚洲日韩国产人成在线播放 | 国产亚洲精品久久久久久大师 | 玩弄少妇高潮ⅹxxxyw | 久久综合激激的五月天 | 日本在线高清不卡免费播放 | 日本www一道久久久免费榴莲 | 久久zyz资源站无码中文动漫 | 少妇久久久久久人妻无码 | 亚洲中文字幕无码中字 | 300部国产真实乱 | 亚洲精品久久久久中文第一幕 | 国产尤物精品视频 | 在线а√天堂中文官网 | 波多野结衣乳巨码无在线观看 | 一个人免费观看的www视频 | 中文字幕av日韩精品一区二区 | 草草网站影院白丝内射 | 国产精品美女久久久网av | 高清无码午夜福利视频 | 思思久久99热只有频精品66 | 国产亚洲精品久久久久久大师 | 国产深夜福利视频在线 | 欧美熟妇另类久久久久久多毛 | 天下第一社区视频www日本 | 色妞www精品免费视频 | 人妻无码αv中文字幕久久琪琪布 | 久久99久久99精品中文字幕 | 欧美大屁股xxxxhd黑色 | 无码人中文字幕 | 亚洲精品一区二区三区四区五区 | 免费看少妇作爱视频 | 中文字幕日产无线码一区 | 99视频精品全部免费免费观看 | 色一情一乱一伦一视频免费看 | 国产亚洲日韩欧美另类第八页 | 中文字幕av日韩精品一区二区 | 国产精品亚洲一区二区三区喷水 | 未满小14洗澡无码视频网站 | 好男人www社区 | √天堂中文官网8在线 | 国产女主播喷水视频在线观看 | 人人妻人人澡人人爽精品欧美 | 久久精品99久久香蕉国产色戒 | 日日麻批免费40分钟无码 | 久久久久久av无码免费看大片 | 精品久久综合1区2区3区激情 | 国产真实乱对白精彩久久 | 日日麻批免费40分钟无码 |