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

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

?? mpegts.c

?? arm平臺下的H264編碼和解碼源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * MPEG2 transport stream (aka DVB) demux * Copyright (c) 2002-2003 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "avformat.h"#include "mpegts.h"//#define DEBUG_SI//#define DEBUG_SEEK/* 1.0 second at 24Mbit/s */#define MAX_SCAN_PACKETS 32000/* maximum size in which we look for synchronisation if   synchronisation is lost */#define MAX_RESYNC_SIZE 4096static int add_pes_stream(MpegTSContext *ts, int pid, int stream_type);enum MpegTSFilterType {    MPEGTS_PES,    MPEGTS_SECTION,};typedef void PESCallback(void *opaque, const uint8_t *buf, int len, int is_start);typedef struct MpegTSPESFilter {    PESCallback *pes_cb;    void *opaque;} MpegTSPESFilter;typedef void SectionCallback(void *opaque, const uint8_t *buf, int len);typedef void SetServiceCallback(void *opaque, int ret);typedef struct MpegTSSectionFilter {    int section_index;    int section_h_size;    uint8_t *section_buf;    int check_crc:1;    int end_of_section_reached:1;    SectionCallback *section_cb;    void *opaque;} MpegTSSectionFilter;typedef struct MpegTSFilter {    int pid;    int last_cc; /* last cc code (-1 if first packet) */    enum MpegTSFilterType type;    union {        MpegTSPESFilter pes_filter;        MpegTSSectionFilter section_filter;    } u;} MpegTSFilter;typedef struct MpegTSService {    int running:1;    int sid;    char *provider_name;    char *name;} MpegTSService;struct MpegTSContext {    /* user data */    AVFormatContext *stream;    int raw_packet_size; /* raw packet size, including FEC if present */    int auto_guess; /* if true, all pids are analized to find streams */    int set_service_ret;    int mpeg2ts_raw;  /* force raw MPEG2 transport stream output, if possible */    int mpeg2ts_compute_pcr; /* compute exact PCR for each transport stream packet */    /* used to estimate the exact PCR */    int64_t cur_pcr;    int pcr_incr;    int pcr_pid;        /* data needed to handle file based ts */    int stop_parse; /* stop parsing loop */    AVPacket *pkt; /* packet containing av data */    /******************************************/    /* private mpegts data */    /* scan context */    MpegTSFilter *sdt_filter;    int nb_services;    MpegTSService **services;        /* set service context (XXX: allocated it ?) */    SetServiceCallback *set_service_cb;    void *set_service_opaque;    MpegTSFilter *pat_filter;    MpegTSFilter *pmt_filter;    int req_sid;    MpegTSFilter *pids[NB_PID_MAX];};static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1,                               const uint8_t *buf, int buf_size, int is_start){    MpegTSSectionFilter *tss = &tss1->u.section_filter;    int len;    unsigned int crc;        if (is_start) {        memcpy(tss->section_buf, buf, buf_size);        tss->section_index = buf_size;        tss->section_h_size = -1;        tss->end_of_section_reached = 0;    } else {        if (tss->end_of_section_reached)            return;        len = 4096 - tss->section_index;        if (buf_size < len)            len = buf_size;        memcpy(tss->section_buf + tss->section_index, buf, len);        tss->section_index += len;    }    /* compute section length if possible */    if (tss->section_h_size == -1 && tss->section_index >= 3) {        len = (((tss->section_buf[1] & 0xf) << 8) | tss->section_buf[2]) + 3;        if (len > 4096)            return;        tss->section_h_size = len;    }    if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) {        if (tss->check_crc) {            crc = mpegts_crc32(tss->section_buf, tss->section_h_size);            if (crc != 0)                goto invalid_crc;        }        tss->section_cb(tss->opaque, tss->section_buf, tss->section_h_size);    invalid_crc:        tss->end_of_section_reached = 1;    }}MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid,                                          SectionCallback *section_cb, void *opaque,                                         int check_crc){    MpegTSFilter *filter;    MpegTSSectionFilter *sec;    #ifdef DEBUG_SI    printf("Filter: pid=0x%x\n", pid);#endif    if (pid >= NB_PID_MAX || ts->pids[pid])        return NULL;    filter = av_mallocz(sizeof(MpegTSFilter));    if (!filter)         return NULL;    ts->pids[pid] = filter;    filter->type = MPEGTS_SECTION;    filter->pid = pid;    filter->last_cc = -1;    sec = &filter->u.section_filter;    sec->section_cb = section_cb;    sec->opaque = opaque;    sec->section_buf = av_malloc(MAX_SECTION_SIZE);    sec->check_crc = check_crc;    if (!sec->section_buf) {        av_free(filter);        return NULL;    }    return filter;}MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,                                      PESCallback *pes_cb,                                     void *opaque){    MpegTSFilter *filter;    MpegTSPESFilter *pes;    if (pid >= NB_PID_MAX || ts->pids[pid])        return NULL;    filter = av_mallocz(sizeof(MpegTSFilter));    if (!filter)         return NULL;    ts->pids[pid] = filter;    filter->type = MPEGTS_PES;    filter->pid = pid;    filter->last_cc = -1;    pes = &filter->u.pes_filter;    pes->pes_cb = pes_cb;    pes->opaque = opaque;    return filter;}void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter){    int pid;    pid = filter->pid;    if (filter->type == MPEGTS_SECTION)        av_freep(&filter->u.section_filter.section_buf);    else if (filter->type == MPEGTS_PES)        av_freep(&filter->u.pes_filter.opaque);    av_free(filter);    ts->pids[pid] = NULL;}static int analyze(const uint8_t *buf, int size, int packet_size, int *index){    int stat[packet_size];    int i;    int x=0;    int best_score=0;    memset(stat, 0, packet_size*sizeof(int));    for(x=i=0; i<size; i++){        if(buf[i] == 0x47){            stat[x]++;            if(stat[x] > best_score){                best_score= stat[x];                if(index) *index= x;            }        }        x++;        if(x == packet_size) x= 0;    }    return best_score;}/* autodetect fec presence. Must have at least 1024 bytes  */static int get_packet_size(const uint8_t *buf, int size){    int score, fec_score;    if (size < (TS_FEC_PACKET_SIZE * 5 + 1))        return -1;            score    = analyze(buf, size, TS_PACKET_SIZE, NULL);    fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);//    av_log(NULL, AV_LOG_DEBUG, "score: %d, fec_score: %d \n", score, fec_score);        if     (score > fec_score) return TS_PACKET_SIZE;    else if(score < fec_score) return TS_FEC_PACKET_SIZE;    else                       return -1;}typedef struct SectionHeader {    uint8_t tid;    uint16_t id;    uint8_t version;    uint8_t sec_num;    uint8_t last_sec_num;} SectionHeader;static inline int get8(const uint8_t **pp, const uint8_t *p_end){    const uint8_t *p;    int c;    p = *pp;    if (p >= p_end)        return -1;    c = *p++;    *pp = p;    return c;}static inline int get16(const uint8_t **pp, const uint8_t *p_end){    const uint8_t *p;    int c;    p = *pp;    if ((p + 1) >= p_end)        return -1;    c = (p[0] << 8) | p[1];    p += 2;    *pp = p;    return c;}/* read and allocate a DVB string preceeded by its length */static char *getstr8(const uint8_t **pp, const uint8_t *p_end){    int len;    const uint8_t *p;    char *str;    p = *pp;    len = get8(&p, p_end);    if (len < 0)        return NULL;    if ((p + len) > p_end)        return NULL;    str = av_malloc(len + 1);    if (!str)        return NULL;    memcpy(str, p, len);    str[len] = '\0';    p += len;    *pp = p;    return str;}static int parse_section_header(SectionHeader *h,                                 const uint8_t **pp, const uint8_t *p_end){    int val;    val = get8(pp, p_end);    if (val < 0)        return -1;    h->tid = val;    *pp += 2;    val = get16(pp, p_end);    if (val < 0)        return -1;    h->id = val;    val = get8(pp, p_end);    if (val < 0)        return -1;    h->version = (val >> 1) & 0x1f;    val = get8(pp, p_end);    if (val < 0)        return -1;    h->sec_num = val;    val = get8(pp, p_end);    if (val < 0)        return -1;    h->last_sec_num = val;    return 0;}static MpegTSService *new_service(MpegTSContext *ts, int sid,                                   char *provider_name, char *name){    MpegTSService *service;#ifdef DEBUG_SI    printf("new_service: sid=0x%04x provider='%s' name='%s'\n",            sid, provider_name, name);#endif    service = av_mallocz(sizeof(MpegTSService));    if (!service)        return NULL;    service->sid = sid;    service->provider_name = provider_name;    service->name = name;    dynarray_add(&ts->services, &ts->nb_services, service);    return service;}static void pmt_cb(void *opaque, const uint8_t *section, int section_len){    MpegTSContext *ts = opaque;    SectionHeader h1, *h = &h1;    const uint8_t *p, *p_end;    int program_info_length, pcr_pid, pid, stream_type, desc_length;    #ifdef DEBUG_SI    printf("PMT:\n");    av_hex_dump(stdout, (uint8_t *)section, section_len);#endif    p_end = section + section_len - 4;    p = section;    if (parse_section_header(h, &p, p_end) < 0)        return;#ifdef DEBUG_SI    printf("sid=0x%x sec_num=%d/%d\n", h->id, h->sec_num, h->last_sec_num);#endif    if (h->tid != PMT_TID || (ts->req_sid >= 0 && h->id != ts->req_sid) )        return;    pcr_pid = get16(&p, p_end) & 0x1fff;    if (pcr_pid < 0)        return;    ts->pcr_pid = pcr_pid;#ifdef DEBUG_SI    printf("pcr_pid=0x%x\n", pcr_pid);#endif    program_info_length = get16(&p, p_end) & 0xfff;    if (program_info_length < 0)        return;    p += program_info_length;    if (p >= p_end)        return;    for(;;) {        stream_type = get8(&p, p_end);        if (stream_type < 0)            break;        pid = get16(&p, p_end) & 0x1fff;        if (pid < 0)            break;        desc_length = get16(&p, p_end) & 0xfff;        if (desc_length < 0)            break;        p += desc_length;        if (p > p_end)            return;#ifdef DEBUG_SI        printf("stream_type=%d pid=0x%x\n", stream_type, pid);#endif        /* now create ffmpeg stream */        switch(stream_type) {        case STREAM_TYPE_AUDIO_MPEG1:        case STREAM_TYPE_AUDIO_MPEG2:        case STREAM_TYPE_VIDEO_MPEG1:        case STREAM_TYPE_VIDEO_MPEG2:        case STREAM_TYPE_VIDEO_MPEG4:        case STREAM_TYPE_VIDEO_H264:        case STREAM_TYPE_AUDIO_AAC:        case STREAM_TYPE_AUDIO_AC3:            add_pes_stream(ts, pid, stream_type);            break;        default:            /* we ignore the other streams */            break;        }    }    /* all parameters are there */    ts->set_service_cb(ts->set_service_opaque, 0);    mpegts_close_filter(ts, ts->pmt_filter);    ts->pmt_filter = NULL;}static void pat_cb(void *opaque, const uint8_t *section, int section_len){    MpegTSContext *ts = opaque;    SectionHeader h1, *h = &h1;    const uint8_t *p, *p_end;    int sid, pmt_pid;#ifdef DEBUG_SI    printf("PAT:\n");    av_hex_dump(stdout, (uint8_t *)section, section_len);#endif    p_end = section + section_len - 4;    p = section;    if (parse_section_header(h, &p, p_end) < 0)        return;    if (h->tid != PAT_TID)        return;    for(;;) {        sid = get16(&p, p_end);        if (sid < 0)            break;        pmt_pid = get16(&p, p_end) & 0x1fff;        if (pmt_pid < 0)            break;#ifdef DEBUG_SI        printf("sid=0x%x pid=0x%x\n", sid, pmt_pid);#endif        if (sid == 0x0000) {            /* NIT info */        } else {            if (ts->req_sid == sid) {                ts->pmt_filter = mpegts_open_section_filter(ts, pmt_pid,                                                             pmt_cb, ts, 1);                goto found;            }        }    }    /* not found */    ts->set_service_cb(ts->set_service_opaque, -1); found:    mpegts_close_filter(ts, ts->pat_filter);    ts->pat_filter = NULL;}/* add all services found in the PAT */static void pat_scan_cb(void *opaque, const uint8_t *section, int section_len){    MpegTSContext *ts = opaque;    SectionHeader h1, *h = &h1;    const uint8_t *p, *p_end;    int sid, pmt_pid;    char *provider_name, *name;    char buf[256];#ifdef DEBUG_SI    printf("PAT:\n");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲精品成人久久奇米网 | 国产色91在线| 亚洲精品视频在线看| 麻豆91在线看| 在线免费亚洲电影| 中文在线免费一区三区高中清不卡| 亚洲一区二区视频在线观看| 国产高清精品在线| 69堂成人精品免费视频| 亚洲乱码日产精品bd| 国产suv精品一区二区6| 日韩欧美你懂的| 午夜精品福利在线| 日本黄色一区二区| 日韩毛片一二三区| 成人国产免费视频| 久久久av毛片精品| 激情都市一区二区| 精品精品欲导航| 欧美aaa在线| 欧美一区二区三区影视| 亚洲r级在线视频| 欧美三级乱人伦电影| 亚洲一区二区美女| 色婷婷综合视频在线观看| 国产精品免费视频网站| 成人中文字幕电影| 国产欧美一区二区三区在线老狼| 精品亚洲porn| 日韩精品一区二区三区中文不卡| 美女高潮久久久| 欧美精品一区二区高清在线观看| 免费看欧美女人艹b| 欧美大尺度电影在线| 免费看欧美美女黄的网站| 日韩美女天天操| 久久爱www久久做| 久久婷婷一区二区三区| 国产**成人网毛片九色| 中文字幕不卡在线| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲欧美在线视频观看| 欧美影院一区二区| 喷水一区二区三区| 国产日韩欧美不卡在线| 97aⅴ精品视频一二三区| 午夜成人在线视频| 国产夜色精品一区二区av| 亚洲三级小视频| 色婷婷一区二区| 午夜av电影一区| 久久亚洲私人国产精品va媚药| 亚洲黄网站在线观看| 在线观看视频欧美| 视频一区欧美精品| 国产欧美日韩不卡免费| 欧美电影免费观看高清完整版在线 | 精品系列免费在线观看| 亚洲午夜精品网| 成人欧美一区二区三区视频网页| 久久影院午夜论| 在线不卡中文字幕| 欧美亚洲图片小说| 欧美婷婷六月丁香综合色| 99精品国产热久久91蜜凸| 国产98色在线|日韩| 国产乱人伦偷精品视频不卡| 黑人精品欧美一区二区蜜桃| 日韩精品欧美精品| 日韩在线观看一区二区| 天天av天天翘天天综合网| 亚洲国产另类av| 一区二区三区免费在线观看| 亚洲女人的天堂| 依依成人精品视频| 亚洲午夜久久久久久久久电影网| 一级精品视频在线观看宜春院 | 亚洲va中文字幕| 亚洲动漫第一页| 亚洲在线免费播放| 亚洲成人免费在线观看| 亚洲国产成人av好男人在线观看| 亚洲黄一区二区三区| 亚洲国产精品嫩草影院| 午夜精品久久久久久久久久| 亚洲成av人片在线观看无码| 日韩黄色小视频| 激情综合五月婷婷| 丁香网亚洲国际| 99精品久久只有精品| 欧美在线免费观看亚洲| 欧美老女人第四色| 日韩欧美国产综合| 欧美韩日一区二区三区四区| 亚洲日韩欧美一区二区在线| 夜夜揉揉日日人人青青一国产精品 | 日韩精品91亚洲二区在线观看| 奇米色777欧美一区二区| 国产综合色精品一区二区三区| 国产成人免费网站| 色婷婷亚洲一区二区三区| 欧美丰满一区二区免费视频| 精品国产乱码久久久久久1区2区| 欧美激情一区二区在线| 亚洲精品免费在线播放| 琪琪一区二区三区| 国产99久久久久久免费看农村| 91麻豆免费观看| 337p亚洲精品色噜噜| 中文字幕免费不卡在线| 亚洲午夜久久久久久久久电影院| 麻豆国产精品777777在线| 丁香激情综合五月| 欧美高清视频不卡网| 中文字幕乱码久久午夜不卡 | 91国产免费观看| 日韩精品一区二区在线观看| 亚洲欧洲日韩女同| 奇米亚洲午夜久久精品| 波多野结衣一区二区三区| 欧美日韩色一区| 欧美极品少妇xxxxⅹ高跟鞋 | 2021国产精品久久精品| 一级中文字幕一区二区| 国产99精品在线观看| 欧美猛男男办公室激情| 国产精品视频看| 精品一区二区三区免费毛片爱 | 欧美视频一区二区三区四区| 精品国产免费人成电影在线观看四季 | 欧美视频一二三区| 国产亚洲精品福利| 亚洲成av人综合在线观看| 成人国产精品免费网站| 日韩免费高清视频| 亚洲国产一区二区视频| 不卡在线视频中文字幕| 26uuu久久天堂性欧美| 亚洲国产精品久久不卡毛片| 成人18精品视频| 久久久精品免费观看| 美女一区二区视频| 欧美三级电影在线观看| 成人免费小视频| 国产成人综合视频| 日韩欧美区一区二| 日本亚洲欧美天堂免费| 欧美主播一区二区三区美女| 国产精品人成在线观看免费 | 日韩电影在线免费看| 91官网在线观看| 亚洲欧洲一区二区三区| 成人性生交大合| 久久精品亚洲乱码伦伦中文| 久久精品国产99国产精品| 777色狠狠一区二区三区| 性做久久久久久免费观看欧美| 91蝌蚪porny| 亚洲图片另类小说| 成av人片一区二区| 亚洲欧洲精品天堂一级 | 欧美性大战xxxxx久久久| 亚洲精选视频在线| 91香蕉视频在线| 亚洲免费av高清| 在线观看亚洲专区| 亚洲福中文字幕伊人影院| 欧美视频一二三区| 亚洲国产精品精华液网站| 欧美日韩一区不卡| 婷婷综合另类小说色区| 欧美日韩国产欧美日美国产精品| 亚洲va欧美va国产va天堂影院| 欧美久久久久久久久中文字幕| 亚洲h在线观看| 日韩一区二区电影在线| 韩国精品主播一区二区在线观看 | 99久久99精品久久久久久| 中文字幕一区二区三区视频| 99国产精品久久| 一区二区三区日韩| 欧美猛男超大videosgay| 日韩av高清在线观看| 26uuu精品一区二区| 成人av资源站| 亚洲最色的网站| 欧美一区二区三区免费在线看| 久久99精品久久只有精品| 国产亲近乱来精品视频| 色综合夜色一区| 午夜一区二区三区在线观看| 在线91免费看| 成人一区二区三区视频在线观看| 国产精品女主播在线观看| 在线观看日韩av先锋影音电影院| 青娱乐精品视频在线| 欧美激情一区二区三区不卡| 91精品福利在线| 精品一区二区三区在线播放 | 3d动漫精品啪啪1区2区免费 |