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

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒(méi)有錢
隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
數(shù)據(jù)加載中……

linux下播放器設(shè)計(jì)和開(kāi)發(fā)

播放器設(shè)計(jì)與開(kāi)發(fā)  
轉(zhuǎn)載自http://hi.baidu.com/zhaozequan
kf701.ye@gmail.com 2008
本文根據(jù)DawnLightPlayer的開(kāi)發(fā)經(jīng)驗(yàn)寫成。DawnLithtPlayer是今天3月份開(kāi)始,和maddrone一起在業(yè)余時(shí)間開(kāi)發(fā)的一個(gè)跨平臺(tái),多線程的播放器,主要是在Linux下面開(kāi)發(fā)的,文中所用示例代碼均截自其中。
DawnLightPlayer目前可以運(yùn)行在Linux和Windows系統(tǒng)上,并使用VC和Python開(kāi)發(fā)了GUI,支持大部分的音視頻文件格式和網(wǎng)絡(luò)流,另外新增對(duì)CMMB協(xié)議的支持,不支持 RMVB, SWF 等尚未公開(kāi)協(xié)議的視頻文件格式。
目錄:
一. 播放器的流程
   1. 輸入
   2. 解碼
   3. 輸出
二. 播放器的實(shí)現(xiàn)
   1. 輸入實(shí)現(xiàn)
   2. 解碼線程實(shí)現(xiàn)
   3. 輸出線程實(shí)現(xiàn)
三. 視頻輸出庫(kù)
   1. SDL (多平臺(tái),支持硬件縮放)
   2. DirectX DirectDraw (win32平臺(tái),支持硬件縮放)
   3. OpenGL (多平臺(tái),支持硬件縮放)
   4. X11 (Linux/Unix)
   5. FrameBuffer (Linux, 無(wú)硬件縮放)
四. 音頻輸出
   1. OSS (Open Sound System for Linux)
   2. ALSA (Advanced Linux Sound Architecture)
   3. DirectSound (WIN32)
五. 音視頻同步
   1. 以音頻為基準(zhǔn)同步視頻
   2. 以視頻為基準(zhǔn)同步音頻
   3. 同步于一個(gè)外部時(shí)鐘
六. 截圖
   1. 使用jpeglib保存成jpeg文件
   2. 使用libpng保存成png文件
