日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 图形系统之图形缓冲区分配

發布時間:2024/4/11 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 图形系统之图形缓冲区分配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BufferQueue 是 Android 中所有圖形處理操作的核心。它的作用很簡單:將生成圖形數據緩沖區的一方(生產者)連接到接受數據以顯示或進一步處理的一方(消費者)。幾乎所有在系統中移動圖形數據緩沖區的內容都依賴于 BufferQueue。

Android 定義了一個類 BufferQueue,用于創建 BufferQueue、生產者和消費者。該類定義(位于frameworks/native/include/gui/BufferQueue.h)如下:

namespace android {class BufferQueue { public:// BufferQueue will keep track of at most this value of buffers.// Attempts at runtime to increase the number of buffers past this will fail.enum { NUM_BUFFER_SLOTS = BufferQueueDefs::NUM_BUFFER_SLOTS };// Used as a placeholder slot# when the value isn't pointing to an existing buffer.enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };// Alias to <IGraphicBufferConsumer.h> -- please scope from there in future code!enum {NO_BUFFER_AVAILABLE = IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,PRESENT_LATER = IGraphicBufferConsumer::PRESENT_LATER,};// When in async mode we reserve two slots in order to guarantee that the// producer and consumer can run asynchronously.enum { MAX_MAX_ACQUIRED_BUFFERS = NUM_BUFFER_SLOTS - 2 };// for backward source compatibilitytypedef ::android::ConsumerListener ConsumerListener;// ProxyConsumerListener is a ConsumerListener implementation that keeps a weak// reference to the actual consumer object. It forwards all calls to that// consumer object so long as it exists.//// This class exists to avoid having a circular reference between the// BufferQueue object and the consumer object. The reason this can't be a weak// reference in the BufferQueue class is because we're planning to expose the// consumer side of a BufferQueue as a binder interface, which doesn't support// weak references.class ProxyConsumerListener : public BnConsumerListener {public:ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);virtual ~ProxyConsumerListener();virtual void onFrameAvailable(const BufferItem& item) override;virtual void onFrameReplaced(const BufferItem& item) override;virtual void onBuffersReleased() override;virtual void onSidebandStreamChanged() override;virtual bool getFrameTimestamps(uint64_t frameNumber,FrameTimestamps* outTimestamps) const override;private:// mConsumerListener is a weak reference to the IConsumerListener. This is// the raison d'etre of ProxyConsumerListener.wp<ConsumerListener> mConsumerListener;};// BufferQueue manages a pool of gralloc memory slots to be used by// producers and consumers. allocator is used to allocate all the// needed gralloc buffers.static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,sp<IGraphicBufferConsumer>* outConsumer,const sp<IGraphicBufferAlloc>& allocator = NULL);private:BufferQueue(); // Create through createBufferQueue };// ---------------------------------------------------------------------------- }; // namespace android

BufferQueue 定義了一個類 ProxyConsumerListener 用于方便 ConsumerListener 的 IPC,它會把所有對它的調用,都轉發給實際的 consumer 對象。

BufferQueue 類只有一個靜態成員函數 createBufferQueue() 用于創建 BufferQueue,該函數定義(位于 frameworks/native/libs/gui/BufferQueueCore.cpp)如下:

void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,sp<IGraphicBufferConsumer>* outConsumer,const sp<IGraphicBufferAlloc>& allocator) {LOG_ALWAYS_FATAL_IF(outProducer == NULL,"BufferQueue: outProducer must not be NULL");LOG_ALWAYS_FATAL_IF(outConsumer == NULL,"BufferQueue: outConsumer must not be NULL");sp<BufferQueueCore> core(new BufferQueueCore(allocator));LOG_ALWAYS_FATAL_IF(core == NULL,"BufferQueue: failed to create BufferQueueCore");sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core));LOG_ALWAYS_FATAL_IF(producer == NULL,"BufferQueue: failed to create BufferQueueProducer");sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));LOG_ALWAYS_FATAL_IF(consumer == NULL,"BufferQueue: failed to create BufferQueueConsumer");*outProducer = producer;*outConsumer = consumer; }

createBufferQueue()函數基于 IGraphicBufferAlloc 創建 BufferQueueCore,并基于后者創建 BufferQueueProducer 和 BufferQueueConsumer 返回給調用者。Android 圖形系統的核心在 BufferQueue,BufferQueue 的核心則在 BufferQueueCore 類,而不是 BufferQueue 類。

圖形緩沖區分配器 IGraphicBufferAlloc

BufferQueueConsumer 管理的圖形緩沖區均由 BufferQueueProducer 通過 IGraphicBufferAlloc 分配。創建 BufferQueue 時,傳入的 allocator 通常為空值,此時 BufferQueueCore 通過如下方式(位于
frameworks/native/libs/gui/BufferQueueCore.cpp)獲得 IGraphicBufferAlloc:

if (allocator == NULL) {sp<ISurfaceComposer> composer(ComposerService::getComposerService());mAllocator = composer->createGraphicBufferAlloc();if (mAllocator == NULL) {BQ_LOGE("createGraphicBufferAlloc failed");}}

BufferQueueCore 的 IGraphicBufferAlloc 來自于 ComposerService。ComposerService 定義(位于frameworks/native/include/private/gui/ComposerService.h)如下:

class ComposerService : public Singleton<ComposerService> {sp<ISurfaceComposer> mComposerService;sp<IBinder::DeathRecipient> mDeathObserver;Mutex mLock;ComposerService();void connectLocked();void composerServiceDied();friend class Singleton<ComposerService>; public:// Get a connection to the Composer Service. This will block until// a connection is established.static sp<ISurfaceComposer> getComposerService(); };

ComposerService 類本身僅僅持有到 composer service,如 SurfaceFlinger 的連接,即 ISurfaceComposer。如果遠程服務掛掉了,這個類通過 Binder 的 linkToDeath 機制得到通知,并將重新建立連接。

ComposerService 類的成員函數定義(位于 frameworks/native/libs/gui/SurfaceComposerClient.cpp)如下:

ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);ComposerService::ComposerService() : Singleton<ComposerService>() {Mutex::Autolock _l(mLock);connectLocked(); }void ComposerService::connectLocked() {const String16 name("SurfaceFlinger");while (getService(name, &mComposerService) != NO_ERROR) {usleep(250000);}assert(mComposerService != NULL);// Create the death listener.class DeathObserver : public IBinder::DeathRecipient {ComposerService& mComposerService;virtual void binderDied(const wp<IBinder>& who) {ALOGW("ComposerService remote (surfaceflinger) died [%p]",who.unsafe_get());mComposerService.composerServiceDied();}public:DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }};mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); }/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {ComposerService& instance = ComposerService::getInstance();Mutex::Autolock _l(instance.mLock);if (instance.mComposerService == NULL) {ComposerService::getInstance().connectLocked();assert(instance.mComposerService != NULL);ALOGD("ComposerService reconnected");}return instance.mComposerService; }

實際的 composer service 是 SurfaceFlinger。SurfaceFlinger 中是這樣創建 IGraphicBufferAlloc 的(配置使用 HWC2 的情況,位于frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp):

sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() {sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());return gba; }

IGraphicBufferAlloc 實際為 GraphicBufferAlloc,該類定義(位于 frameworks/native/include/gui/GraphicBufferAlloc.h)如下:

namespace android { // ---------------------------------------------------------------------------class GraphicBuffer;class GraphicBufferAlloc : public BnGraphicBufferAlloc { public:GraphicBufferAlloc();virtual ~GraphicBufferAlloc();virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t width,uint32_t height, PixelFormat format, uint32_t usage,std::string requestorName, status_t* error) override; };// --------------------------------------------------------------------------- }; // namespace android

GraphicBufferAlloc 繼承自 BnGraphicBufferAlloc,后者定義(位于 frameworks/native/include/gui/IGraphicBufferAlloc.h)如下:

class IGraphicBufferAlloc : public IInterface { public:DECLARE_META_INTERFACE(GraphicBufferAlloc);/* Create a new GraphicBuffer for the client to use.*/virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h,PixelFormat format, uint32_t usage, std::string requestorName,status_t* error) = 0;sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h,PixelFormat format, uint32_t usage, status_t* error) {return createGraphicBuffer(w, h, format, usage, "<Unknown>", error);} };// ----------------------------------------------------------------------------class BnGraphicBufferAlloc : public BnInterface<IGraphicBufferAlloc> { public:virtual status_t onTransact(uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0); };// ----------------------------------------------------------------------------}; // namespace android

GraphicBufferAlloc 只有一個成員函數,該函數定義(frameworks/native/libs/gui/GraphicBufferAlloc.cpp)如下:

