3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

啦啦啦www在线观看免费视频 | 亚洲日本va午夜在线电影 | 久久亚洲中文字幕精品一区 | 日日麻批免费40分钟无码 | 成人三级无码视频在线观看 | 国内精品久久久久久中文字幕 | 久久99精品久久久久久 | 成人动漫在线观看 | 色婷婷综合中文久久一本 | 久久国产精品_国产精品 | 少妇性l交大片欧洲热妇乱xxx | 亚洲 另类 在线 欧美 制服 | 六月丁香婷婷色狠狠久久 | 精品亚洲成av人在线观看 | 国产成人无码午夜视频在线观看 | √天堂资源地址中文在线 | 国产人妻精品一区二区三区 | 午夜精品久久久内射近拍高清 | 女人被男人躁得好爽免费视频 | 亚洲精品国产精品乱码视色 | 国产超级va在线观看视频 | 青春草在线视频免费观看 | 性欧美疯狂xxxxbbbb | 99久久亚洲精品无码毛片 | 久久久久亚洲精品男人的天堂 | 国产人妻人伦精品1国产丝袜 | 东京热男人av天堂 | 日日摸夜夜摸狠狠摸婷婷 | 色婷婷av一区二区三区之红樱桃 | 日本高清一区免费中文视频 | 女人被男人爽到呻吟的视频 | 2019午夜福利不卡片在线 | 国产特级毛片aaaaaaa高清 | 亚无码乱人伦一区二区 | 免费看少妇作爱视频 | 亚洲人交乣女bbw | 久久www免费人成人片 | 99久久久无码国产aaa精品 | 四十如虎的丰满熟妇啪啪 | 高潮毛片无遮挡高清免费视频 | 亚洲日韩一区二区 | 亚洲欧洲日本无在线码 | 水蜜桃亚洲一二三四在线 | 国产乱人偷精品人妻a片 | 亚洲中文字幕av在天堂 | 国产真人无遮挡作爱免费视频 | 久久精品女人的天堂av | 1000部夫妻午夜免费 | 狠狠色噜噜狠狠狠狠7777米奇 | 麻豆国产丝袜白领秘书在线观看 | 四虎永久在线精品免费网址 | 免费网站看v片在线18禁无码 | 激情综合激情五月俺也去 | 国产av一区二区三区最新精品 | 午夜理论片yy44880影院 | 精品午夜福利在线观看 | 色综合天天综合狠狠爱 | 免费无码肉片在线观看 | 国产色在线 | 国产 | 亚洲人交乣女bbw | 精品熟女少妇av免费观看 | 成人亚洲精品久久久久软件 | 亚洲色偷偷男人的天堂 | 熟妇激情内射com | 国产又粗又硬又大爽黄老大爷视 | 国产亚洲美女精品久久久2020 | 国产av无码专区亚洲awww | 国产真人无遮挡作爱免费视频 | 无码吃奶揉捏奶头高潮视频 | 精品夜夜澡人妻无码av蜜桃 | 中文字幕人成乱码熟女app | 亚洲娇小与黑人巨大交 | 欧美日韩视频无码一区二区三 | 小sao货水好多真紧h无码视频 | 97色伦图片97综合影院 | 超碰97人人射妻 | 乱人伦中文视频在线观看 | 欧美自拍另类欧美综合图片区 | 精品久久综合1区2区3区激情 | 免费人成在线视频无码 | 强开小婷嫩苞又嫩又紧视频 | 天天摸天天碰天天添 | 成人无码精品一区二区三区 | 色 综合 欧美 亚洲 国产 | 中文字幕无码日韩专区 | 精品国产福利一区二区 | 漂亮人妻洗澡被公强 日日躁 | aⅴ亚洲 日韩 色 图网站 播放 | 麻豆精品国产精华精华液好用吗 | 大乳丰满人妻中文字幕日本 | 日韩 欧美 动漫 国产 制服 | 377p欧洲日本亚洲大胆 | 日韩精品a片一区二区三区妖精 | 在线欧美精品一区二区三区 | 色爱情人网站 | 九九久久精品国产免费看小说 | 一本色道久久综合狠狠躁 | 免费中文字幕日韩欧美 | 中文字幕乱妇无码av在线 | 久久久中文久久久无码 | 青草视频在线播放 | 熟女体下毛毛黑森林 | 强辱丰满人妻hd中文字幕 | 日韩少妇内射免费播放 | 亚洲一区二区三区播放 | 久久综合九色综合欧美狠狠 | 97夜夜澡人人双人人人喊 | 99视频精品全部免费免费观看 | 国产精品国产三级国产专播 | 久久久久成人片免费观看蜜芽 | 亚洲高清偷拍一区二区三区 | 四十如虎的丰满熟妇啪啪 | 久久熟妇人妻午夜寂寞影院 | 扒开双腿疯狂进出爽爽爽视频 | 撕开奶罩揉吮奶头视频 | 十八禁视频网站在线观看 | 无码国产色欲xxxxx视频 | 久久久久免费看成人影片 | 亚洲欧美日韩成人高清在线一区 | 美女黄网站人色视频免费国产 | 亚洲精品成a人在线观看 | 久久久久99精品成人片 | 最近中文2019字幕第二页 | 丰满少妇高潮惨叫视频 | 超碰97人人做人人爱少妇 | 性做久久久久久久免费看 | 久久久亚洲欧洲日产国码αv | 亚洲精品鲁一鲁一区二区三区 | 内射白嫩少妇超碰 | 久久久无码中文字幕久... | 成人影院yy111111在线观看 | 亚洲中文字幕va福利 | 久久人妻内射无码一区三区 | 精品无码av一区二区三区 | 国产精品99爱免费视频 | 亚洲 高清 成人 动漫 | 久久五月精品中文字幕 | 亚洲一区二区三区无码久久 | 中文字幕久久久久人妻 | 亚洲午夜福利在线观看 | 装睡被陌生人摸出水好爽 | 粗大的内捧猛烈进出视频 | 成在人线av无码免观看麻豆 | 国产免费久久久久久无码 | 少妇高潮喷潮久久久影院 | 婷婷综合久久中文字幕蜜桃三电影 | 青草视频在线播放 | 亚洲成av人在线观看网址 | 欧美国产日韩亚洲中文 | a在线亚洲男人的天堂 | 亚洲精品国产a久久久久久 | 激情五月综合色婷婷一区二区 | 永久免费观看美女裸体的网站 | 日韩精品a片一区二区三区妖精 | 久久午夜无码鲁丝片 | 激情内射亚州一区二区三区爱妻 | 免费中文字幕日韩欧美 | 无码福利日韩神码福利片 | 人妻与老人中文字幕 | 天天燥日日燥 | 色一情一乱一伦 | 免费观看又污又黄的网站 | 女人高潮内射99精品 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 久久人人爽人人爽人人片av高清 | 亚洲va中文字幕无码久久不卡 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品一区三区三区在线观看 | 中文字幕av无码一区二区三区电影 | 亚洲精品中文字幕久久久久 | 中文字幕乱妇无码av在线 | 免费人成在线视频无码 | 亚洲综合伊人久久大杳蕉 | 亚洲大尺度无码无码专区 | 婷婷色婷婷开心五月四房播播 | 又大又黄又粗又爽的免费视频 | 97精品国产97久久久久久免费 | 亚洲人成人无码网www国产 | 99久久人妻精品免费一区 | 永久黄网站色视频免费直播 | 亚洲爆乳大丰满无码专区 | 午夜性刺激在线视频免费 | 疯狂三人交性欧美 | 成人精品天堂一区二区三区 | 人妻天天爽夜夜爽一区二区 | 中文字幕乱码亚洲无线三区 | 色综合久久88色综合天天 | 欧美老妇与禽交 | 精品久久综合1区2区3区激情 | 亚洲乱码国产乱码精品精 | 中文字幕无码免费久久99 | 领导边摸边吃奶边做爽在线观看 | 未满小14洗澡无码视频网站 | 亚洲成av人在线观看网址 | 老子影院午夜精品无码 | 狠狠综合久久久久综合网 | 色欲人妻aaaaaaa无码 | 亚洲va欧美va天堂v国产综合 | 人人爽人人爽人人片av亚洲 | 亚洲一区二区三区播放 | 久久精品人妻少妇一区二区三区 | 国产免费无码一区二区视频 | 亚洲理论电影在线观看 | 欧美怡红院免费全部视频 | 97资源共享在线视频 | 99久久亚洲精品无码毛片 | 久久久久av无码免费网 | 亚洲欧美色中文字幕在线 | 国产超碰人人爽人人做人人添 | 欧美三级a做爰在线观看 | 啦啦啦www在线观看免费视频 | 性欧美熟妇videofreesex | 丰满少妇高潮惨叫视频 | 日韩av激情在线观看 | 亚洲中文字幕va福利 | 又湿又紧又大又爽a视频国产 | 国产xxx69麻豆国语对白 | 日韩av无码一区二区三区不卡 | 四十如虎的丰满熟妇啪啪 | 天干天干啦夜天干天2017 | 欧美高清在线精品一区 | 九月婷婷人人澡人人添人人爽 | 欧美第一黄网免费网站 | 夜先锋av资源网站 | 露脸叫床粗话东北少妇 | 日产精品高潮呻吟av久久 | √8天堂资源地址中文在线 | 大乳丰满人妻中文字幕日本 | 亚洲色欲色欲欲www在线 | 粗大的内捧猛烈进出视频 | 中文字幕日韩精品一区二区三区 | 99在线 | 亚洲 | 欧美日韩一区二区综合 | 丁香啪啪综合成人亚洲 | 久久久久亚洲精品中文字幕 | 久久久久免费精品国产 | 国产真人无遮挡作爱免费视频 | 欧美精品免费观看二区 | 少妇人妻偷人精品无码视频 | 精品无人区无码乱码毛片国产 | 久久aⅴ免费观看 | 国产精品丝袜黑色高跟鞋 | 国产精品久久久久久久9999 | 色综合久久久无码中文字幕 | 少妇高潮喷潮久久久影院 | 国产情侣作爱视频免费观看 | 成人aaa片一区国产精品 | 内射后入在线观看一区 | 国产av一区二区三区最新精品 | 日韩无码专区 | 亚洲精品成人av在线 | 欧美精品免费观看二区 | 女人被爽到呻吟gif动态图视看 | 熟妇女人妻丰满少妇中文字幕 | 乱人伦人妻中文字幕无码久久网 | 国产成人无码一二三区视频 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲精品久久久久中文第一幕 | 中文无码成人免费视频在线观看 | 午夜时刻免费入口 | 精品无码一区二区三区爱欲 | 成人性做爰aaa片免费看不忠 | 丰满人妻翻云覆雨呻吟视频 | 在线天堂新版最新版在线8 | 少妇人妻av毛片在线看 | 无码人妻丰满熟妇区五十路百度 | 色婷婷综合激情综在线播放 | 亚洲中文字幕乱码av波多ji | 亚洲精品成a人在线观看 | 久久久国产精品无码免费专区 | 夜先锋av资源网站 | 一个人看的视频www在线 | www国产精品内射老师 | 国语精品一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 免费看少妇作爱视频 | 丰满护士巨好爽好大乳 | 欧美成人高清在线播放 | 国产成人一区二区三区别 | 色五月丁香五月综合五月 | 精品无人国产偷自产在线 | 九九久久精品国产免费看小说 | 人人澡人人透人人爽 | 欧美人与禽zoz0性伦交 | 国产两女互慰高潮视频在线观看 | 夜夜影院未满十八勿进 | 正在播放老肥熟妇露脸 | 成 人影片 免费观看 | 色综合久久久久综合一本到桃花网 | 奇米影视888欧美在线观看 | 熟妇人妻无乱码中文字幕 | 又粗又大又硬又长又爽 | 我要看www免费看插插视频 | 精品国产福利一区二区 | 少妇人妻偷人精品无码视频 | 精品日本一区二区三区在线观看 | 午夜无码人妻av大片色欲 | 牲欲强的熟妇农村老妇女视频 | 波多野结衣乳巨码无在线观看 | 精品无码av一区二区三区 | 午夜福利一区二区三区在线观看 | 国产乱人伦av在线无码 | 久久久久久久女国产乱让韩 | 老司机亚洲精品影院 | 大地资源中文第3页 | 青草视频在线播放 | 久久综合网欧美色妞网 | 99久久精品无码一区二区毛片 | 久久99久久99精品中文字幕 | 色欲av亚洲一区无码少妇 | 成人试看120秒体验区 | 又大又硬又黄的免费视频 | 人妻尝试又大又粗久久 | 熟妇女人妻丰满少妇中文字幕 | 久久久久成人片免费观看蜜芽 | 在线а√天堂中文官网 | 精品成人av一区二区三区 | 一本久久a久久精品亚洲 | 色综合久久久久综合一本到桃花网 | 国产两女互慰高潮视频在线观看 | 亚洲a无码综合a国产av中文 | 麻豆av传媒蜜桃天美传媒 | 久久精品视频在线看15 | 午夜熟女插插xx免费视频 | 亚洲色成人中文字幕网站 | 狠狠亚洲超碰狼人久久 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲乱码日产精品bd | 精品国产成人一区二区三区 | 九一九色国产 | 日韩欧美中文字幕在线三区 | 乱人伦中文视频在线观看 | 特大黑人娇小亚洲女 | 亚洲区欧美区综合区自拍区 | 丝袜 中出 制服 人妻 美腿 | 久久久成人毛片无码 | 国产色精品久久人妻 | 日韩少妇内射免费播放 | 76少妇精品导航 | 最新国产麻豆aⅴ精品无码 | 2019午夜福利不卡片在线 | aa片在线观看视频在线播放 | 欧美野外疯狂做受xxxx高潮 | 欧美日韩在线亚洲综合国产人 | 成人av无码一区二区三区 | 成人亚洲精品久久久久软件 | 欧美阿v高清资源不卡在线播放 | 色偷偷人人澡人人爽人人模 | 人人妻人人澡人人爽欧美一区 | 欧美性色19p | 亚洲性无码av中文字幕 | 欧美日韩视频无码一区二区三 | 伦伦影院午夜理论片 | 在线播放无码字幕亚洲 | 色 综合 欧美 亚洲 国产 | 国产区女主播在线观看 | 国产人妻久久精品二区三区老狼 | 国产成人无码av在线影院 | 麻豆国产丝袜白领秘书在线观看 | 在线看片无码永久免费视频 | 永久免费观看美女裸体的网站 | 呦交小u女精品视频 | 婷婷色婷婷开心五月四房播播 | 国产精品久久久久久亚洲影视内衣 | 免费无码av一区二区 | 欧美成人家庭影院 | 亚洲精品一区二区三区在线 | 欧洲精品码一区二区三区免费看 | 人人妻人人澡人人爽欧美精品 | 亚洲乱亚洲乱妇50p | 亚洲熟悉妇女xxx妇女av | 97夜夜澡人人爽人人喊中国片 | 少妇人妻大乳在线视频 | 欧美一区二区三区视频在线观看 | 亚洲阿v天堂在线 | 中文字幕中文有码在线 | 日本成熟视频免费视频 | 精品国产乱码久久久久乱码 | 亚洲伊人久久精品影院 | 久久午夜无码鲁丝片秋霞 | 亚洲精品www久久久 | 六十路熟妇乱子伦 | 日日天干夜夜狠狠爱 | 色一情一乱一伦一区二区三欧美 | 麻豆蜜桃av蜜臀av色欲av | 国产激情无码一区二区app | 日本在线高清不卡免费播放 | 内射后入在线观看一区 | 无码毛片视频一区二区本码 | 国产成人亚洲综合无码 | 久久久精品欧美一区二区免费 | 曰本女人与公拘交酡免费视频 | 小sao货水好多真紧h无码视频 | 精品无码国产一区二区三区av | 熟女少妇人妻中文字幕 | 色狠狠av一区二区三区 | 国产美女极度色诱视频www | 久久久久国色av免费观看性色 | 高潮毛片无遮挡高清免费视频 | 亚洲精品一区二区三区在线 | 国产人妻久久精品二区三区老狼 | 岛国片人妻三上悠亚 | 精品无码av一区二区三区 | 欧美老人巨大xxxx做受 | 久精品国产欧美亚洲色aⅴ大片 | 东北女人啪啪对白 | 中文字幕乱码人妻无码久久 | 夜精品a片一区二区三区无码白浆 | 青草青草久热国产精品 | 国产97在线 | 亚洲 | 人人澡人摸人人添 | 无码中文字幕色专区 | 人人妻人人澡人人爽欧美一区 | 免费观看黄网站 | 激情综合激情五月俺也去 | 精品久久久久香蕉网 | 国产另类ts人妖一区二区 | 青青青爽视频在线观看 | 国产网红无码精品视频 | 久久亚洲日韩精品一区二区三区 | 三级4级全黄60分钟 | 丰满人妻翻云覆雨呻吟视频 | 欧洲vodafone精品性 | 51国偷自产一区二区三区 | 成熟人妻av无码专区 | 一本久久伊人热热精品中文字幕 | 精品国产成人一区二区三区 | 伊人久久大香线蕉午夜 | 午夜嘿嘿嘿影院 | a在线亚洲男人的天堂 | 无码人妻精品一区二区三区不卡 | 欧美黑人巨大xxxxx | 欧美zoozzooz性欧美 | 亚洲综合精品香蕉久久网 | 东京无码熟妇人妻av在线网址 | 国语精品一区二区三区 | 亚洲欧美色中文字幕在线 | 国产性生大片免费观看性 | 午夜丰满少妇性开放视频 | 人妻无码αv中文字幕久久琪琪布 | 丰满人妻精品国产99aⅴ | 久久久亚洲欧洲日产国码αv | 精品无码国产自产拍在线观看蜜 | 特大黑人娇小亚洲女 | 亚洲最大成人网站 | 日本欧美一区二区三区乱码 | 国产成人精品视频ⅴa片软件竹菊 | 国产另类ts人妖一区二区 | 欧美日韩在线亚洲综合国产人 | 无码一区二区三区在线 | 人妻夜夜爽天天爽三区 | 无码一区二区三区在线 | 欧美精品在线观看 | 性欧美熟妇videofreesex | 日本又色又爽又黄的a片18禁 | 三上悠亚人妻中文字幕在线 | 日韩精品无码免费一区二区三区 | 特黄特色大片免费播放器图片 | 国产精品无码永久免费888 | 国产综合久久久久鬼色 | 中文字幕无码av波多野吉衣 | 全黄性性激高免费视频 | 国产精品视频免费播放 | 波多野结衣高清一区二区三区 | 久久精品中文字幕大胸 | 鲁鲁鲁爽爽爽在线视频观看 | 久久亚洲国产成人精品性色 | 午夜福利不卡在线视频 | 国产色精品久久人妻 | 大肉大捧一进一出好爽视频 | 国产精品对白交换视频 | 亚洲一区二区观看播放 | 精品人妻人人做人人爽夜夜爽 | 国产成人人人97超碰超爽8 | 国产情侣作爱视频免费观看 | 国产黄在线观看免费观看不卡 | 亲嘴扒胸摸屁股激烈网站 | 国产精品久久久久久亚洲毛片 | 女高中生第一次破苞av | 国产精品美女久久久久av爽李琼 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产激情无码一区二区 | 中文字幕人妻丝袜二区 | 高中生自慰www网站 | 巨爆乳无码视频在线观看 | 人妻夜夜爽天天爽三区 | 亚洲精品综合一区二区三区在线 | 国产色视频一区二区三区 | 久久精品女人天堂av免费观看 | 国产成人精品久久亚洲高清不卡 | 亚洲阿v天堂在线 | 无码毛片视频一区二区本码 | 人妻与老人中文字幕 | 中文精品久久久久人妻不卡 | 国产精品沙发午睡系列 | 一二三四在线观看免费视频 | 蜜臀aⅴ国产精品久久久国产老师 | 日韩亚洲欧美中文高清在线 | 老熟妇仑乱视频一区二区 | 国产午夜亚洲精品不卡 | 波多野结衣乳巨码无在线观看 | 国产内射爽爽大片视频社区在线 | 强辱丰满人妻hd中文字幕 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 在线欧美精品一区二区三区 | 久久久久成人片免费观看蜜芽 | 亚洲成熟女人毛毛耸耸多 | 激情亚洲一区国产精品 | 欧美精品免费观看二区 | 乌克兰少妇性做爰 | 东京热无码av男人的天堂 | 欧美xxxx黑人又粗又长 | 亚洲小说图区综合在线 | 人人妻人人澡人人爽欧美精品 | 色一情一乱一伦一区二区三欧美 | 青春草在线视频免费观看 | 真人与拘做受免费视频一 | 荫蒂被男人添的好舒服爽免费视频 | 又紧又大又爽精品一区二区 | 一本久久a久久精品vr综合 | 性生交大片免费看女人按摩摩 | 日本肉体xxxx裸交 | 亚洲精品综合五月久久小说 | 国产免费观看黄av片 | 两性色午夜视频免费播放 | 国产深夜福利视频在线 | 亚洲熟悉妇女xxx妇女av | av无码久久久久不卡免费网站 | 国产亚洲精品久久久久久久 | 亚洲自偷精品视频自拍 | 亚洲色偷偷偷综合网 | 动漫av网站免费观看 | 亚洲一区二区三区 | 欧美精品无码一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 网友自拍区视频精品 | 成人精品视频一区二区 | 久久午夜无码鲁丝片 | 国产xxx69麻豆国语对白 | 午夜熟女插插xx免费视频 | 强辱丰满人妻hd中文字幕 | 国产偷国产偷精品高清尤物 | 少妇人妻偷人精品无码视频 | 中文字幕乱码人妻无码久久 | 精品亚洲韩国一区二区三区 | 中文字幕人成乱码熟女app | 强奷人妻日本中文字幕 | 国产精品人人妻人人爽 | 亚洲伊人久久精品影院 | 日日摸天天摸爽爽狠狠97 | 亚洲高清偷拍一区二区三区 | 国产麻豆精品一区二区三区v视界 | 又紧又大又爽精品一区二区 | 日本一区二区三区免费播放 | 一区二区传媒有限公司 | 日韩精品乱码av一区二区 | 国产欧美熟妇另类久久久 | 97夜夜澡人人双人人人喊 | 久久成人a毛片免费观看网站 | 亚洲日韩一区二区三区 | 国产成人无码专区 | 露脸叫床粗话东北少妇 | 久久国产精品精品国产色婷婷 | 天天拍夜夜添久久精品 | 日韩人妻无码一区二区三区久久99 | 无码人妻丰满熟妇区毛片18 | 午夜性刺激在线视频免费 | 熟妇人妻中文av无码 | 青青青手机频在线观看 | 老熟女乱子伦 | 久久精品国产日本波多野结衣 | 狂野欧美性猛交免费视频 | 中文无码伦av中文字幕 | 丰满人妻翻云覆雨呻吟视频 | 欧美日韩综合一区二区三区 | 亚洲中文字幕在线无码一区二区 | 青青青爽视频在线观看 | 中文字幕人妻丝袜二区 | 精品人妻人人做人人爽 | 无码福利日韩神码福利片 | 97色伦图片97综合影院 | 成 人 网 站国产免费观看 | 精品一二三区久久aaa片 | 女人被男人躁得好爽免费视频 | 日韩成人一区二区三区在线观看 | 少妇无码吹潮 | 18黄暴禁片在线观看 | 四十如虎的丰满熟妇啪啪 | 99久久婷婷国产综合精品青草免费 | 亚洲国产精品成人久久蜜臀 | 日韩亚洲欧美中文高清在线 | 国产人妻精品午夜福利免费 | 欧美熟妇另类久久久久久多毛 | 午夜精品久久久久久久 | 熟妇激情内射com | 亚洲一区二区三区国产精华液 | 国产女主播喷水视频在线观看 | 成 人 网 站国产免费观看 | 少妇被黑人到高潮喷出白浆 | 亚洲 欧美 激情 小说 另类 | 午夜免费福利小电影 | 国产精品美女久久久久av爽李琼 | 久久午夜无码鲁丝片午夜精品 | 国产精品第一国产精品 | 日产精品高潮呻吟av久久 | 亚洲综合伊人久久大杳蕉 | 成人无码精品1区2区3区免费看 | 爽爽影院免费观看 | 国内揄拍国内精品少妇国语 | 久久午夜无码鲁丝片午夜精品 | 精品夜夜澡人妻无码av蜜桃 | 99久久精品无码一区二区毛片 | 性欧美熟妇videofreesex | 国产在线精品一区二区三区直播 | 精品久久久久久人妻无码中文字幕 | 亚洲国产精品毛片av不卡在线 | 狂野欧美激情性xxxx | 少妇无码av无码专区在线观看 | 男人的天堂2018无码 | 特黄特色大片免费播放器图片 | 日韩 欧美 动漫 国产 制服 | 成人免费视频一区二区 | 国产在线一区二区三区四区五区 | 人妻少妇精品视频专区 | 国产精品无码永久免费888 | 国产精品无码mv在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产人妻精品午夜福利免费 | 国产色xx群视频射精 | 亚洲精品中文字幕乱码 | 天海翼激烈高潮到腰振不止 | 亚洲精品美女久久久久久久 | 成 人 网 站国产免费观看 | 婷婷五月综合缴情在线视频 | yw尤物av无码国产在线观看 | 国产成人无码av片在线观看不卡 | 纯爱无遮挡h肉动漫在线播放 | 国产精品美女久久久网av | 精品国产一区二区三区av 性色 | 日本熟妇人妻xxxxx人hd | 亚洲熟妇自偷自拍另类 | 曰本女人与公拘交酡免费视频 | 国产亚洲精品久久久久久久久动漫 | 亚洲中文字幕无码一久久区 | 乌克兰少妇性做爰 | 国产乱人伦av在线无码 | 午夜福利不卡在线视频 | 成人亚洲精品久久久久软件 | 青青青手机频在线观看 | 天天拍夜夜添久久精品 | 日产精品99久久久久久 | 国产在线精品一区二区高清不卡 | 麻豆国产97在线 | 欧洲 | 亚洲区小说区激情区图片区 | 四虎影视成人永久免费观看视频 | 中文字幕无码av波多野吉衣 | 无码帝国www无码专区色综合 | 国产精品毛片一区二区 | 人人妻人人澡人人爽欧美精品 | 无码av中文字幕免费放 | 久久这里只有精品视频9 | 亚洲狠狠婷婷综合久久 | 亚洲国产精品美女久久久久 | 熟妇人妻无乱码中文字幕 | 一个人看的www免费视频在线观看 | 蜜桃av抽搐高潮一区二区 | 亚洲精品国产品国语在线观看 | 日日摸夜夜摸狠狠摸婷婷 | 男女猛烈xx00免费视频试看 | 国内精品人妻无码久久久影院蜜桃 | 亚洲色欲色欲天天天www | 日本成熟视频免费视频 | 蜜桃视频韩日免费播放 | 亚洲国精产品一二二线 | 国产激情综合五月久久 | 国产香蕉尹人综合在线观看 | 水蜜桃色314在线观看 | 国产精品高潮呻吟av久久4虎 | 亚洲精品无码国产 | 亚洲人亚洲人成电影网站色 | 中文毛片无遮挡高清免费 | a国产一区二区免费入口 | 日本www一道久久久免费榴莲 | 99精品无人区乱码1区2区3区 | 澳门永久av免费网站 | 亚洲色www成人永久网址 | 精品国产乱码久久久久乱码 | 国产av无码专区亚洲awww | 中文字幕乱码中文乱码51精品 | 国产国产精品人在线视 | 亚洲经典千人经典日产 | 精品亚洲成av人在线观看 | 色综合久久中文娱乐网 | 亚洲爆乳精品无码一区二区三区 | 久久久精品欧美一区二区免费 | 国产三级久久久精品麻豆三级 | 国产精品久久久久久久影院 | 亚洲国产日韩a在线播放 | 国语精品一区二区三区 | 少妇厨房愉情理9仑片视频 | 国产真人无遮挡作爱免费视频 | 国产成人精品优优av | 欧美xxxxx精品 | 高中生自慰www网站 | 亚洲乱亚洲乱妇50p | 丰满妇女强制高潮18xxxx | 鲁鲁鲁爽爽爽在线视频观看 | 日本大香伊一区二区三区 | 熟女少妇人妻中文字幕 | 无码av中文字幕免费放 | 亚洲欧美国产精品专区久久 | 成人一在线视频日韩国产 | 欧美zoozzooz性欧美 | 亚洲国产精品无码一区二区三区 | 成年女人永久免费看片 | 久久亚洲中文字幕无码 | 强伦人妻一区二区三区视频18 | 精品国精品国产自在久国产87 | 国产精品资源一区二区 | 亚洲欧美色中文字幕在线 | 亚洲阿v天堂在线 | 免费无码午夜福利片69 | 国产日产欧产精品精品app | 亚洲理论电影在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲熟女一区二区三区 | 女人色极品影院 | 中文字幕日韩精品一区二区三区 | 亚洲国产综合无码一区 | 国产在线精品一区二区三区直播 | 国产成人久久精品流白浆 | 色婷婷综合中文久久一本 | 少妇被黑人到高潮喷出白浆 | 国产精品丝袜黑色高跟鞋 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产香蕉尹人综合在线观看 | 麻豆md0077饥渴少妇 | 粗大的内捧猛烈进出视频 | 无码纯肉视频在线观看 | 久久熟妇人妻午夜寂寞影院 | 在线天堂新版最新版在线8 | 国产午夜精品一区二区三区嫩草 | 51国偷自产一区二区三区 | 色 综合 欧美 亚洲 国产 | 国产精品久久久 | 天天综合网天天综合色 | 亚洲一区二区三区国产精华液 | 国产区女主播在线观看 | 人妻有码中文字幕在线 | 国产性生交xxxxx无码 | www国产亚洲精品久久久日本 | 亚洲精品午夜国产va久久成人 | 日本欧美一区二区三区乱码 | 国产色在线 | 国产 | 欧美老人巨大xxxx做受 | 中文无码伦av中文字幕 | 色综合久久久久综合一本到桃花网 | 国产婷婷色一区二区三区在线 | 中文字幕乱码亚洲无线三区 | 亚洲爆乳精品无码一区二区三区 | 成人无码视频免费播放 | 国产av久久久久精东av | 98国产精品综合一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 波多野结衣av在线观看 | 久久亚洲中文字幕无码 | 亚洲伊人久久精品影院 | 国产精品成人av在线观看 | 久久视频在线观看精品 | 久久aⅴ免费观看 | 真人与拘做受免费视频一 | 黄网在线观看免费网站 | 一本色道久久综合狠狠躁 | 精品aⅴ一区二区三区 | 国产精品丝袜黑色高跟鞋 | 久久久婷婷五月亚洲97号色 | 中文无码伦av中文字幕 | 日韩少妇白浆无码系列 | 日韩精品无码一本二本三本色 | 日本乱偷人妻中文字幕 | 国产av无码专区亚洲a∨毛片 | 精品无码一区二区三区的天堂 | 亚洲一区二区三区含羞草 | 无码人妻精品一区二区三区不卡 | 乱码午夜-极国产极内射 | aa片在线观看视频在线播放 | 黄网在线观看免费网站 | 成熟妇人a片免费看网站 | 2020久久超碰国产精品最新 | 国产精品毛多多水多 | 无码精品国产va在线观看dvd | 精品国偷自产在线 | 97资源共享在线视频 | 亚洲精品国产精品乱码视色 | 亚洲日韩av一区二区三区四区 | 丁香花在线影院观看在线播放 | 丝袜人妻一区二区三区 | 福利一区二区三区视频在线观看 | 日日夜夜撸啊撸 | 久久久久亚洲精品中文字幕 | 波多野42部无码喷潮在线 | 精品久久久久久人妻无码中文字幕 | 国产精品无码mv在线观看 | 亚洲日韩中文字幕在线播放 | 欧洲vodafone精品性 | 亚洲色大成网站www国产 | 全球成人中文在线 | 超碰97人人射妻 | 国产精品多人p群无码 | 国产麻豆精品一区二区三区v视界 | 亚洲色偷偷偷综合网 | 一本无码人妻在中文字幕免费 | 国产香蕉尹人视频在线 | 日韩精品无码免费一区二区三区 | 国产舌乚八伦偷品w中 | 国产综合色产在线精品 | 老司机亚洲精品影院无码 | 波多野结衣乳巨码无在线观看 | 亚洲精品国偷拍自产在线麻豆 | 国产精品二区一区二区aⅴ污介绍 | 国产乱人伦偷精品视频 | 老熟妇仑乱视频一区二区 | 奇米影视7777久久精品人人爽 | 男女下面进入的视频免费午夜 | 风流少妇按摩来高潮 | 人人澡人人妻人人爽人人蜜桃 | 领导边摸边吃奶边做爽在线观看 | 国产成人精品一区二区在线小狼 | 无码帝国www无码专区色综合 | 少妇性俱乐部纵欲狂欢电影 | 高清无码午夜福利视频 | 精品久久久久香蕉网 | 欧美日韩精品 | 日韩av无码一区二区三区不卡 | 大屁股大乳丰满人妻 | 日韩亚洲欧美精品综合 | 亚洲国产精品一区二区美利坚 | 国产97人人超碰caoprom | 国产香蕉尹人视频在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 男人扒开女人内裤强吻桶进去 | 精品国产青草久久久久福利 | 成人无码视频免费播放 | 欧美放荡的少妇 | 久久久久久亚洲精品a片成人 | 人妻互换免费中文字幕 | 国产99久久精品一区二区 | 无码人妻精品一区二区三区不卡 | 无码人妻黑人中文字幕 | 国产真人无遮挡作爱免费视频 | 日本一本二本三区免费 | 青青草原综合久久大伊人精品 | 中文字幕乱码人妻二区三区 | 领导边摸边吃奶边做爽在线观看 | 国产国产精品人在线视 | 国产精品人人妻人人爽 | 国产乱人伦偷精品视频 | 欧美丰满老熟妇xxxxx性 | 亚洲熟熟妇xxxx | 国内精品人妻无码久久久影院 | 强辱丰满人妻hd中文字幕 | 亚洲精品久久久久久一区二区 | 日韩视频 中文字幕 视频一区 | 亚洲国产精品成人久久蜜臀 | 日韩精品a片一区二区三区妖精 | 国产一区二区不卡老阿姨 | 狠狠色丁香久久婷婷综合五月 | 综合人妻久久一区二区精品 | 国内综合精品午夜久久资源 | 性色欲情网站iwww九文堂 | 久久无码中文字幕免费影院蜜桃 | 国产极品视觉盛宴 | 亚洲综合另类小说色区 | 免费无码av一区二区 | 77777熟女视频在线观看 а天堂中文在线官网 | 台湾无码一区二区 | 亚洲一区二区三区含羞草 | 亚洲国产av美女网站 | 无码人妻出轨黑人中文字幕 | 亚洲精品国产a久久久久久 | 欧美老熟妇乱xxxxx | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 老头边吃奶边弄进去呻吟 | 欧美人妻一区二区三区 | 无码av中文字幕免费放 | 中文字幕精品av一区二区五区 | 国产精品久久久久影院嫩草 | ass日本丰满熟妇pics | 国内丰满熟女出轨videos | 欧美 日韩 亚洲 在线 | 成人片黄网站色大片免费观看 | 欧美日韩人成综合在线播放 | 麻豆精品国产精华精华液好用吗 | 疯狂三人交性欧美 | 成人av无码一区二区三区 | 国产色在线 | 国产 | 国产人妻人伦精品1国产丝袜 | 精品无人区无码乱码毛片国产 | 思思久久99热只有频精品66 | 欧美日韩人成综合在线播放 | 国产成人精品久久亚洲高清不卡 | 性欧美videos高清精品 | 免费播放一区二区三区 | 亚洲性无码av中文字幕 | 国产电影无码午夜在线播放 | 国产亚洲美女精品久久久2020 | 久久综合香蕉国产蜜臀av | 精品无码国产自产拍在线观看蜜 | 国产色视频一区二区三区 | 国内精品人妻无码久久久影院 | 日韩人妻无码中文字幕视频 | 国产乱子伦视频在线播放 | 国产综合色产在线精品 | 99精品久久毛片a片 | 精品偷拍一区二区三区在线看 | 蜜桃视频韩日免费播放 | 国产精品无码一区二区桃花视频 | 国产成人精品一区二区在线小狼 | 国产无av码在线观看 | 国产精品va在线播放 | 欧美性色19p | 欧洲熟妇色 欧美 | 国产乱人伦av在线无码 | 亚洲人成网站色7799 | 国产suv精品一区二区五 | 久久精品无码一区二区三区 | 2019午夜福利不卡片在线 | 亚洲国产av美女网站 | 国产午夜福利100集发布 | 97久久超碰中文字幕 | 鲁大师影院在线观看 | 亚洲精品久久久久avwww潮水 | 人人爽人人爽人人片av亚洲 | 波多野结衣一区二区三区av免费 | 男女性色大片免费网站 | 亚洲国产精品毛片av不卡在线 | 麻豆精产国品 | 免费观看又污又黄的网站 | 久久综合久久自在自线精品自 | 欧美喷潮久久久xxxxx | 未满小14洗澡无码视频网站 | 97久久精品无码一区二区 | 天天摸天天碰天天添 | 国产精品人人妻人人爽 | 少妇性l交大片欧洲热妇乱xxx | 国产精品沙发午睡系列 | 乱人伦中文视频在线观看 | 国产精品久久久久9999小说 | √8天堂资源地址中文在线 | 日韩亚洲欧美精品综合 | 一二三四社区在线中文视频 | 人妻插b视频一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 成人精品一区二区三区中文字幕 | 无套内谢老熟女 | 日本大香伊一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 亚洲国产精品美女久久久久 | 亚洲日韩av一区二区三区中文 | 一区二区三区乱码在线 | 欧洲 | 国产亚洲精品久久久闺蜜 | 亚洲欧美国产精品专区久久 | 欧美性生交xxxxx久久久 | 国产精品怡红院永久免费 | 福利一区二区三区视频在线观看 | 人人澡人摸人人添 | 亚洲精品成人av在线 | 国精产品一品二品国精品69xx | 国产电影无码午夜在线播放 | 中文精品久久久久人妻不卡 | 熟女体下毛毛黑森林 | 乌克兰少妇性做爰 | 国产两女互慰高潮视频在线观看 | 久久精品国产日本波多野结衣 | 精品国产福利一区二区 | 四十如虎的丰满熟妇啪啪 | 国产高清不卡无码视频 | 性欧美熟妇videofreesex | 久久午夜无码鲁丝片午夜精品 | 性色av无码免费一区二区三区 | 中文字幕乱码人妻二区三区 | 日韩精品一区二区av在线 | 精品 日韩 国产 欧美 视频 | 野外少妇愉情中文字幕 | 四虎影视成人永久免费观看视频 | 午夜精品久久久久久久 | 内射老妇bbwx0c0ck | 国产成人无码av在线影院 | 亚洲人成影院在线无码按摩店 | 日韩精品成人一区二区三区 | 亚洲一区av无码专区在线观看 | 欧美亚洲国产一区二区三区 | 亚洲一区二区三区播放 | 性生交大片免费看女人按摩摩 | 久久国产劲爆∧v内射 | 在线观看国产一区二区三区 | 欧美放荡的少妇 | 国产熟妇高潮叫床视频播放 | 亚洲国精产品一二二线 | 亚洲色大成网站www国产 | 夜夜夜高潮夜夜爽夜夜爰爰 | 牲欲强的熟妇农村老妇女视频 | 免费看少妇作爱视频 | 精品午夜福利在线观看 | 色婷婷av一区二区三区之红樱桃 | 一本精品99久久精品77 | 亚洲精品无码人妻无码 | 欧美黑人巨大xxxxx | 久久久久亚洲精品中文字幕 | av无码不卡在线观看免费 | 中文字幕人成乱码熟女app | 狠狠色噜噜狠狠狠7777奇米 | 人妻少妇精品久久 | 亚洲成a人片在线观看无码3d | 亚洲精品国产精品乱码视色 | 欧美老妇与禽交 | 国产性生大片免费观看性 | 亚洲伊人久久精品影院 | 人人超人人超碰超国产 | 无码av最新清无码专区吞精 | 欧美激情综合亚洲一二区 | 麻豆果冻传媒2021精品传媒一区下载 | 天天爽夜夜爽夜夜爽 | 日韩人妻少妇一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 国产色在线 | 国产 | 野狼第一精品社区 | 黑人巨大精品欧美一区二区 | 在线看片无码永久免费视频 | 久久99精品久久久久婷婷 | 无码午夜成人1000部免费视频 | 久久国产自偷自偷免费一区调 | 思思久久99热只有频精品66 | 国产亚洲日韩欧美另类第八页 | 国产无遮挡又黄又爽又色 | 欧洲精品码一区二区三区免费看 | 亚洲综合另类小说色区 | 国色天香社区在线视频 | 亚洲综合另类小说色区 | 亚洲中文字幕无码一久久区 | 人妻少妇精品视频专区 | 国产99久久精品一区二区 | 国产香蕉尹人视频在线 | 东京无码熟妇人妻av在线网址 | 亚洲成av人影院在线观看 | 国产亲子乱弄免费视频 | 欧美亚洲日韩国产人成在线播放 | 国产精品爱久久久久久久 | 一本大道伊人av久久综合 | 成人片黄网站色大片免费观看 | 男人的天堂av网站 | 欧美激情一区二区三区成人 | 青草视频在线播放 | 国产精品.xx视频.xxtv | 波多野结衣一区二区三区av免费 | 国产午夜精品一区二区三区嫩草 | 亚洲精品一区二区三区婷婷月 | 久久精品中文字幕一区 | 中文亚洲成a人片在线观看 | 久久久久se色偷偷亚洲精品av | 精品久久久无码中文字幕 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产人妻久久精品二区三区老狼 | 女人和拘做爰正片视频 | 日韩精品无码一本二本三本色 | 精品人妻人人做人人爽 | 国产精品久久久久久无码 | 久久国产精品萌白酱免费 | 欧美国产亚洲日韩在线二区 | 婷婷丁香六月激情综合啪 | 99久久婷婷国产综合精品青草免费 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 波多野结衣一区二区三区av免费 | 无码任你躁久久久久久久 | 东北女人啪啪对白 | 色一情一乱一伦一视频免费看 | 夜夜高潮次次欢爽av女 | 国产女主播喷水视频在线观看 | 九月婷婷人人澡人人添人人爽 | 特黄特色大片免费播放器图片 | 国产无套粉嫩白浆在线 | 丰满少妇女裸体bbw | 奇米影视888欧美在线观看 | 中文字幕+乱码+中文字幕一区 | 成年美女黄网站色大免费视频 | 午夜熟女插插xx免费视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 漂亮人妻洗澡被公强 日日躁 | 人妻熟女一区 | 丰满少妇高潮惨叫视频 | 国产精品人人爽人人做我的可爱 | 久久精品国产日本波多野结衣 | 真人与拘做受免费视频 | 无码av最新清无码专区吞精 | 国产内射老熟女aaaa | 未满小14洗澡无码视频网站 | 国产成人综合色在线观看网站 | 中文字幕亚洲情99在线 | 精品久久久无码人妻字幂 | 少妇人妻偷人精品无码视频 | 国产午夜亚洲精品不卡 | 久久综合给合久久狠狠狠97色 | 日本护士毛茸茸高潮 | 无码人妻久久一区二区三区不卡 | 97精品国产97久久久久久免费 | 亚洲码国产精品高潮在线 | 亚欧洲精品在线视频免费观看 | 久久久久久国产精品无码下载 | 四虎影视成人永久免费观看视频 | 青草青草久热国产精品 | 在线亚洲高清揄拍自拍一品区 | √天堂中文官网8在线 | 日本高清一区免费中文视频 | 中文字幕无码热在线视频 | 嫩b人妻精品一区二区三区 | 2020久久超碰国产精品最新 | 强奷人妻日本中文字幕 | 少妇久久久久久人妻无码 | 亚洲欧洲日本综合aⅴ在线 | 狠狠色噜噜狠狠狠7777奇米 | 一本久道久久综合狠狠爱 | 熟女俱乐部五十路六十路av | 国产精品毛多多水多 | 亚洲熟妇色xxxxx欧美老妇y | 99精品无人区乱码1区2区3区 | 中文字幕无码免费久久9一区9 | 久久国产精品二国产精品 | 欧美第一黄网免费网站 | 无码人妻av免费一区二区三区 | 东北女人啪啪对白 | 午夜丰满少妇性开放视频 | 日本爽爽爽爽爽爽在线观看免 | ass日本丰满熟妇pics | 亚洲 a v无 码免 费 成 人 a v | 男女性色大片免费网站 | 国产亚洲日韩欧美另类第八页 | 无码精品国产va在线观看dvd | 亚洲欧洲中文日韩av乱码 | 国产精品亚洲综合色区韩国 | 少妇久久久久久人妻无码 | 最近免费中文字幕中文高清百度 | 精品国偷自产在线 | 欧美亚洲国产一区二区三区 | 两性色午夜视频免费播放 | 中文字幕无码av波多野吉衣 | 无码午夜成人1000部免费视频 | 成人影院yy111111在线观看 | 一二三四在线观看免费视频 | 成人免费视频视频在线观看 免费 | 精品国精品国产自在久国产87 | 国产精品国产三级国产专播 | 人人妻人人澡人人爽欧美一区九九 | 欧美丰满少妇xxxx性 | 无码精品国产va在线观看dvd | 午夜男女很黄的视频 | 国产精品亚洲一区二区三区喷水 | √天堂资源地址中文在线 | 麻豆国产丝袜白领秘书在线观看 | 国产精品亚洲а∨无码播放麻豆 | 九九在线中文字幕无码 | 亚洲成av人片天堂网无码】 | 国产精品久久久久影院嫩草 | 中文字幕无线码免费人妻 | 一本大道伊人av久久综合 | 亚洲热妇无码av在线播放 | 99久久精品无码一区二区毛片 | 少妇高潮喷潮久久久影院 | 亚洲日本在线电影 | 亚洲呦女专区 | 99国产精品白浆在线观看免费 | 国产电影无码午夜在线播放 | 中文字幕乱码人妻无码久久 | 亚洲综合伊人久久大杳蕉 | 中文精品久久久久人妻不卡 | 大地资源网第二页免费观看 | 中国大陆精品视频xxxx | yw尤物av无码国产在线观看 | 亚洲国产精品美女久久久久 | 久久综合给久久狠狠97色 | 免费男性肉肉影院 | v一区无码内射国产 | 亚洲理论电影在线观看 | 色窝窝无码一区二区三区色欲 | 乱人伦中文视频在线观看 | 国产精品欧美成人 | 俺去俺来也www色官网 | 特黄特色大片免费播放器图片 | 欧美成人高清在线播放 | 娇妻被黑人粗大高潮白浆 | 国产69精品久久久久app下载 | 久久久无码中文字幕久... | 亚洲狠狠婷婷综合久久 | 国产人妻久久精品二区三区老狼 | 国产精品久久久久久久9999 | 精品国产av色一区二区深夜久久 | 纯爱无遮挡h肉动漫在线播放 | 亚洲欧美精品伊人久久 | 中文字幕av无码一区二区三区电影 | 无码人妻出轨黑人中文字幕 | 国产精品第一区揄拍无码 | 精品亚洲韩国一区二区三区 | 狠狠色欧美亚洲狠狠色www | 久久久久成人精品免费播放动漫 | 亚洲精品一区三区三区在线观看 | 国产精品久久久久7777 | 欧美人妻一区二区三区 | www成人国产高清内射 | 无码人妻黑人中文字幕 | 国产亲子乱弄免费视频 | 999久久久国产精品消防器材 | 久久zyz资源站无码中文动漫 | 日本一卡2卡3卡四卡精品网站 | 国产无遮挡又黄又爽又色 | 纯爱无遮挡h肉动漫在线播放 | 亚洲国产成人a精品不卡在线 | 久久久精品456亚洲影院 | 亚洲欧洲中文日韩av乱码 | 99视频精品全部免费免费观看 | 天堂亚洲免费视频 | 高清不卡一区二区三区 | 一本久久a久久精品亚洲 | 国产精品国产三级国产专播 | 精品国产麻豆免费人成网站 | 日本护士xxxxhd少妇 | 久久久精品成人免费观看 | 日本va欧美va欧美va精品 | 久久亚洲中文字幕精品一区 | 麻花豆传媒剧国产免费mv在线 | 人人爽人人爽人人片av亚洲 | 国产农村乱对白刺激视频 | 久久久久久久女国产乱让韩 | 狠狠噜狠狠狠狠丁香五月 | 亚洲熟女一区二区三区 | 中文字幕无码日韩欧毛 | 亚洲精品国产精品乱码视色 | 色综合久久久无码网中文 | 亚洲国产成人av在线观看 | 亚洲精品综合一区二区三区在线 | 国精产品一区二区三区 | 国产精品久久精品三级 | 中文字幕无线码免费人妻 | 人人妻人人澡人人爽欧美一区 | 内射白嫩少妇超碰 | 理论片87福利理论电影 | 国产高潮视频在线观看 | 色五月五月丁香亚洲综合网 | 少妇被黑人到高潮喷出白浆 | 人妻少妇精品无码专区动漫 | 国产精品-区区久久久狼 | 色综合久久中文娱乐网 | 成人免费视频视频在线观看 免费 | 亚洲娇小与黑人巨大交 | 熟妇女人妻丰满少妇中文字幕 | 日本乱人伦片中文三区 | 在线精品国产一区二区三区 | 国产香蕉尹人视频在线 | 97夜夜澡人人爽人人喊中国片 | 亚洲综合精品香蕉久久网 | 久久国产精品偷任你爽任你 | 中文字幕日韩精品一区二区三区 | 精品国精品国产自在久国产87 | 久久国产精品精品国产色婷婷 | 国产网红无码精品视频 | 久久久久av无码免费网 | 国产人妻大战黑人第1集 | 四虎国产精品免费久久 | 国产综合在线观看 | 国产精品毛片一区二区 | 国产精品久久久久7777 | 久久久中文字幕日本无吗 | 麻豆av传媒蜜桃天美传媒 | 人妻插b视频一区二区三区 | 久久久久成人精品免费播放动漫 | 亚洲乱码国产乱码精品精 | 在线播放免费人成毛片乱码 | 国产欧美精品一区二区三区 | 中文精品无码中文字幕无码专区 | 东京一本一道一二三区 | 人人妻人人澡人人爽人人精品浪潮 | 黑人巨大精品欧美黑寡妇 | 日韩精品乱码av一区二区 | 男女下面进入的视频免费午夜 | 宝宝好涨水快流出来免费视频 | 性生交大片免费看女人按摩摩 | 黄网在线观看免费网站 | 久久久婷婷五月亚洲97号色 | 最新国产乱人伦偷精品免费网站 | 思思久久99热只有频精品66 | 国产亚洲精品久久久ai换 | 人人妻人人澡人人爽欧美一区 | 亚洲熟妇自偷自拍另类 | 亚洲国产欧美国产综合一区 | a国产一区二区免费入口 | 亚洲欧美色中文字幕在线 | 成人欧美一区二区三区黑人 | 娇妻被黑人粗大高潮白浆 | 少妇一晚三次一区二区三区 | 97资源共享在线视频 | 无码一区二区三区在线 | 美女极度色诱视频国产 | 97久久精品无码一区二区 | 荡女精品导航 | 亚洲乱亚洲乱妇50p | 亚洲色www成人永久网址 | 中文字幕中文有码在线 | 成年女人永久免费看片 | 精品欧洲av无码一区二区三区 | 欧美三级a做爰在线观看 | 激情综合激情五月俺也去 | 精品久久久中文字幕人妻 | 亚洲s码欧洲m码国产av | 中文精品久久久久人妻不卡 | 国产成人精品优优av | 国产女主播喷水视频在线观看 | 蜜桃视频韩日免费播放 | 一本大道久久东京热无码av | 久9re热视频这里只有精品 | 红桃av一区二区三区在线无码av | 四十如虎的丰满熟妇啪啪 | 日本高清一区免费中文视频 | 人人妻人人澡人人爽欧美一区九九 | 人人妻人人澡人人爽欧美一区九九 | 日本一卡二卡不卡视频查询 | 精品成在人线av无码免费看 | 久久精品人人做人人综合 | 牲欲强的熟妇农村老妇女 | 无码人妻精品一区二区三区下载 | 日韩人妻少妇一区二区三区 | 国产三级久久久精品麻豆三级 | 波多野结衣乳巨码无在线观看 | 国产 精品 自在自线 | 麻豆精品国产精华精华液好用吗 | 少女韩国电视剧在线观看完整 | 内射爽无广熟女亚洲 | 日韩人妻系列无码专区 | 老子影院午夜精品无码 | 中文字幕乱码亚洲无线三区 | 色婷婷欧美在线播放内射 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲午夜福利在线观看 | 免费观看又污又黄的网站 | 色综合久久88色综合天天 | 日韩少妇内射免费播放 | 纯爱无遮挡h肉动漫在线播放 | 99久久久国产精品无码免费 | 色妞www精品免费视频 | 久久久www成人免费毛片 | 狂野欧美性猛xxxx乱大交 | 日韩精品成人一区二区三区 | 色情久久久av熟女人妻网站 | 国产极品美女高潮无套在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲色偷偷偷综合网 | 国产无遮挡又黄又爽又色 | 无码一区二区三区在线 | 亚洲热妇无码av在线播放 | 国产热a欧美热a在线视频 | 日韩精品a片一区二区三区妖精 | 国产人妻精品午夜福利免费 | 日本又色又爽又黄的a片18禁 | 国产午夜手机精彩视频 | 中文字幕乱妇无码av在线 | 丁香花在线影院观看在线播放 | 亚洲精品国产a久久久久久 | 精品国产乱码久久久久乱码 | 日本xxxx色视频在线观看免费 | 国产精品爱久久久久久久 | 俺去俺来也www色官网 | 国产亚洲tv在线观看 | 无码精品国产va在线观看dvd | 狂野欧美性猛xxxx乱大交 | 国产精品.xx视频.xxtv | 最近免费中文字幕中文高清百度 | 牲欲强的熟妇农村老妇女视频 | 国产亚洲精品久久久ai换 | 精品国产精品久久一区免费式 | 国产成人av免费观看 | 亚洲欧美日韩综合久久久 | 国产精品久久久久9999小说 | 日本护士xxxxhd少妇 | 国产午夜亚洲精品不卡下载 | 十八禁视频网站在线观看 | 少妇高潮一区二区三区99 | 性做久久久久久久免费看 | 妺妺窝人体色www在线小说 | 亚洲 欧美 激情 小说 另类 | 久久午夜无码鲁丝片午夜精品 | 亚洲精品无码人妻无码 | 天堂久久天堂av色综合 | 18禁黄网站男男禁片免费观看 | 国产在线一区二区三区四区五区 | 一本色道久久综合狠狠躁 | 久久午夜无码鲁丝片午夜精品 | 成熟女人特级毛片www免费 | 性生交大片免费看l | 99久久婷婷国产综合精品青草免费 | 欧美国产日韩亚洲中文 | 亚洲午夜福利在线观看 | 奇米影视7777久久精品人人爽 | 日韩av无码一区二区三区 | 人妻插b视频一区二区三区 | 少妇人妻偷人精品无码视频 | 成人欧美一区二区三区黑人 | 又色又爽又黄的美女裸体网站 | 成人精品天堂一区二区三区 | 亚洲一区二区三区四区 | 日日天干夜夜狠狠爱 | 中文无码成人免费视频在线观看 | 精品乱子伦一区二区三区 | 疯狂三人交性欧美 | 九九热爱视频精品 | 中文字幕无码视频专区 | 国产精品久久精品三级 | 久久久久免费看成人影片 | 中文字幕av日韩精品一区二区 | 成人性做爰aaa片免费看不忠 | 久久99精品国产麻豆 | 亚洲精品中文字幕久久久久 | 久久国产36精品色熟妇 | 日韩无套无码精品 | 国产午夜视频在线观看 | 亚洲中文字幕在线无码一区二区 | 国产99久久精品一区二区 | 婷婷丁香五月天综合东京热 | 骚片av蜜桃精品一区 | 水蜜桃av无码 | 一二三四在线观看免费视频 | 在线精品亚洲一区二区 | 永久免费观看国产裸体美女 | 欧美日韩一区二区综合 | 精品国产国产综合精品 | 国产精品香蕉在线观看 | 乱人伦人妻中文字幕无码久久网 | 久久99久久99精品中文字幕 | 老头边吃奶边弄进去呻吟 | 欧美乱妇无乱码大黄a片 | 久青草影院在线观看国产 | 大地资源中文第3页 | 极品嫩模高潮叫床 | 熟女少妇在线视频播放 | 少妇无码一区二区二三区 | 国产精品亚洲综合色区韩国 | 大地资源中文第3页 | 一本久久伊人热热精品中文字幕 | 欧美怡红院免费全部视频 | 久久这里只有精品视频9 | 中文字幕人妻无码一区二区三区 | 亚洲小说春色综合另类 | 中文字幕无码乱人伦 | 亚洲精品鲁一鲁一区二区三区 | 六月丁香婷婷色狠狠久久 | 亚洲综合色区中文字幕 | 日本乱偷人妻中文字幕 | 色综合久久久久综合一本到桃花网 | 国产精品沙发午睡系列 | 99精品国产综合久久久久五月天 | www国产亚洲精品久久久日本 | 亚洲の无码国产の无码影院 | 亚洲成av人综合在线观看 | 久久久中文字幕日本无吗 | 国产精品永久免费视频 | 丰满岳乱妇在线观看中字无码 | 国产在热线精品视频 | 97精品国产97久久久久久免费 | 性欧美疯狂xxxxbbbb | 精品国产一区二区三区四区在线看 | 国产精品99久久精品爆乳 | 亚洲小说图区综合在线 | 98国产精品综合一区二区三区 | 欧美精品无码一区二区三区 | 天堂无码人妻精品一区二区三区 | 精品国产一区二区三区四区 | 中文字幕无码热在线视频 | 欧美日韩人成综合在线播放 | 55夜色66夜色国产精品视频 | 国产凸凹视频一区二区 | 亚洲人成影院在线无码按摩店 | 人人妻人人藻人人爽欧美一区 | 国产精品免费大片 | 亚洲色无码一区二区三区 | 欧美精品免费观看二区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品久久国产三级国 | 欧美日韩一区二区免费视频 | 久久久无码中文字幕久... | 精品国产一区二区三区av 性色 | 东京无码熟妇人妻av在线网址 | 美女张开腿让人桶 | 蜜桃臀无码内射一区二区三区 | 精品aⅴ一区二区三区 | 欧美老熟妇乱xxxxx | 欧美日韩视频无码一区二区三 | 日本精品久久久久中文字幕 | 无码福利日韩神码福利片 | 67194成是人免费无码 | 激情综合激情五月俺也去 | 真人与拘做受免费视频 | 永久免费观看美女裸体的网站 | 乱码午夜-极国产极内射 | 少妇人妻av毛片在线看 | 国产 浪潮av性色四虎 | 国产精品对白交换视频 | 99久久精品无码一区二区毛片 | 国产97人人超碰caoprom | 爱做久久久久久 | 国产在线aaa片一区二区99 | 国产欧美精品一区二区三区 | 女人被爽到呻吟gif动态图视看 | 精品一区二区三区无码免费视频 | 欧美怡红院免费全部视频 | 黑人巨大精品欧美一区二区 | 亚洲欧美日韩国产精品一区二区 | 国产精品.xx视频.xxtv | ass日本丰满熟妇pics | 亚洲经典千人经典日产 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲中文字幕久久无码 | 欧美丰满熟妇xxxx性ppx人交 | 少妇的肉体aa片免费 | 内射欧美老妇wbb | 日欧一片内射va在线影院 | 午夜成人1000部免费视频 | 久久婷婷五月综合色国产香蕉 | 性史性农村dvd毛片 | 欧美黑人性暴力猛交喷水 | 欧美人与动性行为视频 | 国内精品一区二区三区不卡 | 婷婷丁香六月激情综合啪 | 99久久人妻精品免费一区 | 撕开奶罩揉吮奶头视频 | 未满小14洗澡无码视频网站 | 人人妻人人藻人人爽欧美一区 | 麻豆国产人妻欲求不满谁演的 | 樱花草在线播放免费中文 | 精品亚洲韩国一区二区三区 | 国产艳妇av在线观看果冻传媒 | 最近的中文字幕在线看视频 | 中文字幕人成乱码熟女app | 欧美亚洲国产一区二区三区 | 亚洲一区二区三区在线观看网站 | 蜜桃视频韩日免费播放 | 蜜桃av抽搐高潮一区二区 | 任你躁国产自任一区二区三区 | 美女毛片一区二区三区四区 | 综合网日日天干夜夜久久 | 日本精品少妇一区二区三区 | 老司机亚洲精品影院 | 亚洲综合无码一区二区三区 | 日韩少妇内射免费播放 | 高清国产亚洲精品自在久久 | 国内综合精品午夜久久资源 | 亚洲七七久久桃花影院 | 中文字幕乱码中文乱码51精品 | 无码人妻丰满熟妇区五十路百度 | 亚洲欧美日韩国产精品一区二区 | 国产超碰人人爽人人做人人添 | 丰满肥臀大屁股熟妇激情视频 | 精品国产一区二区三区四区在线看 | 无码av最新清无码专区吞精 | 亚洲精品鲁一鲁一区二区三区 | 国产一精品一av一免费 | 亚洲人成无码网www | 久久亚洲精品中文字幕无男同 | 人妻有码中文字幕在线 | 国内精品人妻无码久久久影院 | 两性色午夜视频免费播放 | ass日本丰满熟妇pics | 婷婷丁香五月天综合东京热 | aa片在线观看视频在线播放 | 疯狂三人交性欧美 | 免费看男女做好爽好硬视频 | 无码乱肉视频免费大全合集 | 久久国产精品精品国产色婷婷 | 中文字幕乱码亚洲无线三区 | 亚洲成色www久久网站 | 色 综合 欧美 亚洲 国产 | 蜜臀aⅴ国产精品久久久国产老师 | 乌克兰少妇性做爰 | 全黄性性激高免费视频 | 东北女人啪啪对白 | 人妻少妇精品视频专区 | 亚洲毛片av日韩av无码 | 免费观看又污又黄的网站 | 中文字幕乱码人妻无码久久 | 国产综合久久久久鬼色 | 无码一区二区三区在线 | 国产超碰人人爽人人做人人添 | 97色伦图片97综合影院 | 在线天堂新版最新版在线8 | 久久亚洲国产成人精品性色 | 国产精品沙发午睡系列 | 久久亚洲精品中文字幕无男同 | 国产精品无码久久av | 无码精品人妻一区二区三区av | 亚洲人成网站色7799 | 亚洲国产午夜精品理论片 | 亚洲国产精华液网站w | 国产精品免费大片 | 国产亚洲tv在线观看 | 国产精品无码成人午夜电影 | 国产精品人人妻人人爽 | 亚洲日韩精品欧美一区二区 | 久久久久亚洲精品中文字幕 | 六十路熟妇乱子伦 | 精品成在人线av无码免费看 | 成人无码视频在线观看网站 | 一本大道久久东京热无码av | 精品 日韩 国产 欧美 视频 | 麻豆果冻传媒2021精品传媒一区下载 | 成人无码精品一区二区三区 | 樱花草在线播放免费中文 | 国产美女精品一区二区三区 | 又大又紧又粉嫩18p少妇 | 无码播放一区二区三区 | 亚洲精品久久久久久久久久久 | 亚洲国产综合无码一区 | 无码av最新清无码专区吞精 | 超碰97人人做人人爱少妇 | 2020久久香蕉国产线看观看 | 亚洲成av人在线观看网址 | 荫蒂添的好舒服视频囗交 | 国产精品久久久久9999小说 | 一个人看的视频www在线 | 永久免费观看美女裸体的网站 | 色五月五月丁香亚洲综合网 | 国产亚洲人成a在线v网站 | 精品国产青草久久久久福利 | 欧美三级a做爰在线观看 | 亚洲男人av天堂午夜在 | 国产精品久久久av久久久 | 丝袜人妻一区二区三区 | 久久精品99久久香蕉国产色戒 | 丁香花在线影院观看在线播放 | 亚洲国产精品无码久久久久高潮 | 人人妻人人澡人人爽欧美一区九九 | 国产av一区二区三区最新精品 | 久久久久久av无码免费看大片 | 狠狠躁日日躁夜夜躁2020 | 精品成在人线av无码免费看 | 亚洲成色www久久网站 | 国产亚洲美女精品久久久2020 | 久久久久人妻一区精品色欧美 | 亚洲一区二区三区国产精华液 | 国产精品人人爽人人做我的可爱 | 亚洲色在线无码国产精品不卡 | 成人亚洲精品久久久久软件 | 一本色道婷婷久久欧美 | 波多野结衣 黑人 | 亚洲阿v天堂在线 | 牲欲强的熟妇农村老妇女 | 又大又黄又粗又爽的免费视频 | 国产无av码在线观看 | 亚洲精品久久久久久久久久久 | 成年美女黄网站色大免费视频 | 中文字幕无码人妻少妇免费 | 国产激情艳情在线看视频 | 亚洲精品国产精品乱码不卡 | 青青草原综合久久大伊人精品 | 人妻尝试又大又粗久久 | a在线观看免费网站大全 | 蜜桃av抽搐高潮一区二区 | 99久久99久久免费精品蜜桃 | 国产综合久久久久鬼色 | 99久久久无码国产精品免费 | 中文字幕+乱码+中文字幕一区 | 沈阳熟女露脸对白视频 | 97资源共享在线视频 | 欧美人与禽猛交狂配 | 亚洲欧美日韩成人高清在线一区 | 久久久国产一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 日日摸夜夜摸狠狠摸婷婷 | 色 综合 欧美 亚洲 国产 | 日韩人妻无码一区二区三区久久99 |