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

Do What You think !!

 

水煮TCPMP (轉(zhuǎn))

去年年底幫別人做一個項目,了解了一下TCPMP,覺得這個軟件的結(jié)構(gòu)寫得很好就做了些記錄,今天偶然翻出來看看覺得可能對正在研究這個軟件的人有點幫助就貼出來。如果轉(zhuǎn)載請注明出處,謝謝。

TCPMP是一個功能強大開放式的開源多媒體播放器,
播放器主要由核心框架模塊(common工程)和解碼器分離器插件組成。
TCPMP的插件非常多,、libmad我們聯(lián)合幾個最常用的插件(ffmpeg、splitter)來說明,其中interface插件實現(xiàn)TCPMP的界面,由于他和媒體播放沒有什么關(guān)系,這部分可以完全被替換掉,替換成自己的界面。
ffmpeg工程是系統(tǒng)主要的音視頻解碼模塊,ffmpeg是一個集錄制、轉(zhuǎn)換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發(fā)是基于Linux操作系統(tǒng),但是可以在大多數(shù)操作系統(tǒng)中編譯和使用。ffmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多種編碼,AVI、MPEG、OGG、Matroska、ASF等90多種解碼。很多開源播放器都用到了ffmpeg。但是ffmpeg程序解碼效率不是很高,系統(tǒng)僅僅使用了FFmpeg的部分解碼功能。
ffmpeg主目錄下主要有l(wèi)ibavcodec、libavformat和libavutil等子目錄。其中l(wèi)ibavcodec用于存放各個encode/decode模塊,libavformat用于存放muxer/demuxer模塊,libavutil用于存放內(nèi)存操作等常用模塊。本系統(tǒng)的媒體文件分離器有單獨的splitter模塊完成所以不需要libavformat子目錄。ffmpeg目錄下libavcodec、libavutil保留子目錄。

libmad工程用于MP3文件解碼,該工程包含兩個功能模塊,一個負責(zé)解析MP3文件格式,包括MPEG1音頻文件 (MP1,MP2,MP3,MPA),讀取每一幀音頻數(shù)據(jù);另一個負責(zé)解碼MPEG1音頻數(shù)據(jù),解碼代碼在libmad子目錄中。
libmad是一個開源的高精度 MPEG1音頻解碼庫,支持 MPEG-1(Layer I, Layer II 和 LayerIII,也就是 MP3)。libmad提供 24-bit 的 PCM 輸出,完全是定點計算,非常適合沒有浮點支持的平臺上使用。使用 libmad 提供的一系列 API,就可以非常簡單地實現(xiàn) MP3 數(shù)據(jù)解碼工作。在 libmad 的源代碼文件目錄下的 mad.h 文件中,可以看到絕大部分該庫的數(shù)據(jù)結(jié)構(gòu)和 API 等。libmad是用的fixed-integer,通過整數(shù)模擬小數(shù)計算的,精度只能保證到小數(shù)點后第9位(大于0的最小值 0.00000000372529),雖然解碼精度會有損失,但是極大提高了解碼效率,特別是在嵌入式設(shè)備上也可以實現(xiàn)高碼率MP3文件的解碼。

splitter工程用于解析多種音視頻文件格式。可以解析的文件格式包括:ASF媒體文件,視頻文件 (AVI,DIVX),Windows波形文件 (WAV,RMP),MPEG電影文件 (MPEG,MPG,MPV),MPEG4文件 (MP4,3GP,M4A,M4B,K3G)。以上格式可以被解析但是數(shù)據(jù)編碼不一定能正確解碼,需要依賴系統(tǒng)的解碼器。

