亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mpeg2pmt.c

?? Sun公司Dream項目
?? C
字號:
/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License").  You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * http://www.opensource.org/licenses/cddl1.php
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * http://www.opensource.org/licenses/cddl1.php.  If 
 * applicable, add the following below this CDDL HEADER, 
 * with the fields enclosed by brackets "[]" replaced 
 * with your own identifying information: 
 * Portions Copyright [yyyy]
 * [name of copyright owner]
 */ 

/*
 * $(@)Mpeg2Pmt.c $Revision: 1.2 $ $Date: 2006/07/15 00:02:38 $
 * 
 * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
 */
/*
 * Copyright (c) 1996 by Sun Microsystems, Inc.
 */

/*
 * MPEG2 program map table parser
 */

#pragma ident "@(#)Mpeg2Pmt.c 1.1	96/09/18 SMI"

#include <string.h>
#include <stdlib.h>

#include "cobjs/HashTable.h"
#include "cobjs/Log.h"
#include "cobjs/Macros.h"
#include "cobjs/Types.h"
#include "cobjs/RetCode.h"

#include "mmp/Mmp.h"
#include "mmp/Pipe.h"

#include "mmp/Mpeg2Pmt.h"

#define	MPEG2_PMT_MAX_CHUNK		256
#define	MPEG2_PMT_SIZE			10
#define	MPEG2_PMT_FACTOR		0.9

struct _Mpeg2Pmt {
    MmpParserObject    *streamTypeToPop[MPEG2_PMT_STREAM_TYPE_MAX + 1];
    Mpeg2PmtCallBack    callBack;
    void               *token;
    Boolean             isStrict:1;
    Boolean             shouldPmtStop:1;
    HashTable           pmtTable[2];
    MmpParserObject     po;
    Boolean		isDirty;
};

static size_t       mpeg2PmtMaxChunk(void *instp);

static RetCode
mpeg2PmtParse(void *instp, MmpContextObject *cop,
	      Pipe pipe);

static void         mpeg2PmtRecover(void *instp);

static RetCode
mpeg2PmtActivate(Mpeg2Pmt mpeg2Pmt, MmpContextObject *cop,
		 Mpeg2PmtTsProgramMapSection * pmsp);

static void
mpeg2PmtDeactivate(Mpeg2Pmt mpeg2Pmt, unsigned pn,
		   Mpeg2PmtCurrentNextIndicator cni);

static RetCode      mpeg2PmtGetDesc(Pipe pipe, Mpeg2PmtDescriptor ***descppp);

static RetCode
mpeg2PmtGetStreamDesc(Pipe pipe,
		      Mpeg2PmtStream ***streamppp);

static void         mpeg2PmtDescListFree(Mpeg2PmtDescriptor *descp);
static void         mpeg2PmtStreamListFree(Mpeg2PmtStream *streamp);

static RetCodeTable mpeg2PmtErrorTable[] = {
    {MPEG2_PMT_ERROR_SSI, NULL, "section syntax indicator not set"},
    {MPEG2_PMT_ERROR_SN, NULL, "(last) section number != 0"},
    {MPEG2_PMT_ERROR_PIL_LEN, NULL, "program info length error"},
    {MPEG2_PMT_ERROR_LEN, NULL, "pmt length error"},
    {MPEG2_PMT_ERROR_CRC, NULL, "crc error"},
    {MPEG2_PMT_ERROR_STOP, NULL, "stop on pmt found"},
    {MPEG2_PMT_ERROR_PID_USE, NULL, "pid use conflict"},
    {MPEG2_PMT_ERROR_EOF, NULL, "unexpected eof"},
    {0, NULL, NULL}
};

static RetCodeId    retCodeId;

