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

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

?? mpeg_demux.cpp

?? linux下實現視頻播放的播放器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/* *  Copyright (C) 2005-2007  gulikoza * *  PAT/PMT table parser for PID detection. *  Copyright (C) 2004, Donald A Graft, All Rights Reserved * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* $Id$ */#include "iptv.h"#define USES_BASECLASS#include "video.h"#include "wxgui/StreamInfo.h"//#define DEBUG#include "log.h"#define MODULE "mpeg_demux"int mpeg_demux::ProcessData(unsigned char *buffer, int size){    unsigned int pid;    unsigned int i = 0;    rdr.SetBuffer(buffer, size);    while((pkt=rdr.GetPacket())) {	// Get packet pid#ifdef DEBUG	static int pnum = 0;#endif	pid =((pkt[1] & 0x1F) << 8) | pkt[2];	DEBUG_MSG("packet no: %d, PID 0x%x%s", pnum++, pid, ((pkt[1] & 0x40) >> 6) ? ", start" : "");	// Check for valid PAT	if(!valid_pat) {	    if(pid == 0x0) {		ParsePAT();	    } else {		DEBUG_MSG("No valid PAT and PID not 0x0");	    }	    continue;	}	// Make sure all PMTs are valid	if(num_valid_pmts < num_pat_entries) {	    try {	    if(ParsePMT(pid)) {		// Set Audio and Video to the first program		for(i = 0; i < pat_entries[0].num_streams; i++) {		    if(!strcmp(pat_entries[0].streams[i].stream_type, "MPEG2 Video")) {			MPEG2_Transport_VideoPID = pat_entries[0].streams[i].pid;			ERROR_MSG("MPEG2_Transport_VideoPID set to 0x%x", MPEG2_Transport_VideoPID);			SeqHeader = MpegHDR;			// Create video decoder object#if 0			videodec = new libav_decoder(wait, CODEC_ID_MPEG2VIDEO, 2*1024*1024);			LOG_MSG("Created libav decoder at 0x%p", videodec);#else			videodec = new mpeg_decoder(wait, 2*1024*1024);			LOG_MSG("Created libmpeg2 decoder at 0x%p", videodec);#endif		    } else if(!strcmp(pat_entries[0].streams[i].stream_type, "h264 Video")) {			MPEG2_Transport_VideoPID = pat_entries[0].streams[i].pid;			ERROR_MSG("h264_Transport_VideoPID set to 0x%x", MPEG2_Transport_VideoPID);#if (C_HAS_DIRECTSHOW)			// Create video decoder object			// Try dshow first			try {			    videodec = new libds_decoder("CoreAVCDecoder.ax", wait, 4*1024*1024);			} catch(const char *e) {			    ERROR_MSG("%s", e);#endif#if (C_HAS_LIBAVCODEC)			    videodec = new libav_decoder(wait, CODEC_ID_H264, 4*1024*1024);#else			    ERROR_MSG("h264 decoder not available, aborting..");			    return 0;#endif#if (C_HAS_DIRECTSHOW)			}#endif			LOG_MSG("Created new decoder at 0x%p", videodec);		    }		    if(!strcmp(pat_entries[0].streams[i].stream_type, "MPEG1 Audio") ||		     !strcmp(pat_entries[0].streams[i].stream_type, "MPEG2 Audio")) {		        if(MPEG2_Transport_AudioPID == 0) {			    MPEG2_Transport_AudioPID = pat_entries[0].streams[i].pid;			    ERROR_MSG("MPEG2_Transport_AudioPID set to 0x%x", MPEG2_Transport_AudioPID);			    // Create audio decoder object			    audiodec = new mpeg_audio(wait);			    LOG_MSG("Created new decoder at 0x%p", audiodec);			} else {			    LOG_MSG("Additional audio on pid", pat_entries[0].streams[i].pid);			}		    }		}#if (C_HAVE_WXGUI)		if(gui.wxStreamInfo != NULL)		    gui.wxStreamInfo->UpdateStreamInfo(pat_entries, num_pat_entries, num_valid_pmts,							MPEG2_Transport_VideoPID, MPEG2_Transport_AudioPID);#endif	    }	    } catch (const char * c) {		fprintf(stderr, "[%d] EXCEPTION: %s\n", SDL_GetTicks(), c);		return 0;	    }	    continue;	}	// Capture Video or Audio packets	if(pid == MPEG2_Transport_VideoPID)	    ProcessVideoPacket();	else if(pid == MPEG2_Transport_AudioPID)	    ProcessAudioPacket();	else if((pat_entries[0].pcrpid != MPEG2_Transport_VideoPID)		    && (pid == pat_entries[0].pcrpid))	    ProcessHeader(false);	else	    DEBUG_MSG("Skip stream 0x%x", pid);    }    /* Some programs have bad program tables (evil?) */    if((m_video) && (pcr_count > 25)) {	ERROR_MSG("Evil program mode activated, set video PID to 0x%x", pat_entries[0].pcrpid);	MPEG2_Transport_VideoPID = pat_entries[0].pcrpid;    }    DEBUG_MSG("Done.");    return rdr.LeftBytes();}int mpeg_demux::ProcessHeader(bool first){    int offset;    if(pkt[0] != 0x47) {	ERROR_MSG("No sync byte in header");	return -1;    }    // Check error indicator.    if((pkt[1] & 0x80) >> 7) {	ERROR_MSG("Error in packet!");	return -1;    }    // Check for presence of a section start.    if((first == true) && (!((pkt[1] & 0x40) >> 6))) {	DEBUG_MSG("Packet fragment!");	return -1;    }    char adp = (pkt[3] & 0x30) >> 4;    // Use PCR in adaptation field to sync timer clock    if(adp & 0x2) {	// Get PID	unsigned int pid = ((pkt[1] & 0x1F) << 8) | pkt[2];	// If PCR is on this PID (assume channel 0 for now)	if(pat_entries[0].pcrpid == pid) {	    offset = 4;	    unsigned char flags = pkt[offset+1];	    DEBUG_MSG("Searching for PCR, adaptation field length %d, flags: 0x%x", pkt[offset], flags);	    if(flags & 0x80) {		LOG_MSG("Discontinuity flag present");	    } else	    if(flags & 0x10) {		// PCR is 42 bit, but only take 32-bits of upper 33-bits...blah :P		pid  = (pkt[offset+2] & 0x7f) << 25;		pid |= (pkt[offset+3]) << 17;		pid |= (pkt[offset+4]) << 9;		pid |= (pkt[offset+5]) << 1;		pid |= (pkt[offset+6] & 0x80) >> 7;		pid /= 90;		pcr_count++;		LOG_MSG("Current PCR: %u, pcr_count: %d", pid, pcr_count);		timer->SetPTS(pid);	    }	}    }    // Skip if there is no payload (adaptation field)    if(adp == 0 || adp == 2) {	LOG_MSG("Adaptation field w/o payload!");	return -1;    }    // Skip the adaptation field (if any).    offset = 4;    if(adp == 3) {	DEBUG_MSG("Skipping adaptation field (%d bytes)", pkt[offset]);	offset += pkt[offset] + 1;	if(offset == TS_PACKET_SIZE) {	    DEBUG_MSG("No payload in packet");	    return -1;	}    }    DEBUG_MSG("Payload offset %d", offset);    return offset;}bool mpeg_demux::ParsePAT(){    // Buffer offset    unsigned int ndx;    unsigned int length, number, last, program, pmtpid;    if((ndx = ProcessHeader(first_pat)) < 0)	return false;    // Skip to the start of the section.    ndx += pkt[ndx] + 1;    // Now pointing to the start of the section. Check the table id.    if(pkt[ndx++] != 0) {	ERROR_MSG("Table ID not null!");	return false;    }    // Check the section syntax indicator.    if((pkt[ndx] & 0xc0) != 0x80) {        ERROR_MSG("Invalid syntax indicator!");        return false;    }    // Check and get section length.    if((pkt[ndx] & 0x0c) != 0) {        ERROR_MSG("Section length invalid!");        return false;    }    length = ((pkt[ndx++] & 0x03) << 8);    length |= pkt[ndx++];    DEBUG_MSG("Detected length %d", length);    if(length > 0x3fd) {        ERROR_MSG("Length is too large!");        return false;    }    // Skip the transport stream id.    ndx += 2;    // We want only current tables.    if(!(pkt[ndx++] & 0x01)) {        ERROR_MSG("No current tables!");        return false;    }    // Get the number of this section.    number = pkt[ndx++];    DEBUG_MSG("Number of the current section %d", number);    // Get the number of the last section.    last = pkt[ndx++];    DEBUG_MSG("Number of the last section %d", last);    // Now we have the program/pid tuples.    for(unsigned int i = 0; i < length - 9;) {	program = pkt[ndx+i++] << 8;	program |= pkt[ndx+i++];	pmtpid = (pkt[ndx+i++] & 0x1f) << 8;	pmtpid |= pkt[ndx+i++];	ERROR_MSG("Found program %d with PID 0x%x", program, pmtpid);	// Skip the Network Information Table (NIT).	if(program != 0) {	    pat_entries[num_pat_entries].first_pmt = true;	    pat_entries[num_pat_entries].num_streams = 0;	    pat_entries[num_pat_entries].program = program;	    pat_entries[num_pat_entries++].pmtpid = pmtpid;	    if(num_pat_entries >= MAX_PAT_ENTRIES) {		ERROR_MSG("MAX_PAT_ENTRIES reached!");		num_pat_entries = MAX_PAT_ENTRIES - 1;	    }	}    }    first_pat = false;    LOG_MSG("num_pat_entries: %d", num_pat_entries);    // If this is the last section number, we're done.    if(number == last)	valid_pat = true;    return true;}bool mpeg_demux::ParsePMT(unsigned int pid){    unsigned int ndx, length, number, last, begin, num_streams;    unsigned int descriptors_length, es_descriptors_length;    // Now we have to get the PMT tables to retrieve the actual    // program PIDs.    for (unsigned int entry = 0; entry < num_pat_entries; entry++)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女免费视频一区| 久久国产福利国产秒拍| 欧美揉bbbbb揉bbbbb| 视频在线观看国产精品| 久久久精品影视| 欧洲在线/亚洲| 麻豆一区二区三区| 亚洲色图在线看| 欧美成人性战久久| 美日韩一级片在线观看| 亚洲同性gay激情无套| 日韩一级片在线播放| 99精品在线观看视频| 人人爽香蕉精品| 亚洲国产精品黑人久久久| 欧美日韩免费一区二区三区| 国产精品77777| 中文字幕欧美区| 欧美不卡在线视频| 欧美一区三区二区| 91精品欧美综合在线观看最新| 91黄视频在线观看| av在线这里只有精品| 成人性视频免费网站| 亚洲色图欧洲色图婷婷| 国产精品久线在线观看| 中文字幕第一区二区| 2020日本不卡一区二区视频| 欧美tk—视频vk| 精品欧美一区二区三区精品久久| 日韩视频一区二区三区| 日韩一二在线观看| 日韩美女一区二区三区四区| 日韩欧美一区在线观看| 日韩一区二区三| 精品国产精品网麻豆系列| 精品免费日韩av| 欧美精品一区二| 久久精品人人做| 欧美韩日一区二区三区| 国产精品天天摸av网| 国产精品成人午夜| 中文字幕亚洲在| 亚洲视频在线观看三级| 亚洲美女一区二区三区| 亚洲制服丝袜一区| 日本怡春院一区二区| 麻豆精品国产传媒mv男同| 国产一区二区精品在线观看| 成人一二三区视频| 91美女视频网站| 欧美日韩国产综合一区二区| 欧美电影在线免费观看| 日韩免费看网站| 国产欧美日韩麻豆91| 1区2区3区欧美| 国产在线精品一区在线观看麻豆| 久久精品国产免费| 国产经典欧美精品| 91视频.com| 91麻豆精品国产91久久久使用方法 | 一区二区三区在线视频免费 | 91久久国产最好的精华液| 在线观看视频91| 日韩午夜在线观看| 国产亚洲va综合人人澡精品| 亚洲日本欧美天堂| 日韩黄色免费电影| 国产精品一区二区在线观看网站| 91免费国产在线| 日韩三区在线观看| 中文一区二区在线观看| 亚洲444eee在线观看| 国产高清无密码一区二区三区| 91蜜桃视频在线| 日韩精品一区在线观看| 亚洲欧美另类小说| 麻豆精品视频在线| 色拍拍在线精品视频8848| 日韩你懂的电影在线观看| 中文字幕一区二区三区在线观看| 日韩中文字幕区一区有砖一区| 国产精品 日产精品 欧美精品| 欧美亚洲动漫另类| 欧美国产精品专区| 日韩中文字幕1| 99久久综合色| 欧美成人精精品一区二区频| 一区二区三区四区在线免费观看| 国产一区二区三区美女| 欧美专区日韩专区| 国产精品全国免费观看高清| 免费在线欧美视频| 日本道色综合久久| 国产欧美日韩在线| 蜜桃精品在线观看| 欧美日韩专区在线| 最新日韩av在线| 韩国av一区二区三区在线观看| 欧美最新大片在线看| 国产精品久久久久9999吃药| 免费欧美在线视频| 欧美性猛交xxxxxxxx| 国产亚洲1区2区3区| 久久精品国产亚洲aⅴ| 欧美日精品一区视频| 亚洲欧洲成人自拍| 成人一区二区三区在线观看| 日韩久久久精品| 天堂一区二区在线| 日本道色综合久久| 中文字幕日韩av资源站| 国产福利一区二区三区| 日韩欧美一二三区| 日本在线播放一区二区三区| 欧美三级电影在线观看| 一区二区三区欧美| 91在线观看地址| 国产精品久久久久久亚洲伦| 欧美麻豆精品久久久久久| 亚洲色图在线视频| av亚洲精华国产精华| 日本一区二区在线不卡| 国产黄色精品视频| 久久精品人人做人人综合| 国模无码大尺度一区二区三区| 日韩一区二区三区免费观看| 日本成人在线网站| 欧美一级欧美一级在线播放| 天堂午夜影视日韩欧美一区二区| 精品视频在线免费观看| 亚洲一二三四在线| 欧美亚男人的天堂| 亚洲gay无套男同| 91精品国产色综合久久久蜜香臀| 水野朝阳av一区二区三区| 3atv一区二区三区| 美国毛片一区二区三区| 精品少妇一区二区三区免费观看| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲另类中文字| 欧美图区在线视频| 亚洲成人1区2区| 3d成人h动漫网站入口| 麻豆国产精品视频| 国产亚洲欧美一区在线观看| 国产伦精品一区二区三区视频青涩 | 日韩精品一区在线观看| 国产在线观看免费一区| 中文字幕乱码日本亚洲一区二区| 成人免费视频caoporn| 亚洲人妖av一区二区| 色综合天天性综合| 亚洲国产综合视频在线观看| 91麻豆精品国产91久久久久 | 亚洲成人一区二区| 777欧美精品| 国产成人av资源| 亚洲女人小视频在线观看| 欧美日韩高清在线播放| 激情综合色丁香一区二区| 国产精品无遮挡| 欧美日韩精品一区二区在线播放| 日日摸夜夜添夜夜添国产精品| 日韩欧美亚洲另类制服综合在线| 国产成人免费视频精品含羞草妖精| 亚洲色图第一区| 欧美一级淫片007| 粉嫩av亚洲一区二区图片| 夜夜嗨av一区二区三区中文字幕| 日韩一区二区免费电影| 成人激情动漫在线观看| 五月综合激情网| 国产欧美综合在线| 91福利资源站| 国产精品456露脸| 亚洲无人区一区| 久久人人爽爽爽人久久久| 色悠悠亚洲一区二区| 久久福利资源站| 亚洲精品中文字幕在线观看| 欧美岛国在线观看| 91蝌蚪porny九色| 精彩视频一区二区| 亚洲国产精品久久久男人的天堂 | 欧美影片第一页| 国产精品一二一区| 午夜久久久久久久久| 国产精品成人在线观看| 亚洲蜜臀av乱码久久精品| 日韩视频在线永久播放| 99vv1com这只有精品| 国产资源精品在线观看| 亚洲激情校园春色| 久久免费的精品国产v∧| 欧美日韩视频不卡| 成人丝袜18视频在线观看| 强制捆绑调教一区二区| 亚洲精品国产一区二区精华液| 久久伊99综合婷婷久久伊|