common工程是核心模塊,是一個開放的集數(shù)據(jù)輸入、轉(zhuǎn)換、音/視頻解碼、信號輸出等功能為一體的完整的多媒體播放框架。這個框架自身不包含任何的Decode和Split功能,這些功能由插件實現(xiàn),核心模塊以一個樹狀結(jié)構(gòu)管理所有的功能模塊和插件模塊,實現(xiàn)數(shù)據(jù)Render功能,對輸入、轉(zhuǎn)換、輸出流程的控制,接受播放過程中的操作和對事件進行處理,同時也實現(xiàn)系統(tǒng)運行中經(jīng)常使用的一些共用函數(shù),比如解碼過程中經(jīng)常使用的逆離散余弦變換,內(nèi)存操作,界面中需要使用的多語言字符處理等。common工程的主目錄下主要有:blit、dyncode、overlay、pcm、softidct、win32、zlib等子目錄。其中blit和overlay存放是視頻信號渲染模塊,pcm存放PCM音頻信號轉(zhuǎn)換模塊,softidct存放逆離散余弦變換函數(shù),win32存放內(nèi)存操作等常用模塊,dyncode這個目錄的代碼比較晦澀,存放的是程序運行是動態(tài)生成代碼模塊,針對不同的CPU指令集,PCM數(shù)據(jù)數(shù)據(jù)聲道和采樣率不同,視頻渲染數(shù)據(jù)格式和色深等不同情況動態(tài)生成不同的優(yōu)化代碼(這段代碼非常精彩,不能不讓人佩服TCPMP作者的高超水平)。核心模塊有一個上下文對象context,該對象在初始化函數(shù)bool_t Context_Init(……)中候創(chuàng)建了一個該對象實例。該對象實例記錄管理各個功能模塊,用戶界面可以通過該對象和核心模塊交互,管理控制播放過程。
 Context對象說明:
typedef struct context
{
 int Version; //版本信息
 uint32_t ProgramId;
 const tchar_t* ProgramName;  //應(yīng)用程序名稱
 const tchar_t* ProgramVersion; //程序版本號,字符串
 const tchar_t* CmdLine;   //程序命令行信息
 void* Wnd;   //視頻渲染窗口句柄
 void* NodeLock;  //功能模塊訪問臨界區(qū)互斥變量
 array Node;   //功能模塊數(shù)據(jù)對象數(shù)組
 array NodeClass;  //功能模塊定義對象數(shù)組,按照系統(tǒng)邏輯關(guān)系組織
 array NodeClassPri; //功能模塊定義對象數(shù)組,按照系統(tǒng)邏輯關(guān)系和模塊優(yōu)先級排列
 array NodeModule;  //外部插件模塊數(shù)組
 int LoadModuleNo;  //當(dāng)前正在裝載的外部插件序號
 void* LoadModule;
 array StrTable[2];  //字符串資源數(shù)組,字符串分為
      //給底層使用的標(biāo)準(zhǔn)字符串資源和
      //給界面使用的顯示字符串資源,兩種資源用兩個數(shù)組表示
 array StrBuffer;
 array StrModule;  //未使用
 void* StrLock;  //字符串?dāng)?shù)組訪問臨界區(qū)互斥變量
 uint32_t Lang;   //當(dāng)前使用語言標(biāo)志
 int CodePage;   //當(dāng)前使用代碼頁標(biāo)志
 struct pcm_soft* PCM; //PCM音頻信號轉(zhuǎn)換模塊
 struct blitpack* Blit; //視頻信號渲染模塊
 struct node* Platform; //得到平臺相關(guān)信息
 struct node* Advanced; //得到播放模塊高級信息
 struct node* Player;  //播放控制模塊
 notify Error;   //信息錯誤回調(diào)函數(shù)
 //屏幕旋轉(zhuǎn)信息,在某些系統(tǒng)中屏幕可以旋轉(zhuǎn)90度或180度
 int (*HwOrientation)(void*);
 void *HwOrientationContext;
 bool_t TryDynamic;  //未使用
 int SettingsPage;   //未使用
 size_t StartUpMemory;  //可以使用的有效內(nèi)存數(shù)
 bool_t InHibernate;   //是否進入休眠狀態(tài)
 bool_t WaitDisable;   //未使用
 int FtrId;     //未使用
 bool_t LowMemory;  //可以使用的有效內(nèi)存數(shù)是否小于系統(tǒng)要求的最低要求
 //動態(tài)代碼生成中間狀態(tài)及數(shù)據(jù)
 bool_t CodeFailed;
 bool_t CodeMoveBack;
 bool_t CodeDelaySlot;
 void* CodeLock;
 void* CodeInstBegin;
 void* CodeInstEnd;
 int NextCond;
 bool_t NextSet;
 bool_t NextByte;
 bool_t NextHalf;
 bool_t NextSign;
 
 uint32_t* FlushCache;  //未使用
 void* CharConvertUTF8; //未使用
 void* CharConvertCustom; //未使用
 int CustomCodePage;  //未使用
 void* CharConvertAscii; //未使用
 void* Application;
 void* Logger;    //未使用
 bool_t KeepDisplay;  //是否保持背光長亮
 int DisableOutOfMemory; //未使用

} context;
核心模塊上下文指針可以通過全局函數(shù)獲得context* Context();
初始化上下文對象的全局函數(shù)是bool_t Context_Init(const tchar_t* Name,const tchar_t* Version,int Id,const tchar_t* CmdLine,void* Application);其中Name參數(shù)為應(yīng)用程序名稱,Version為版本信息字符串。
釋放上下文對象的全局函數(shù)是void Context_Done();。
void Context_Wnd(void*);函數(shù)將視頻播放窗口句柄初始化給設(shè)備上下文。

