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

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

?? mpeg2pes.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]
 */ 

/*
 * $(@)Mpeg2Pes.c $Revision: 1.1.1.1 $ $Date: 2006/04/17 22:47:31 $
 * 
 * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
 */
/*
 * Copyright (c) 1996 by Sun Microsystems, Inc.
 */

/*
 * MPEG2 PES parser
 */

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

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

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

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

#include "mmp/Mpeg2Pes.h"

#define	MPEG2_PES_MAX_CHUNK	(256)	   /* FIXME: Put real value here */

struct _Mpeg2Pes {
    MmpParserObject    *streamIdToPop[MPEG2_PES_STREAM_ID_MAX + 1];
    Mpeg2PesCallBack    callBack;
    void               *token;
    MmpParserObject     po;
    Context		context;
    MmpContextObject   *cop;
    Boolean		isDirty;
    Boolean		doFlush;
};

typedef struct Mpeg2PesPacketAndFlag {
    Mpeg2PesPacket      pesPacket;
    BIT2(b10:2,
         ignored:6);
} Mpeg2PesPacketAndFlag;

static size_t       mpeg2PesMaxChunk(void *instp);
static RetCode      mpeg2PesRecognize(void *instp, Pipe pipe);

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

static void         mpeg2PesRecover(void *instp);

static RetCodeTable mpeg2PesErrorTable[] = {
    {MPEG2_PES_ERROR_SYNTAX, NULL, "packet syntax error"},
    {MPEG2_PES_ERROR_PTS, NULL, "pts flag error"},
    {MPEG2_PES_ERROR_DTS, NULL, "dts flag error"},
    {MPEG2_PES_ERROR_HDR_LEN, NULL, "header length error"},
    {MPEG2_PES_ERROR_LEN, NULL, "packet length error"},
    {0, NULL, NULL}
};

static RetCodeId    retCodeId;

Mpeg2Pes
mpeg2PesNew(void)
{
    Mpeg2Pes            mpeg2Pes;

    if (retCodeId == 0) {
	retCodeId = retCodeRegisterWithTable(MPEG2PES_CLASSNAME,
					     mpeg2PesErrorTable);
    }
    mpeg2Pes = NEW_ZEROED(struct _Mpeg2Pes, 1);

    mpeg2Pes->po.maxChunk = mpeg2PesMaxChunk;
    mpeg2Pes->po.recognize = mpeg2PesRecognize;
    mpeg2Pes->po.parse = mpeg2PesParse;
    mpeg2Pes->po.recover = mpeg2PesRecover;
    mpeg2Pes->po.instp = mpeg2Pes;

    mpeg2Pes->context = contextNew();
    mpeg2Pes->cop = contextMmpContextObject(mpeg2Pes->context);
    return mpeg2Pes;
}

void
mpeg2PesSetEsParsers(Mpeg2Pes mpeg2Pes,
		MmpParserObject *streamIdToPop[MPEG2_PES_STREAM_ID_MAX + 1])
{
    mpeg2PesRecover(mpeg2Pes);
    (void) memcpy(mpeg2Pes->streamIdToPop, streamIdToPop,
	sizeof(mpeg2Pes->streamIdToPop));
}

MmpParserObject    *
mpeg2PesParserObject(Mpeg2Pes mpeg2Pes)
{
    return &mpeg2Pes->po;
}

void
mpeg2PesSetFlush(Mpeg2Pes mpeg2Pes, Boolean doFlush)
{
    mpeg2Pes->doFlush = doFlush;
}

void
mpeg2PesSetCallBack(Mpeg2Pes mpeg2Pes, Mpeg2PesCallBack callBack, void *token)
{
    mpeg2Pes->callBack = callBack;
    mpeg2Pes->token = token;
}

void
mpeg2PesFree(Mpeg2Pes mpeg2Pes)
{
    mpeg2PesRecover(mpeg2Pes);
    contextFree(mpeg2Pes->context);
    free(mpeg2Pes);
}