七. YUV RGB 軟件轉(zhuǎn)換
八. 軟件縮放
一. 播放器的流程
1. 輸入 : 從文件或網(wǎng)絡(luò)等讀取原數(shù)據(jù),如 x.avi, x.mov, rtsp://xxx, 對(duì)原數(shù)據(jù)進(jìn)行解析,比如文件,首先要分析文件格式,從文件中取得音視頻編碼參數(shù),視頻時(shí)間長(zhǎng)度等信息,然后要從其中取出音頻編碼數(shù)據(jù)和視頻編碼數(shù)據(jù)送到解 碼部分,這里暫稱這種編碼源數(shù)據(jù)塊為 packet。
2. 解碼 : 初始化時(shí),利用輸入端從源數(shù)據(jù)中取得的信息調(diào)用不同的解碼庫(kù)初始化;然后接收輸入端傳送來(lái)的音視頻編碼數(shù)據(jù),分別進(jìn)行音頻解碼和視頻解碼,視頻解碼出來(lái)的 數(shù)據(jù)一般是 YUV 或 RGB 數(shù)據(jù),這里暫稱為 picture, 音頻解碼出來(lái)的數(shù)據(jù)是采樣數(shù)據(jù),是聲卡可以播放的數(shù)據(jù),這里暫稱為 sample。 解碼所得的數(shù)據(jù)接下來(lái)送到輸出部分。
3. 輸出 : 接收解碼部分送來(lái)的 picture 和 sample 并顯示。 視頻顯示一般使用某個(gè)圖形庫(kù),如 SDL, Xlib, DirectDraw, OpengGL, FrameBuffer等, 音頻輸出是把 sample 寫入系統(tǒng)的音頻驅(qū)動(dòng),由音頻驅(qū)動(dòng)送入聲卡播放, 可用的音頻輸出有 ALSA, OSS, SDL, DirectSound, WaveOut等。
二. 播放器的實(shí)現(xiàn)
推薦實(shí)現(xiàn)方案
一個(gè)audio_packet隊(duì)列,一個(gè)video_packet隊(duì)列,一個(gè)picture隊(duì)列,一個(gè)sample隊(duì)列
一個(gè)input線程,兩個(gè)decode線程,兩個(gè)output線程,一個(gè)UI控制線程
1. 輸入實(shí)現(xiàn)
對(duì) 文件的解析,首先要了解文件的格式,文件格式一般稱為文件容器。公開(kāi)的文件格式,按格式協(xié)議讀取分析就可以了,但像RMVB,SWF這種目前還不公開(kāi)格式 的文件,就不好辦,也是目前一般播放器的困難。一般的文件格式的解析libavformat庫(kù)已經(jīng)做了,只要使用它就行,下面給出示例代碼段:
初始化:
static int avin_file_init(void)
{
    AVFormatParameters params, *ap = &params;
    err = av_open_input_file( &fmtctx, input_filename, NULL, 0, ap );
    if ( err < 0 )
    {
        av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);
        print_error( input_filename, err );
        return -1;
    }
    fmtctx->flags |= AVFMT_FLAG_GENPTS;
    err = av_find_stream_info( fmtctx );
    if ( err < 0 )
    {
        av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);
        print_error( input_filename, err );
        return -1;
    }
    if (fmtctx->pb) fmtctx->pb->eof_reached = 0;
    dump_format( fmtctx, 0, input_filename, 0 );
    ....
}
讀取packet:
while( 1 )
{
    AVPacket *pkt = NULL;
    pkt = av_malloc( sizeof(AVPacket) );
    ret = av_read_frame(fmtctx, pkt);
    
送出packet到解碼部分:
    可以memcpy, 或用LinkList結(jié)構(gòu)處理,如:
    push_to_video_packet_queue(pkt);
}
如果是自己的私有輸入,比如移動(dòng)電視的視頻輸入,代碼如下,部分是偽代碼:
while( 1 )
{
    your_parse_code();
    size = your_get_video_data(buf);
    pkt = av_mallocz( sizeof(AVPacket) );
    x = av_new_packet( pkt, vret);
    memcpy( pkt->data, buf, size );
    pkt->pts = your_time;
    push_to_video_packet_queue(pkt);
}
2. 解碼線程實(shí)現(xiàn)
解碼是個(gè)算法大課題,大多只能使用已有的解碼庫(kù),如libavcodec,下面示例代碼:
while ( 1 )
{
    AVPicture *picture;
    AVPacket *pkt = pop_from_video_packet_queue();
    AVFrame *frame = avcodec_alloc_frame();
    avcodec_decode_video(video_ctxp, frame, &got_picture, pkt->data, pkt->size);
    if ( got_picture )
    {
        convert_frame_to_picture( picture, frame );
        picture->pts = pkt->pts;
        push_to_picture_queue( picture );
    }
}
音頻雷同
3. 輸出線程實(shí)現(xiàn)
視 頻輸出要控制FPS,比如25幀每秒的視頻,那么每一幀的顯示時(shí)間要是1/25秒,但把一幀RGB數(shù)據(jù)寫入顯存用不了1/25秒的時(shí)間,那么就要控制,不 能讓25幀的數(shù)據(jù)在0.1或0.2秒的時(shí)間內(nèi)就顯示完了,最簡(jiǎn)單的實(shí)現(xiàn)是在每顯示一幀數(shù)據(jù)后,sleep( 1/fps - 顯示用去的時(shí)間 )。
音 視頻同步這個(gè)重要的工作也要在輸出線程里完成。以音頻為基準(zhǔn)同步視頻,以視頻為基準(zhǔn)同步音頻,或與一個(gè)外部時(shí)鐘同步,都是可行的方法,但以音頻為基準(zhǔn)同步 視頻是最簡(jiǎn)單也最有效的方法。音頻驅(qū)動(dòng)只要設(shè)置好sample rate, sample size 和 channels 后, write 數(shù)據(jù)就會(huì)以此恒定的速度播放, 如果驅(qū)動(dòng)的輸出 buffer 滿,則 write 就可以等待。
視頻:
while( 1 )
{
    picture = pop_from_picture_queue();
    picture_shot( picture ); /* 截圖 */
    vo->display( picture );
    video_pts = picture->pts;
    sync_with_audio(); /* 同步 */
    control_fps(); /* FPS */
}
音頻:
while( 1 )
{
    sample = pop_from_sample_queue();
    ao->play( sample );
    now_pts = sample->pts;
}
三. 視頻輸出庫(kù)
1. SDL (多平臺(tái),支持硬件縮放)
SDL(Simple DirectMedia Layer) is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
其實(shí)SDL就是一個(gè)中間件,它封裝了下層的OpenGL, FrameBuffer, X11, DirectX等給上層提供一個(gè)統(tǒng)一的API接口,使用SDL的優(yōu)點(diǎn)是我們不必再為X11或DirectX分別做個(gè)視頻輸出程序了。
SDL可以直接顯示YUV數(shù)據(jù)和RGB數(shù)據(jù),一般解碼得到的picture都是YUV420P格式的,不用做YUV2RGB的轉(zhuǎn)換就可以直接顯示,主要代碼如下:
static int vo_sdl_init(void)
{
    ....
    screen = SDL_SetVideoMode(ww, wh, 0, flags);
    overlay = SDL_CreateYUVOverlay(dw, dh, SDL_YV12_OVERLAY, screen);
   ....
}
static void vo_sdl_display(AVPicture *pict)
{
    SDL_Rect rect;
    AVPicture p;
    SDL_LockYUVOverlay(overlay);
    p.data[0] = overlay->pixels[0];
    p.data[1] = overlay->pixels[2];
    p.data[2] = overlay->pixels[1];
    p.linesize[0] = overlay->pitches[0];
    p.linesize[1] = overlay->pitches[2];
    p.linesize[2] = overlay->pitches[1];
    vo_sdl_sws( &p, pict ); /* only do memcpy */
    SDL_UnlockYUVOverlay(overlay);
    rect.x = dx;
    rect.y = dy;
    rect.w = dw;
    rect.h = dh;
    SDL_DisplayYUVOverlay(overlay, &rect);
}
2. DirectX DirectDraw (win32平臺(tái),支持硬件縮放)
DirectX是window上使用較多的一種輸出,也支持直接YUV或RGB顯示,示例代碼:
static int vo_dx_init(void)
{
    DxCreateWindow();
    DxInitDirectDraw();
    DxCreatePrimarySurface();
    DxCreateOverlay();
    DetectImgFormat();
}
static void vo_dx_display(AVPicture *pic)
{
    vfmt2rgb(my_pic, pic);
    memcpy( g_image, my_pic->data[0], my_pic->linesize[0] * height );
    flip_page();
}
3. OpenGL (多平臺(tái),支持硬件縮放)
OpenGL是3D游戲庫(kù),跨平臺(tái),效率高,支持大多數(shù)的顯示加速,顯示2D RGB數(shù)據(jù)只要使用glDrawPixels函數(shù)就足夠了,同時(shí)禁用一些OpenGL管線操作效率更高,如:
    glDisable( GL_SCISSOR_TEST );
    glDisable( GL_ALPHA_TEST );
    glDisable( GL_DEPTH_TEST );
    glDisable( GL_DITHER );
