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

隨筆-341  評論-2670  文章-0  trackbacks-0
    這個壓縮流是Vczh Library++ 2.0龐大的流與控制器系統的其中一個部分。我準備將其改造成可調大小的,并且打算添加LZW與Huffman壓縮解壓算法。以下是用C++實現的代碼。

    頭文件:
  1 /*******************************************************************************
  2 Vczh Library++ 2.0
  3 數據結構::壓縮流
  4 開發者:陳梓瀚
  5 
  6 接口:
  7 類:
  8   VL_CompressedStream                    :壓縮流
  9   VL_LZ77Stream                            :LZ77壓縮流
 10   VL_LZWStream                            :LZW壓縮流
 11   VL_HuffmanStream                        :Adaptive/Canonical Huffman壓縮流
 12 函數:
 13 *******************************************************************************/
 14 #ifndef VL_COMPRESSION
 15 #define VL_COMPRESSION
 16 
 17 #include "VL_Stream.h"
 18 
 19 namespace vl
 20 {
 21     namespace stream
 22     {
 23         using namespace collection;
 24 
 25 /*********************************************************************************************************
 26 壓縮流
 27 *********************************************************************************************************/
 28 
 29         class VL_CompressedStream : public VL_Base , public IVL_Stream
 30         {
 31         public:
 32             enum VLE_OpenMode
 33             {
 34                 vomRead,
 35                 vomWrite,
 36             };
 37 
 38             class Compressor : public IVL_Interface
 39             {
 40             public:
 41                 virtual void            SetStream(IVL_Stream* Stream)=0;
 42                 virtual VInt            Write(VPointer Data , VInt ByteCount)=0;
 43             };
 44 
 45             class Decompressor : public IVL_Interface
 46             {
 47             public:
 48                 virtual void            SetStream(IVL_Stream* Stream)=0;
 49                 virtual VInt            Read(VPointer Data , VInt ByteCount)=0;
 50                 virtual VL_Base*        CopyStatus()=0;
 51                 virtual void            ReplaceStatus(VL_Base* Status)=0;
 52                 virtual void            FreeStatus(VL_Base* Status)=0;
 53             };
 54         protected:
 55             IVL_Stream*                    FStream;
 56             VBool                        FOwned;
 57             VLE_OpenMode                FMode;
 58             VSize                        FPosition;
 59             Compressor*                    FCompressor;
 60             Decompressor*                FDecompressor;
 61 
 62             void                        Init(IVL_Stream* Stream , VBool Owned , Compressor* aCompressor);
 63             void                        Init(IVL_Stream* Stream , VBool Owned , Decompressor* aDecompressor);
 64 
 65             VL_CompressedStream();
 66         public:
 67             ~VL_CompressedStream();
 68 
 69             VBool                        CanRead();
 70             VBool                        CanPeek();
 71             VBool                        CanWrite();
 72             VBool                        CanClose();
 73             VBool                        CanSeek();
 74             VBool                        CanGrow();
 75             VInt                        Read(VPointer Data , VInt ByteCount);
 76             VInt                        Peek(VPointer Data , VInt ByteCount);
 77             VInt                        Write(VPointer Data , VInt ByteCount);
 78             void                        Close();
 79             VBool                        IsAvailable();
 80             VSize                        Position();
 81             VSize                        Size();
 82             VSize                        MaxWriteSize();
 83             void                        SeekFromBegin(VSize Offset);
 84             void                        SeekFromEnd(VSize Offset);
 85             void                        Seek(VSize Offset);
 86             VBool                        IsEnd();
 87         };
 88 
 89         class VL_LZ77Stream : public VL_CompressedStream
 90         {
 91         public:
 92             VL_LZ77Stream(IVL_Stream* Stream , VLE_OpenMode Mode , VBool Owned=false);
 93         };
 94 
 95 /*********************************************************************************************************
 96 LZ77壓縮算法 [0:wide,1:encoded][0-127:byte count-1][index/data]
 97 *********************************************************************************************************/
 98 
 99         namespace LZ77Algorithms
100         {
101             class AlgorithmBase : public VL_Base
102             {
103             protected:
104                 static const VInt            WindowSize=128;
105                 static const VInt            MaxBlockSize=128;
106 
107                 VByte                        FWindow[WindowSize*3];        /*滑動窗口*/
108                 VSize                        FPosition;                    /*當前位置*/
109                 VInt                        FUsedWindowSize;            /*窗口有效數據大小*/
110                 VSize                        FWindowStartPosition;        /*窗口的起始位置*/
111 
112                 AlgorithmBase();
113             };
114 
115             class Compressor : public AlgorithmBase , public VL_CompressedStream::Compressor
116             {
117             protected:
118                 IVL_Stream*                    FStream;
119 
120             protected:
121                 VInt WriteUncompressedHeader(VBuffer Data , VInt ByteCount);
122                 VInt CompressAndWrite(VBuffer Data , VInt ByteCount);
123             public:
124                 Compressor();
125 
126                 void SetStream(IVL_Stream* Stream);
127                 VInt Write(VPointer Data , VInt ByteCount);
128             };
129 
130             class Decompressor : public AlgorithmBase , public VL_CompressedStream::Decompressor
131             {
132             protected:
133                 class Status : public VL_Base
134                 {
135                 protected:
136                     VByte                    OldWindow[WindowSize*3];
137                     VSize                    OldPosition;
138                     VInt                    OldUsedWindowSize;
139                     VSize                    OldWindowStartPosition;
140                 public:
141                     Status(Decompressor* aDecompressor);
142                     void Apply(Decompressor* aDecompressor);
143                 };
144             protected:
145                 IVL_Stream*                    FStream;
146 
147                 VInt DecompressBlock();
148             public:
149                 Decompressor();
150 
151                 void SetStream(IVL_Stream* Stream);
152                 VInt Read(VPointer Data , VInt ByteCount);
153                 VL_Base* CopyStatus();
154                 void ReplaceStatus(VL_Base* Status);
155                 void FreeStatus(VL_Base* Status);
156             };
157 
158         }
159     }
160 }
161 
162 #endif

    實現文件:
  1 #include "VL_Compression.h"
  2 
  3 namespace vl
  4 {
  5     namespace stream
  6     {
  7 
  8 /*********************************************************************************************************
  9 VL_CompressedStream
 10 *********************************************************************************************************/
 11 
 12         void VL_CompressedStream::Init(IVL_Stream* Stream , VBool Owned , Compressor* aCompressor)
 13         {
 14             FStream=Stream;
 15             FOwned=Owned;
 16             FMode=vomWrite;
 17             FCompressor=aCompressor;
 18             FCompressor->SetStream(FStream);
 19             FDecompressor=0;
 20         }
 21 
 22         void VL_CompressedStream::Init(IVL_Stream* Stream , VBool Owned , Decompressor* aDecompressor)
 23         {
 24             FStream=Stream;
 25             FOwned=Owned;
 26             FMode=vomRead;
 27             FCompressor=0;
 28             FDecompressor=aDecompressor;
 29             FDecompressor->SetStream(FStream);
 30         }
 31 
 32         VL_CompressedStream::VL_CompressedStream()
 33         {
 34             FStream=0;
 35             FOwned=false;
 36             FPosition=0;
 37         }
 38 
 39         VL_CompressedStream::~VL_CompressedStream()
 40         {
 41             Close();
 42             if(FCompressor)delete FCompressor;
 43             if(FDecompressor)delete FDecompressor;
 44         }
 45 
 46         VBool VL_CompressedStream::CanRead()
 47         {
 48             return IsAvailable() && (FMode==vomRead) && FStream->CanRead();
 49         }
 50 
 51         VBool VL_CompressedStream::CanPeek()
 52         {
 53             return IsAvailable() && (FMode==vomRead) && FStream->CanRead() && FStream->CanSeek();
 54         }
 55 
 56         VBool VL_CompressedStream::CanWrite()
 57         {
 58             return IsAvailable() && (FMode==vomWrite) && FStream->CanWrite();
 59         }
 60 
 61         VBool VL_CompressedStream::CanClose()
 62         {
 63             return IsAvailable() && FStream->CanClose();
 64         }
 65 
 66         VBool VL_CompressedStream::CanSeek()
 67         {
 68             return false;
 69         }
 70 
 71         VBool VL_CompressedStream::CanGrow()
 72         {
 73             return CanWrite();
 74         }
 75 
 76         VInt VL_CompressedStream::Read(VPointer Data , VInt ByteCount)
 77         {
 78             if(CanRead())
 79             {
 80                 ByteCount=FDecompressor->Read(Data,ByteCount);
 81                 FPosition+=ByteCount;
 82                 return ByteCount;
 83             }
 84             else
 85             {
 86                 return -1;
 87             }
 88         }
 89 
 90         VInt VL_CompressedStream::Peek(VPointer Data , VInt ByteCount)
 91         {
 92             if(CanPeek())
 93             {
 94                 VL_Base* Status=FDecompressor->CopyStatus();
 95                 VSize OldPosition=FPosition;
 96                 VSize OldStreamPosition=FStream->Position();
 97 
 98                 ByteCount=Read(Data,ByteCount);
 99 
100                 FStream->SeekFromBegin(OldStreamPosition);
101                 FPosition=OldPosition;
102                 FDecompressor->ReplaceStatus(Status);
103                 FDecompressor->FreeStatus(Status);
104 
105                 return ByteCount;
106             }
107             else
108             {
109                 return -1;
110             }
111         }
112 
113         VInt VL_CompressedStream::Write(VPointer Data , VInt ByteCount)
114         {
115             if(CanWrite())
116             {
117                 ByteCount=FCompressor->Write(Data,ByteCount);
118                 FPosition+=ByteCount;
119                 return ByteCount;
120             }
121             else
122             {
123                 return -1;
124             }
125         }
126 
127         void VL_CompressedStream::Close()
128         {
129             if(FStream)
130             {
131                 if(FOwned)
132                 {
133                     FStream->Close();
134                     delete FStream;
135                 }
136                 FStream=0;
137             }
138         }
139 
140         VBool VL_CompressedStream::IsAvailable()
141         {
142             return FStream && FStream->IsAvailable();
143         }
144 
145         VSize VL_CompressedStream::Position()
146         {
147             return IsAvailable()?FPosition:-1;
148         }
149 
150         VSize VL_CompressedStream::Size()
151         {
152             return -1;
153         }
154 
155         VSize VL_CompressedStream::MaxWriteSize()
156         {
157             return -1;
158         }
159 
160         void VL_CompressedStream::SeekFromBegin(VSize Offset)
161         {
162         }
163 
164         void VL_CompressedStream::SeekFromEnd(VSize Offset)
165         {
166         }
167 
168         void VL_CompressedStream::Seek(VSize Offset)
169         {
170         }
171 
172         VBool VL_CompressedStream::IsEnd()
173         {
174             return IsAvailable()?FStream->IsEnd():true;
175         }
176 
177 /*********************************************************************************************************
178 VL_LZ77Stream
179 *********************************************************************************************************/
180 
181         VL_LZ77Stream::VL_LZ77Stream(IVL_Stream* Stream , VLE_OpenMode Mode , VBool Owned)
182         {
183             switch(Mode)
184             {
185             case vomRead:
186                 Init(Stream,Owned,new LZ77Algorithms::Decompressor());
187                 break;
188             case vomWrite:
189                 Init(Stream,Owned,new LZ77Algorithms::Compressor());
190                 break;
191             }
192         }
193 
194 /*********************************************************************************************************
195 LZ77Algorithms::AlgorithmBase
196 *********************************************************************************************************/
197 
198         namespace LZ77Algorithms
199         {
200 
201             AlgorithmBase::AlgorithmBase()
202             {
203                 FPosition=0;
204                 FUsedWindowSize=0;
205                 FWindowStartPosition=0;
206             }
207 
208 /*********************************************************************************************************
209 LZ77Algorithms::Compressor
210 *********************************************************************************************************/
211 
212             struct CompressionRecord
213             {
214                 VBool Compressed;
215                 VInt Start;
216                 VInt Size;
217             };
218 
219             CompressionRecord TestCompression(VBuffer Window , VInt WindowSize , VInt ExtendedSize)
220             {
221                 CompressionRecord Record;
222                 Record.Compressed=false;
223                 Record.Start=0;
224                 Record.Size=1;
225                 for(VInt i=0;i<WindowSize;i++)
226                 {
227                     VBuffer Read1=Window+i;
228                     VBuffer Read2=Window+WindowSize;
229                     VInt CurrentSize=0;
230                     while(CurrentSize<ExtendedSize && *Read1++==*Read2++)
231                     {
232                         CurrentSize++;
233                     }
234                     if(CurrentSize>Record.Size)
235                     {
236                         Record.Compressed=true;
237                         Record.Start=i;
238                         Record.Size=CurrentSize;
239                         if(CurrentSize==ExtendedSize)
240                         {
241                             break;
242                         }
243                     }
244                 }
245                 return Record;
246             }
247 
248             VInt Compressor::WriteUncompressedHeader(VBuffer Data , VInt ByteCount)
249             {
250                 VInt UnusedWindowSize=WindowSize-FUsedWindowSize;
251                 if(UnusedWindowSize)
252                 {
253                     if(ByteCount>UnusedWindowSize)
254                     {
255                         ByteCount=UnusedWindowSize;
256                     }
257                     memcpy(FWindow+FUsedWindowSize,Data,ByteCount);
258                     FStream->Write(Data,ByteCount);
259                     FUsedWindowSize+=ByteCount;
260                     FPosition+=ByteCount;
261                     return ByteCount;
262                 }
263                 else
264                 {
265                     return 0;
266                 }
267             }
268 
269             VInt Compressor::CompressAndWrite(VBuffer Data , VInt ByteCount)
270             {
271                 VInt SelectedStart=-1;
272                 VInt EncodedLength=-1;
273                 if(ByteCount>MaxBlockSize*2)
274                 {
275                     ByteCount=MaxBlockSize*2;
276                 }
277                 memcpy(FWindow+WindowSize,Data,ByteCount);
278 
279                 VInt UncompressedBlockSize=0;
280                 VInt CompressedBlockStart=0;
281                 VInt CompressedBlockSize=0;
282                 VInt MaxUncompressedSize=MaxBlockSize<ByteCount?MaxBlockSize:ByteCount;
283                 while(UncompressedBlockSize<MaxUncompressedSize)
284                 {
285                     VInt ExtendedSize=ByteCount-UncompressedBlockSize;
286                     if(ExtendedSize>MaxBlockSize)
287                     {
288                         ExtendedSize=MaxBlockSize;
289                     }
290                     CompressionRecord Record=TestCompression(FWindow+UncompressedBlockSize,WindowSize,ExtendedSize);
291                     if(Record.Compressed)
292                     {
293                         CompressedBlockStart=Record.Start;
294                         CompressedBlockSize=Record.Size;
295                         break;
296                     }
297                     else
298                     {
299                         UncompressedBlockSize++;
300                     }
301                 }
302 
303                 if(UncompressedBlockSize)
304                 {
305                     VByte Block=(VByte)(UncompressedBlockSize-1);
306                     FStream->Write(&Block,sizeof(Block));
307                     FStream->Write(Data,UncompressedBlockSize);
308                     FPosition+=UncompressedBlockSize;
309                 }
310                 if(CompressedBlockSize)
311                 {
312                     VByte Block[2];
313                     Block[0]=((VByte)(CompressedBlockSize-1)) | 0x80;
314                     Block[1]=(VByte)CompressedBlockStart;
315                     FStream->Write(&Block,sizeof(Block));
316                     FPosition+=CompressedBlockSize;
317                 }
318 
319                 ByteCount=UncompressedBlockSize+CompressedBlockSize;
320                 memmove(FWindow,FWindow+ByteCount,WindowSize);
321                 FWindowStartPosition+=ByteCount;
322                 return ByteCount;
323             }
324 
325             Compressor::Compressor()
326             {
327                 FStream=0;
328             }
329 
330             void Compressor::SetStream(IVL_Stream* Stream)
331             {
332                 FStream=Stream;
333             }
334 
335             VInt Compressor::Write(VPointer Data , VInt ByteCount)
336             {
337                 VBuffer Buffer=(VBuffer)Data;
338                 VInt WrittenCount=0;
339                 {
340                     VInt Size=WriteUncompressedHeader(Buffer,ByteCount);
341                     Buffer+=Size;
342                     WrittenCount+=Size;
343                 }
344                 while(WrittenCount<ByteCount)
345                 {
346                     VInt Size=CompressAndWrite(Buffer,ByteCount-WrittenCount);
347                     if(Size==0)
348                     {
349                         break;
350                     }
351                     Buffer+=Size;
352                     WrittenCount+=Size;
353                 }
354                 return WrittenCount;
355             }
356 
357 /*********************************************************************************************************
358 LZ77Algorithms::Decompressor
359 *********************************************************************************************************/
360 
361             Decompressor::Status::Status(Decompressor* aDecompressor)
362             {
363                 OldPosition=aDecompressor->FPosition;
364                 OldUsedWindowSize=aDecompressor->FUsedWindowSize;
365                 OldWindowStartPosition=aDecompressor->FWindowStartPosition;
366                 memcpy(&OldWindow,&aDecompressor->FWindow,sizeof(OldWindow));
367             }
368 
369             void Decompressor::Status::Apply(Decompressor* aDecompressor)
370             {
371                 aDecompressor->FPosition=OldPosition;
372                 aDecompressor->FUsedWindowSize=OldUsedWindowSize;
373                 aDecompressor->FWindowStartPosition=OldWindowStartPosition;
374                 memcpy(&aDecompressor->FWindow,&OldWindow,sizeof(OldWindow));
375             }
376 
377             VInt Decompressor::DecompressBlock()
378             {
379                 VByte BlockHeader;
380                 if(FStream->Read(&BlockHeader,sizeof(BlockHeader))!=sizeof(BlockHeader))
381                 {
382                     return 0;
383                 }
384                 VByte BlockSize=(BlockHeader & 0x7F)+1;
385                 if(BlockHeader & 0x80)
386                 {
387                     VByte BlockStart;
388                     if(FStream->Read(&BlockStart,sizeof(BlockStart))!=sizeof(BlockStart))
389                     {
390                         return 0;
391                     }
392                     VBuffer Dest=FWindow+WindowSize;
393                     VBuffer Src=FWindow+BlockStart;
394                     for(VInt i=0;i<BlockSize;i++)
395                     {
396                         *Dest++=*Src++;
397                     }
398                 }
399                 else
400                 {
401                     if(FStream->Read(FWindow+WindowSize,BlockSize)!=BlockSize)
402                     {
403                         return 0;
404                     }
405                 }
406                 memmove(FWindow,FWindow+BlockSize,WindowSize);
407                 FWindowStartPosition+=BlockSize;
408                 return BlockSize;
409             }
410 
411             Decompressor::Decompressor()
412             {
413                 FStream=0;
414             }
415 
416             void Decompressor::SetStream(IVL_Stream* Stream)
417             {
418                 FStream=Stream;
419             }
420 
421             VInt Decompressor::Read(VPointer Data , VInt ByteCount)
422             {
423                 if(!FWindowStartPosition && !FUsedWindowSize)
424                 {
425                     FUsedWindowSize=FStream->Read(FWindow,WindowSize);
426                 }
427                 VBuffer Buffer=(VBuffer)Data;
428                 VInt WrittenCount=0;
429                 while(WrittenCount<ByteCount)
430                 {
431                     if(FWindowStartPosition+FUsedWindowSize==FPosition && FUsedWindowSize==WindowSize)
432                     {
433                         if(DecompressBlock()==0)
434                         {
435                             break;
436                         }
437                     }
438 
439                     VInt NeedCount=ByteCount-WrittenCount;
440                     VInt AllowSize=(VInt)(FWindowStartPosition+FUsedWindowSize-FPosition);
441                     VInt ReadSize=NeedCount<AllowSize?NeedCount:AllowSize;
442                     if(ReadSize)
443                     {
444                         memcpy(Buffer,FWindow+(FPosition-FWindowStartPosition),ReadSize);
445                         WrittenCount+=ReadSize;
446                         Buffer+=ReadSize;
447                         FPosition+=ReadSize;
448                     }
449                     else
450                     {
451                         break;
452                     }
453                 }
454                 return WrittenCount;
455             }
456 
457             VL_Base* Decompressor::CopyStatus()
458             {
459                 return new Status(this);
460             }
461 
462             void Decompressor::ReplaceStatus(VL_Base* Status)
463             {
464                 dynamic_cast<Decompressor::Status*>(Status)->Apply(this);
465             }
466 
467             void Decompressor::FreeStatus(VL_Base* Status)
468             {
469                 delete Status;
470             }
471 
472         }
473 
474     }
475 }
posted on 2009-01-05 09:47 陳梓瀚(vczh) 閱讀(2774) 評論(5)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 實現了一個128長度窗口大小的LZ77壓縮解壓算法 2009-01-05 18:34 | 空明流轉
輪子美