namespace android { // ----------------------------------------------------------------------------GraphicBufferAlloc::GraphicBufferAlloc() { }GraphicBufferAlloc::~GraphicBufferAlloc() { }sp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t width,uint32_t height, PixelFormat format, uint32_t usage,std::string requestorName, status_t* error) {sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(width, height, format, usage, std::move(requestorName)));status_t err = graphicBuffer->initCheck();*error = err;if (err != 0 || graphicBuffer->handle == 0) {if (err == NO_MEMORY) {GraphicBuffer::dumpAllocationsToSystemLog();}ALOGE("GraphicBufferAlloc::createGraphicBuffer(w=%d, h=%d) ""failed (%s), handle=%p",width, height, strerror(-err), graphicBuffer->handle);return 0;}return graphicBuffer; }// ---------------------------------------------------------------------------- }; // namespace android

BufferQueueCore 為 GraphicBuffer 的容器,IGraphicBufferAlloc 僅僅用于創建 GraphicBuffer 對象。但對于實際的圖形內存塊的管理,還不在 IGraphicBufferAlloc 這一層。

圖形緩沖區 GraphicBuffer

GraphicBuffer 類是更底層 操作系統/硬件 層圖形內存塊的封裝,該類的定義如下:

class GraphicBuffer: public ANativeObjectBase< ANativeWindowBuffer, GraphicBuffer, RefBase >,public Flattenable<GraphicBuffer> {friend class Flattenable<GraphicBuffer>; public: . . . . . .GraphicBuffer();// creates w * h bufferGraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,uint32_t inUsage, std::string requestorName = "<Unknown>");// create a buffer from an existing handleGraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,uint32_t inUsage, uint32_t inStride, native_handle_t* inHandle,bool keepOwnership);// create a buffer from an existing ANativeWindowBufferGraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership);// return statusstatus_t initCheck() const;uint32_t getWidth() const { return static_cast<uint32_t>(width); }uint32_t getHeight() const { return static_cast<uint32_t>(height); }uint32_t getStride() const { return static_cast<uint32_t>(stride); }uint32_t getUsage() const { return static_cast<uint32_t>(usage); }PixelFormat getPixelFormat() const { return format; }Rect getBounds() const { return Rect(width, height); }uint64_t getId() const { return mId; }uint32_t getGenerationNumber() const { return mGenerationNumber; }void setGenerationNumber(uint32_t generation) {mGenerationNumber = generation;}status_t reallocate(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage);bool needsReallocation(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage);status_t lock(uint32_t inUsage, void** vaddr);status_t lock(uint32_t inUsage, const Rect& rect, void** vaddr);// For HAL_PIXEL_FORMAT_YCbCr_420_888status_t lockYCbCr(uint32_t inUsage, android_ycbcr *ycbcr);status_t lockYCbCr(uint32_t inUsage, const Rect& rect,android_ycbcr *ycbcr);status_t unlock();status_t lockAsync(uint32_t inUsage, void** vaddr, int fenceFd);status_t lockAsync(uint32_t inUsage, const Rect& rect, void** vaddr,int fenceFd);status_t lockAsyncYCbCr(uint32_t inUsage, android_ycbcr *ycbcr,int fenceFd);status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,android_ycbcr *ycbcr, int fenceFd);status_t unlockAsync(int *fenceFd);ANativeWindowBuffer* getNativeBuffer() const;// for debuggingstatic void dumpAllocationsToSystemLog();// Flattenable protocolsize_t getFlattenedSize() const;size_t getFdCount() const;status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);private:~GraphicBuffer();enum {ownNone = 0,ownHandle = 1,ownData = 2,};inline const GraphicBufferMapper& getBufferMapper() const {return mBufferMapper;}inline GraphicBufferMapper& getBufferMapper() {return mBufferMapper;}uint8_t mOwner;private:friend class Surface;friend class BpSurface;friend class BnSurface;friend class LightRefBase<GraphicBuffer>;GraphicBuffer(const GraphicBuffer& rhs);GraphicBuffer& operator = (const GraphicBuffer& rhs);const GraphicBuffer& operator = (const GraphicBuffer& rhs) const;status_t initSize(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,uint32_t inUsage, std::string requestorName);void free_handle();GraphicBufferMapper& mBufferMapper;ssize_t mInitCheck;// If we're wrapping another buffer then this reference will make sure it// doesn't get freed.sp<ANativeWindowBuffer> mWrappedBuffer;uint64_t mId;// Stores the generation number of this buffer. If this number does not// match the BufferQueue's internal generation number (set through// IGBP::setGenerationNumber), attempts to attach the buffer will fail.uint32_t mGenerationNumber; };

ANativeObjectBase 模板的聲明(位于 frameworks/native/include/ui/ANativeObjectBase.h)是這樣的:

template <typename NATIVE_TYPE, typename TYPE, typename REF> class ANativeObjectBase : public NATIVE_TYPE, public REF { public:// Disambiguate between the incStrong in REF and NATIVE_TYPEvoid incStrong(const void* id) const {REF::incStrong(id);}void decStrong(const void* id) const {REF::decStrong(id);}protected:typedef ANativeObjectBase<NATIVE_TYPE, TYPE, REF> BASE;ANativeObjectBase() : NATIVE_TYPE(), REF() {NATIVE_TYPE::common.incRef = incRef;NATIVE_TYPE::common.decRef = decRef;}static inline TYPE* getSelf(NATIVE_TYPE* self) {return static_cast<TYPE*>(self);}static inline TYPE const* getSelf(NATIVE_TYPE const* self) {return static_cast<TYPE const *>(self);}static inline TYPE* getSelf(android_native_base_t* base) {return getSelf(reinterpret_cast<NATIVE_TYPE*>(base));}static inline TYPE const * getSelf(android_native_base_t const* base) {return getSelf(reinterpret_cast<NATIVE_TYPE const*>(base));}static void incRef(android_native_base_t* base) {ANativeObjectBase* self = getSelf(base);self->incStrong(self);}static void decRef(android_native_base_t* base) {ANativeObjectBase* self = getSelf(base);self->decStrong(self);} };} // namespace android #endif // __cplusplus

以此來看,GraphicBuffer 也將繼承 ANativeWindowBuffer。ANativeWindowBuffer 定義(位于 system/core/include/system/window.h)如下:

typedef const native_handle_t* buffer_handle_t; . . . . . . typedef struct ANativeWindowBuffer { #ifdef __cplusplusANativeWindowBuffer() {common.magic = ANDROID_NATIVE_BUFFER_MAGIC;common.version = sizeof(ANativeWindowBuffer);memset(common.reserved, 0, sizeof(common.reserved));}// Implement the methods that sp<ANativeWindowBuffer> expects so that it// can be used to automatically refcount ANativeWindowBuffer's.void incStrong(const void* /*id*/) const {common.incRef(const_cast<android_native_base_t*>(&common));}void decStrong(const void* /*id*/) const {common.decRef(const_cast<android_native_base_t*>(&common));} #endifstruct android_native_base_t common;int width;int height;int stride;int format;int usage;void* reserved[2];buffer_handle_t handle;void* reserved_proc[8]; } ANativeWindowBuffer_t;

這個結構體描述了更底層 操作系統/硬件 層圖形內存塊的信息,包括圖形內存塊的句柄 handle,圖像的寬度、高度,像素格式等。圖形內存塊的句柄類型 buffer_handle_t 為 const native_handle_t* 的別名,native_handle_t 定義(位于 system/core/include/cutils/native_handle.h)如下:

typedef struct native_handle {int version; /* sizeof(native_handle_t) */int numFds; /* number of file-descriptors at &data[0] */int numInts; /* number of ints at &data[numFds] */int data[0]; /* numFds + numInts ints */ } native_handle_t;

可以看到 GraphicBuffer 類的主要職責主要有三塊:
1. 主要通過繼承自 ANativeWindowBuffer 結構體的成員,來描述圖形內存塊的信息。
2. 分配釋放圖形內存塊。這主要通過 initSize() / reallocate() / free_handle() 等操作完成。
3. 分配的圖形內存塊未必已經映射到應用程序的虛擬地址空間了。應用程序要想像訪問普通內存那樣訪問圖形內存塊,還需要通過 lockXXX 操作將圖形內存塊映射到應用程序進程的虛擬地址空間內。應用程序在把圖形內存塊還回去的時候則需要 unlockXXX 操作。

此外 GraphicBuffer 的 mInitCheck 用于記錄圖形緩沖區的狀態;mGenerationNumber 用于記錄 generation number;mId 用于標識圖形緩沖區,它通過如下方式計算得到:

static uint64_t getUniqueId() {static volatile int32_t nextId = 0;uint64_t id = static_cast<uint64_t>(getpid()) << 32;id |= static_cast<uint32_t>(android_atomic_inc(&nextId));return id; }

mID 通過進程的 PID 和一個不斷遞增的整數計算獲得。

GraphicBuffer 依賴于 GraphicBufferAllocator 完成圖形內存塊的分配和釋放,依賴于 GraphicBufferMapper 執行圖形內存塊的 lock/unlock 操作。

GraphicBuffer 的圖形內存塊分配和釋放操作實現(位于 frameworks/native/libs/ui/GraphicBuffer.cpp)如下:

GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage, std::string requestorName): BASE(), mOwner(ownData), mBufferMapper(GraphicBufferMapper::get()),mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0) {width =height =stride =format =usage = 0;handle = NULL;mInitCheck = initSize(inWidth, inHeight, inFormat, inUsage,std::move(requestorName)); }GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage, uint32_t inStride,native_handle_t* inHandle, bool keepOwnership): BASE(), mOwner(keepOwnership ? ownHandle : ownNone),mBufferMapper(GraphicBufferMapper::get()),mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0) {width = static_cast<int>(inWidth);height = static_cast<int>(inHeight);stride = static_cast<int>(inStride);format = inFormat;usage = static_cast<int>(inUsage);handle = inHandle; }GraphicBuffer::GraphicBuffer(ANativeWindowBuffer* buffer, bool keepOwnership): BASE(), mOwner(keepOwnership ? ownHandle : ownNone),mBufferMapper(GraphicBufferMapper::get()),mInitCheck(NO_ERROR), mWrappedBuffer(buffer), mId(getUniqueId()),mGenerationNumber(0) {width = buffer->width;height = buffer->height;stride = buffer->stride;format = buffer->format;usage = buffer->usage;handle = buffer->handle; }GraphicBuffer::~GraphicBuffer() {if (handle) {free_handle();} }void GraphicBuffer::free_handle() {if (mOwner == ownHandle) {mBufferMapper.unregisterBuffer(handle);native_handle_close(handle);native_handle_delete(const_cast<native_handle*>(handle));} else if (mOwner == ownData) {GraphicBufferAllocator& allocator(GraphicBufferAllocator::get());allocator.free(handle);}handle = NULL;mWrappedBuffer = 0; } . . . . . . status_t GraphicBuffer::reallocate(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage) {if (mOwner != ownData)return INVALID_OPERATION;if (handle &&static_cast<int>(inWidth) == width &&static_cast<int>(inHeight) == height &&inFormat == format &&static_cast<int>(inUsage) == usage)return NO_ERROR;if (handle) {GraphicBufferAllocator& allocator(GraphicBufferAllocator::get());allocator.free(handle);handle = 0;}return initSize(inWidth, inHeight, inFormat, inUsage, "[Reallocation]"); } . . . . . . status_t GraphicBuffer::initSize(uint32_t inWidth, uint32_t inHeight,PixelFormat inFormat, uint32_t inUsage, std::string requestorName) {GraphicBufferAllocator& allocator = GraphicBufferAllocator::get();uint32_t outStride = 0;status_t err = allocator.allocate(inWidth, inHeight, inFormat, inUsage,&handle, &outStride, mId, std::move(requestorName));if (err == NO_ERROR) {width = static_cast<int>(inWidth);height = static_cast<int>(inHeight);format = inFormat;usage = static_cast<int>(inUsage);stride = static_cast<int>(outStride);}return err; }