4. X11 (Linux/Unix)
X11 是Unix/Linux系統(tǒng)平臺(tái)上的基本圖形界面庫(kù),像普通的GTK,QT等主要都是建立在X11的基礎(chǔ)之上。但X11的API接口太多,復(fù)雜,很不利于 開(kāi)發(fā),基本的GUI程序一般都會(huì)使用GTK,QT等,不會(huì)直接調(diào)用X11的API,這里只是為了效率。MPlyaer的libvo里有X11的完整使用代 碼,包括全屏等功能。
static void vo_x11_display(AVPicture* pic)
{
    vfmt2rgb( my_pic, pic );
    Ximg->data = my_pic->data[0];
    XPutImage(Xdisplay, Xvowin, Xvogc, Ximg,
              0, 0, 0, 0, dw, dh);
    XSync(Xdisplay, False);
    XSync(Xdisplay, False);
}
5. FrameBuffer (Linux, 無(wú)硬件縮放)
FrameBuffer是Linux內(nèi)核的一部分,提供一個(gè)到顯存的存取地址的map,但沒(méi)有任何加速使用。
static void vo_fb_display(AVPicture *pic)
{
    int i;
    uint8_t *src, *dst = fbctxp->mem;
    vfmt2rgb( my_pic, pic );
    src = my_pic->data[0];
    for ( i = 0; i < fbctxp->dh; i++ )
    {
        memcpy( dst, src, fbctxp->dw * (fbctxp->varinfo.bits_per_pixel / 8) );
        dst += fbctxp->fixinfo.line_length;
        src += my_pic->linesize[0];
    }
}
四. 音頻輸出
1. OSS (Open Sound System for Linux)
OSS是Linux下面最簡(jiǎn)單的音頻輸出了,直接write就可以。
static int ao_oss_init(void)
{
    int i;
    dsp = open(dsp_dev, O_WRONLY);
    if ( dsp < 0 )
    {
        av_log(NULL, AV_LOG_ERROR, "open oss: %s\n", strerror(errno));
        return -1;
    }
    i = sample_rate;
    ioctl (dsp, SNDCTL_DSP_SPEED, &i);
    i = format2oss(sample_fmt);
    ioctl(dsp, SNDCTL_DSP_SETFMT, &i);
    i = channels;
    if ( i > 2 ) i = 2;
    ioctl(dsp, SNDCTL_DSP_CHANNELS, &i);
    return 0;
}
static void ao_oss_play(AVSample *s)
{
    write(dsp, s->data, s->size);
}
2. ALSA (Advanced Linux Sound Architecture)
ALSA做的比較失敗,長(zhǎng)長(zhǎng)的函數(shù)名。
static void ao_alsa_play(AVSample *s)
{
    int num_frames = s->size / bytes_per_sample;
    snd_pcm_sframes_t res = 0;
    uint8_t *data = s->data;
    if (!alsa_handle)
        return ;
    if (num_frames == 0)
        return ;
rewrite:
    res = snd_pcm_writei(alsa_handle, data, num_frames);
    if ( res == -EINTR )
        goto rewrite;
    if ( res < 0 )
    {
        snd_pcm_prepare(alsa_handle);
        goto rewrite;
    }
    if ( res < num_frames )
    {
        data += res * bytes_per_sample;
        num_frames -= res;
        goto rewrite;
    }
}
3. DirectSound (WIN32)
MS DirectX的一部分,它的缺點(diǎn)是不如Linux里面的OSS或ALSA那樣,在沒(méi)有sample寫入的時(shí)候,自動(dòng) silent,DirectSound在播放過(guò)程中,當(dāng)沒(méi)有sample數(shù)據(jù)送入輸出線程時(shí),它總是回放最后0.2或0.5秒的數(shù)據(jù)。由于只是最近移植 DawnLightPlayer才使用起Windows,不太了解其機(jī)制。
static void dsound_play(AVSample *s)
{
    int wlen, ret, len = s->size;
    uint8_t *data = s->data;
    while ( len > 0 )
    {
        wlen = dsound_getspace();
        if ( wlen > len ) wlen = len;
        ret = write_buffer(data, wlen);
        data += ret;
        len -= ret;
        usleep(10*1000);
    }
}
五. 音視頻同步
1. 以音頻為基準(zhǔn)同步視頻
視頻輸出線程中如下處理:
    start_time = now();
    ....
    vo->display( picture );
    last_video_pts = picture->pts;
    end_time = now();
    rest_time = end_time - start_time;
    av_diff = last_audio_pts - last_video_pts;
    if ( av_diff > 0.2 )
    {
        if ( av_diff < 0.5 ) rest_time -= rest_time / 4;
        else rest_time -= rest_time / 2;
    }
    else if ( av_diff < -0.2)
    {
        if ( av_diff > -0.5 ) rest_time += rest_time / 4;
        else rest_time += rest_time / 2;
    }
    if ( rest_time > 0 )
        usleep(rest_time);