功能模塊包含定義對象和數(shù)據(jù)對象,定義對象描述功能模塊相互間的邏輯結(jié)構(gòu),數(shù)據(jù)對象記錄模塊屬性和方法。
所有的功能模塊結(jié)構(gòu)按一個樹狀結(jié)構(gòu)來組織,結(jié)構(gòu)關(guān)系如下,NODE是整個結(jié)構(gòu)的根結(jié)點,其下為子節(jié)點,節(jié)點按類型可分為實節(jié)點,全局節(jié)點,設(shè)置節(jié)點,抽象節(jié)點。
#define CF_SIZE   0x00FFFFFF
#define CF_GLOBAL  0x01000000
#define CF_SETTINGS  0x02000000
#define CF_ABSTRACT  0x08000000
抽象節(jié)點沒有對應(yīng)的對象實例,類似C++的抽象基類,為了按照邏輯關(guān)系組織系統(tǒng)結(jié)構(gòu)而存在,例如NODE就是抽象節(jié)點。全局節(jié)點全局只有一個對象的實例,如播放控制模塊PLAYER_ID。設(shè)置節(jié)點表示和系統(tǒng)播放設(shè)置相關(guān),比如聲音均衡器模塊EQUALIZER_ID,顏色控制模塊COLOR_ID。實節(jié)點與抽象節(jié)點不同,指可以生成對象實例的節(jié)點,實節(jié)點沒有特殊標(biāo)識,一般以數(shù)據(jù)對象占用內(nèi)存大小表示是否是一個實節(jié)點,創(chuàng)建節(jié)點時要根據(jù)該信息分配內(nèi)存單元,實節(jié)點也可以有子節(jié)點,例如:MMS_ID的父節(jié)點是HTTP_ID。全局節(jié)點,設(shè)置節(jié)點和實節(jié)點可以相互組合,比如播放控制節(jié)點同時是全局節(jié)點,設(shè)置節(jié)點和實節(jié)點。節(jié)點名稱后帶_ID的就是實節(jié)點,否則就是抽象節(jié)點。

    NODE (根節(jié)點)
    ├─FLOW (流控制模塊)
    │  ├─CODEC (解碼模塊)
    │  │  ├─EQUALIZER_ID (聲音均衡器模塊)
    │  │  ├─VBUFFER_ID (視頻緩沖模塊)
    │  │  ├─DMO (DirectX Media Object)
    │  │  │  ├─WMV_ID
    │  │  │  ├─WMS_ID
    │  │  │  ├─WMVA_ID
    │  │  │  ├─WMA_ID
    │  │  │  └─WMAV_ID
    │  │  ├─FFMPEG VIDEO (FFMpeg 解碼模塊)
    │  │  └─LIBMAD_ID (Libmad Mp3解碼模塊)
    │  ├─OUT (信號渲染模塊)
    │  │  ├─AOUT (音頻信號渲染)
    │  │  │  ├─NULLAUDIO_ID
    │  │  │  └─WAVEOUT_ID
    │  │  └─VOUT (視頻信號渲染)
    │  │      ├─NULLVIDEO_ID
    │  │      └─OVERLAY
    │  ├─IDCT (離散余弦解碼模塊)
    │  │  └─SOFTIDCT_ID
    │  └─CODECIDCT(離散余弦解碼模塊,函數(shù)比IDCT要少)
    │      └─MPEG1_ID
    ├─MEDIA (媒體文件格式編碼解析模塊)
    │  ├─FORMAT (格式解析模塊)
    │  │  └─FORMATBASE
    │  │      ├─RAWAUDIO
    │  │      │  └─MP3_ID
    │  │      ├─RAWIMAGE
    │  │      ├─ASF_ID
    │  │      ├─AVI_ID
    │  │      ├─MP4_ID
    │  │      ├─MPG_ID
    │  │      ├─NSV_ID
    │  │      └─WAV_ID
    │  ├─PLAYLIST (播放列表模塊)
    │  │  ├─ASX_ID
    │  │  ├─M3U_ID
    │  │  └─PLS_ID
    │  └─STREAMPROCESS (數(shù)據(jù)流處理模塊)
    ├─STREAM (數(shù)據(jù)輸入模塊)
    │  ├─MEMSTREAM_ID (內(nèi)存數(shù)據(jù)流模塊)
    │  ├─FILE_ID (文件IO模塊)
    │  └─HTTP_ID (網(wǎng)絡(luò)數(shù)據(jù)獲取模塊)
    ├─TIMER (定時器模塊)
    │  └─SYSTIMER_ID
    ├─ASSOCIATION_ID (文件擴展名自動關(guān)聯(lián)模塊)
    ├─ADVANCED_ID (高級設(shè)置模塊)
    ├─COLOR_ID (顏色控制模塊)
    ├─PLATFORM_ID (平臺信息模塊)
    ├─XSCALEDRIVER_ID (Intel XScale CPU 信息模塊)
    ├─PLAYER_ID (播放控制模塊)
    └─PLAYER_BUFFER_ID (播放緩沖模塊)
   
    節(jié)點樹狀結(jié)構(gòu)由若干個靜態(tài)定義對象(nodedef)實例實現(xiàn),
        typedef struct nodedef
  {
   int    Flags;
   int    Class;
   int    ParentClass;
   int    Priority;
   nodecreate  Create;
   nodedelete  Delete;
  } nodedef;
 Flags表示當(dāng)前節(jié)點的類型:抽象、實節(jié)點、全局、設(shè)置。
 Class表示當(dāng)前節(jié)點的標(biāo)識,如MEDIA_CLASS或ASF_ID等等。
 ParentClass表示當(dāng)前節(jié)點的父節(jié)點標(biāo)識,如SYSTIMER_ID對象的父節(jié)點是TIMER_CLASS。
 Priority表示當(dāng)前節(jié)點優(yōu)先級。
 Create和Delete是兩個函數(shù)指針,表示該節(jié)點的創(chuàng)建函數(shù)和銷毀函數(shù)。
 如播放控制模塊的結(jié)構(gòu)定義是
 static const nodedef Player =
 {
  sizeof(player_base)|CF_GLOBAL|CF_SETTINGS,
  PLAYER_ID,
  NODE_CLASS,
  PRI_MAXIMUM+600,
  (nodecreate)Create,
  (nodedelete)Delete,
 };
 
 絕大多數(shù)節(jié)點都有一個對應(yīng)的數(shù)據(jù)對象,記錄該節(jié)點的數(shù)據(jù)和方法,每一個子節(jié)點對象都是以父節(jié)點對象作為該節(jié)點一個元素,類似C++的封裝繼承機制。如果子節(jié)點的父節(jié)點沒有數(shù)據(jù)對象,該節(jié)點可以從node節(jié)點直接繼承。每一個節(jié)點都可以看成Node節(jié)點的直接或間接子節(jié)點,所以所有節(jié)點頭以一個相同的node結(jié)構(gòu)開頭,子節(jié)點可能還有自己的屬性,在繼承父對象后就是子節(jié)點自己的元素。
    typedef struct node
 {
  int   Class;
  nodeenum Enum;
  nodeget  Get;
  nodeset  Set;
 } node;
 Class表示該對象的標(biāo)識,如PLAYER_ID。
 Enum是一個函數(shù)指針,指向一個函數(shù)用于枚舉當(dāng)前節(jié)點的屬性。
 Get是一個函數(shù)指針,得到當(dāng)前節(jié)點某一屬性值。
 Set是一個函數(shù)指針,設(shè)置當(dāng)前節(jié)點的某一屬性數(shù)值。
 
 節(jié)點的屬性值數(shù)據(jù)特性在一個static const datatable xxxParams[] = {……};的靜態(tài)數(shù)組里定義。
 typedef struct datatable
 {
  int No;
  int Type;
  int Flags;
  int Format1;
  int Format2;
 } datatable;
 
 No表示屬性的標(biāo)識,如播放控制模塊的#define PLAYER_PLAY 0x32 就表示控制播放器播放或暫停。
 Type表示屬性的數(shù)據(jù)類型,可用值在node.h中定義。
 Flags是屬性數(shù)據(jù)的標(biāo)志,表示該數(shù)據(jù)是不是只讀數(shù)據(jù),是否有最大最小值等等,可用值在node.h中定義,如果該標(biāo)志包含DF_SETUP同時不包含DF_NOSAVE和DF_RDONLY屬性,該屬性會被記錄在注冊表中,下次啟動時用注冊表的數(shù)據(jù)初始化該屬性。
 Format1和Format2是可選標(biāo)志與Flags配合使用,比如如果Flags表示該屬性存在最大最小值,F(xiàn)ormat1和Format2可以分別表示最小和最大數(shù)值。
 
 在在系統(tǒng)上下文對象中有兩個元素記錄節(jié)點信息array Node;和array NodeClass;,array是數(shù)組數(shù)據(jù)類型,Node是節(jié)點數(shù)據(jù)對象的數(shù)組,NodeClass節(jié)點對象的數(shù)組,按照系統(tǒng)邏輯關(guān)系組織。
 創(chuàng)建節(jié)點時傳入nodedef對象到節(jié)點創(chuàng)建函數(shù),函數(shù)會根據(jù)nodedef信息生成對應(yīng)nodeclass對象添加到NodeClass數(shù)組,同時根據(jù)nodedef信息分配數(shù)據(jù)對象的內(nèi)存空間。在該節(jié)點的Create函數(shù)里面再初始化該節(jié)點的數(shù)據(jù)對象。