GraphicBuffer 的圖形內存塊的 lock/unlock 操作實現(位于 frameworks/native/libs/ui/GraphicBuffer.cpp)如下:

status_t GraphicBuffer::lock(uint32_t inUsage, void** vaddr) {const Rect lockBounds(width, height);status_t res = lock(inUsage, lockBounds, vaddr);return res; }status_t GraphicBuffer::lock(uint32_t inUsage, const Rect& rect, void** vaddr) {if (rect.left < 0 || rect.right > width ||rect.top < 0 || rect.bottom > height) {ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",rect.left, rect.top, rect.right, rect.bottom,width, height);return BAD_VALUE;}status_t res = getBufferMapper().lock(handle, inUsage, rect, vaddr);return res; }status_t GraphicBuffer::lockYCbCr(uint32_t inUsage, android_ycbcr* ycbcr) {const Rect lockBounds(width, height);status_t res = lockYCbCr(inUsage, lockBounds, ycbcr);return res; }status_t GraphicBuffer::lockYCbCr(uint32_t inUsage, const Rect& rect,android_ycbcr* ycbcr) {if (rect.left < 0 || rect.right > width ||rect.top < 0 || rect.bottom > height) {ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",rect.left, rect.top, rect.right, rect.bottom,width, height);return BAD_VALUE;}status_t res = getBufferMapper().lockYCbCr(handle, inUsage, rect, ycbcr);return res; }status_t GraphicBuffer::unlock() {status_t res = getBufferMapper().unlock(handle);return res; }status_t GraphicBuffer::lockAsync(uint32_t inUsage, void** vaddr, int fenceFd) {const Rect lockBounds(width, height);status_t res = lockAsync(inUsage, lockBounds, vaddr, fenceFd);return res; }status_t GraphicBuffer::lockAsync(uint32_t inUsage, const Rect& rect,void** vaddr, int fenceFd) {if (rect.left < 0 || rect.right > width ||rect.top < 0 || rect.bottom > height) {ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",rect.left, rect.top, rect.right, rect.bottom,width, height);return BAD_VALUE;}status_t res = getBufferMapper().lockAsync(handle, inUsage, rect, vaddr,fenceFd);return res; }status_t GraphicBuffer::lockAsyncYCbCr(uint32_t inUsage, android_ycbcr* ycbcr,int fenceFd) {const Rect lockBounds(width, height);status_t res = lockAsyncYCbCr(inUsage, lockBounds, ycbcr, fenceFd);return res; }status_t GraphicBuffer::lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,android_ycbcr* ycbcr, int fenceFd) {if (rect.left < 0 || rect.right > width ||rect.top < 0 || rect.bottom > height) {ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",rect.left, rect.top, rect.right, rect.bottom,width, height);return BAD_VALUE;}status_t res = getBufferMapper().lockAsyncYCbCr(handle, inUsage, rect,ycbcr, fenceFd);return res; }status_t GraphicBuffer::unlockAsync(int *fenceFd) {status_t res = getBufferMapper().unlockAsync(handle, fenceFd);return res; }

這些操作基本上都是比較直接的委托。

GraphicBufferAllocator 和 GraphicBufferMapper

GraphicBufferAllocator 和 GraphicBufferMapper 則依賴于 Gralloc1::Loader 和
Gralloc1::Device 完成圖形內存的分配釋放和 lock / unlock 操作,其中 Gralloc1::Loader 用于加載 HAL 層的 gralloc 模塊并創建 Gralloc1::Device,Gralloc1::Device 則用于執行最終的圖形內存的分配釋放和 lock / unlock 操作。

GraphicBufferAllocator 類定義(位于 frameworks/native/include/ui/GraphicBufferAllocator.h)如下:

namespace android {class Gralloc1Loader; class String8;class GraphicBufferAllocator : public Singleton<GraphicBufferAllocator> { public:enum {USAGE_SW_READ_NEVER = GRALLOC1_CONSUMER_USAGE_CPU_READ_NEVER,USAGE_SW_READ_RARELY = GRALLOC1_CONSUMER_USAGE_CPU_READ,USAGE_SW_READ_OFTEN = GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN,USAGE_SW_READ_MASK = GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN,USAGE_SW_WRITE_NEVER = GRALLOC1_PRODUCER_USAGE_CPU_WRITE_NEVER,USAGE_SW_WRITE_RARELY = GRALLOC1_PRODUCER_USAGE_CPU_WRITE,USAGE_SW_WRITE_OFTEN = GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN,USAGE_SW_WRITE_MASK = GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN,USAGE_SOFTWARE_MASK = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK,USAGE_HW_TEXTURE = GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE,USAGE_HW_RENDER = GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET,USAGE_HW_2D = 0x00000400, // DeprecatedUSAGE_HW_MASK = 0x00071F00, // Deprecated};static inline GraphicBufferAllocator& get() { return getInstance(); }status_t allocate(uint32_t w, uint32_t h, PixelFormat format,uint32_t usage, buffer_handle_t* handle, uint32_t* stride,uint64_t graphicBufferId, std::string requestorName);status_t free(buffer_handle_t handle);void dump(String8& res) const;static void dumpToSystemLog();private:struct alloc_rec_t {uint32_t width;uint32_t height;uint32_t stride;PixelFormat format;uint32_t usage;size_t size;std::string requestorName;};static Mutex sLock;static KeyedVector<buffer_handle_t, alloc_rec_t> sAllocList;friend class Singleton<GraphicBufferAllocator>;GraphicBufferAllocator();~GraphicBufferAllocator();std::unique_ptr<Gralloc1::Loader> mLoader;std::unique_ptr<Gralloc1::Device> mDevice; };// --------------------------------------------------------------------------- }; // namespace android

GraphicBufferAllocator 主要定義了分配圖形內存塊的 allocate() 和釋放圖形內存塊的 free() 兩個函數,這兩個函數的實現(位于 frameworks/native/libs/ui/GraphicBufferAllocator.cpp)如下:

ANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferAllocator )Mutex GraphicBufferAllocator::sLock; KeyedVector<buffer_handle_t,GraphicBufferAllocator::alloc_rec_t> GraphicBufferAllocator::sAllocList;GraphicBufferAllocator::GraphicBufferAllocator(): mLoader(std::make_unique<Gralloc1::Loader>()),mDevice(mLoader->getDevice()) {}GraphicBufferAllocator::~GraphicBufferAllocator() {} . . . . . . status_t GraphicBufferAllocator::allocate(uint32_t width, uint32_t height,PixelFormat format, uint32_t usage, buffer_handle_t* handle,uint32_t* stride, uint64_t graphicBufferId, std::string requestorName) {ATRACE_CALL();// make sure to not allocate a N x 0 or 0 x N buffer, since this is// allowed from an API stand-point allocate a 1x1 buffer instead.if (!width || !height)width = height = 1;// Filter out any usage bits that should not be passed to the gralloc moduleusage &= GRALLOC_USAGE_ALLOC_MASK;auto descriptor = mDevice->createDescriptor();auto error = descriptor->setDimensions(width, height);if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to set dimensions to (%u, %u): %d", width, height, error);return BAD_VALUE;}error = descriptor->setFormat(static_cast<android_pixel_format_t>(format));if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to set format to %d: %d", format, error);return BAD_VALUE;}error = descriptor->setProducerUsage(static_cast<gralloc1_producer_usage_t>(usage));if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to set producer usage to %u: %d", usage, error);return BAD_VALUE;}error = descriptor->setConsumerUsage(static_cast<gralloc1_consumer_usage_t>(usage));if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to set consumer usage to %u: %d", usage, error);return BAD_VALUE;}error = mDevice->allocate(descriptor, graphicBufferId, handle);if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to allocate (%u x %u) format %d usage %u: %d",width, height, format, usage, error);return NO_MEMORY;}error = mDevice->getStride(*handle, stride);if (error != GRALLOC1_ERROR_NONE) {ALOGW("Failed to get stride from buffer: %d", error);}if (error == NO_ERROR) {Mutex::Autolock _l(sLock);KeyedVector<buffer_handle_t, alloc_rec_t>& list(sAllocList);uint32_t bpp = bytesPerPixel(format);alloc_rec_t rec;rec.width = width;rec.height = height;rec.stride = *stride;rec.format = format;rec.usage = usage;rec.size = static_cast<size_t>(height * (*stride) * bpp);rec.requestorName = std::move(requestorName);list.add(*handle, rec);}return NO_ERROR; }status_t GraphicBufferAllocator::free(buffer_handle_t handle) {ATRACE_CALL();auto error = mDevice->release(handle);if (error != GRALLOC1_ERROR_NONE) {ALOGE("Failed to free buffer: %d", error);}Mutex::Autolock _l(sLock);KeyedVector<buffer_handle_t, alloc_rec_t>& list(sAllocList);list.removeItem(handle);return NO_ERROR; }

GraphicBufferAllocator 分配圖形內存塊時,步驟如下:
1. 通過 Gralloc1::Device 創建 Gralloc1::Descriptor,并為其設置要分配的圖形內存塊的規格,包括圖像的長和寬,圖像的像素格式,圖形內存塊的使用場景,其中圖形內存塊的使用場景參數主要用于性能優化。
2. 以 Gralloc1::Descriptor、圖形內存塊的標識 ID,和圖形內存塊句柄的指針作為參數,通過 Gralloc1::Device 的 allocate() 分配圖形內存塊,分配的結果通過圖形內存塊句柄的指針返回。
3. 分配完成之后,可以通過Gralloc1::Device 圖形內存塊的步進,即單行像素數據占用的內存字節數。底層可能為了性能優化,內存對齊等,分配的內存塊可能大于保存實際圖像所需要的大小。
4. 對分配結果做記錄。GraphicBufferAllocator 維護一個圖形內存塊句柄到圖形內存塊規格的映射。

GraphicBufferAllocator 釋放圖形內存塊時的步驟則基本相反:
1. 通過 Gralloc1::Device 釋放圖形內存塊句柄。
2. 移除分配記錄。

GraphicBufferMapper 類提供了對圖形內存塊的 lock / unlock 操作。該類定義(位于 frameworks/native/include/ui/GraphicBufferMapper.h)如下:

class GraphicBufferMapper : public Singleton<GraphicBufferMapper> { public:static inline GraphicBufferMapper& get() { return getInstance(); }status_t registerBuffer(buffer_handle_t handle);status_t registerBuffer(const GraphicBuffer* buffer);status_t unregisterBuffer(buffer_handle_t handle);status_t lock(buffer_handle_t handle,uint32_t usage, const Rect& bounds, void** vaddr);status_t lockYCbCr(buffer_handle_t handle,uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr);status_t unlock(buffer_handle_t handle);status_t lockAsync(buffer_handle_t handle,uint32_t usage, const Rect& bounds, void** vaddr, int fenceFd);status_t lockAsyncYCbCr(buffer_handle_t handle,uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr,int fenceFd);status_t unlockAsync(buffer_handle_t handle, int *fenceFd);private:friend class Singleton<GraphicBufferMapper>;GraphicBufferMapper();std::unique_ptr<Gralloc1::Loader> mLoader;std::unique_ptr<Gralloc1::Device> mDevice; };

GraphicBufferMapper 通過 Gralloc1::Device 提供對圖形內存塊的 lock / unlock 操作,這些操作的定義(位于 frameworks/native/libs/ui/GraphicBufferMapper.cpp)如下:

ANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferMapper )GraphicBufferMapper::GraphicBufferMapper(): mLoader(std::make_unique<Gralloc1::Loader>()),mDevice(mLoader->getDevice()) {}status_t GraphicBufferMapper::registerBuffer(buffer_handle_t handle) {ATRACE_CALL();gralloc1_error_t error = mDevice->retain(handle);ALOGW_IF(error != GRALLOC1_ERROR_NONE, "registerBuffer(%p) failed: %d",handle, error);return error; }status_t GraphicBufferMapper::registerBuffer(const GraphicBuffer* buffer) {ATRACE_CALL();gralloc1_error_t error = mDevice->retain(buffer);ALOGW_IF(error != GRALLOC1_ERROR_NONE, "registerBuffer(%p) failed: %d",buffer->getNativeBuffer()->handle, error);return error; }status_t GraphicBufferMapper::unregisterBuffer(buffer_handle_t handle) {ATRACE_CALL();gralloc1_error_t error = mDevice->release(handle);ALOGW_IF(error != GRALLOC1_ERROR_NONE, "unregisterBuffer(%p): failed %d",handle, error);return error; }static inline gralloc1_rect_t asGralloc1Rect(const Rect& rect) {gralloc1_rect_t outRect{};outRect.left = rect.left;outRect.top = rect.top;outRect.width = rect.width();outRect.height = rect.height();return outRect; }status_t GraphicBufferMapper::lock(buffer_handle_t handle, uint32_t usage,const Rect& bounds, void** vaddr) {return lockAsync(handle, usage, bounds, vaddr, -1); }status_t GraphicBufferMapper::lockYCbCr(buffer_handle_t handle, uint32_t usage,const Rect& bounds, android_ycbcr *ycbcr) {return lockAsyncYCbCr(handle, usage, bounds, ycbcr, -1); }status_t GraphicBufferMapper::unlock(buffer_handle_t handle) {int32_t fenceFd = -1;status_t error = unlockAsync(handle, &fenceFd);if (error == NO_ERROR) {sync_wait(fenceFd, -1);close(fenceFd);}return error; }status_t GraphicBufferMapper::lockAsync(buffer_handle_t handle,uint32_t usage, const Rect& bounds, void** vaddr, int fenceFd) {ATRACE_CALL();gralloc1_rect_t accessRegion = asGralloc1Rect(bounds);sp<Fence> fence = new Fence(fenceFd);gralloc1_error_t error = mDevice->lock(handle,static_cast<gralloc1_producer_usage_t>(usage),static_cast<gralloc1_consumer_usage_t>(usage),&accessRegion, vaddr, fence);ALOGW_IF(error != GRALLOC1_ERROR_NONE, "lock(%p, ...) failed: %d", handle,error);return error; }static inline bool isValidYCbCrPlane(const android_flex_plane_t& plane) {if (plane.bits_per_component != 8) {ALOGV("Invalid number of bits per component: %d",plane.bits_per_component);return false;}if (plane.bits_used != 8) {ALOGV("Invalid number of bits used: %d", plane.bits_used);return false;}bool hasValidIncrement = plane.h_increment == 1 ||(plane.component != FLEX_COMPONENT_Y && plane.h_increment == 2);hasValidIncrement = hasValidIncrement && plane.v_increment > 0;if (!hasValidIncrement) {ALOGV("Invalid increment: h %d v %d", plane.h_increment,plane.v_increment);return false;}return true; }status_t GraphicBufferMapper::lockAsyncYCbCr(buffer_handle_t handle,uint32_t usage, const Rect& bounds, android_ycbcr *ycbcr, int fenceFd) {ATRACE_CALL();gralloc1_rect_t accessRegion = asGralloc1Rect(bounds);sp<Fence> fence = new Fence(fenceFd);if (mDevice->hasCapability(GRALLOC1_CAPABILITY_ON_ADAPTER)) {gralloc1_error_t error = mDevice->lockYCbCr(handle,static_cast<gralloc1_producer_usage_t>(usage),static_cast<gralloc1_consumer_usage_t>(usage),&accessRegion, ycbcr, fence);ALOGW_IF(error != GRALLOC1_ERROR_NONE, "lockYCbCr(%p, ...) failed: %d",handle, error);return error;}uint32_t numPlanes = 0;gralloc1_error_t error = mDevice->getNumFlexPlanes(handle, &numPlanes);if (error != GRALLOC1_ERROR_NONE) {ALOGV("Failed to retrieve number of flex planes: %d", error);return error;}if (numPlanes < 3) {ALOGV("Not enough planes for YCbCr (%u found)", numPlanes);return GRALLOC1_ERROR_UNSUPPORTED;}std::vector<android_flex_plane_t> planes(numPlanes);android_flex_layout_t flexLayout{};flexLayout.num_planes = numPlanes;flexLayout.planes = planes.data();error = mDevice->lockFlex(handle,static_cast<gralloc1_producer_usage_t>(usage),static_cast<gralloc1_consumer_usage_t>(usage),&accessRegion, &flexLayout, fence);if (error != GRALLOC1_ERROR_NONE) {ALOGW("lockFlex(%p, ...) failed: %d", handle, error);return error;}if (flexLayout.format != FLEX_FORMAT_YCbCr) {ALOGV("Unable to convert flex-format buffer to YCbCr");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}// Find planesauto yPlane = planes.cend();auto cbPlane = planes.cend();auto crPlane = planes.cend();for (auto planeIter = planes.cbegin(); planeIter != planes.cend();++planeIter) {if (planeIter->component == FLEX_COMPONENT_Y) {yPlane = planeIter;} else if (planeIter->component == FLEX_COMPONENT_Cb) {cbPlane = planeIter;} else if (planeIter->component == FLEX_COMPONENT_Cr) {crPlane = planeIter;}}if (yPlane == planes.cend()) {ALOGV("Unable to find Y plane");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (cbPlane == planes.cend()) {ALOGV("Unable to find Cb plane");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (crPlane == planes.cend()) {ALOGV("Unable to find Cr plane");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}// Validate planesif (!isValidYCbCrPlane(*yPlane)) {ALOGV("Y plane is invalid");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (!isValidYCbCrPlane(*cbPlane)) {ALOGV("Cb plane is invalid");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (!isValidYCbCrPlane(*crPlane)) {ALOGV("Cr plane is invalid");unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (cbPlane->v_increment != crPlane->v_increment) {ALOGV("Cb and Cr planes have different step (%d vs. %d)",cbPlane->v_increment, crPlane->v_increment);unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}if (cbPlane->h_increment != crPlane->h_increment) {ALOGV("Cb and Cr planes have different stride (%d vs. %d)",cbPlane->h_increment, crPlane->h_increment);unlock(handle);return GRALLOC1_ERROR_UNSUPPORTED;}// Pack plane data into android_ycbcr structycbcr->y = yPlane->top_left;ycbcr->cb = cbPlane->top_left;ycbcr->cr = crPlane->top_left;ycbcr->ystride = static_cast<size_t>(yPlane->v_increment);ycbcr->cstride = static_cast<size_t>(cbPlane->v_increment);ycbcr->chroma_step = static_cast<size_t>(cbPlane->h_increment);return error; }status_t GraphicBufferMapper::unlockAsync(buffer_handle_t handle, int *fenceFd) {ATRACE_CALL();sp<Fence> fence = Fence::NO_FENCE;gralloc1_error_t error = mDevice->unlock(handle, &fence);if (error != GRALLOC1_ERROR_NONE) {ALOGE("unlock(%p) failed: %d", handle, error);return error;}*fenceFd = fence->dup();return error; }

lock 時,需要以 Rect 的形式給 GraphicBufferMapper 傳入 lock 的區域,這個區域會被做一個轉換。GraphicBufferMapper 通過 Gralloc1::Device 執行 lock 操作。并將 lock 的結果,也就是映射到應用程序進程的虛擬地址空間的圖形內存塊的地址通過傳入的 vaddr 返回給調用者。

像素數據格式有 RGB 和 YUV 之分,在 lock YUV 圖形內存塊時,如果設備支持 GRALLOC1_CAPABILITY_ON_ADAPTER,會直接通過 Gralloc1::Device 完成操作;否則,通過 Gralloc1::Device 的 lockFlex() 完成操作。

這里的 fence 是什么,用來做什么的?

Done.

Android OpenGL 圖形系統分析系列文章

在 Android 中使用 OpenGL
Android 圖形驅動初始化
EGL Context 創建
Android 圖形系統之圖形緩沖區分配
Android 圖形系統之gralloc

總結

以上是生活随笔為你收集整理的Android 图形系统之图形缓冲区分配的全部內容,希望文章能夠幫你解決所遇到的問題。

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

正在播放国产一区二区 | 青青草国产精品 | 91漂亮少妇露脸在线播放 | 成人在线免费av | av解说在线 | 99在线热播精品免费99热 | 91视频在线国产 | 天天超碰| 最近中文字幕mv免费高清在线 | 四虎在线免费观看视频 | 狠狠操91| 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 亚洲视频中文 | 久久久久久久久久久久影院 | 免费国产一区二区视频 | 人人插人人草 | 99精品免费久久久久久久久日本 | 在线观看免费av网站 | 亚洲成人影音 | 成年人在线免费看片 | 成人av影视观看 | a级片久久久 | 福利视频网址 | 久久激情视频网 | 免费视频xnxx com | 国产视频精品视频 | 97精品视频在线播放 | 免费在线电影网址大全 | 国产精品久久久久久吹潮天美传媒 | 欧美黑人猛交 | 天堂在线一区二区三区 | 精品99在线观看 | 五月花激情| 香蕉影院在线 | 国产视频二区三区 | 午夜狠狠操 | 人人添人人澡人人澡人人人爽 | 亚洲成年人av | 在线免费成人 | 国产高清av免费在线观看 | 欧美精品久久久久性色 | 狠狠狠干| 国产va在线 | 久久久久免费精品视频 | 国产精品第10页 | 一区二区久久久久 | 天天综合精品 | 美女网站一区 | 国内精品久久久久久 | 91丨九色丨国产丨porny精品 | 久久久久久久久久久久影院 | 亚洲黄网站 | 国产成人a亚洲精品 | 久久人人爽人人爽人人片av免费 | 麻豆视频国产 | 日本午夜免费福利视频 | 人人爽人人爽人人片av免 | 久久精品中文字幕 | 在线一区二区三区 | 香蕉视频免费看 | 中文字幕在线视频一区 | 国产精品观看 | 97国产在线观看 | 黄色在线视频网址 | 狠狠的操狠狠的干 | 麻豆影视在线免费观看 | 青青草国产精品 | 在线观看免费版高清版 | 男女精品久久 | 日韩视频在线观看视频 | av韩国在线 | 午夜美女wwww | 日本性xxxxx| 91看毛片 | 国产美腿白丝袜足在线av | 国产91影视 | 人人爽人人干 | 欧美在线视频日韩 | 色九九视频 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 天天干天天摸天天操 | 色久网 | 天天色天天爱天天射综合 | 性色av免费观看 | 五月婷网站 | 91在线视频免费播放 | 少妇高潮冒白浆 | 午夜精品成人一区二区三区 | 青草视频在线播放 | 国产不卡在线播放 | 福利视频导航网址 | 久久视频在线观看中文字幕 | 99久久久久久久久久 | 99视频在线精品免费观看2 | 亚洲天堂激情 | 久久精品国产免费看久久精品 | 免费av片在线 | 久久中文字幕在线视频 | 国产青草视频在线观看 | 日韩成人精品一区二区三区 | 激情 婷婷 | 国产97色| 很污的网站 | 久久精品久久99精品久久 | 亚洲精品色婷婷 | 国产在线观看污片 | 国产精品久久久久久久久免费看 | 亚洲精品视频第一页 | 日日爱影视 | 91免费看片黄 | 美女黄频免费 | 欧美午夜激情网 | 性日韩欧美在线视频 | 久久视频在线观看免费 | 欧美a在线看 | 亚洲精品成人在线 | 日韩大片在线 | 狠狠狠狠狠色综合 | 国产精品视频线看 | 欧美一级片在线 | 色香蕉在线 | 久色伊人| av大全在线看 | 国产精品久久久久久一区二区三区 | 国产高清视频免费在线观看 | 91桃色在线观看视频 | 日韩av网页 | 在线观看自拍 | 最新av网址在线观看 | 日韩高清在线观看 | 久久人人爽人人片 | 日日干夜夜操视频 | 99热国产在线观看 | 久久爱影视i| 天堂av在线网 | 亚洲精品中文字幕在线 | 日日干干夜夜 | 深爱开心激情 | 亚洲成人国产精品 | 99精品国产一区二区三区麻豆 | 91视视频在线直接观看在线看网页在线看 | 国产视频黄 | 亚洲黄色片一级 | 又爽又黄在线观看 | 午夜精品一区二区三区免费视频 | 国产精品av在线免费观看 | 91av视频| 日韩字幕在线 | 国产黄色精品在线 | 亚洲尺码电影av久久 | 国产欧美精品一区二区三区 | 国产精品密入口果冻 | 亚州av网站大全 | 国产成人精品一区一区一区 | 超碰在线97国产 | 黄色av电影在线观看 | 一级黄色在线免费观看 | 欧美一级免费片 | 久久国产成人午夜av影院潦草 | 日韩乱理| 成全在线视频免费观看 | 操天天操 | 不卡的av在线 | 91av在线国产| 国产一区二区三区在线 | www.伊人网 | 久久久久久麻豆 | 不卡的av在线播放 | 国产精品亚洲综合久久 | 久久久久久免费视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久久久久久久久网站 | 欧美久久电影 | 麻豆传媒视频在线免费观看 | 国产一区福利在线 | 麻豆传媒视频在线播放 | 亚洲精品一区二区三区在线观看 | 500部大龄熟乱视频使用方法 | 亚洲欧美观看 | 99精品国产视频 | 日韩精品在线播放 | 国产 精品 资源 | 亚洲精品黄 | 婷色| 香蕉视频在线视频 | 日韩欧美aaa | 亚洲在线视频网站 | 欧美 亚洲 另类 激情 另类 | 国产一区精品在线 | 玖玖爱免费视频 | 狠狠做深爱婷婷综合一区 | 操碰av| 成人精品久久久 | 精品久久久影院 | 久草男人天堂 | 亚洲激情一区二区三区 | 91在线操 | 深夜免费小视频 | 西西4444www大胆视频 | 久久免费的视频 | 日韩va欧美va亚洲va久久 | 黄网av在线 | 中文字幕免费高 | 国产资源av | 国产精品亚洲精品 | 四虎成人网 | 日韩av成人在线观看 | 天天爽天天摸 | 欧美福利视频一区 | 久久一区二区三区日韩 | japanesefreesexvideo高潮 | 精品国产1区2区 | 欧美在线你懂的 | 99精品国产免费久久 | 国产三级午夜理伦三级 | 四虎欧美| 国产精品99久久免费黑人 | 久久久久久亚洲精品 | av久久在线 | 最新av网址在线 | 久久久精华网 | 天天天插 | 欧美精品久久久久久久久久久 | 天天干天天操天天拍 | 久热久草在线 | 久久久久久高潮国产精品视 | 国产免费激情久久 | 免费观看成年人视频 | 91精选在线观看 | 亚洲一区美女视频在线观看免费 | 国产成人久久精品 | 成人在线免费看视频 | 天天天干夜夜夜操 | 久久草在线精品 | 国产精品午夜免费福利视频 | 免费三级av | 日夜夜精品视频 | 久久国产精品久久w女人spa | 日日干美女 | 中文字幕久久网 | 欧美日韩另类在线观看 | 91香蕉视频好色先生 | 亚洲国产美女精品久久久久∴ | 成人免费在线播放 | 久久理伦片 | 超碰人人干人人 | 午夜精品av | 五月婷婷六月丁香在线观看 | 亚洲精品综合一二三区在线观看 | 天天爽天天射 | 99视频在线观看一区三区 | av三级av| 美女在线观看网站 | 亚洲欧洲xxxx| 波多野结衣在线观看一区二区三区 | www.com.日本一级 | 欧美一级电影免费观看 | 黄色三级网站在线观看 | 99色网站 | 激情五月综合网 | 超碰人人99 | 亚洲综合视频网 | 五月婷在线观看 | 久久九九免费视频 | 日韩视频三区 | 中文字幕在线字幕中文 | 久久久精品成人 | 午夜 免费 | 在线精品观看国产 | 久草视频在线新免费 | 中文字幕色在线视频 | 欧美精品久久久久久久亚洲调教 | 在线观看日韩国产 | 人人狠狠综合久久亚洲 | 91久久精品一区二区三区 | 亚洲综合欧美日韩狠狠色 | 国产一区二区三区四区大秀 | 日韩免费不卡av | 97精品视频在线播放 | 91麻豆精品国产91久久久久久久久 | 免费午夜视频在线观看 | 玖玖视频免费在线 | 最近日本韩国中文字幕 | 天天躁日日躁狠狠躁av麻豆 | 91精品毛片 | 久久综合狠狠综合久久综合88 | 国产不卡av在线播放 | 91cn国产在线| 久久亚洲欧美日韩精品专区 | 久久综合九九 | 久久av电影 | 久久精品日产第一区二区三区乱码 | 日韩激情精品 | 狠狠色丁香婷婷综合欧美 | 欧美日韩中文字幕视频 | 日韩av男人的天堂 | 色网址99 | 免费日韩 精品中文字幕视频在线 | 深夜免费福利视频 | 精品亚洲免费 | 免费黄a | 视频成人永久免费视频 | 97国产精品亚洲精品 | 久久狠狠一本精品综合网 | 日韩视频一 | 欧美性另类 | 国内精品久久久精品电影院 | 天天色欧美 | 日本一区二区三区免费观看 | 青草草在线视频 | 国产免费中文字幕 | 日本精a在线观看 | 欧美一级片在线 | 日本成人中文字幕在线观看 | 欧美日韩中文国产 | www.神马久久 | 中文字幕在线国产 | 亚洲视频电影在线 | 国产91影视 | 91av在线免费 | 国产精品av免费观看 | 国产资源在线视频 | 国产日产在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 91在线区 | 中文字幕欧美三区 | 久久9视频| 国内视频在线 | 91av九色 | 欧美黑人巨大xxxxx | 五月天色综合 | 国内精品久久久久影院优 | 久久久久久久久久影视 | 国产在线 一区二区三区 | 日韩午夜高清 | 久久视频网址 | 欧美成人aa | 亚洲精品在线二区 | 日韩理论 | 91视频这里只有精品 | 亚洲成人黄色 | 中文字幕av免费在线观看 | 日韩中文字幕在线 | 麻豆视频免费在线观看 | 韩国一区二区三区视频 | av色一区 | 国产婷婷视频在线 | 午夜精品久久久久久久99婷婷 | 日韩视频中文 | 人人爽人人澡 | 六月丁香社区 | 亚洲日韩中文字幕在线播放 | 国产91精品久久久久久 | 有码中文字幕在线观看 | 2021国产在线 | 天天艹日日干 | 99久久精品国产一区二区成人 | 欧美天堂久久 | 在线免费日韩 | 日韩免费视频播放 | 97av.com| 久久一区精品 | av日韩不卡| www.久久成人 | 亚洲丝袜一区 | 亚洲在线精品视频 | 日韩高清在线一区二区 | 欧美一级在线观看视频 | 九九99视频| 亚洲黄色片在线 | 国产福利资源 | 中文字幕免费高清在线观看 | 日韩色一区二区三区 | 亚洲精品国产精品国自产观看浪潮 | 日韩免 | 在线观看黄色大片 | 国产精品99蜜臀久久不卡二区 | 69视频在线 | 国产精品亚洲片在线播放 | av福利网址导航大全 | 日韩av网址在线 | 在线视频a| avav99| 色综合久久综合网 | 欧美三人交 | 日韩av成人在线观看 | 国产在线免费观看 | 色91在线视频 | 国产精品一区二区av麻豆 | 免费男女羞羞的视频网站中文字幕 | 国产又粗又猛又黄 | av在线播放免费 | 国产在线更新 | 不卡视频国产 | 日韩精品一区二区在线 | 在线免费观看黄色 | 色av色av色av| 视频一区二区免费 | 国产在线综合视频 | 免费在线观看视频a | 国产在线观看一 | 久久精品久久精品 | 天天插一插 | 日韩精品一区二区免费视频 | 欧美日韩国产精品一区 | 国产在线理论片 | 黄色的视频 | 最近中文字幕mv免费高清在线 | 日韩欧美高清视频在线观看 | 日韩精品视频免费看 | 99精品免费在线观看 | 91精品久久久久久久99蜜桃 | 五月婷婷综合激情网 | 国产在线观看xxx | 久久综合九色综合久99 | 国产精品 日韩 | 亚洲区精品| 超级碰碰碰碰 | 久久99国产精品久久99 | 国产精品理论片 | 伊人色综合久久天天网 | 国产精品久久毛片 | 免费能看的av | 97国产精品久久 | 日b视频在线观看网址 | 天天激情天天干 | 就要色综合 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 精品欧美一区二区三区久久久 | 1024手机看片国产 | 久久久高清视频 | 天天干天天操天天射 | 日韩一片| 国产亚洲精品美女久久 | 麻豆影视在线免费观看 | 久久久久成人免费 | 欧美精品亚洲二区 | 欧美成人播放 | 欧美午夜精品久久久久久孕妇 | 国产精品99久久久精品免费观看 | 亚洲精品成人av在线 | 亚洲精品乱码久久久久久蜜桃动漫 | 亚洲视频第一页 | 91丨九色丨国产在线 | 中文字幕色站 | 国产精品久久在线观看 | 国产精品久久精品国产 | 91观看视频 | 婷婷去俺也去六月色 | 国产精品九九九九九 | 手机av电影在线 | 波多野结衣一区二区 | 少妇性aaaaaaaaa视频 | 国产精品理论片在线观看 | 国产美女视频免费观看的网站 | 欧美亚洲国产精品久久高清浪潮 | 免费视频黄 | 97看片吧 | 亚洲视频免费在线看 | 狠狠操导航 | 成年人在线免费看视频 | 丁香五月网久久综合 | 天天摸天天干天天操天天射 | 麻豆国产网站 | 成人黄色片免费 | 一区二区三区在线电影 | 亚洲日b视频 | 黄色av三级在线 | 精品亚洲免费 | av在线进入| 精品主播网红福利资源观看 | 国产精品欧美久久久久无广告 | 五月天天av | 久久久久久久国产精品影院 | 欧美 国产 视频 | 日韩www在线 | 91香蕉视频 mp4 | 操处女逼 | 国产精品手机在线 | 天天操天天爱天天干 | 91精品免费 | 国产精品久久久久影院日本 | 精品久久五月天 | 91人人网 | 日本精品一区二区三区在线观看 | 96国产精品视频 | 中文字幕久久精品亚洲乱码 | 久久精品这里热有精品 | 麻豆激情电影 | 国产亚洲精品久久久久久大师 | 午夜精品婷婷 | 亚洲日韩欧美一区二区在线 | 色片网站在线观看 | 精品成人网 | 久久久国产精品人人片99精片欧美一 | 水蜜桃亚洲一二三四在线 | 一级成人免费 | 亚洲最大av网站 | 91在线免费观看国产 | 91在线视频在线观看 | 狠狠狠狠狠色综合 | 亚洲精品在线观看不卡 | 国产男女免费完整视频 | av电影在线播放 | 亚洲欧美激情插 | 中文字幕一区二区三区久久 | 黄色av网站在线观看 | 日韩欧美高清一区二区 | 国产成人一区二区三区在线观看 | 精品在线小视频 | 美女免费视频观看网站 | 激情五月视频 | 麻豆视频在线免费观看 | 日韩av一卡二卡三卡 | 国产亚洲在线 | 精品91视频| 人人澡人人草 | 国产在线播放不卡 | 国产精品第一页在线观看 | 国产玖玖在线 | 狠狠色丁香婷婷综合欧美 | 精品一区免费 | 日韩视频中文字幕在线观看 | 在线看av的网址 | a黄色一级| 91经典在线 | 国产精品欧美久久 | 亚洲激情婷婷 | 久精品视频免费观看2 | 色婷婷综合久色 | 国产高清视频免费在线观看 | 日韩一区二区免费在线观看 | 婷婷综合电影 | 欧美日本在线视频 | 国产特级毛片aaaaaa毛片 | 国产伦理剧 | 97电影院在线观看 | 久久久三级视频 | 婷婷六月丁 | 一级黄网| 成人激情开心网 | 精品xxx | 亚洲 欧美 另类人妖 | 国产精品 日韩精品 | 国产精品美 | 久久精品久久精品久久39 | 超碰人人草 | 五月天婷亚洲天综合网鲁鲁鲁 | 天天操综合网 | 国产精品美乳一区二区免费 | 精品国产91亚洲一区二区三区www | 日韩免费视频线观看 | 久久电影日韩 | 干天天 | 午夜av在线电影 | 中文字幕在线播放第一页 | 高潮毛片无遮挡高清免费 | 欧美日韩免费视频 | 久久午夜色播影院免费高清 | 美女福利视频一区二区 | 在线观看视频色 | 久草.com| 午夜精品久久久久久99热明星 | 亚洲一区二区三区毛片 | 黄色小说视频在线 | 日本精品视频在线观看 | 精品久久久久一区二区国产 | 免费久久视频 | 国产一区在线免费观看 | 黄色avwww| 在线观看日韩中文字幕 | 亚洲成人国产 | 免费视频久久久久 | 国产区精品在线观看 | 一区二区视频在线观看免费 | av电影免费观看 | 色婷婷av国产精品 | 人人躁| 91 在线视频播放 | 久久高清av | 免费观看日韩 | 日韩在线观看一区二区 | 亚洲专区免费观看 | 国产成人av免费在线观看 | 亚洲人成在线观看 | 日韩欧美精品一区二区 | 欧美人人爱 | 亚洲国产精品成人va在线观看 | 成人9ⅰ免费影视网站 | 日韩伦理片一区二区三区 | 亚洲专区免费观看 | 亚洲人成人在线 | 欧美精品在线观看一区 | 99久热精品 | 99久久99久久综合 | 99在线视频网站 | 欧美精品久久久久久久久久白贞 | 日本在线观看中文字幕无线观看 | 91九色在线视频 | 免费观看黄色av | 97在线播放视频 | 一本一本久久a久久 | 欧美日韩中文在线视频 | 九九久久精品 | 国产一区二区午夜 | 国产精品久久久视频 | 在线观看完整版免费 | 91av视频在线观看 | 免费性网站 | 97在线看| 黄色免费观看 | 亚洲不卡在线 | 最近免费观看的电影完整版 | 国产人免费人成免费视频 | 天天操天天干天天爽 | 17婷婷久久www | 天天射夜夜爽 | 久久免费播放 | 91成人精品视频 | 欧美成人影音 | 97国产在线播放 | 亚洲欧美视频在线播放 | 狠狠干2018| 天堂资源在线观看视频 | 九九精品视频在线观看 | 久久视频在线视频 | 99在线视频免费观看 | av 一区 二区 久久 | av永久网址 | 国产精品理论在线观看 | 亚洲做受高潮欧美裸体 | 欧美性天天 | 天天爽夜夜爽精品视频婷婷 | 日韩精品一区二区三区免费视频观看 | 狠狠操天天操 | 97视频免费观看 | 2021国产精品视频 | 日日干视频 | 成人精品国产免费网站 | 黄色av免费看 | 亚洲天堂在线观看完整版 | 亚洲免费在线视频 | 欧美婷婷色| 国产精品免费麻豆入口 | 亚洲精品一区二区三区四区高清 | 欧美在线91 | 韩国三级av在线 | 97国产精品亚洲精品 | av日韩中文 | 日韩综合视频在线观看 | 伊人亚洲综合网 | 久草免费色站 | 一区二区激情视频 | japanesexxxhd奶水| 五月天丁香综合 | 六月丁香婷婷久久 | 蜜臀久久99精品久久久无需会员 | 亚洲成年片 | 精品国产一区二区三区四区在线观看 | 成人免费在线观看av | 中文字幕91在线 | 一区免费观看 | 亚洲国产剧情av | 久久精品屋| 黄色国产高清 | 国产一级在线观看 | 99视频免费 | 日韩在线观看你懂的 | 91激情视频在线 | 999久久精品| 国产成人免费在线 | 97精品国产91久久久久久 | 久久婷婷网 | 在线视频a | 亚洲精品ww | 麻豆免费在线播放 | av免费看看 | 黄色avwww| 国产二级视频 | 国产美女视频免费观看的网站 | 在线免费色视频 | 香蕉久久久久久久 | 91精品办公室少妇高潮对白 | 久久免费在线观看 | 97色婷婷成人综合在线观看 | 久久久免费观看完整版 | 天天操夜夜摸 | 久久亚洲影院 | 免费韩国av | 亚洲一区二区三区四区在线视频 | 国内丰满少妇猛烈精品播 | 国产第一页福利影院 | 日韩视频专区 | 五月婷婷精品 | 超碰av在线播放 | 99久久精品免费看国产四区 | 国产一区成人在线 | 丁香午夜婷婷 | 午夜视频在线观看欧美 | 热久久免费视频精品 | 久久久久国产精品一区 | 日本视频高清 | 免费视频久久久久 | 日韩高清dvd | 日韩在线 一区二区 | 欧美激情奇米色 | 91成人免费在线 | 国产免费一区二区三区最新 | 天天干天天操av | 九九免费观看全部免费视频 | 精品一二区 | h视频在线看 | 国产精品午夜久久 | 碰超在线| 91试看 | 国产午夜三级一区二区三桃花影视 | 免费97视频 | 九九久久电影 | 久久久精品小视频 | 伊人手机在线 | 91在线免费视频观看 | 美女网站色 | 国产一线二线三线性视频 | 国产亲近乱来精品 | 99在线观看视频网站 | 操操操影院 | 色综合天天在线 | 午夜影院日本 | 国产精品va| 奇米先锋 | 免费a现在观看 | 久久国产露脸精品国产 | 黄色亚洲 | 中文字幕av免费观看 | 91视频免费| 成人黄色毛片视频 | 国产精品日韩在线播放 | 日本性动态图 | 色噜噜日韩精品一区二区三区视频 | 九九久久成人 | 黄色网址国产 | www.亚洲精品 | 日韩理论| 日韩精品在线一区 | 午夜影视一区 | 婷婷久久丁香 | 久久大视频 | 国产福利精品一区二区 | 国产一区在线视频观看 | 中文字幕人成乱码在线观看 | 中文一二区 | 国产九九精品视频 | 欧美日韩性视频 | 黄色特级一级片 | 国产玖玖精品视频 | 色片网站在线观看 | 精品国产1区2区 | 69国产精品视频免费观看 | 精品久久久久久久久久 | 伊人婷婷激情 | 久久久精品亚洲 | 黄色小说免费观看 | 伊人在线视频 | 在线亚洲人成电影网站色www | 五月婷婷中文 | 久久久精品一区二区三区 | av亚洲产国偷v产偷v自拍小说 | 久操中文字幕在线观看 | 国产白浆在线观看 | 高清在线观看av | 月下香电影 | 色射色| 久久精品最新 | 亚洲不卡123 | 国产一卡在线 | 超碰国产在线观看 | 在线 你懂| 久久人人干| 狠狠夜夜 | 丁香网五月天 | 欧美亚洲国产日韩 | 最近中文字幕免费视频 | 在线观看国产成人av片 | 草久久久| 九九九九九九精品 | 国产麻豆剧传媒免费观看 | 日本一区二区不卡高清 | 久久精品波多野结衣 | 亚洲精品女人久久久 | 亚洲欧美激情精品一区二区 | av色影院| 成人蜜桃视频 | 欧美一区二区三区激情视频 | 国产精品毛片久久久久久久久久99999999 | 亚洲最新毛片 | 婷婷色综合色 | 少妇搡bbbb搡bbb搡aa | 人人干人人爽 | 开心色激情网 | 中文字幕在线看人 | 中文字幕人成一区 | 在线a视频免费观看 | 日本性xxxxx 亚洲精品午夜久久久 | 日韩一级电影网站 | 婷婷5月激情5月 | 91精品播放| 欧美成人h版在线观看 | 久草在线免费播放 | 黄色免费视频在线观看 | 欧美精品久久久久久久免费 | 欧美射射射 | 亚洲最大在线视频 | 亚洲黄色在线观看 | 天堂av在线7 | 久久久久看片 | 麻豆免费在线播放 | 欧美国产精品一区二区 | 天天激情在线 | 国产午夜视频在线观看 | 久久国色夜色精品国产 | 超碰在线97观看 | 久久久久久福利 | 最近中文字幕完整视频高清1 | 成人av资源在线 | 天天干天天想 | av丁香| 三级动图 | 69亚洲精品| 日韩中文字幕免费视频 | 欧美最新另类人妖 | 精品国产一区在线观看 | 91九色蝌蚪视频在线 | 四虎最新入口 | 欧美日韩国产一区二区三区在线观看 | 91在线资源| 网址你懂的在线观看 | 免费高清在线观看成人 | 日韩中文字幕网站 | 欧美极度另类性三渗透 | 日韩中午字幕 | 最近中文字幕 | 中文字幕亚洲国产 | 国产高清一区二区 | 香蕉视频网站在线观看 | www.久久com | 欧美性猛片 | 乱男乱女www7788 | 久久久久久麻豆 | 欧美美女视频在线观看 | 久久精品久久精品久久39 | 一区二区三区免费看 | 国产精品久久久久久久久婷婷 | 国产成人一区二区三区在线观看 | 久久99精品久久久久久久久久久久 | 夜夜夜| 一级黄色片毛片 | 91九色视频网站 | 国产精品18久久久久vr手机版特色 | 国产精彩在线视频 | 日韩欧美一区二区三区黑寡妇 | 一本一道久久a久久综合蜜桃 | 国产亚洲婷婷免费 | 99综合视频 | 国产视频一区二区三区在线 | 99精品欧美一区二区蜜桃免费 | 日韩在线观看小视频 | 日韩伦理片hd | 久要激情网 | 狠狠操.com| 欧美日视频 | 国产精品二区在线 | 九九热精品在线 | 久久久免费电影 | 色综合久久88色综合天天6 | 欧美激精品 | 久久精品久久99精品久久 | 操操色| 丁香电影小说免费视频观看 | 九九激情视频 | 国产69精品久久99的直播节目 | av在线官网| 国产自在线观看 | 亚洲手机av| 免费在线观看黄色网 | 婷婷色在线资源 | 久久精品综合网 | 免费的黄色的网站 | 久久久精品国产一区二区 | 涩涩网站在线观看 | 一区二区三区国产精品 | 久久草草热国产精品直播 | 国产精品成人自拍 | 国产精品永久免费在线 | 最近免费观看的电影完整版 | 亚洲精品在线观看的 | 欧美一级特黄高清视频 | 嫩小bbbb摸bbb摸bbb | 果冻av在线 | 在线观看国产高清视频 | 久久艹人人 | 国产一区视频在线 | 日韩精品一区二区三区高清免费 | 日本久久免费视频 | 三上悠亚一区二区在线观看 | 国产免费黄视频在线观看 | 亚洲一区二区三区在线看 | 五月天天色 | 黄色三级免费 | 99精品视频精品精品视频 | 最近中文字幕视频完整版 | 香蕉97视频观看在线观看 | 久久国产精品一区二区三区四区 | 免费成人黄色av | 在线中文字幕一区二区 | 亚洲国产精品日韩 | 午夜视频导航 | 一级成人在线 | 午夜视频在线观看一区二区 | 狂野欧美激情性xxxx欧美 | 黄www在线观看 | 天堂网av在线 | 欧美日韩高清一区二区 国产亚洲免费看 | 天天操天天操天天操天天操 | 精品一区二区免费视频 | 欧美999 | 91精品国产乱码在线观看 | 成人午夜在线观看 | 在线视频 精品 | 去干成人网 | 99精品视频观看 | 亚洲在线激情 | 伊人伊成久久人综合网小说 | 婷婷视频| av中文字幕剧情 | 天天草av | 国产一区二区视频在线播放 | 99精品视频在线观看播放 | 97天天干| 欧美va天堂va视频va在线 | 久久综合狠狠综合久久综合88 | 免费看黄在线观看 | www91在线观看| 激情久久小说 | 日韩在线国产精品 | 成人中文字幕在线观看 | 日韩日韩日韩日韩 | 亚洲成人麻豆 | 精品一区二区av | 国产免费观看久久黄 | 欧美亚洲免费在线一区 | 久久久精品国产一区二区 | 外国av网 | 在线一区av | 国产一级片一区二区三区 | 亚洲综合在线五月天 | 精品日韩在线一区 | 午夜久久视频 | 成年人视频在线 | 国产精品久久久毛片 | 插综合网| 麻豆免费在线播放 | 中文字幕久久精品亚洲乱码 | 毛片美女网站 | 99精品一区二区 | 天天干.com | 久久久久亚洲天堂 | 日韩欧美在线免费 | 中文综合在线 | 视频在线观看入口黄最新永久免费国产 | 国产精品成人一区 | 国产精品1区2区在线观看 | 天天干天天干天天干天天干天天干天天干 | 999久久国产 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 狠狠综合| 97国产精品亚洲精品 | 91精品国产综合久久久久久久 | 五月天久久久久 | 波多野结衣视频一区二区 | 波多野结衣电影久久 | 天天干天天草天天爽 | 亚洲成人av电影 | 美女免费网视频 | 日韩一区二区三区观看 | 999久久久久久久久久久 | 欧美日韩午夜爽爽 | 奇米网网址 | 99色网站 | 久久久精品二区 | 日韩视 | 日本黄色大片免费看 | 夜夜干夜夜| 久久综合婷婷 | 免费看日韩片 | 亚洲精品一区二区三区四区高清 | 91日韩国产| 国语对白少妇爽91 | 99热最新地址 |