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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? extract_mpeg2.c

?? mpeg2 decoder filter過濾服務(wù)端
?? C
字號:
/* * extract_mpeg2.c * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org> * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> * * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. * See http://libmpeg2.sourceforge.net/ for updates. * * mpeg2dec 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. * * mpeg2dec 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 */#include "config.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <getopt.h>#ifdef HAVE_IO_H#include <fcntl.h>#include <io.h>#endif#include <inttypes.h>#define BUFFER_SIZE 4096static uint8_t buffer[BUFFER_SIZE];static FILE * in_file;static int demux_track = 0xe0;static int demux_pid = 0;static int demux_pva = 0;static void print_usage (char ** argv){    fprintf (stderr, "usage: %s [-h] [-s <track>] [-t <pid>] [-p] <file>\n"	     "\t-h\tdisplay help\n"	     "\t-s\tset track number (0-15 or 0xe0-0xef)\n"	     "\t-t\tuse transport stream demultiplexer, pid 0x10-0x1ffe\n"	     "\t-p\tuse pva demultiplexer\n",	     argv[0]);    exit (1);}static void handle_args (int argc, char ** argv){    int c;    char * s;    while ((c = getopt (argc, argv, "hs:t:p")) != -1)	switch (c) {	case 's':	    demux_track = strtol (optarg, &s, 0);	    if (demux_track < 0xe0)		demux_track += 0xe0;	    if (demux_track < 0xe0 || demux_track > 0xef || *s) {		fprintf (stderr, "Invalid track number: %s\n", optarg);		print_usage (argv);	    }	    break;	case 't':	    demux_pid = strtol (optarg, &s, 0);	    if (demux_pid < 0x10 || demux_pid > 0x1ffe || *s) {		fprintf (stderr, "Invalid pid: %s\n", optarg);		print_usage (argv);	    }	    break;	case 'p':	    demux_pva = 1;	    break;	default:	    print_usage (argv);	}    if (optind < argc) {	in_file = fopen (argv[optind], "rb");	if (!in_file) {	    fprintf (stderr, "%s - could not open file %s\n", strerror (errno),		     argv[optind]);	    exit (1);	}    } else	in_file = stdin;}#define DEMUX_PAYLOAD_START 1static int demux (uint8_t * buf, uint8_t * end, int flags){    static int mpeg1_skip_table[16] = {	0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    };    /*     * the demuxer keeps some state between calls:     * if "state" = DEMUX_HEADER, then "head_buf" contains the first     *     "bytes" bytes from some header.     * if "state" == DEMUX_DATA, then we need to copy "bytes" bytes     *     of ES data before the next header.     * if "state" == DEMUX_SKIP, then we need to skip "bytes" bytes     *     of data before the next header.     *     * NEEDBYTES makes sure we have the requested number of bytes for a     * header. If we dont, it copies what we have into head_buf and returns,     * so that when we come back with more data we finish decoding this header.     *     * DONEBYTES updates "buf" to point after the header we just parsed.     */#define DEMUX_HEADER 0#define DEMUX_DATA 1#define DEMUX_SKIP 2    static int state = DEMUX_SKIP;    static int state_bytes = 0;    static uint8_t head_buf[264];    uint8_t * header;    int bytes;    int len;#define NEEDBYTES(x)						\    do {							\	int missing;						\								\	missing = (x) - bytes;					\	if (missing > 0) {					\	    if (header == head_buf) {				\		if (missing <= end - buf) {			\		    memcpy (header + bytes, buf, missing);	\		    buf += missing;				\		    bytes = (x);				\		} else {					\		    memcpy (header + bytes, buf, end - buf);	\		    state_bytes = bytes + end - buf;		\		    return 0;					\		}						\	    } else {						\		memcpy (head_buf, header, bytes);		\		state = DEMUX_HEADER;				\		state_bytes = bytes;				\		return 0;					\	    }							\	}							\    } while (0)#define DONEBYTES(x)		\    do {			\	if (header != head_buf)	\	    buf = header + (x);	\    } while (0)    if (flags & DEMUX_PAYLOAD_START)	goto payload_start;    switch (state) {    case DEMUX_HEADER:	if (state_bytes > 0) {	    header = head_buf;	    bytes = state_bytes;	    goto continue_header;	}	break;    case DEMUX_DATA:	if (demux_pid || (state_bytes > end - buf)) {	    fwrite (buf, end - buf, 1, stdout);	    state_bytes -= end - buf;	    return 0;	}	fwrite (buf, state_bytes, 1, stdout);	buf += state_bytes;	break;    case DEMUX_SKIP:	if (demux_pid || (state_bytes > end - buf)) {	    state_bytes -= end - buf;	    return 0;	}	buf += state_bytes;	break;    }    while (1) {	if (demux_pid) {	    state = DEMUX_SKIP;	    return 0;	}    payload_start:	header = buf;	bytes = end - buf;    continue_header:	NEEDBYTES (4);	if (header[0] || header[1] || (header[2] != 1)) {	    if (demux_pid) {		state = DEMUX_SKIP;		return 0;	    } else if (header != head_buf) {		buf++;		goto payload_start;	    } else {		header[0] = header[1];		header[1] = header[2];		header[2] = header[3];		bytes = 3;		goto continue_header;	    }	}	if (demux_pid) {	    if ((header[3] >= 0xe0) && (header[3] <= 0xef))		goto pes;	    fprintf (stderr, "bad stream id %x\n", header[3]);	    exit (1);	}	switch (header[3]) {	case 0xb9:	/* program end code */	    /* DONEBYTES (4); */	    /* break;         */	    return 1;	case 0xba:	/* pack header */	    NEEDBYTES (5);	    if ((header[4] & 0xc0) == 0x40) {	/* mpeg2 */		NEEDBYTES (14);		len = 14 + (header[13] & 7);		NEEDBYTES (len);		DONEBYTES (len);		/* header points to the mpeg2 pack header */	    } else if ((header[4] & 0xf0) == 0x20) {	/* mpeg1 */		NEEDBYTES (12);		DONEBYTES (12);		/* header points to the mpeg1 pack header */	    } else {		fprintf (stderr, "weird pack header\n");		DONEBYTES (5);	    }	    break;	default:	    if (header[3] == demux_track) {	    pes:		NEEDBYTES (7);		if ((header[6] & 0xc0) == 0x80) {	/* mpeg2 */		    NEEDBYTES (9);		    len = 9 + header[8];		    NEEDBYTES (len);		    /* header points to the mpeg2 pes header */		} else {	/* mpeg1 */		    len = 7;		    while ((header-1)[len] == 0xff) {			len++;			NEEDBYTES (len);			if (len > 23) {			    fprintf (stderr, "too much stuffing\n");			    break;			}		    }		    if (((header-1)[len] & 0xc0) == 0x40) {			len += 2;			NEEDBYTES (len);		    }		    len += mpeg1_skip_table[(header - 1)[len] >> 4];		    NEEDBYTES (len);		    /* header points to the mpeg1 pes header */		}		DONEBYTES (len);		bytes = 6 + (header[4] << 8) + header[5] - len;		if (demux_pid || (bytes > end - buf)) {		    fwrite (buf, end - buf, 1, stdout);		    state = DEMUX_DATA;		    state_bytes = bytes - (end - buf);		    return 0;		} else if (bytes <= 0)		    continue;		fwrite (buf, bytes, 1, stdout);		buf += bytes;	    } else if (header[3] < 0xb9) {		fprintf (stderr,			 "looks like a video stream, not system stream\n");		DONEBYTES (4);	    } else {		NEEDBYTES (6);		DONEBYTES (6);		bytes = (header[4] << 8) + header[5];		if (bytes > end - buf) {		    state = DEMUX_SKIP;		    state_bytes = bytes - (end - buf);		    return 0;		}		buf += bytes;	    }	}    }}static void ps_loop (void){    uint8_t * end;    do {	end = buffer + fread (buffer, 1, BUFFER_SIZE, in_file);	if (demux (buffer, end, 0))	    break;	/* hit program_end_code */    } while (end == buffer + BUFFER_SIZE);}static int pva_demux (uint8_t * buf, uint8_t * end){    static int state = DEMUX_SKIP;    static int state_bytes = 0;    static uint8_t head_buf[12];    uint8_t * header;    int bytes;    int len;    switch (state) {    case DEMUX_HEADER:        if (state_bytes > 0) {            header = head_buf;            bytes = state_bytes;            goto continue_header;        }        break;    case DEMUX_DATA:        if (state_bytes > end - buf) {            fwrite (buf, end - buf, 1, stdout);            state_bytes -= end - buf;            return 0;        }        fwrite (buf, state_bytes, 1, stdout);        buf += state_bytes;        break;    case DEMUX_SKIP:        if (state_bytes > end - buf) {            state_bytes -= end - buf;            return 0;        }        buf += state_bytes;        break;    }    while (1) {    payload_start:	header = buf;	bytes = end - buf;    continue_header:	NEEDBYTES (2);	if (header[0] != 0x41 || header[1] != 0x56) {	    if (header != head_buf) {		buf++;		goto payload_start;	    } else {		header[0] = header[1];		bytes = 1;		goto continue_header;	    }	}	NEEDBYTES (8);	if (header[2] != 1) {	    DONEBYTES (8);	    bytes = (header[6] << 8) + header[7];	    if (bytes > end - buf) {		state = DEMUX_SKIP;		state_bytes = bytes - (end - buf);		return 0;	    } 	    buf += bytes; 	} else {	    len = 8;	    if (header[5] & 0x10) {		len = 12;		NEEDBYTES (len);	    }	    DONEBYTES (len);	    bytes = (header[6] << 8) + header[7] + 8 - len;	    if (bytes > end - buf) {		fwrite (buf, end - buf, 1, stdout);		state = DEMUX_DATA;		state_bytes = bytes - (end - buf);		return 0;	    } else if (bytes > 0) {		fwrite (buf, bytes, 1, stdout);		buf += bytes;	    }	}    }}static void pva_loop (void){    uint8_t * end;    do {	end = buffer + fread (buffer, 1, BUFFER_SIZE, in_file);	pva_demux (buffer, end);    } while (end == buffer + BUFFER_SIZE);}static void ts_loop (void){    uint8_t * buf;    uint8_t * nextbuf;    uint8_t * data;    uint8_t * end;    int pid;    buf = buffer;    while (1) {	end = buf + fread (buf, 1, buffer + BUFFER_SIZE - buf, in_file);	buf = buffer;	for (; (nextbuf = buf + 188) <= end; buf = nextbuf) {	    if (*buf != 0x47) {		fprintf (stderr, "bad sync byte\n");		nextbuf = buf + 1;		continue;	    }	    pid = ((buf[1] << 8) + buf[2]) & 0x1fff;	    if (pid != demux_pid)		continue;	    data = buf + 4;	    if (buf[3] & 0x20) {	/* buf contains an adaptation field */		data = buf + 5 + buf[4];		if (data > nextbuf)		    continue;	    }	    if (buf[3] & 0x10)		demux (data, nextbuf,		       (buf[1] & 0x40) ? DEMUX_PAYLOAD_START : 0);	}	if (end != buffer + BUFFER_SIZE)	    break;	memcpy (buffer, buf, end - buf);	buf = buffer + (end - buf);    }}int main (int argc, char ** argv){#ifdef HAVE_IO_H    setmode (fileno (stdin), O_BINARY);    setmode (fileno (stdout), O_BINARY);#endif    handle_args (argc, argv);    if (demux_pva)	pva_loop ();    if (demux_pid)	ts_loop ();    else	ps_loop ();    return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久99精品国产片| 亚洲精品网站在线观看| 日本一区二区三区四区在线视频| 一区二区三区在线视频观看| 国内久久精品视频| 欧美午夜不卡在线观看免费| 日本一区二区电影| 蜜臀av性久久久久av蜜臀妖精| 色琪琪一区二区三区亚洲区| 久久久蜜臀国产一区二区| 亚洲18色成人| 色综合久久中文字幕综合网| 欧美激情一二三区| 国产美女久久久久| 精品国产一区二区三区忘忧草| 一区二区三区蜜桃| 91麻豆国产福利精品| 国产三级欧美三级| 国产在线精品一区二区三区不卡| 91精品国产综合久久久蜜臀图片| 亚洲综合激情另类小说区| 成人深夜在线观看| 亚洲国产精华液网站w | 中文字幕中文在线不卡住| 九九**精品视频免费播放| 欧美剧情片在线观看| 亚洲小说春色综合另类电影| 91高清在线观看| 一区二区三区欧美激情| 99免费精品在线| 亚洲欧洲日韩综合一区二区| 成人午夜av影视| 国产精品久久久久久久久免费相片 | 国产婷婷色一区二区三区在线| 美女视频一区二区| 欧美电影免费观看高清完整版在线| 日韩精品一区第一页| 91精品国产入口在线| 日日夜夜精品视频免费| 日韩一区二区三区高清免费看看| 日韩av一级电影| 欧美精品一区二区精品网| 国产在线精品一区在线观看麻豆| 久久九九99视频| 成人午夜电影网站| 亚洲蜜臀av乱码久久精品蜜桃| 91国产丝袜在线播放| 亚洲成人动漫精品| 91精品国产高清一区二区三区| 男女性色大片免费观看一区二区| 欧美白人最猛性xxxxx69交| 国产麻豆精品在线观看| 国产精品对白交换视频| 欧美性感一类影片在线播放| 日产欧产美韩系列久久99| 精品国精品自拍自在线| 成人国产精品免费| 亚洲sss视频在线视频| 日韩视频免费观看高清完整版| 国产经典欧美精品| 一区二区三区**美女毛片| 91精品国产乱码久久蜜臀| 国产精品亚洲一区二区三区在线| 中文字幕中文字幕在线一区 | 国产精品一区免费在线观看| 欧美国产欧美综合| 欧美日精品一区视频| 精品午夜一区二区三区在线观看| 中文字幕乱码日本亚洲一区二区 | 国产成人在线免费观看| 亚洲另类在线一区| 精品入口麻豆88视频| 99精品视频中文字幕| 免费观看在线色综合| 中文一区在线播放| 91精选在线观看| 99国内精品久久| 久久精工是国产品牌吗| 亚洲黄色尤物视频| 精品国产伦一区二区三区观看方式 | 国产又粗又猛又爽又黄91精品| 国产精品美女久久久久久| 在线不卡中文字幕播放| zzijzzij亚洲日本少妇熟睡| 免费精品视频最新在线| 亚洲你懂的在线视频| 精品99一区二区| 欧美日韩黄色一区二区| 成人av集中营| 国产一区二区在线看| 亚洲第一久久影院| 亚洲美腿欧美偷拍| 国产午夜精品一区二区| 日韩一卡二卡三卡| 日韩一级片网站| 在线观看成人小视频| 成人中文字幕电影| 国产综合色在线| 三级欧美在线一区| 亚洲成av人综合在线观看| 中文字幕免费观看一区| 久久久久久免费网| 精品欧美一区二区久久| 欧美日韩www| 欧美三级欧美一级| 欧美性受xxxx| 欧美在线观看视频一区二区| voyeur盗摄精品| 国产91露脸合集magnet| 国产一区二区精品久久91| 免费观看30秒视频久久| 日本不卡高清视频| 美女视频黄频大全不卡视频在线播放| 亚洲福利一区二区| 婷婷成人综合网| 免费成人美女在线观看| 日av在线不卡| 精彩视频一区二区三区| 精品一区二区三区在线观看 | 亚洲电影一区二区| 亚洲地区一二三色| 日韩专区欧美专区| 强制捆绑调教一区二区| 激情综合色播激情啊| 国内精品视频666| 国产在线日韩欧美| 成人丝袜高跟foot| 在线一区二区三区四区五区| 在线精品视频免费观看| 欧美日韩和欧美的一区二区| 欧美一区二区二区| 欧美成人猛片aaaaaaa| 久久久久久久久久久黄色| 婷婷综合五月天| 国内精品免费**视频| 丁香激情综合五月| 日本高清不卡aⅴ免费网站| 欧美日韩中文字幕一区二区| 日韩视频在线永久播放| 欧美激情一区二区三区全黄| 亚洲人成在线播放网站岛国 | 国产精品网站一区| 亚洲尤物在线视频观看| 午夜av电影一区| 国产福利视频一区二区三区| 99久久精品国产一区二区三区 | 成人在线综合网| 91久久精品一区二区二区| 正在播放一区二区| 国产女人水真多18毛片18精品视频 | 成人av资源站| 欧美日韩成人一区| 国产精品久久午夜| 日韩av在线播放中文字幕| 成人精品国产福利| 欧美一区二区三区在线| 国产精品视频九色porn| 五月天视频一区| 成人a级免费电影| 91精品国产aⅴ一区二区| 国产精品福利电影一区二区三区四区| 五月婷婷综合在线| 成人久久久精品乱码一区二区三区 | 欧美不卡一区二区三区| 亚洲精品一二三区| 国产精品亚洲第一| 在线不卡一区二区| 亚洲欧美aⅴ...| 国产成人精品一区二区三区网站观看 | 国产成人亚洲综合色影视| 欧美亚洲国产一区在线观看网站| 久久精品在线免费观看| 青草国产精品久久久久久| 91麻豆文化传媒在线观看| 久久免费午夜影院| 免费精品视频最新在线| 欧美日韩久久不卡| 亚洲精品国产视频| 成人精品免费视频| 久久精品日韩一区二区三区| 日韩精品一级二级| 欧美三级在线播放| 一区二区三区不卡在线观看| 成人美女在线观看| 国产日韩v精品一区二区| 精品一区二区三区久久| 91精品国产91热久久久做人人| 亚洲国产一区二区三区青草影视| 99久久国产综合精品女不卡| 国产三级欧美三级| 国产一区二区三区免费播放| 日韩欧美国产一区二区三区 | 亚洲欧洲制服丝袜| 高清av一区二区| 国产欧美日韩视频在线观看| 国产精品一区二区男女羞羞无遮挡| 日韩一区和二区| 久久精品国产免费| 欧美大片日本大片免费观看| 99精品久久只有精品|