Mpeg2Pmt
mpeg2PmtNew(void)
{
    Mpeg2Pmt            mpeg2Pmt;

    if (retCodeId == 0) {
	retCodeId = retCodeRegisterWithTable(MPEG2PMT_CLASSNAME,
					     mpeg2PmtErrorTable);
    }
    mpeg2Pmt = NEW_ZEROED(struct _Mpeg2Pmt, 1);

    mpeg2Pmt->pmtTable[0] = hashTableIntNewWithSizeAndFactor(MPEG2_PMT_SIZE,
							  MPEG2_PMT_FACTOR);
    mpeg2Pmt->pmtTable[1] = hashTableIntNewWithSizeAndFactor(MPEG2_PMT_SIZE,
							  MPEG2_PMT_FACTOR);

    mpeg2Pmt->po.maxChunk = mpeg2PmtMaxChunk;
    mpeg2Pmt->po.recognize = NULL;
    mpeg2Pmt->po.parse = mpeg2PmtParse;
    mpeg2Pmt->po.recover = mpeg2PmtRecover;
    mpeg2Pmt->po.instp = mpeg2Pmt;

    return mpeg2Pmt;
}

void
mpeg2PmtSetPesParsers(Mpeg2Pmt mpeg2Pmt,
	    MmpParserObject *streamTypeToPop[MPEG2_PMT_STREAM_TYPE_MAX + 1])
{
    mpeg2PmtRecover(mpeg2Pmt);
    (void) memcpy(mpeg2Pmt->streamTypeToPop, streamTypeToPop,
	          sizeof(mpeg2Pmt->streamTypeToPop));
}

MmpParserObject    *
mpeg2PmtParserObject(Mpeg2Pmt mpeg2Pmt)
{
    return &mpeg2Pmt->po;
}

void
mpeg2PmtSetCallBack(Mpeg2Pmt mpeg2Pmt, Mpeg2PmtCallBack callBack, void *token)
{
    mpeg2Pmt->callBack = callBack;
    mpeg2Pmt->token = token;
}

void
mpeg2PmtSetStrict(Mpeg2Pmt mpeg2Pmt, Boolean isStrict)
{
    mpeg2Pmt->isStrict = isStrict;
}

Boolean
mpeg2PmtGetStrict(Mpeg2Pmt mpeg2Pmt)
{
    return mpeg2Pmt->isStrict;
}

void
mpeg2PmtSetPmtStop(Mpeg2Pmt mpeg2Pmt, Boolean shouldPmtStop)
{
    mpeg2Pmt->shouldPmtStop = shouldPmtStop;
}

Boolean
mpeg2PmtGetPmtStop(Mpeg2Pmt mpeg2Pmt)
{
    return mpeg2Pmt->shouldPmtStop;
}

Mpeg2PmtStatus
mpeg2PmtStatus(Mpeg2Pmt mpeg2Pmt)
{
    Mpeg2PmtStatus      pmtStatus;

    pmtStatus.pmtTable[0] = mpeg2Pmt->pmtTable[0];
    pmtStatus.pmtTable[1] = mpeg2Pmt->pmtTable[1];
    return pmtStatus;
}

void
mpeg2PmtFree(Mpeg2Pmt mpeg2Pmt)
{
    int                 cni;

    mpeg2PmtRecover(mpeg2Pmt);
    for (cni = 0; cni < NELEM(mpeg2Pmt->pmtTable); cni++) {
	ASSERT(hashTableUsed(mpeg2Pmt->pmtTable[cni]) == 0);
	hashTableFree(mpeg2Pmt->pmtTable[cni]);
	mpeg2Pmt->pmtTable[cni] = NULL;
    }
    free(mpeg2Pmt);
}

/* ARGSUSED */
static size_t
mpeg2PmtMaxChunk(void *instp)
{
    return MPEG2_PMT_MAX_CHUNK;
}