在所有功能模塊中和界面加交互的主要就是播放控制模塊struct node* Player;使用方法如下:
context* p = Context();
player* myplayer = NULL;
if(p) myplayer = (player*)(p->Player);
控制播放參數(shù)使用Set(void* This,int No,const void* Data,int Size);函數(shù),第一個參數(shù)是播放模塊指針,第二個參數(shù)是控制代碼,即要進行什么操作,第三個參數(shù)是需要賦值給控制代碼的數(shù)值,最后一個參數(shù)是所賦數(shù)值的占用內(nèi)存的大小。
例如開始播放的代碼是:
myplayer->Set(myplayer,PLAYER_PLAY,1,sizeof(int));
PLAYER_PLAY為控制代碼,表示當(dāng)前控制的是播放暫停功能,數(shù)值為1表示播放為0表示暫停。
得到某一控制屬性使用Get(void* This,int No,void* Data,int Size);函數(shù),參數(shù)含義和Set函數(shù)相同。
控制代碼是一組宏,定義在player.h文件中。比較重要的控制參數(shù)有
// play or pause (bool_t)
#define PLAYER_PLAY   0x32
// position in fraction (fraction)
#define PLAYER_PERCENT  0x25
// position in time (tick_t)
#define PLAYER_POSITION  0x28
// current format (format*)
#define PLAYER_FORMAT  0x2B
// current file in playlist (int)
#define PLAYER_LIST_CURRENT 0x2F
// current file index (suffled) in playlist (int)
#define PLAYER_LIST_CURRIDX 0xA2
// fullscreen mode (bool_t)
#define PLAYER_FULLSCREEN 0x3E
// stop
#define PLAYER_STOP   0xB2
// skin viewport rectangle (rect)
#define PLAYER_SKIN_VIEWPORT 0x3C
播放控制模塊所有可用參數(shù)見static const datatable PlayerParams[]結(jié)構(gòu)。