/* ARGSUSED */
static size_t
mpeg2PesMaxChunk(void *instp)
{
    return MPEG2_PES_MAX_CHUNK;
}

/* ARGSUSED */
static RetCode
mpeg2PesRecognize(void *instp, Pipe pipe)
{
    Mpeg2PesPacketAndFlag *pfp = PIPE_PEEK(pipe, Mpeg2PesPacketAndFlag);
    RetCode             retCode = RETCODE_FAILED;

    if (IS_MPEG2_PES_PACKET_START_CODE_PREFIX(&pfp->pesPacket)
	    && MPEG2_PES_STREAM_ID_MIN <= pfp->pesPacket.streamId
	    && pfp->pesPacket.streamId >= MPEG2_PES_STREAM_ID_MAX) {
	switch (pfp->pesPacket.streamId) {
	case MPEG2_PES_STREAM_ID_PROGRAM_STREAM_MAP:
	case MPEG2_PES_STREAM_ID_PADDING_STREAM:
	case MPEG2_PES_STREAM_ID_PRIVATE_STREAM_2:
	case MPEG2_PES_STREAM_ID_ECM_STREAM:
	case MPEG2_PES_STREAM_ID_EMM_STREAM:
	case MPEG2_PES_STREAM_ID_PROGRAM_STREAM_DIRECTORY:
	    retCode = RETCODE_SUCCESS;
	    break;
	default:
	    if (pfp->b10 == 2) {
		retCode = RETCODE_SUCCESS;
	    }
	    break;
	}
    }
    return retCode;
}