static RetCode
mpeg2PmtParse(void *instp, MmpContextObject *cop, Pipe pipe)
{
    Mpeg2Pmt            mpeg2Pmt = (Mpeg2Pmt) instp;
    Mpeg2PmtInfo        info;
    Mpeg2PmtInfo       *infop = &info;
    Mpeg2PmtTsProgramMapSection *pmsp = &infop->tsProgramMapSection;
    PipePosition        pmtEnd;
    RetCode             retCode;
    Mpeg2PmtDescriptor **descListEndpp;
    Mpeg2PmtStream    **streamListEndpp;
    unsigned            pil;
    PipePosition        descEndPos;

    mpeg2Pmt->isDirty = TRUE;
    (void) memset(infop, 0, sizeof(*infop));

    infop->position = pipePosition(pipe);
    pmtEnd = pipeRelativePosition(pipe);
    pmsp->psiHeader = *PIPE_GET(pipe, Mpeg2PsiHeader);
    if (!pmsp->psiHeader.sectionSyntaxIndicator) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_SSI);
	goto error;
    }
    pmsp->psiExtension = *PIPE_GET(pipe, Mpeg2PsiExtension);

    if (pmsp->psiExtension.sectionNumber != 0
	    || pmsp->psiExtension.lastSectionNumber != 0) {
	if (mpeg2Pmt->isStrict) {
	    return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_SN);
	}
    }
    pmtEnd += MPEG2_PSI_HEADER_SECTION_LENGTH(&pmsp->psiHeader)
      + sizeof(Mpeg2PsiHeader);

    /*
     * NOTE: pmt has only a single section. Because of this, we don't mess
     * with next->current "promotion" (although we do maintain both current
     * and next tables).
     */
    pmsp->pmtHeader = *PIPE_GET(pipe, Mpeg2PmtHeader);
    pmsp->descList = NULL;
    pmsp->streamList = NULL;
    pil = MPEG2_PMT_HEADER_PROGRAM_INFO_LENGTH(&pmsp->pmtHeader);
    descEndPos = pipeRelativePosition(pipe) + pil;
    if (descEndPos > pmtEnd) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_PIL_LEN);
	goto error;
    }
    /*
     * Becareful to avoid pipe detected unexpected eof's, that would keep us
     * from freeing the streams and descriptors allocated here.
     */
    descListEndpp = &pmsp->descList;
    while (pipeRelativePosition(pipe) < descEndPos) {
	if ((retCode = mpeg2PmtGetDesc(pipe, &descListEndpp))
		!= RETCODE_SUCCESS) {
	    goto error;
	}
    }
    if (pipeRelativePosition(pipe) != descEndPos) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_PIL_LEN);
	goto error;
    }
    streamListEndpp = &pmsp->streamList;
    while (pipeRelativePosition(pipe) + 4 < pmtEnd) {
	if ((retCode = mpeg2PmtGetStreamDesc(pipe, &streamListEndpp))
		!= RETCODE_SUCCESS) {
	    goto error;
	}
    }
    if (pmtEnd - pipeRelativePosition(pipe) != 4) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_LEN);
	goto error;
    }
    if (!PIPE_IS_AVAIL(pipe, u32)) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_EOF);
	goto error;
    }
    /*
     * FIXME: Do this the normal way with 4 bytes?
     */
    pmsp->crc = pipeGetBits(pipe, 32);
    if (pipeCrcGet(pipe) != 0) {
	retCode = RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_CRC);
	goto error;
    }
    if (mpeg2Pmt->callBack != NULL) {
	retCode = (*mpeg2Pmt->callBack) (mpeg2Pmt->token, infop,
					 RETCODE_SUCCESS);
	if (retCode != RETCODE_SUCCESS) {
	    return retCode;
	}
    }
    return mpeg2PmtActivate(mpeg2Pmt, cop, pmsp);

error:
    if (mpeg2Pmt->callBack != NULL) {
	(void) (*mpeg2Pmt->callBack) (mpeg2Pmt->token, infop, retCode);
    }
    mpeg2PmtDescListFree(pmsp->descList);
    mpeg2PmtStreamListFree(pmsp->streamList);
    return retCode;
}

static void
mpeg2PmtRecover(void *instp)
{
    Mpeg2Pmt            mpeg2Pmt = (Mpeg2Pmt) instp;
    int                 cni;
    int                 pmtCount;
    HashItem           *pmtItems;
    int                 i;

    if (! mpeg2Pmt->isDirty) {
	return;
    }
    mpeg2Pmt->isDirty = FALSE;
    for (cni = 0; cni < NELEM(mpeg2Pmt->pmtTable); cni++) {
	pmtCount = hashTableUsed(mpeg2Pmt->pmtTable[cni]);
	pmtItems = hashTableDump(mpeg2Pmt->pmtTable[cni]);
	for (i = 0; i < pmtCount; i++) {
	    mpeg2PmtDeactivate(mpeg2Pmt, (int) pmtItems[i].key, (Mpeg2PmtCurrentNextIndicator)cni);
	}
	free(pmtItems);
    }
}