添加一個媒體文件到播放模塊使用int PlayerAdd(player* Player,int Index, const tchar_t* Path, const tchar_t* Title);
第一個參數(shù)為播放模塊指針,第二個參數(shù)是添加到播放模塊文件隊列的序號,如果是使文件成為第一個文件該參數(shù)設(shè)為0,第三個參數(shù)是媒體文件的目錄和名稱,第四個參數(shù)為媒體文件標(biāo)題,該參數(shù)可以忽略。

核心模塊也管理多語言字符串,使用函數(shù)const tchar_t* LangStr(int Class, int Id);和const tchar_t* LangStrDef(int Class, int Id)可以得到對應(yīng)字符串,系統(tǒng)字符串資源有兩種,標(biāo)準(zhǔn)字符串和特殊字符集字符串。標(biāo)準(zhǔn)字符串資源文件是工程目錄下的lang_std.txt文件,該文件字符串為ASCII字符,可與其他代碼頁字符兼容。該文件記錄的是核心模塊運行時需要使用的字符串,Decode和Splite模塊可以處理的編碼格式和文件格式也在這個文件中記錄,例如lang_std.txt文件中的
MP3_0001=audio/mpeg
MP3_0002=mp1:A;mp2:A;mp3:A;mpa:A
MP3_0200=acodec/0x0055
紀錄了MP3文件分離器對應(yīng)的文件類型、擴展名和文件特征碼。
要得到標(biāo)準(zhǔn)字符串使用函數(shù)LangStrDef,第一個參數(shù)表示字符類別,第二個參數(shù)表示字符ID。界面相關(guān)的是特殊字符集的字符串,使用函數(shù)LangStr,第一個參數(shù)表示字符類別,第二個參數(shù)表示字符ID。關(guān)于字符串資源文件結(jié)構(gòu)含義將在以后的文檔中說明。http://blog.csdn.net/navi_dx/archive/2007/11/14/1885780.aspx