static RetCode
mpeg2PesParse(void *instp, MmpContextObject *cop, Pipe pipe)
{
    Mpeg2Pes            mpeg2Pes = (Mpeg2Pes) instp;
    Mpeg2PesInfo        info;
    Mpeg2PesInfo       *infop = &info;
    RetCode             retCode = RETCODE_SUCCESS;
    Mpeg2PesPacket     *ppp;
    unsigned	        pid;

    mpeg2Pes->isDirty = TRUE;

    pid = MMP_CONTEXT_PIPETOPID(cop, pipe);

    /*
     * If this is a transport stream, pmt that caused initiation of this
     * pes parser may occur anywhere relative to the start of the pes
     * packet -- so wait until we're at a mark which indicates the
     * start of a PES packet.
     */
    if (pid != MMP_PID_NULL) {
	pipeFindMark(pipe);
    }

    while ((ppp = PIPE_PEEK(pipe, Mpeg2PesPacket), TRUE)
	    && IS_MPEG2_PES_PACKET_START_CODE_PREFIX(ppp)
	    && MPEG2_PES_STREAM_ID_MIN <= ppp->streamId
	    && ppp->streamId <= MPEG2_PES_STREAM_ID_MAX) {
	PipePosition        packetEnd;
	unsigned            streamId;
	PipePosition        nStuffBytes;
	PipePosition        headerEnd;
	int                 payloadLen;
	unsigned            packetLength;
	Pipe                pidPipe;
        unsigned	    pipeId;
	Boolean		    isMarked;

	(void) memset(infop, 0, sizeof(*infop));

	isMarked = pipeIsAtMark(pipe);
	infop->position = pipePosition(pipe);
	packetEnd = pipeRelativePosition(pipe);
	infop->packet = *PIPE_GET(pipe, Mpeg2PesPacket);

	packetLength = MPEG2_PES_PACKET_LENGTH(&infop->packet);
	packetEnd = packetLength == 0 ? 0 : packetEnd + packetLength + 6;
	streamId = infop->packet.streamId;
	switch (streamId) {
	default:
	    infop->packetFlags = *PIPE_GET(pipe, Mpeg2PesPacketFlags);
	    if (infop->packetFlags.b10 != 0x2) {
		retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_SYNTAX);
		goto error;
	    }
	    headerEnd = pipeRelativePosition(pipe)
	      + infop->packetFlags.pesHeaderDataLength;
	    switch (infop->packetFlags.ptsDtsFlags) {
	    case 0x0:
		break;
	    case 0x2:
		infop->pts = *PIPE_GET(pipe, Mpeg2PesTs);
		if (infop->pts.tsType != 0x2) {
		    retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_PTS);
		    goto error;
		}
		break;
	    case 0x3:
		infop->pts = *PIPE_GET(pipe, Mpeg2PesTs);
		if (infop->pts.tsType != 0x3) {
		    retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_PTS);
		    goto error;
		}
		infop->dts = *PIPE_GET(pipe, Mpeg2PesTs);
		if (infop->dts.tsType != 0x1) {
		    retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_DTS);
		    goto error;
		}
		break;
	    default:
		return RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_SYNTAX);
	    }
	    if (infop->packetFlags.escrFlag) {
		infop->escr = *PIPE_GET(pipe, Mpeg2PesEscr);
	    }
	    if (infop->packetFlags.esRateFlag) {
		infop->esRate = *PIPE_GET(pipe, Mpeg2PesEsRate);
	    }
	    if (infop->packetFlags.dsmTrickModeFlag) {
		infop->dsmTrickMode = *PIPE_GET(pipe, Mpeg2PesDsmTrickMode);
	    }
	    if (infop->packetFlags.additionalCopyInfoFlag) {
		infop->additionalCopyInfo = *PIPE_GET(pipe,
						Mpeg2PesAdditionalCopyInfo);
	    }
	    if (infop->packetFlags.pesCrcFlag) {
		infop->pesCrc = *PIPE_GET(pipe, Mpeg2PesPesCrc);
	    }
	    if (infop->packetFlags.pesExtensionFlag) {
		infop->pesExtension = *PIPE_GET(pipe, Mpeg2PesPesExtension);
		if (infop->pesExtension.pesPrivateDataFlag) {
		    infop->pesPrivateData = *PIPE_GET(pipe,
						      Mpeg2PesPrivateData);
		}
		if (infop->pesExtension.packHeaderFieldFlag) {
		    infop->packHeaderField = *PIPE_GET(pipe,
						   Mpeg2PesPackHeaderField);
		}
		if (infop->pesExtension.programPacketSequenceCounterFlag) {
		    infop->programPacketSequenceCounter = *PIPE_GET(pipe,
				      Mpeg2PesProgramPacketSequenceCounter);
		}
		if (infop->pesExtension.pStdBufferFlag) {
		    infop->pStdBuffer = *PIPE_GET(pipe, Mpeg2PesPStdBuffer);
		}
		if (infop->pesExtension.pesExtensionFlag2) {
		    unsigned            fieldLen;

		    infop->pesExtension2 = *PIPE_GET(pipe, Mpeg2PesExtension2);
		    fieldLen = infop->pesExtension2.pesExtensionFieldLength;
		    (void) memcpy(infop->pesExtension2Data,
				  pipeGet(pipe, fieldLen), fieldLen);
		}
	    }
	    nStuffBytes = headerEnd - pipeRelativePosition(pipe);
	    if (nStuffBytes < 0) {
		retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_HDR_LEN);
		goto error;
	    } else if (nStuffBytes > 0) {
	        retCode = pipeSkipStuffBytes(pipe, nStuffBytes,
					 MPEG2_PES_PACKET_STUFF_BYTE);
	        if (retCode != RETCODE_SUCCESS) {
		    goto error;
	        }
	    }
	    /* FALLTHRU */

	case MPEG2_PES_STREAM_ID_PROGRAM_STREAM_MAP:
	case MPEG2_PES_STREAM_ID_PRIVATE_STREAM_2:
	case MPEG2_PES_STREAM_ID_ECM_STREAM:
	case MPEG2_PES_STREAM_ID_EMM_STREAM:
	case MPEG2_PES_STREAM_ID_PROGRAM_STREAM_DIRECTORY:
	    if (packetLength != 0) {
		payloadLen = packetEnd - pipeRelativePosition(pipe);
		if (payloadLen < 0) {
		    retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_LEN);
		    goto error;
		}
	    }
	    if (mpeg2Pes->callBack != NULL) {
		retCode = (*mpeg2Pes->callBack) (mpeg2Pes->token, infop,
						 RETCODE_SUCCESS);
	    }
	    if (retCode != RETCODE_SUCCESS) {
		return retCode;
	    }
	    /*
	     * If incoming pipe has a pid, then this is a PES within
	     * a transport stream, streamId's may be duplicated between
	     * various programs.  Use pid rather than streamId to name
	     * ES pipe in this context.
	     */
            pipeId = (pid != MMP_PID_NULL) ? pid : streamId;
	    if ((pidPipe = MMP_CONTEXT_PIDTOPIPE(mpeg2Pes->cop, pipeId))
		== NULL) {
		MmpParserObject    *pop = mpeg2Pes->streamIdToPop[streamId];

		pidPipe = MMP_PARSER_NEWPIPE(pop, mpeg2Pes->cop);
		/*
		 * This can't fail...  we just checked that pipePipe == NULL
		 */
		retCode = MMP_CONTEXT_ADDPIPE(mpeg2Pes->cop, pipeId, pidPipe);
		ASSERT(retCode == RETCODE_SUCCESS);
	    }
	    if (packetLength == 0) {
		if (pidPipe == PIPE_NULL) {
		    pipeFindMark(pipe);
		} else
		    while (pipeIsAvailUnmarked(pipe, 1)) {
			retCode = pipeTransfer(pidPipe, pipe,
					       pipeAvailUnmarked(pipe),
					       isMarked, FALSE);
			isMarked = FALSE;
			if (retCode != RETCODE_SUCCESS) {
			    return retCode;
			}
		    }
	    } else {
		retCode = pipeTransfer(pidPipe, pipe, payloadLen, isMarked,
				       FALSE);
		if (retCode != RETCODE_SUCCESS) {
		    return retCode;
		}
	    }
	    if (mpeg2Pes->doFlush
		    && (retCode = pipeSync(pipe)) != RETCODE_SUCCESS) {
		return retCode;
	    }
	    break;

	case MPEG2_PES_STREAM_ID_PADDING_STREAM:
	    if (packetLength != 0) {
		payloadLen = packetEnd - pipeRelativePosition(pipe);
		if (payloadLen < 0) {
		    retCode = RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_LEN);
		    goto error;
		}
	    }
	    if (mpeg2Pes->callBack != NULL) {
		retCode = (*mpeg2Pes->callBack) (mpeg2Pes->token, infop,
						 RETCODE_SUCCESS);
	    }
	    if (retCode != RETCODE_SUCCESS) {
		return retCode;
	    }
	    if (packetLength == 0) {
		while (pipeIsAvailUnmarked(pipe, 1)) {
		    size_t              unmarkedLen = pipeAvailUnmarked(pipe);

		    retCode = pipeSkipStuffBytes(pipe, unmarkedLen,
					     MPEG2_PES_PACKET_PADDING_BYTE);
		    if (retCode != RETCODE_SUCCESS) {
			return retCode;
		    }
		}
	    } else {
		retCode = pipeSkipStuffBytes(pipe, payloadLen,
					 MPEG2_PES_PACKET_PADDING_BYTE);
		if (retCode != RETCODE_SUCCESS) {
		    return retCode;
		}
	    }
	    break;
	}
    }
    /*
     * If pid is PID_NULL, then this is within a Program Stream, might
     * have just come up on a Pack header, so let Ps handle error.
     * If is isn't PID_NULL, then this is a transport stream and this
     * pipe should only be carrying PES packets -- give an error.
     */
    return pid == MMP_PID_NULL
	? RETCODE_SUCCESS : RETCODE_CONS(retCodeId, MPEG2_PES_ERROR_SYNTAX);