static RetCode
mpeg2PmtActivate(Mpeg2Pmt mpeg2Pmt, MmpContextObject *cop,
		 Mpeg2PmtTsProgramMapSection * pmsp)
{
    Mpeg2PmtStream     *streamp;
    Mpeg2PmtTsProgramMapSection *curPmsp;
    Mpeg2PmtCurrentNextIndicator cni;
    unsigned            pn;

    cni = Mpeg2PmtCurrentNextIndicator(pmsp->psiExtension.currentNextIndicator);
    pn = MPEG2_PMT_PROGRAM_NUMBER(&pmsp->psiExtension);

    curPmsp = (Mpeg2PmtTsProgramMapSection*)hashTableGet(mpeg2Pmt->pmtTable[cni], pn);

    if (curPmsp == NULL
	    || curPmsp->psiExtension.versionNumber
	    != pmsp->psiExtension.versionNumber) {
	mpeg2PmtDeactivate(mpeg2Pmt, pn, cni);
	(void) hashTablePut(mpeg2Pmt->pmtTable[cni], pn,
			DUP(Mpeg2PmtTsProgramMapSection, pmsp));
	if (mpeg2Pmt->shouldPmtStop) {
	    return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_STOP);
	}
	for (streamp = pmsp->streamList;
		streamp != NULL; streamp = streamp->next) {
	    unsigned            streamType = streamp->streamHeader.streamType;
	    unsigned            ePid = MPEG2_PMT_STREAM_HEADER_ELEMENTARY_PID(
						    &streamp->streamHeader);
	    Pipe                pidPipe;

	    if (MMP_CONTEXT_PIDTOPIPE(cop, ePid) == NULL) {
		MmpParserObject    *pop = mpeg2Pmt->streamTypeToPop[streamType];
		RetCode             retCode;

		streamp->cop = cop;
		pidPipe = MMP_PARSER_NEWPIPE(pop, cop);
		retCode = MMP_CONTEXT_ADDPIPE(cop, ePid, pidPipe);
		ABORT_IF_FALSE(retCode == RETCODE_SUCCESS);
	    } else if (streamp->cop != cop) {
		return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_PID_USE);
	    }
	}
    } else {
	mpeg2PmtDescListFree(pmsp->descList);
	mpeg2PmtStreamListFree(pmsp->streamList);
    }
    return RETCODE_SUCCESS;
}

static void
mpeg2PmtDeactivate(Mpeg2Pmt mpeg2Pmt, unsigned pn,
		   Mpeg2PmtCurrentNextIndicator cni)
{
    Mpeg2PmtTsProgramMapSection *pmsp;
    Mpeg2PmtStream     *streamp;

    pmsp = (Mpeg2PmtTsProgramMapSection*) hashTableRemove(mpeg2Pmt->pmtTable[cni], pn);

    if (pmsp != NULL) {
	for (streamp = pmsp->streamList;
		streamp != NULL; streamp = streamp->next) {
	    unsigned            ePid = MPEG2_PMT_STREAM_HEADER_ELEMENTARY_PID(
						    &streamp->streamHeader);

	    (void) MMP_CONTEXT_DELETEPIPE(streamp->cop, ePid);
	}
	mpeg2PmtDescListFree(pmsp->descList);
	mpeg2PmtStreamListFree(pmsp->streamList);
	free(pmsp);
    }
}

static RetCode
mpeg2PmtGetDesc(Pipe pipe, Mpeg2PmtDescriptor ***descppp)
{
    Mpeg2PmtDescriptor *newDescp;

    if (!pipeIsAvail(pipe, 2)) {
	return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_EOF);
    }
    newDescp = NEW_ZEROED(Mpeg2PmtDescriptor, 1);
    newDescp->descriptor.descriptorTag = *PIPE_GET(pipe, u8);
    newDescp->descriptor.descriptorLen = *PIPE_GET(pipe, u8);
    if (!pipeIsAvail(pipe, newDescp->descriptor.descriptorLen)) {
	free(newDescp);
	return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_EOF);
    }
    (void) memcpy(newDescp->descriptor.un.descriptor,
		  pipeGet(pipe, newDescp->descriptor.descriptorLen),
		  newDescp->descriptor.descriptorLen);

    **descppp = newDescp;
    *descppp = &newDescp->next;
    return RETCODE_SUCCESS;
}