posted on 2007-11-23 10:28 零宇 閱讀(1121) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(4)

隨筆檔案(8)

文章分類(4)

文章檔案(4)

Windows Mobile 論壇

道中人

最新隨筆

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老司机亚洲精品| 久久漫画官网| 国产精品久久久久99| 欧美精品一区在线播放| 欧美精品一区二区三区蜜桃| 欧美片第1页综合| 欧美日韩在线播| 国产精品免费电影| 国内精品久久国产| 亚洲久久一区二区| 亚洲一区二区精品在线| 午夜精品久久久久久久久久久久| 午夜视频一区二区| 免费成人av在线看| 一本久久综合亚洲鲁鲁五月天| 亚洲一区二区动漫| 久久久久在线观看| 欧美日韩亚洲综合一区| 国产午夜亚洲精品不卡| 91久久精品www人人做人人爽 | 麻豆精品视频在线观看| 亚洲国产精品久久久久婷婷884 | 亚洲国产精品成人久久综合一区| 亚洲精品字幕| 欧美一进一出视频| 欧美日韩成人免费| 国产一区日韩一区| 一区二区三区久久| 久久青草欧美一区二区三区| 亚洲美女免费精品视频在线观看| 欧美亚洲一级| 欧美色综合网| 亚洲国产精品www| 欧美一区二区黄| 亚洲激情国产| 久久精品视频免费| 欧美亚洲第一区| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品一区亚洲| 亚洲国产成人在线视频| 亚洲免费在线精品一区| 亚洲国产一区二区视频| 欧美一区二区三区在线| 久久久午夜电影| 性xx色xx综合久久久xx| 日韩一本二本av| 久久激情视频久久| 一本色道久久88综合日韩精品| 久久综合九色综合久99| 国产在线视频欧美| 午夜在线播放视频欧美| 亚洲成色www8888| 久久精品在线视频| 在线视频欧美一区| 欧美精品一区二区三区久久久竹菊| 国产亚洲成年网址在线观看| 亚洲特级片在线| 亚洲免费观看| 欧美日韩一区二区在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美成人午夜| 欧美chengren| 亚洲伦伦在线| 一区二区三区国产在线| 国产精品欧美日韩| 久久久福利视频| 欧美主播一区二区三区美女 久久精品人| 国产日韩欧美二区| 免费成人性网站| 欧美激情二区三区| 亚洲一区二区视频| 午夜亚洲性色福利视频| 狠狠干综合网| 亚洲第一黄网| 欧美日韩国产综合视频在线观看中文 | 99国产一区| 欧美午夜视频在线| 午夜在线视频一区二区区别| 午夜天堂精品久久久久| 亚洲电影网站| 亚洲免费精彩视频| 国产区在线观看成人精品| 久久久久久久久一区二区| 久久永久免费| 亚洲一区影音先锋| 久久久精品动漫| 一区二区久久| 久久精彩免费视频| 亚洲美女免费精品视频在线观看| 亚洲美女免费视频| 国产三级精品三级| 欧美激情亚洲另类| 国产精品青草久久| 欧美激情第3页| 国产精品无码专区在线观看| 女仆av观看一区| 欧美特黄一级大片| 农村妇女精品| 国产精品午夜在线观看| 欧美福利电影在线观看| 亚洲视频一区在线观看| 国内久久婷婷综合| 美女啪啪无遮挡免费久久网站| 亚洲第一黄网| 亚洲综合激情| 日韩图片一区| 久久精品亚洲精品国产欧美kt∨| 一区二区免费在线观看| 久久精品夜色噜噜亚洲aⅴ| 国产精品99久久久久久久久 | 久久国产精品免费一区| 中文国产成人精品久久一| 欧美专区第一页| 午夜精品久久久久久久99樱桃| 女人色偷偷aa久久天堂| 久久久久久久久久久一区 | 亚洲精品在线观看视频| 欧美一区二区三区婷婷月色| 亚洲一区在线免费| 欧美激情在线有限公司| 毛片一区二区三区| 国产在线精品自拍| 午夜精品久久久久久99热软件| 一区二区三区四区蜜桃| 欧美刺激性大交免费视频| 蜜臀99久久精品久久久久久软件| 国产精品视频久久| 亚洲午夜免费视频| 午夜久久tv| 国产精品九九久久久久久久| 日韩亚洲不卡在线| 一区二区高清| 欧美日韩视频不卡| 99re这里只有精品6| 日韩一级二级三级| 欧美精品一区二区久久婷婷| 亚洲国产黄色片| 日韩一级精品视频在线观看| 欧美高清视频在线| 亚洲欧洲日本国产| 亚洲性图久久| 国产精品乱码一区二三区小蝌蚪| 亚洲视频二区| 小黄鸭视频精品导航| 国产伦精品一区二区三区照片91| 一区二区三区久久网| 亚洲欧美激情一区二区| 国产毛片久久| 欧美自拍偷拍| 欧美顶级艳妇交换群宴| 日韩小视频在线观看| 欧美视频在线观看免费网址| 亚洲深夜影院| 美女精品视频一区| 日韩午夜电影| 国产精品区二区三区日本 | 国产精品视频自拍| 久久精品久久99精品久久| 欧美激情国产日韩| 亚洲综合色婷婷| 韩国福利一区| 亚洲免费在线看| 国产亚洲日本欧美韩国| 欧美在线视频一区| 欧美激情区在线播放| 中日韩高清电影网| 狠狠色丁香婷综合久久| 欧美日韩亚洲成人| 欧美有码视频| 日韩亚洲欧美精品| 久久久久久伊人| 这里只有视频精品| 曰韩精品一区二区| 国产精品乱码妇女bbbb| 毛片一区二区三区| 亚洲你懂的在线视频| 亚洲福利视频一区| 久久se精品一区二区| 99这里只有精品| 在线观看亚洲一区| 国产欧美 在线欧美| 欧美精品久久天天躁| 久久精品国产欧美激情| 日韩小视频在线观看| 欧美99在线视频观看| 午夜精品一区二区三区在线| 亚洲精品在线一区二区| 国内精品久久久久久久影视麻豆| 欧美深夜影院| 欧美精品观看| 久久综合伊人| 欧美一区二区三区在线看| 一区二区三区 在线观看视| 欧美激情久久久久| 久久综合伊人77777蜜臀| 亚洲欧美在线免费观看| 亚洲视频一区二区| 一区二区欧美亚洲| 99精品国产在热久久| 亚洲精品一区中文|