2. 以視頻為基準(zhǔn)同步音頻
3. 同步于一個(gè)外部時(shí)鐘
六. 截圖
截圖可以在解碼線程做,也可以在輸出線程做,見(jiàn)前面的輸出線程部分。只要在display前把picture保存起來(lái)即可。一般加一些編碼,如保存成 PNG 或 JPEG 格式。
1. 使用jpeglib保存成jpeg文件
static void draw_jpeg(AVPicture *pic)
{
    char fname[128];
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPROW row_pointer[1];
    int row_stride;
    uint8_t *buffer;
    if ( !po_status )
        return ;
    vfmt2rgb24(my_pic, pic);
    buffer = my_pic->data[0];
#ifdef __MINGW32__
    sprintf(fname, "%s\\DLPShot-%d.jpg", get_save_path(), framenum++);
#else
    sprintf(fname, "%s/DLPShot-%d.jpg", get_save_path(), framenum++);
#endif
    fp = fopen (fname, "wb");
    if (fp == NULL)
    {
        av_log(NULL, AV_LOG_ERROR, "fopen %s error\n", fname);
        return;
    }
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo, fp);
    cinfo.image_width = width;
    cinfo.image_height = height;
    cinfo.input_components = 3;
    cinfo.in_color_space = JCS_RGB;
    jpeg_set_defaults(&cinfo);
    cinfo.write_JFIF_header = TRUE;
    cinfo.JFIF_major_version = 1;
    cinfo.JFIF_minor_version = 2;
    cinfo.density_unit = 1;
    cinfo.X_density = jpeg_dpi * width / width;
    cinfo.Y_density = jpeg_dpi * height / height;
    cinfo.write_Adobe_marker = TRUE;
    jpeg_set_quality(&cinfo, jpeg_quality, jpeg_baseline);
    cinfo.optimize_coding = jpeg_optimize;
    cinfo.smoothing_factor = jpeg_smooth;
    if ( jpeg_progressive_mode )
    {
        jpeg_simple_progression(&cinfo);
    }
    jpeg_start_compress(&cinfo, TRUE);
    row_stride = width * 3;
    while (cinfo.next_scanline < height)
    {
        row_pointer[0] = &buffer[cinfo.next_scanline * row_stride];
        (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }
    jpeg_finish_compress(&cinfo);
    fclose(fp);
    jpeg_destroy_compress(&cinfo);
    return ;
}
2. 使用libpng保存成png文件
static void draw_png(AVPicture *pic)
{
    int k;
    png_byte *row_pointers[height]; /* GCC C99 */
    if ( init_png() < 0 )
    {
        av_log(NULL, AV_LOG_ERROR, "draw_png: init png error\n");
        return ;
    }
    vfmt2rgb24( my_pic, pic );
    for ( k = 0; k < height; k++ )
        row_pointers[k] = my_pic->data[0] + my_pic->linesize[0] * k;
    png_write_image(png.png_ptr, row_pointers);
    destroy_png();
}
七. YUV RGB 轉(zhuǎn)換
YUV 與RGB的轉(zhuǎn)換和縮放,一般在低端設(shè)備上,要有硬件加速來(lái)做,否則CPU吃不消。在如今的高端PC上,可以使用軟件來(lái)做,libswscale庫(kù)正為此而 來(lái)。libswscale針對(duì)X86 CPU已經(jīng)做了優(yōu)化,如使用 MMX, SSE, 3DNOW 等 CPU 相關(guān)的多媒體指令。
static int vfmt2rgb(AVPicture *dst, AVPicture *src)
{
    static struct SwsContext *img_convert_ctx;
    img_convert_ctx = sws_getCachedContext(img_convert_ctx,
                      width, height, src_pic_fmt,
                      width, height, my_pic_fmt, SWS_X, NULL, NULL, NULL);
    sws_scale(img_convert_ctx, src->data, src->linesize,
              0, width, dst->data, dst->linesize);
    return 0;
}
比如從 YUV420P 到 RGB24 的轉(zhuǎn)換,只要設(shè)置
src_pic_fmt = PIX_FMT_YUV420P ;
my_pic_fmt = PIX_FMT_RGB24 ;
八. 軟件縮放
軟件縮放就可以使用上述的 libswscale 庫(kù),調(diào)用代碼基本一樣,只是改一下目標(biāo)picture的width和height,如放大兩倍:
static int zoom_2(AVPicture *dst, AVPicture *src)
{
    static struct SwsContext *img_convert_ctx;
    img_convert_ctx = sws_getCachedContext(img_convert_ctx,
                      width, height, src_pic_fmt,
                      width*2, height*2, my_pic_fmt, SWS_X, NULL, NULL, NULL);
    sws_scale(img_convert_ctx, src->data, src->linesize,
              0, width*2, dst->data, dst->linesize);
    return 0;
}