static RetCode
mpeg2PmtGetStreamDesc(Pipe pipe, Mpeg2PmtStream ***streamppp)
{
    Mpeg2PmtStream     *newStrp;
    Mpeg2PmtDescriptor **descListEndpp;
    PipePosition        descEndPos;
    RetCode             retCode = RETCODE_SUCCESS;

    if (!PIPE_IS_AVAIL(pipe, Mpeg2PmtStreamHeader)) {
	return RETCODE_CONS(retCodeId, MPEG2_PMT_ERROR_EOF);
    }
    newStrp = NEW_ZEROED(Mpeg2PmtStream, 1);
    newStrp->streamHeader = *PIPE_GET(pipe, Mpeg2PmtStreamHeader);
    descEndPos = pipeRelativePosition(pipe)
      + MPEG2_PMT_STREAM_HEADER_ES_INFO_LENGTH(&newStrp->streamHeader);
    descListEndpp = &newStrp->descList;
    while (pipeRelativePosition(pipe) < descEndPos) {
	if ((retCode = mpeg2PmtGetDesc(pipe, &descListEndpp))
		!= RETCODE_SUCCESS) {
	    break;
	}
    }
    **streamppp = newStrp;
    *streamppp = &newStrp->next;
    return retCode;
}

static void
mpeg2PmtDescListFree(Mpeg2PmtDescriptor *descp)
{
    Mpeg2PmtDescriptor *nextDescp;

    for (; descp != NULL; descp = nextDescp) {
	nextDescp = descp->next;
	free(descp);
    }
}