我就用用

iostreams就完事了。。。。  回復  更多評論
  
# re: 實現了一個128長度窗口大小的LZ77壓縮解壓算法 2009-01-06 18:30 | 星綻紫輝
我是菜鳥,沒時間看代碼,冒昧問一句:你那個“128長度窗口大小”和壓縮解壓文件有什么關系?  回復  更多評論
  
# re: 實現了一個128長度窗口大小的LZ77壓縮解壓算法 2009-01-06 19:59 | 陳梓瀚(vczh)
這是LZ77算法的一個參數。LZ77只能壓縮窗口內重復的內容。  回復  更多評論
  
# re: 實現了一個128長度窗口大小的LZ77壓縮解壓算法 2010-11-14 20:03 | Husiwa
你好,請問這個壓縮的模塊在 3.0中去除了嗎?
我看了下源文件中貌似沒有這些文件  回復  更多評論
  
# re: 實現了一個128長度窗口大小的LZ77壓縮解壓算法 2010-11-15 04:30 | 陳梓瀚(vczh)
@Husiwa
嗯,因為我整個重寫了,還來不及寫到那里。2.0還留著在博客上,你還是可以找到的哈。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲大片在线观看| 欧美黑人在线观看| 久久国产天堂福利天堂| 亚洲影院在线| 亚洲精品1234| 亚洲黄色视屏| 亚洲久久一区二区| 在线亚洲自拍| 亚洲午夜激情免费视频| 亚洲一区二区日本| 校园激情久久| 久久久久久久久伊人| 久久se精品一区精品二区| 久久久久国产精品午夜一区| 欧美在线免费看| 久久久久久久久久久久久9999 | 一区二区精品在线| 一区二区日韩伦理片| 男人的天堂亚洲在线| 国产女主播在线一区二区| 欧美一区二区三区久久精品| 午夜久久tv| 免费成人av在线| 欧美性理论片在线观看片免费| 欧美日韩一区在线| 在线观看日韩精品| 欧美一进一出视频| 亚洲经典三级| 久久国产加勒比精品无码| 久久亚洲综合色| 精品51国产黑色丝袜高跟鞋| 国产精品亚洲一区| 一区二区久久久久| 免费不卡中文字幕视频| 亚洲成人在线免费| 亚洲欧美另类在线观看| 欧美一区二区三区免费在线看| 久热精品视频在线| 夜夜嗨av一区二区三区 | 一区二区精品| 久久久久久久高潮| 欧美四级电影网站| 91久久精品国产| 亚洲在线播放电影| 女主播福利一区| 亚洲一区二区三区中文字幕| 浪潮色综合久久天堂| 欧美午夜精品久久久久久人妖| 欧美视频二区| 国产亚洲精品aa| 国产精品社区| 久久国产精品久久久久久电车| av成人老司机| 国产精品www.| 久久综合一区二区三区| 久久人91精品久久久久久不卡| 国产一区二区黄色| 亚洲第一伊人| 国产精品丝袜xxxxxxx| 久久九九电影| 欧美激情精品久久久久久免费印度 | 日韩亚洲欧美高清| 午夜在线观看欧美| 免费成人在线视频网站| 伊大人香蕉综合8在线视| 亚洲一区中文| 9国产精品视频| 欧美日韩在线综合| 亚洲天堂av在线免费观看| 亚洲国内自拍| 欧美精品成人在线| 亚洲美女视频在线观看| 亚洲国产欧美日韩精品| 久久精品最新地址| 一区在线播放视频| 久久亚洲综合| 男人的天堂成人在线| 亚洲国产高潮在线观看| 免费欧美日韩| 麻豆国产精品va在线观看不卡| 在线观看国产成人av片| 久色成人在线| 午夜精品一区二区三区电影天堂| 一本久道久久久| 欧美激情成人在线视频| 欧美福利视频网站| 日韩一级网站| 一本色道婷婷久久欧美| 国产精品入口66mio| 先锋影音久久| 久久夜色精品国产亚洲aⅴ | 鲁大师成人一区二区三区| 亚洲激情视频在线播放| 亚洲另类在线视频| 国产精品拍天天在线| 久久久久久一区二区| 欧美成人国产| 午夜精品久久久久久久99樱桃| 欧美一区二区黄色| 91久久精品国产91久久性色tv| 亚洲国产影院| 国产欧美日韩在线播放| 亚洲第一精品福利| 国产精品日韩欧美大师| 欧美国产激情| 国产日韩欧美中文在线播放| 亚洲国产精品成人久久综合一区| 欧美午夜电影网| 女生裸体视频一区二区三区| 欧美丝袜一区二区| 欧美国产精品va在线观看| 国产精品久久福利| 久久亚洲一区二区| 国产精品免费网站| 牛人盗摄一区二区三区视频| 国产精品一区二区三区四区五区 | 久久免费一区| 欧美日韩国产区一| 欧美一区二区三区喷汁尤物| 噜噜噜91成人网| 久久精品国产999大香线蕉| 欧美金8天国| 久久嫩草精品久久久精品| 欧美国产日韩视频| 久久久久久欧美| 国产精品私房写真福利视频| 亚洲精品网站在线播放gif| 亚洲国产日韩一区| 亚洲欧美激情精品一区二区| 亚洲理伦在线| 久久久久久一区| 亚洲欧美一区二区三区久久 | 午夜视频一区二区| 亚洲日本免费电影| 久久亚洲综合色一区二区三区| 欧美一区二区三区四区在线 | 欧美一级日韩一级| 欧美一区二区三区视频| 亚洲国产综合视频在线观看| 亚洲午夜在线| 亚洲国产精品高清久久久| 亚洲精品免费看| 亚洲免费影视第一页| 欧美大片免费观看| 免费久久精品视频| 一区二区三区在线免费播放| 亚洲欧洲av一区二区| 小嫩嫩精品导航| 国产视频观看一区| 午夜伦欧美伦电影理论片| 久久av一区二区三区漫画| 国产欧美一区二区三区在线老狼| 亚洲一区在线观看视频 | 美女主播视频一区| 亚洲成人在线| 久久亚洲色图| 亚洲国产精品久久91精品| 亚洲欧洲在线视频| 欧美成人综合一区| aaa亚洲精品一二三区| 亚洲一区二区三区免费在线观看| 欧美午夜激情在线| 性伦欧美刺激片在线观看| 噜噜爱69成人精品| 日韩亚洲精品在线| 国产精品欧美在线| 久久在线免费观看| 亚洲激情影视| 欧美亚洲系列| 亚洲高清在线视频| 欧美美女日韩| 午夜久久一区| 亚洲国产片色| 欧美一级专区免费大片| 亚洲国产精品高清久久久| 欧美激情亚洲视频| 欧美一区二区三区免费大片| 亚洲高清三级视频| 欧美一区二区免费| 最近中文字幕日韩精品 | 亚洲一区二区三区在线播放| 美女在线一区二区| 亚洲一区二区三区精品在线| 国产在线观看精品一区二区三区 | 猫咪成人在线观看| 亚洲私人影院在线观看| 葵司免费一区二区三区四区五区| 一区二区福利| 一区二区亚洲精品| 国产精品人成在线观看免费| 免费美女久久99| 亚洲免费一在线| 亚洲欧洲一区| 免费成人高清在线视频| 久久精品视频在线免费观看| 欧美成人精品在线| 亚洲欧美日韩精品| 亚洲免费av网站| 欧美福利视频网站| 久久久之久亚州精品露出|