error:
    if (mpeg2Pes->callBack != NULL) {
	retCode = (*mpeg2Pes->callBack) (mpeg2Pes->token, infop, retCode);
    }
    return retCode;
}

static void
mpeg2PesRecover(void *instp)
{
    Mpeg2Pes            mpeg2Pes = (Mpeg2Pes) instp;
    unsigned            streamId;

    if (! mpeg2Pes->isDirty) {
	return;
    }
    mpeg2Pes->isDirty = FALSE;
    MMP_CONTEXT_DELETEALL(mpeg2Pes->cop);
    for (streamId = MPEG2_PES_STREAM_ID_MIN;
	    streamId <= MPEG2_PES_STREAM_ID_MAX; streamId++) {
	MMP_PARSER_RECOVER(mpeg2Pes->streamIdToPop[streamId]);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
九色综合狠狠综合久久| 日本中文在线一区| 久久国产剧场电影| 在线国产电影不卡| 国产欧美日韩激情| 麻豆一区二区三| 欧美日韩在线观看一区二区 | 精品视频一区三区九区| 中文字幕制服丝袜一区二区三区| 美女www一区二区| 欧美精品一卡两卡| 樱花草国产18久久久久| 丁香婷婷综合网| 精品成人a区在线观看| 日韩国产精品大片| 欧美午夜理伦三级在线观看| 中文字幕欧美一区| 国产成人亚洲综合a∨婷婷图片 | 波多野结衣中文一区| 亚洲精品一线二线三线| 蜜臀av性久久久久av蜜臀妖精| 精品视频一区三区九区| 亚洲综合视频在线| 色婷婷综合久久| 国产精品激情偷乱一区二区∴| 国产盗摄女厕一区二区三区| 久久午夜色播影院免费高清| 裸体歌舞表演一区二区| 欧美不卡123| 97se亚洲国产综合自在线| 久久久777精品电影网影网 | 亚洲一区二区三区小说| 91捆绑美女网站| 国产精品久久久99| eeuss鲁片一区二区三区| 欧美国产激情二区三区 | 石原莉奈在线亚洲二区| 欧美绝品在线观看成人午夜影视 | 久久精品视频在线看| 激情六月婷婷久久| 欧美精品一区二区三区一线天视频| 看电影不卡的网站| 日韩三级视频在线看| 日本一不卡视频| 日韩欧美国产电影| 国产真实乱偷精品视频免| 精品国产在天天线2019| 国产一区二区三区四| 久久久91精品国产一区二区精品| 高清视频一区二区| 亚洲欧美综合在线精品| 91福利国产成人精品照片| 亚洲精品日韩一| 欧美视频一区二| 欧美aaaaaa午夜精品| 久久综合视频网| 国产精品一线二线三线| 国产精品美女久久久久aⅴ | 国产精品99久久久久久似苏梦涵| 欧美激情在线观看视频免费| 波多野结衣在线一区| 国产成人在线电影| 亚洲免费三区一区二区| 7777精品伊人久久久大香线蕉 | 免费人成精品欧美精品 | 色94色欧美sute亚洲13| 亚洲成人三级小说| 精品国产第一区二区三区观看体验| 国产不卡一区视频| 尤物av一区二区| 欧美一级片在线观看| 国产精品99久久久久久久女警| 亚洲欧美影音先锋| 91麻豆精品国产91| 国产成人av网站| 亚洲一级二级三级在线免费观看| 欧美一区二区三区播放老司机| 激情av综合网| 亚洲女同女同女同女同女同69| 制服丝袜一区二区三区| 国产精品一区二区无线| 亚洲精品久久久蜜桃| 欧美成人a∨高清免费观看| av不卡一区二区三区| 午夜精品久久久久久| 久久久美女毛片| 欧美在线啊v一区| 韩国理伦片一区二区三区在线播放| 中文字幕在线视频一区| 91麻豆精品国产91久久久更新时间| 国产精品正在播放| 舔着乳尖日韩一区| 中文字幕高清一区| 51久久夜色精品国产麻豆| 成人美女在线视频| 视频一区二区三区入口| 中文字幕一区二区三区在线观看| 91精品国产综合久久福利| 不卡一区二区在线| 久久福利视频一区二区| 亚洲免费观看高清完整版在线观看 | 亚洲第一福利一区| 国产精品免费久久| 日韩欧美高清在线| 91成人在线精品| 国产成人啪免费观看软件| 视频一区欧美日韩| 亚洲欧洲性图库| 久久久久久一级片| 欧美电影在线免费观看| 91香蕉视频mp4| 国产福利91精品一区| 美女视频黄久久| 亚洲国产欧美日韩另类综合 | 久久久精品蜜桃| 欧美年轻男男videosbes| 99久久婷婷国产综合精品电影| 蜜桃一区二区三区在线| 亚洲第一av色| 亚洲欧美在线aaa| 国产日产亚洲精品系列| 精品久久久久一区| 欧美高清视频一二三区| 色婷婷国产精品久久包臀| 丰满亚洲少妇av| 国内精品国产三级国产a久久| 亚洲成人你懂的| 一区二区三区免费网站| 国产精品拍天天在线| 久久久精品国产免费观看同学| 欧美一区二区三区喷汁尤物| 欧美日韩精品一区二区三区蜜桃| 色婷婷综合久色| 色综合久久天天综合网| 波多野结衣中文字幕一区| 国产成人高清在线| 国产精品18久久久久| 久草热8精品视频在线观看| 肉肉av福利一精品导航| 婷婷综合另类小说色区| 亚洲第一福利一区| 亚洲妇女屁股眼交7| 一区二区三区丝袜| 亚洲啪啪综合av一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 亚洲国产精品t66y| 国产午夜精品福利| 欧美激情自拍偷拍| 中文字幕不卡一区| 国产精品家庭影院| 亚洲同性同志一二三专区| 国产精品久久久久久久久搜平片| 国产欧美日韩在线看| 国产日本欧美一区二区| 国产日韩欧美亚洲| 国产精品福利在线播放| 中文字幕亚洲欧美在线不卡| 国产精品免费aⅴ片在线观看| 国产精品视频一二| 综合激情成人伊人| 亚洲欧美一区二区三区国产精品| 亚洲精品久久久蜜桃| 亚洲一区二区三区四区在线免费观看 | 国产精品电影一区二区| 日韩毛片在线免费观看| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩高清在线| 91精品国产综合久久精品| 日韩欧美一级二级三级| 久久理论电影网| 中文字幕电影一区| 伊人夜夜躁av伊人久久| 亚洲大片免费看| 欧美a一区二区| 国产专区欧美精品| 9人人澡人人爽人人精品| 91片在线免费观看| 欧美日韩大陆一区二区| 日韩精品最新网址| 久久久久久久精| 国产精品人妖ts系列视频| 亚洲欧美韩国综合色| 污片在线观看一区二区| 精品一区二区三区免费视频| 成人午夜视频网站| 欧洲一区在线电影| 日韩欧美中文字幕一区| 国产日产精品1区| 亚洲欧美日韩人成在线播放| 日日摸夜夜添夜夜添精品视频| 精品亚洲成a人在线观看| 风流少妇一区二区| 欧美性受xxxx黑人xyx性爽| 91精品国产91久久久久久最新毛片| 欧美精品一区二区三| 亚洲桃色在线一区| 免费成人在线观看| 成人午夜私人影院| 在线电影一区二区三区| 久久久久99精品一区|