posted on 2013-03-24 13:36 Khan 閱讀(2095) 評(píng)論(1)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開(kāi)發(fā)

評(píng)論

# re: linux下播放器設(shè)計(jì)和開(kāi)發(fā)  回復(fù)  更多評(píng)論   

好東西
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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成人网| 欧美午夜在线观看| 欧美激情久久久| 国产一区视频网站| 一区二区三区视频在线| 亚洲国产精品悠悠久久琪琪| 亚洲综合色自拍一区| 一区二区三区视频在线播放| 久久久精品tv| 久久精品夜色噜噜亚洲a∨| 欧美日韩一区三区四区| 欧美激情一区二区三区全黄| 国产综合自拍| 欧美一区二区三区的| 亚洲欧美成人综合| 国产精品99久久久久久人| 美女精品在线观看| 久久综合九色综合欧美就去吻| 国产欧美一级| 午夜精品久久久久久久| 午夜久久久久久| 国产精品久久久久久av福利软件| 亚洲另类自拍| 一区二区三区精品视频在线观看| 欧美激情1区2区| 亚洲第一毛片| 亚洲黄色一区| 99国产一区| 一区二区毛片| 亚洲精品国产精品国自产在线| 国产精品一区毛片| 欧美日韩国产小视频在线观看| 久久精品国产亚洲a| 在线中文字幕日韩| 在线亚洲自拍| 亚洲精品字幕| 亚洲免费成人av电影| 99国产精品99久久久久久| 欧美一区网站| 亚洲欧美综合网| 国产伦精品一区二区三区免费迷 | 亚洲精品一级| 亚洲欧美日本精品| 欧美视频免费看| 亚洲婷婷国产精品电影人久久| 中国成人在线视频| 国产精品日日做人人爱| 午夜久久电影网| 美女久久网站| 一区二区三区日韩欧美精品| 国产精品老牛| 久久精品中文字幕免费mv| 亚洲国产经典视频| 亚洲视频免费| 国产日韩欧美综合在线| 久久综合国产精品| 一区二区三区精品| 久久亚洲一区二区三区四区| 亚洲欧洲日本mm| 国产精品第一页第二页第三页| 欧美在线你懂的| 亚洲肉体裸体xxxx137| 亚洲免费在线视频一区 二区| 亚洲欧美视频| 久久夜色精品国产噜噜av| 影音先锋久久| 欧美日韩精品欧美日韩精品一| 亚洲天堂免费在线观看视频| 免费成人毛片| 亚洲制服av| 亚洲国产成人久久| 国产精品久久综合| 免费在线观看成人av| 亚洲综合精品| 亚洲人午夜精品| 久久天堂成人| 亚洲午夜av| 亚洲激情第一区| 国产一区二区精品久久91| 欧美精品 国产精品| 欧美专区在线播放| 亚洲无线观看| 亚洲激情网站| 女仆av观看一区| 久久国产精品99国产| 一本一本大道香蕉久在线精品| 欧美成年网站| 亚洲一区二区免费在线| 亚洲福利视频专区| 久久综合色婷婷| 欧美在线视频在线播放完整版免费观看 | 欧美大片在线看免费观看| 性欧美办公室18xxxxhd| 夜夜嗨一区二区三区| 在线免费观看日本一区| 国产一区二区黄色| 国产亚洲女人久久久久毛片| 欧美日韩一区三区| 欧美激情一区二区三区在线视频观看| 久久久久久一区二区| 欧美一站二站| 久久成人免费| 欧美呦呦网站| 久久精品99国产精品日本| 亚洲欧美在线观看| 亚洲永久免费av| 亚洲永久在线| 午夜精品国产精品大乳美女| 亚洲一区二区三区精品在线观看| 在线视频日韩| 亚洲天堂男人| 亚洲欧美综合国产精品一区| 亚洲欧美日韩中文在线制服| 亚洲综合第一页| 欧美一级播放| 久久天天躁狠狠躁夜夜爽蜜月| 久久激情综合网| 久久蜜桃资源一区二区老牛| 免费成人黄色av| 欧美极品欧美精品欧美视频| 欧美精品一区二区三区一线天视频| 欧美久久99| 欧美视频一区二区| 国产欧美精品日韩| 激情国产一区二区| 亚洲精一区二区三区| 一区二区成人精品| 西西人体一区二区| 另类国产ts人妖高潮视频| 欧美激情一级片一区二区| 亚洲美女在线视频| 亚洲主播在线| 久久国产综合精品| 欧美精品激情| 国产精品视频不卡| 1000部国产精品成人观看| 最新中文字幕一区二区三区| 亚洲网站在线| 久久精品国产清高在天天线| 欧美黄色网络| 这里只有精品视频| 久久久亚洲影院你懂的| 欧美区日韩区| 国产视频一区二区在线观看| 亚洲激情第一区| 欧美在线短视频| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲视频福利| 另类春色校园亚洲| 国产精品国产亚洲精品看不卡15 | 国产欧美日本一区视频| 在线精品国精品国产尤物884a| 在线亚洲一区观看| 久久亚洲视频| 亚洲色诱最新| 欧美fxxxxxx另类| 国产欧美日韩免费| 99国产精品国产精品毛片| 久久蜜桃精品| 亚洲视频一区二区免费在线观看| 久久久综合免费视频| 国产精品s色| 亚洲精品中文字| 久久久午夜精品| 亚洲性感激情| 欧美精品1区2区3区| 精品成人在线视频| 午夜精品一区二区三区在线视| 欧美日韩综合在线| 久久精品国产第一区二区三区最新章节| 免费91麻豆精品国产自产在线观看| 欧美亚州韩日在线看免费版国语版| 激情综合激情| 亚洲欧美日本视频在线观看| 亚洲国产成人精品女人久久久 | 91久久午夜| 久久久久成人网| 国产午夜精品理论片a级探花| 在线视频欧美精品| 亚洲国产欧美国产综合一区| 久久久久久黄| 国产色产综合产在线视频| 亚洲欧美成人精品| 99这里有精品| 欧美三级视频在线| 国产精品99久久久久久久久| 亚洲福利久久| 欧美成年人网站| 亚洲精品国产视频| 亚洲国产另类久久精品| 免费看的黄色欧美网站| 亚洲国产一区二区三区在线播| 美女91精品| 久久中文精品| 亚洲国产高清aⅴ视频| 免费一级欧美片在线播放| 久久人体大胆视频|