static void
mpeg2PmtStreamListFree(Mpeg2PmtStream *streamp)
{
    Mpeg2PmtStream     *nextStreamp;

    for (; streamp != NULL; streamp = nextStreamp) {
	nextStreamp = streamp->next;
	mpeg2PmtDescListFree(streamp->descList);
	free(streamp);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产午夜精品| 色就色 综合激情| 日韩精品欧美精品| 亚洲gay无套男同| 亚洲裸体xxx| 亚洲精品水蜜桃| 亚洲老妇xxxxxx| 亚洲自拍欧美精品| 亚洲与欧洲av电影| 亚洲福利一二三区| 天天综合网天天综合色| 亚洲国产精品麻豆| 日韩不卡一二三区| 免费成人av在线播放| 捆绑调教一区二区三区| 精品一区二区国语对白| 国产一区二区视频在线| 粉嫩高潮美女一区二区三区 | 91免费观看国产| 成人高清av在线| 在线观看免费亚洲| 欧美精品国产精品| 久久无码av三级| 国产精品色噜噜| 亚洲欧美日韩国产综合| 亚洲一区二区美女| 久久国产精品99精品国产| 国产馆精品极品| 91极品视觉盛宴| 91精品欧美福利在线观看 | 日韩国产在线一| 激情小说亚洲一区| 99在线精品观看| 日韩一区二区麻豆国产| 国产精品色哟哟| 免费成人小视频| 色综合激情久久| 久久综合久久鬼色中文字| 亚洲精品一卡二卡| 国内精品国产成人| 欧美日韩免费高清一区色橹橹 | 亚洲国产精品久久久男人的天堂| 久久se精品一区精品二区| 日韩中文字幕91| 成人国产视频在线观看| 欧美久久久久久久久久| 国产欧美视频一区二区| 精品国产亚洲一区二区三区在线观看| 久久久一区二区| 日本中文字幕一区二区视频| 国内欧美视频一区二区| 日本韩国精品一区二区在线观看| 99vv1com这只有精品| 色综合久久久久综合体 | 亚洲精品少妇30p| 蜜桃一区二区三区在线观看| 丰满亚洲少妇av| 欧美日韩在线观看一区二区 | 91精品麻豆日日躁夜夜躁| 精品国产伦一区二区三区免费| 国产精品护士白丝一区av| 日韩av一区二区三区四区| eeuss国产一区二区三区| 91精品视频网| 亚洲欧美另类小说| 天天色天天爱天天射综合| 在线欧美小视频| 国产女主播一区| 五月婷婷综合在线| av色综合久久天堂av综合| 日韩欧美一级特黄在线播放| 亚洲精品免费电影| 成人午夜电影小说| 日韩免费成人网| 亚洲国产欧美日韩另类综合| 国产综合久久久久久鬼色| 91一区二区三区在线播放| 精品日韩一区二区三区| 视频一区二区国产| 91精品福利视频| 日韩一区在线看| 大胆亚洲人体视频| 国产亚洲精品bt天堂精选| 男女性色大片免费观看一区二区| 欧美亚洲日本一区| 亚洲欧洲av在线| 国产电影精品久久禁18| 日韩精品一区二区在线观看| 日韩av一级电影| 91麻豆精品国产91久久久久久久久 | 琪琪久久久久日韩精品| 欧美午夜一区二区三区| 亚洲男人的天堂网| 在线看不卡av| 亚洲精品乱码久久久久久| 91欧美激情一区二区三区成人| 国产精品国模大尺度视频| 成人动漫一区二区在线| 欧美高清在线视频| 91亚洲永久精品| 亚洲专区一二三| 欧美精品在线观看播放| 亚洲日穴在线视频| 一本大道久久精品懂色aⅴ| 亚洲第一电影网| 日韩精品一区在线观看| 国产综合色精品一区二区三区| 欧美国产在线观看| 99视频一区二区三区| 一区二区三区高清| 91精品国产综合久久精品麻豆| 蓝色福利精品导航| 国产欧美日韩在线| 91视频91自| 日韩av网站在线观看| 日韩视频免费观看高清完整版| 国产在线精品免费| 自拍av一区二区三区| 欧美人妖巨大在线| 亚洲成av人片www| 国产精品二三区| 精品视频1区2区| 韩国视频一区二区| 国产精品乱码人人做人人爱 | 在线观看国产一区二区| 亚洲欧洲国产日韩| 日韩欧美高清dvd碟片| 成人一区二区三区视频在线观看| 国产精品成人免费在线| 欧美怡红院视频| 国产一区二区在线电影| 亚洲精品五月天| 日韩精品一区二区三区在线| www.久久久久久久久| 日韩成人午夜电影| 2020国产成人综合网| 欧美综合亚洲图片综合区| 国产自产视频一区二区三区| 亚洲另类色综合网站| 欧美va亚洲va在线观看蝴蝶网| 波多野结衣中文字幕一区| 三级亚洲高清视频| 亚洲三级视频在线观看| 欧美一区二区观看视频| 日本久久电影网| 91麻豆精品秘密| 国产不卡在线视频| 日韩影院精彩在线| 中文字幕在线视频一区| 日韩欧美资源站| 欧美人妖巨大在线| 91日韩精品一区| 成人综合婷婷国产精品久久| 亚洲无人区一区| 亚洲制服丝袜在线| 中文天堂在线一区| 精品国产a毛片| 亚洲人成网站在线| 成av人片一区二区| 亚洲午夜视频在线观看| 日韩一区二区三区精品视频| 国产成人在线色| 亚洲香肠在线观看| 久久影音资源网| 成人av免费网站| 欧美在线一二三| 国产精品每日更新| 成人avav影音| 中文字幕乱码久久午夜不卡| 国产精品入口麻豆九色| 亚洲欧美日本韩国| 日韩一区二区三区视频在线观看| 五月婷婷激情综合| 欧美日韩精品一二三区| 一区二区三区小说| 丁香另类激情小说| 国产精品久久久久三级| 日韩avvvv在线播放| 国产99久久久久| 日韩欧美国产系列| **欧美大码日韩| 国产麻豆午夜三级精品| 午夜视频在线观看一区| 亚洲乱码一区二区三区在线观看| 欧美日韩国产高清一区二区| 久久久久久免费毛片精品| 亚洲欧美综合色| 国产精品萝li| 日本亚洲天堂网| 色综合久久久久久久久| 精品久久久久久久久久久久包黑料| 国产清纯在线一区二区www| 日韩国产在线一| 97久久久精品综合88久久| 欧美国产日韩精品免费观看| 免费在线观看日韩欧美| 欧美性欧美巨大黑白大战| 日韩一区在线免费观看| 懂色av中文一区二区三区| 亚洲精品一区在线观看|