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

隨筆-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) 閱讀(2773) 評論(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>
            91久久综合| 久久综合色天天久久综合图片| 欧美一区二区免费| 在线天堂一区av电影| 宅男在线国产精品| 欧美一区二区大片| 免费观看久久久4p| 亚洲国产成人久久综合| 欧美成人一区二区三区片免费| 欧美sm视频| av72成人在线| 午夜精品福利一区二区蜜股av| 欧美一区二区视频在线观看2020| 久久久久久久91| 欧美日韩成人综合在线一区二区| 国产精品久久久一区二区三区| 国产日韩精品在线播放| 在线视频观看日韩| 亚洲小说欧美另类社区| 久久视频在线看| 亚洲精品影院| 久久另类ts人妖一区二区| 欧美久久综合| 韩国一区二区三区美女美女秀| 在线看日韩欧美| 午夜一区二区三区不卡视频| 欧美成人一区二区在线| 亚洲专区免费| 欧美精品久久一区二区| 国产日韩精品一区二区| 99国产精品久久久久久久久久| 久久成人综合视频| 9久re热视频在线精品| 久久久久久精| 国产日韩欧美自拍| 亚洲一区在线直播| 91久久精品国产91久久性色| 欧美淫片网站| 国产精品色婷婷久久58| av不卡在线| 欧美激情小视频| 久久大香伊蕉在人线观看热2| 欧美日韩日本国产亚洲在线| 亚洲国产精品视频一区| 久久久91精品国产一区二区精品| 亚洲美女电影在线| 欧美成人久久| 亚洲黄页一区| 欧美承认网站| 久久综合精品国产一区二区三区| 国产美女一区| 欧美一区二区三区精品| 久久精品成人一区二区三区| 亚洲精品一区在线观看香蕉| 欧美18av| 亚洲福利一区| 久久伊人精品天天| 久久精品免费播放| 精品成人乱色一区二区| 久久美女性网| 久久天天狠狠| 亚洲精选一区二区| 日韩图片一区| 国产精品久久久久久久免费软件 | 一区二区欧美激情| 91久久嫩草影院一区二区| 女同性一区二区三区人了人一| 狠狠色狠狠色综合系列| 麻豆精品在线播放| 模特精品裸拍一区| 一区二区福利| 亚洲一区二区三区精品在线| 国产精品素人视频| 久久人人爽人人爽| 久久午夜电影| 日韩视频免费| 亚洲色图自拍| 狠狠色伊人亚洲综合网站色| 欧美+日本+国产+在线a∨观看| 男女激情视频一区| 亚洲免费网址| 久久久久久成人| 一区二区毛片| 午夜亚洲性色视频| 亚洲欧洲免费视频| 亚洲一区二区三区精品动漫| 韩国v欧美v日本v亚洲v| 亚洲国产一区二区三区在线播| 欧美激情一二三区| 欧美一区二区精品| 久久青草欧美一区二区三区| 99精品久久| 欧美主播一区二区三区美女 久久精品人| 黄色资源网久久资源365| 91久久久在线| 国产亚洲欧洲| 亚洲精品在线观看视频| 国产一区二区精品久久| 亚洲精选91| 伊人一区二区三区久久精品| 日韩视频免费在线| 黄色欧美成人| 亚洲男人影院| 在线视频亚洲| 欧美成人午夜激情在线| 久久久999| 国产精品麻豆va在线播放| 欧美激情一区三区| 国内精品久久国产| 中文国产成人精品久久一| 亚洲激情视频在线播放| 最新成人av网站| 亚洲网址在线| 国内精品久久久久久| 夜夜躁日日躁狠狠久久88av| 在线观看精品视频| 欧美在线91| 新67194成人永久网站| 欧美连裤袜在线视频| 欧美激情久久久| 狠狠色狠狠色综合人人| 亚欧成人精品| 久久不射电影网| 国产精品黄页免费高清在线观看| 亚洲国产另类久久精品| 亚洲成人中文| 久久一区精品| 欧美 日韩 国产 一区| 伊人色综合久久天天| 久久精品一区二区三区不卡| 久久国产主播精品| 国产亚洲aⅴaaaaaa毛片| 亚洲小少妇裸体bbw| 亚洲影院在线| 国产精品久久久久免费a∨| 一区二区三区欧美亚洲| 亚洲一区久久久| 国产精品免费网站在线观看| 亚洲视频一区| 久久国内精品视频| 永久域名在线精品| 男男成人高潮片免费网站| 欧美激情影音先锋| 中文国产成人精品久久一| 欧美视频在线观看 亚洲欧| 中文国产成人精品| 久久久久久一区二区| 尤物yw午夜国产精品视频| 玖玖玖国产精品| 亚洲精品一二| 午夜免费在线观看精品视频| 国产午夜久久| 久久综合电影| 99re视频这里只有精品| 欧美一区二区三区日韩| 精品成人一区二区三区| 欧美mv日韩mv国产网站app| 亚洲精选一区| 久久精品人人做人人爽电影蜜月| 国产一区二区三区高清| 久久亚洲欧美国产精品乐播| 亚洲人在线视频| 欧美一区二区三区在线免费观看 | 亚洲电影免费观看高清完整版在线观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产精品综合| 午夜一区二区三区不卡视频| 国内精品久久久| 欧美伦理a级免费电影| 欧美亚洲网站| 亚洲精品国产品国语在线app| 欧美一区二区成人| 亚洲乱码国产乱码精品精天堂| 国产精品久久久久久久久果冻传媒 | 亚洲春色另类小说| 国产精品av免费在线观看| 久久精品国产99精品国产亚洲性色 | 亚洲欧洲精品成人久久奇米网| 欧美日韩国产成人在线| 性欧美办公室18xxxxhd| 亚洲国产精品尤物yw在线观看 | 国产一区二区三区奇米久涩| 欧美成年人视频| 性欧美xxxx大乳国产app| 亚洲高清资源综合久久精品| 久久精品国产视频| 亚洲视频综合| 亚洲精品免费在线观看| 国产午夜精品一区二区三区视频| 欧美日本在线观看| 麻豆精品在线视频| 久久久99精品免费观看不卡| 一区二区三区国产| 亚洲人成77777在线观看网| 裸体女人亚洲精品一区| 久久精品72免费观看| 午夜精品福利视频| 亚洲一级在线| 亚洲一区999| 亚洲伊人伊色伊影伊综合网 |