日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffmpeg分析系列

發(fā)布時間:2023/12/18 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ffmpeg分析系列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
hello,各位好,本人是一名嵌入式軟件工程師,目前正使用ffmpeg開發(fā)一款嵌入式多媒體播放器,《ffmpeg分析》系列博文是本人在閱讀ffmpeg源代碼時所做的筆記,希望對各位有點幫助。分析過程結(jié)合下面的例程: ????http://dranger.com/ffmpeg/tutorial05.c ? 一. 調(diào)用av_register_all函數(shù)注冊所有的格式和編碼解碼器.
1.1 先調(diào)用avcodec_register_all函數(shù)注冊所有的編碼解碼器.
1. 下面列出與H264相關(guān)的注冊:

?? ?// 注冊硬件加速器
????REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
????REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);

????// 注冊解碼器
????REGISTER_DECODER (H264, h264);
????REGISTER_DECODER (H264_VDPAU, h264_vdpau);

????// 注冊編碼器
????REGISTER_ENCODER (LIBX264, libx264);

????// 注冊分析器
????REGISTER_PARSER (H264, h264);

????// 注冊位流分離器
????REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);


2. 下面列出注冊宏:

#define REGISTER_HWACCEL(X,x){ \
??????????extern AVHWAccel x##_hwaccel; \
??????????if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&x##_hwaccel);}

#define REGISTER_ENCODER(X,x){ \
??????????extern AVCodec x##_encoder; \
??????????if(CONFIG_##X##_ENCODER) avcodec_register(&x##_encoder);}

#define REGISTER_DECODER(X,x){ \
??????????extern AVCodec x##_decoder; \
??????????if(CONFIG_##X##_DECODER) avcodec_register(&x##_decoder);}

#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)

#define REGISTER_PARSER(X,x){ \
??????????extern AVCodecParser x##_parser; \
??????????if(CONFIG_##X##_PARSER) av_register_codec_parser(&x##_parser);}

#define REGISTER_BSF(X,x){ \
??????????extern AVBitStreamFilter x##_bsf; \
??????????if(CONFIG_##X##_BSF) av_register_bitstream_filter(&x##_bsf);}


3. 分析一下注冊函數(shù), 以avcodec_register函數(shù)為例:

void avcodec_register(AVCodec*codec)
{
????AVCodec **p;
????avcodec_init();
????p = &first_avcodec;
????while (*p!= NULL) p =&(*p)->next;
????*p = codec;
????codec->next= NULL;
}


?? ?可以看到avcodec_register函數(shù)把輸入的AVCodec連成一個鏈表, 其它注冊函數(shù)與之類似, 就不多言了.
4. 上面調(diào)用了avcodec_init函數(shù):

void avcodec_init(void)
{
????static int initialized= 0;

?????if (initialized!= 0)
????????return;
????initialized = 1;

????dsputil_static_init ();
}


?? ?這個函數(shù)只會真正執(zhí)行一次.
5. 上面調(diào)用了dsputil_static_init函數(shù):

av_coldvoid dsputil_static_init(void)
{
????int i;

?????for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP]= i;
????for(i=0;i<MAX_NEG_CROP;i++){
????????ff_cropTbl[i]= 0;
????????ff_cropTbl[i + MAX_NEG_CROP + 256]= 255;
????}

?????for(i=0;i<512;i++){
????????ff_squareTbl[i]= (i - 256) *(i - 256);
????}

?????for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
}

?? ? ?? ?可以看到, 它初始化了一些靜態(tài)數(shù)據(jù).
1.2 注冊所有的格式和外部庫及協(xié)議.
1. 下面列出與H264相關(guān)的注冊:

?? ?// 注冊分離器和混合器
????REGISTER_MUXDEMUX (H264, h264);

????// 注冊文件協(xié)議
????REGISTER_PROTOCOL (FILE,file);


2. 下面列出注冊宏:

#define REGISTER_MUXER(X,x){ \
????extern AVOutputFormat x##_muxer; \
????if(CONFIG_##X##_MUXER) av_register_output_format(&x##_muxer);}

#define REGISTER_DEMUXER(X,x){ \
????extern AVInputFormat x##_demuxer; \
????if(CONFIG_##X##_DEMUXER) av_register_input_format(&x##_demuxer);}

#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)

#define REGISTER_PROTOCOL(X,x){ \
????extern URLProtocol x##_protocol; \
????if(CONFIG_##X##_PROTOCOL) av_register_protocol(&x##_protocol);}


?? ?這些注冊函數(shù)與avcodec_register函數(shù)類似, 就不多言了.



URL協(xié)議結(jié)構(gòu):

typedef?struct?URLProtocol?{
????const?char?*name;
????int?(*url_open)(URLContext?*h,?const?char?*url,?int?flags);
????int?(*url_read)(URLContext?*h,?unsigned?char?*buf,?int?size);
????int?(*url_write)(URLContext?*h,?unsigned?char?*buf,?int?size);
????int64_t?(*url_seek)(URLContext?*h,?int64_t?pos,?int?whence);
????int?(*url_close)(URLContext?*h);
????struct?URLProtocol?*next;
????int?(*url_read_pause)(URLContext?*h,?int?pause);
????int64_t?(*url_read_seek)(URLContext?*h,?int?stream_index,
?????????????????????????????int64_t?timestamp,?int?flags);
????int?(*url_get_file_handle)(URLContext?*h);
}?URLProtocol;



libavformat/file.c文件的file協(xié)議:

staticint file_open(URLContext*h, const char *filename, int flags)
{
????int access;
????int fd;

????av_strstart(filename,"file:", &filename);

????if (flags& URL_RDWR){
????????access = O_CREAT | O_TRUNC | O_RDWR;
????} else if (flags & URL_WRONLY){
????????access = O_CREAT | O_TRUNC | O_WRONLY;
????} else {
????????access = O_RDONLY;
????}
#ifdef O_BINARY
????access |= O_BINARY;
#endif
????fd = open(filename, access, 0666);
????if (fd == -1)
????????return AVERROR(errno);
????h->priv_data= (void*) (intptr_t) fd;
????return 0;
}

static int file_read(URLContext*h, unsigned char *buf, int size)
{
????int fd =(intptr_t) h->priv_data;
????return read(fd, buf, size);
}

static int file_write(URLContext*h, unsigned char *buf, int size)
{
????int fd =(intptr_t) h->priv_data;
????return write(fd, buf, size);
}

/* XXX: use llseek */
static int64_t file_seek(URLContext*h, int64_t pos, int whence)
{
????int fd =(intptr_t) h->priv_data;
????if (whence== AVSEEK_SIZE){
????????struct stat st;
????????int ret = fstat(fd,&st);
????????return ret < 0 ? AVERROR(errno): st.st_size;
????}
????return lseek(fd, pos, whence);
}

static int file_close(URLContext*h)
{
????int fd =(intptr_t) h->priv_data;
????return close(fd);
}

static int file_get_handle(URLContext*h)
{
????return (intptr_t) h->priv_data;
}

URLProtocol file_protocol = {
????"file",
????file_open,
????file_read,
????file_write,
????file_seek,
????file_close,
????.url_get_file_handle = file_get_handle,
};


libavformat/allformats.c文件的av_register_all函數(shù)注冊了file協(xié)議:

#define REGISTER_PROTOCOL(X,x){ \
????extern URLProtocol x##_protocol; \
????if(CONFIG_##X##_PROTOCOL) av_register_protocol(&x##_protocol);}


void av_register_all(void)
{
????/* 省略部分代碼 */
????/* protocols */
????REGISTER_PROTOCOL (FILE,file);
????/* 省略部分代碼 */
}


把注冊協(xié)議函數(shù)也貼出來吧:

URLProtocol*first_protocol =NULL;


int av_register_protocol(URLProtocol*protocol)
{
????URLProtocol **p;
????p = &first_protocol;
????while (*p!= NULL) p =&(*p)->next;
????*p = protocol;
????protocol->next= NULL;
????return 0;

}

http://blogold.chinaunix.net/u3/104564/showart_2369209.html 探測數(shù)據(jù)結(jié)構(gòu):

/** This structure contains the data a format has to probe a file. */
typedef?struct?AVProbeData?{
????const?char?*filename;
????unsigned?char?*buf;?/**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */
????int?buf_size;?/**< Size of buf except extra allocated bytes */
}?AVProbeData;


h264的探測函數(shù):

staticint h264_probe(AVProbeData*p)
{
????uint32_t code=-1;
????int sps=0, pps=0, idr=0, res=0, sli=0;
????int i;

????for(i=0; i<p->buf_size; i++){
????????code = (code<<8)+ p->buf[i];
????????if ((code& 0xffffff00)== 0x100){
????????????int ref_idc=(code>>5)&3;
????????????int type = code & 0x1F;
????????????static const int8_t ref_zero[32]={
????????????????2, 0, 0, 0, 0,-1, 1,-1,
???????????????-1, 1, 1, 1, 1,-1, 2, 2,
????????????????2, 2, 2, 0, 2, 2, 2, 2,
????????????????2, 2, 2, 2, 2, 2, 2, 2
????????????};

????????????if(code& 0x80) //forbidden bit

????????????????return 0;

????????????if(ref_zero[type]== 1 && ref_idc)
????????????????return 0;
????????????if(ref_zero[type]==-1&& !ref_idc)
????????????????return 0;
????????????if(ref_zero[type]== 2)
????????????????res++;

????????????switch(type){
????????????case 1: sli++;break;
????????????case 5: idr++;break;
????????????case 7:
????????????????if(p->buf[i+2]&0x0F)
????????????????????return 0;
????????????????sps++;
????????????????break;
????????????case 8: pps++;break;
????????????}
????????}
????}
????if(sps && pps &&(idr||sli>3)&& res<(sps+pps+idr))
????????return AVPROBE_SCORE_MAX/2+1;// +1 for .mpg

????return 0;
}


視頻讀首部函數(shù):

staticint video_read_header(AVFormatContext*s,
?????????????????????????????AVFormatParameters *ap)
{
????AVStream *st;

????st = av_new_stream(s, 0);
????if (!st)
????????return AVERROR(ENOMEM);

????st->codec->codec_type= AVMEDIA_TYPE_VIDEO;
????st->codec->codec_id= s->iformat->value;
????st->need_parsing= AVSTREAM_PARSE_FULL;

????/* for MJPEG, specify frame rate */
????/* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
????if (ap->time_base.num){
????????st->codec->time_base= ap->time_base;
????} else if ( st->codec->codec_id== CODEC_ID_MJPEG||
????????????????st->codec->codec_id== CODEC_ID_MPEG4||
????????????????st->codec->codec_id== CODEC_ID_DIRAC||
????????????????st->codec->codec_id== CODEC_ID_DNXHD||
????????????????st->codec->codec_id== CODEC_ID_H264){
????????st->codec->time_base=(AVRational){1,25};
????}
????av_set_pts_info(st, 64, 1, 1200000);

????return 0;
}


原始地讀實際的包函數(shù):

int ff_raw_read_partial_packet(AVFormatContext*s, AVPacket*pkt)
{
????int ret, size;

????size = RAW_PACKET_SIZE;

????if (av_new_packet(pkt, size)< 0)
????????return AVERROR(ENOMEM);

????pkt->pos= url_ftell(s->pb);
????pkt->stream_index= 0;
????ret = get_partial_buffer(s->pb, pkt->data, size);
????if (ret< 0) {
????????av_free_packet(pkt);
????????return ret;
????}
????pkt->size= ret;
????return ret;
}


原始地寫包函數(shù):

static?int?raw_write_packet(struct?AVFormatContext?*s,?AVPacket?*pkt)
{
????put_buffer(s->pb,?pkt->data,?pkt->size);
????put_flush_packet(s->pb);
????return?0;
}


h264混合器:

AVOutputFormat h264_muxer?=?{
????"h264",
????NULL_IF_CONFIG_SMALL("raw H.264 video format"),
????NULL,
????"h264",
????0,
????CODEC_ID_NONE,
????CODEC_ID_H264,
????NULL,
????raw_write_packet,
????.flags=?AVFMT_NOTIMESTAMPS,
};



h264分離器:

AVInputFormat h264_demuxer= {
????"h264",
????NULL_IF_CONFIG_SMALL("raw H.264 video format"),
????0,
????h264_probe,
????video_read_header,
????ff_raw_read_partial_packet,
????.flags= AVFMT_GENERIC_INDEX,
????.extensions ="h26l,h264,264",//FIXME remove after writing mpeg4_probe
????.value = CODEC_ID_H264,
}


libavformat/allformats.c文件的av_register_all函數(shù)注冊了h264分離器和混合器:

#define REGISTER_MUXER(X,x){ \
????extern AVOutputFormat x##_muxer; \
????if(CONFIG_##X##_MUXER) av_register_output_format(&x##_muxer);}

#define REGISTER_DEMUXER(X,x){ \
????extern AVInputFormat x##_demuxer; \
????if(CONFIG_##X##_DEMUXER) av_register_input_format(&x##_demuxer);}

#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)


void av_register_all(void)
{
????/* 省略部分代碼 */
????/* protocols */
????REGISTER_MUXDEMUX (H264, h264);
????/* 省略部分代碼 */
}


把注冊格式函數(shù)也貼出來吧:

/** head of registered input format linked list */
AVInputFormat *first_iformat = NULL;
/** head of registered output format linked list */
AVOutputFormat *first_oformat = NULL;


void av_register_input_format(AVInputFormat*format)
{
????AVInputFormat **p;
????p = &first_iformat;
????while (*p!= NULL) p =&(*p)->next;
????*p = format;
????format->next= NULL;
}

void av_register_output_format(AVOutputFormat*format)
{
????AVOutputFormat **p;
????p = &first_oformat;
????while (*p!= NULL) p =&(*p)->next;
????*p = format;
????format->next= NULL;
}


http://blogold.chinaunix.net/u3/104564/showart_2369231.html


調(diào)用av_open_input_file(&pFormatCtx, is->filename,NULL, 0,NULL)函數(shù)打開輸入的文件.

1. 分析一下函數(shù)原型:
int av_open_input_file(AVFormatContext**ic_ptr,// 輸出參數(shù): 格式上下文
???????????????????????const char *filename,// 文件名
???????????????????????AVInputFormat *fmt,// 輸入的格式, 為NULL, 即未知
???????????????????????int buf_size,// 緩沖的大小, 為0
???????????????????????AVFormatParameters *ap);// 格式的參數(shù), 為NULL


2. 初始化探測數(shù)據(jù):
????AVProbeData probe_data, *pd = &probe_data;

????pd->filename= "";
????if (filename)
????????pd->filename= filename;
????pd->buf= NULL;
????pd->buf_size= 0;

3. 探測輸入的格式:
????if (!fmt){ // fmt == NULL, 成立
????????fmt = av_probe_input_format(pd, 0);
????}

????進(jìn)入av_probe_input_format函數(shù):
AVInputFormat *av_probe_input_format(AVProbeData*pd, int is_opened) {
????int score=0;
????return av_probe_input_format2(pd, is_opened,&score);
}

????進(jìn)入av_probe_input_format2函數(shù):
AVInputFormat *av_probe_input_format2(AVProbeData*pd, int is_opened, int *score_max)
{
????AVInputFormat *fmt1,*fmt;
????int score;

????fmt = NULL;
????for(fmt1= first_iformat; fmt1!= NULL; fmt1 = fmt1->next){
????????if (!is_opened== !(fmt1->flags& AVFMT_NOFILE))// is_opened == 0, fmt1->flags 沒有設(shè)置 AVFMT_NOFILE 標(biāo)志時成立
????????????continue;
????/* 省略部分代碼 */
}

????見libavformat/raw.c文件:
AVInputFormat h264_demuxer = {
????"h264",
????NULL_IF_CONFIG_SMALL("raw H.264 video format"),
????0,
????h264_probe,
????video_read_header,
????ff_raw_read_partial_packet,
????.flags= AVFMT_GENERIC_INDEX,
????.extensions ="h26l,h264,264",//FIXME remove after writing mpeg4_probe
????.value = CODEC_ID_H264,
};
????由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面成立,continue, 返回的 AVInputFormat 指針為NULL, 探測不成功.

1. 打開文件:

if?(!fmt?||?!(fmt->flags?&?AVFMT_NOFILE))?{?

因 fmt == NULL, 上面成立, 再看下面的代碼:

?? ? ? ?ByteIOContext*pb = NULL; // 字節(jié)IO上下文

????????if ((err=url_fopen(&pb, filename, URL_RDONLY))< 0) { // 只讀方式打開輸入的文件
????????????goto fail;
????????}
????????if (buf_size> 0) { // 因 buf_size == 0, 不成立
????????????url_setbufsize(pb, buf_size);

?? ? ? ?}


進(jìn)入url_fopen函數(shù):

int url_fopen(ByteIOContext**s,// 輸出參數(shù): 字節(jié)IO上下文
??????????????const char *filename,// 文件名
??????????????int flags)// 標(biāo)志
{
????URLContext *h;// URL(統(tǒng)一資源定位)上下文
????int err;

????err = url_open(&h, filename, flags);// 打開URL
????if (err< 0)
????????return err;
????err = url_fdopen(s, h);// 用URL上下文打開字節(jié)IO上下文
????if (err< 0) {
????????url_close(h);
????????return err;
????}
????return 0;
}


進(jìn)入url_open函數(shù):

int url_open(URLContext**puc,?//?輸出參數(shù):?URL上下文

constchar *filename,?// 文件名

int flags)?// 標(biāo)志

{
????URLProtocol *up;
????const char*p;
????char proto_str[128],*q;

????// 提取協(xié)議
????p = filename;
????q = proto_str;
????while (*p!= '\0' &&*p !=':') { // 未結(jié)束, 并未遇到分隔符':'
????????if (!isalpha(*p))// 如果不是英文字母
????????????goto file_proto;
????????if ((q- proto_str)< sizeof(proto_str)- 1)
????????????*q++= *p;// 記錄協(xié)議字符串
????????p++;
????}

????if (*p== '\0' || is_dos_path(filename)){ // 如果上面是因為結(jié)束而跳出, 或且
文件名是DOS路徑

????file_proto:
????????strcpy(proto_str,"file");// 文件協(xié)議
????} else {
????????*q ='\0'; // 追加結(jié)束符
????}

????up = first_protocol;
????while (up!= NULL) {
????????if (!strcmp(proto_str, up->name))// 協(xié)議匹配
????????????return url_open_protocol (puc, up, filename, flags);// 用這個協(xié)議打開URL
????????up = up->next;
????}
????*puc = NULL;
????return AVERROR(ENOENT);
}


進(jìn)入url_open_protocol函數(shù):

int url_open_protocol(URLContext **puc,?//?輸出參數(shù):?URL上下文

struct URLProtocol*up,?// URL協(xié)議

constchar *filename,?// 文件名

int flags)?// 標(biāo)志
{
????URLContext *uc;
????int err;

????// 網(wǎng)絡(luò)初始化
#if CONFIG_NETWORK
????if (!ff_network_init())
????????return AVERROR(EIO);
#endif

????// 分配URL上下文并加上文件名的存儲空間
????uc = av_mallocz(sizeof(URLContext)+ strlen(filename)+ 1);
????if (!uc){
????????err = AVERROR(ENOMEM);
????????goto fail;
????}

????// 初始化URL上下文
#if LIBAVFORMAT_VERSION_MAJOR>= 53
????uc->av_class= &urlcontext_class;
#endif

????// 記錄文件名
????uc->filename= (char*) &uc[1];
????strcpy(uc->filename, filename);
?
????uc->prot= up;?
// URL協(xié)議

????uc->flags= flags;?// 標(biāo)志
????uc->is_streamed= 0;?// 默認(rèn)不是流, 可以在up->url_open函數(shù)里修改
????uc->max_packet_size= 0; //?
包最大多大,?默認(rèn)為0,可以在up->url_open函數(shù)里修改
????// 打開URL
????err = up->url_open(uc, filename, flags);
????if (err< 0) {
????????av_free(uc);
????????goto fail;
????}

?

????if((flags & (URL_WRONLY | URL_RDWR))?//?如果以可寫方式打開

???????||!strcmp(up->name,"file"))?//?或且是文件協(xié)議

????????//?如果不是流并且不可以url_seek

????????if(!uc->is_streamed&& url_seek(uc, 0,SEEK_SET) < 0)
????????????uc->is_streamed= 1;//?強制為流

????// 輸出
參數(shù):?URL上下文

????*puc= uc;
????return 0;
?fail:
????*puc = NULL;
#if CONFIG_NETWORK
????ff_network_close();
#endif
????return err;
}


先來看看url_get_max_packet_size函數(shù)

int?url_get_max_packet_size(URLContext?*h)
{
????return?h->max_packet_size;?// 包最大多大, 被上面初始化為0
}


進(jìn)入url_fdopen函數(shù):

int url_fdopen(

ByteIOContext**s,// 輸出參數(shù): 字節(jié)IO上下文

URLContext*h) // URL上下文
{
????uint8_t *buffer;
????int buffer_size, max_packet_size;

????max_packet_size = url_get_max_packet_size(h);
????if (max_packet_size){
????????buffer_size = max_packet_size;
????} else {
????????buffer_size = IO_BUFFER_SIZE;// 緩沖大小為IO_BUFFER_SIZE
????}
????buffer = av_malloc(buffer_size);// 分配緩沖
????if (!buffer)
????????return AVERROR(ENOMEM);

????*s = av_mallocz(sizeof(ByteIOContext));// 分配字節(jié)IO上下文

????if(!*s){
????????av_free(buffer);
????????return AVERROR(ENOMEM);
????}

????if (init_put_byte(*s, buffer, buffer_size,
??????????????????????(h->flags& URL_WRONLY || h->flags& URL_RDWR), h,
??????????????????????url_read, url_write, url_seek)< 0) {
????????av_free(buffer);
????????av_freep(s);
????????return AVERROR(EIO);
????}
????(*s)->is_streamed= h->is_streamed;?// 是否為流
????(*s)->max_packet_size= max_packet_size;?//?包最大多大
????if(h->prot){
????????(*s)->read_pause= (int(*)(void*, int))h->prot->url_read_pause;// 讀暫停函數(shù)
????????(*s)->read_seek= (int64_t(*)(void*, int, int64_t,int))h->prot->url_read_seek;// 讀seek函數(shù)
????}
????return 0;
}


進(jìn)入init_put_byte函數(shù):

int init_put_byte(ByteIOContext*s, // 字節(jié)IO上下文
??????????????????unsigned char *buffer,// 緩沖
??????????????????int buffer_size,// 緩沖的大小
??????????????????int write_flag,// 寫標(biāo)志
??????????????????void *opaque, // URL上下文
??????????????????int (*read_packet)(void*opaque, uint8_t *buf,int buf_size),// 讀包
??????????????????int (*write_packet)(void*opaque, uint8_t *buf,int buf_size),// 寫包
??????????????????int64_t (*seek)(void*opaque, int64_t offset, int whence))// 調(diào)整文件指針
{
????s->buffer= buffer;
????s->buffer_size= buffer_size;
????s->buf_ptr= buffer;
????s->opaque= opaque;
????url_resetbuf(s, write_flag? URL_WRONLY : URL_RDONLY);
????s->write_packet= write_packet;
????s->read_packet= read_packet;
????s->seek= seek;
????s->pos = 0;
????s->must_flush= 0;
????s->eof_reached= 0;
????s->error= 0;
????s->is_streamed= 0;
????s->max_packet_size= 0;
????s->update_checksum=NULL;
????if(!read_packet&& !write_flag){
????????s->pos= buffer_size;
????????s->buf_end= s->buffer+ buffer_size;
????}
????s->read_pause= NULL;
????s->read_seek= NULL;
????return 0;
}

void*logctx= ap&& ap->prealloced_context? *ic_ptr : NULL;// 因為 ap == NULL, 所以 logctx 也 == NULL.

????if (!fmt&& (err = ff_probe_input_buffer(&pb,&fmt, filename, logctx, 0,
????????logctx ? (*ic_ptr)->probesize: 0))< 0) {
????????goto fail;
????}
????// fmt == NULL 時才執(zhí)行 ff_probe_input_buffer 函數(shù),?因為 fmt 就等于NULL, 成立.


ff_probe_input_buffer函數(shù)的原型:

int ff_probe_input_buffer(ByteIOContext**pb,// 字節(jié)IO上下文, 執(zhí)行url_fopen得到的
?? ? ? ? ? ? ? ? ? ? ? ? ?AVInputFormat **fmt,// 輸出參數(shù): 輸入的格式
?? ? ? ? ? ? ? ? ? ? ? ? ?const char *filename,// 文件名
?? ? ? ? ? ? ? ? ? ? ? ? ?void *logctx, // NULL
?? ? ? ? ? ? ? ? ? ? ? ? ?unsigned int offset, // 0
?? ? ? ? ? ? ? ? ? ? ? ? ?unsigned int max_probe_size)?
?// 0


關(guān)鍵的代碼片斷:

?? ? ? ?/* 讀待探測的數(shù)據(jù) */
????????buf = av_realloc(buf, probe_size+ AVPROBE_PADDING_SIZE);
????????if ((ret= get_buffer(*pb, buf+ buf_offset, probe_size- buf_offset))< 0) {
????????????/* fail if error was not end of file, otherwise, lower score */
????????????if (ret!= AVERROR_EOF){
????????????????av_free(buf);
????????????????return ret;
????????????}
????????????score = 0;
????????????ret = 0;/* error was end of file, nothing read */
????????}
????????pd.buf_size += ret;
????????pd.buf =&buf[offset];

????????memset(pd.buf+ pd.buf_size, 0, AVPROBE_PADDING_SIZE);

????????/* 猜測文件格式 */
????????*fmt = av_probe_input_format2(&pd, 1,&score);


get_buffer函數(shù), 有兩處比較關(guān)鍵:

int?get_buffer(ByteIOContext*s, unsigned char *buf, int size);
{

??????? /* 省略部分代碼 */
?? ? ? ?/* 讀包 */
????????if(s->read_packet)
?? ? ? ? ? len = s->read_packet(s->opaque, buf, size);


??????? /* 省略部分代碼 */

?? ? ? ?/* 填充緩沖 */

??????? fill_buffer(s);

??????? /* 省略部分代碼 */

}


fill_buffer函數(shù), 有一處比較關(guān)鍵:

staticvoid fill_buffer(ByteIOContext*s)
{
??????? /* 省略部分代碼 */
?? ? ? ?/* 讀包 */
??????? if(s->read_packet)
?? ? ? ? ??len = s->read_packet(s->opaque, dst, len);

??????? /* 省略部分代碼 */
}


好了, 到第二次探測輸入格式的地方了:

*fmt= av_probe_input_format2(&pd, 1,&score);


進(jìn)入av_probe_input_format2函數(shù):

AVInputFormat*av_probe_input_format2(AVProbeData*pd, int is_opened, int *score_max)
{
????AVInputFormat *fmt1,*fmt;
????int score;

????fmt = NULL;
????for(fmt1= first_iformat; fmt1!= NULL; fmt1 = fmt1->next){
????????if (!is_opened== !(fmt1->flags& AVFMT_NOFILE))
????????????continue;

/* 這次 is_opened == 1, fmt1->flags設(shè)置AVFMT_NOFILE標(biāo)志才時成立?*/

/* 由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面不成立, 繼續(xù)執(zhí)行?*/
????????score = 0;
????????if (fmt1->read_probe){
????????????score = fmt1->read_probe(pd);?/*?調(diào)用h264_demuxer.h264_probe */
????????} elseif (fmt1->extensions){
????????????if (av_match_ext(pd->filename, fmt1->extensions)){?/*?文件名和格式擴展名的匹配 */

/*?h264_demuxer.extensions = "h26l,h264,264" */
????????????????score = 50;
????????????}
????????}
????????if (score> *score_max){
????????????*score_max = score;
????????????fmt = fmt1;
????????}elseif (score == *score_max)
????????????fmt = NULL;
????}
????return fmt;
}


av_match_ext函數(shù):

int av_match_ext(constchar *filename,const char *extensions)
{
????const char*ext, *p;
????char ext1[32],*q;

????if(!filename)
????????return 0;

????ext = strrchr(filename,'.');
????if (ext){
????????ext++;
????????p = extensions;
????????for(;;){
????????????q = ext1;
????????????while (*p !='\0' &&*p !=',' && q-ext1<sizeof(ext1)-1)
????????????????*q++= *p++;
????????????*q ='\0';
????????????if (!strcasecmp(ext1, ext))
????????????????return 1;
????????????if (*p== '\0')
????????????????break;
????????????p++;
????????}
????}
????return 0;
}


總算探測到輸入格式了.

err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);



int av_open_input_stream(

AVFormatContext**ic_ptr,?// 輸出參數(shù): 格式上下文
ByteIOContext *pb,?
// 字節(jié)IO上下文

constchar *filename,?// 文件名
AVInputFormat *fmt,?
// 輸入的格式

AVFormatParameters*ap)?// 格式參數(shù), 調(diào)用時為NULL
{
????int err;
????AVFormatContext *ic;
????AVFormatParameters default_ap;

?? ? // 使用缺省的格式參數(shù)
????if(!ap){
????????ap=&default_ap;
????????memset(ap, 0,sizeof(default_ap));
????}

????if(!ap->prealloced_context)
????????ic = avformat_alloc_context();?// 分配格式上下文
????else
????????ic = *ic_ptr;
????if (!ic){
????????err = AVERROR(ENOMEM);
????????goto fail;
????}

?? ?// 初始化格式上下文
????ic->iformat= fmt;?// 格式
????ic->pb = pb;?// 字節(jié)IO上下文
????ic->duration= AV_NOPTS_VALUE;
????ic->start_time= AV_NOPTS_VALUE;
????av_strlcpy(ic->filename, filename,sizeof(ic->filename));?// 文件名

????/* 分配私有數(shù)據(jù) */
????if (fmt->priv_data_size> 0) {
????????ic->priv_data= av_mallocz(fmt->priv_data_size);
????????if (!ic->priv_data){
????????????err = AVERROR(ENOMEM);
????????????goto fail;
????????}
????} else {
????????ic->priv_data= NULL;
????}

?? ?// 讀首部
????if (ic->iformat->read_header){
????????err = ic->iformat->read_header(ic, ap);
????????if (err< 0)
????????????goto fail;
????}

?? ?// 獲得數(shù)據(jù)偏移
????if (pb && !ic->data_offset)
????????ic->data_offset= url_ftell(ic->pb);

#if LIBAVFORMAT_VERSION_MAJOR< 53
????ff_metadata_demux_compat(ic);
#endif

?? ?// 原始的包緩沖剩余的大小
????ic->raw_packet_buffer_remaining_size= RAW_PACKET_BUFFER_SIZE;

?? ?// 輸出參數(shù):?格式上下文

????*ic_ptr= ic;
????return 0;

}


具體請參看
ffmpeg分析系列之三(輸入輸出格式)

格式上下文結(jié)構(gòu):

typedef?struct?AVFormatContext?{
????const?AVClass?*av_class;?/**< Set by avformat_alloc_context. */

?? ?//?省略部分內(nèi)容
}


AV類結(jié)構(gòu):

typedef?struct?{
????/**
?????* The name of the class; usually it is the same name as the
?????* context structure type to which the AVClass is associated.
?????*/

????const?char*?class_name;

????/**
?????* A pointer to a function which returns the name of a context
?????* instance ctx associated with the class.
?????*/

????const?char*?(*item_name)(void*?ctx);

????/**
?????* a pointer to the first option specified in the class if any or NULL
?????*
?????* @see av_set_default_options()
?????*/

????const?struct?AVOption?*option;

????/**
?????* LIBAVUTIL_VERSION with which this structure was created.
?????* This is used to allow fields to be added without requiring major
?????* version bumps everywhere.
?????*/


????int?version;
}?AVClass;



進(jìn)入avformat_alloc_context函數(shù), 分配格式上下文:

AVFormatContext*avformat_alloc_context(void)
{
????AVFormatContext *ic;
????ic = av_malloc(sizeof(AVFormatContext));
????if (!ic)return ic;
????avformat_get_context_defaults(ic);
????ic->av_class= &av_format_context_class;
????return ic;
}


staticconst AVClass av_format_context_class = { "AVFormatContext", format_to_name, options, LIBAVUTIL_VERSION_INT};


進(jìn)入avformat_get_context_defaults函數(shù), 格式獲得缺省上下文:

staticvoid avformat_get_context_defaults(AVFormatContext*s)
{
????memset(s, 0,sizeof(AVFormatContext));
????s->av_class= &av_format_context_class;
????av_opt_set_defaults(s);
}


av_opt_set_defaults函數(shù)就不分析了.?
下面繼續(xù)分析:

err?=?ic->iformat->read_header(ic,?ap)


以輸入格式為libavformat/raw.c下的h264_demuxer為例:

AVInputFormat h264_demuxer?=?{
????"h264",
????NULL_IF_CONFIG_SMALL("raw H.264 video format"),
????0,
????h264_probe,
????video_read_header,
????ff_raw_read_partial_packet,
????.flags=?AVFMT_GENERIC_INDEX,
????.extensions?=?"h26l,h264,264",?//FIXME remove after writing mpeg4_probe

????.value?=?CODEC_ID_H264,
};



會調(diào)用video_read_header函數(shù):

staticint video_read_header(AVFormatContext*s,
?????????????????????????????AVFormatParameters *ap)
{
????AVStream *st;

????st = av_new_stream(s, 0);?// 格式上下文增加一個流
????if (!st)
????????return AVERROR(ENOMEM);


?? ? // 初始化流
????st->codec->codec_type= AVMEDIA_TYPE_VIDEO;?//?編碼編碼器類型
????st->codec->codec_id= s->iformat->value;?// 為 CODEC_ID_H264
????st->need_parsing= AVSTREAM_PARSE_FULL;?//?需要全分析

????/* for MJPEG, specify frame rate */
????/* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
????if (ap->time_base.num){

????????st->codec->time_base= ap->time_base;
????} else if ( st->codec->codec_id== CODEC_ID_MJPEG||
????????????????st->codec->codec_id== CODEC_ID_MPEG4||
????????????????st->codec->codec_id== CODEC_ID_DIRAC||
????????????????st->codec->codec_id== CODEC_ID_DNXHD||
????????????????st->codec->codec_id== CODEC_ID_H264){
????????st->codec->time_base=(AVRational){1,25};?//?設(shè)置時基
????}
????av_set_pts_info(st, 64, 1, 1200000);?//?設(shè)置PTS(顯示時間截)信息

????return 0;
}


進(jìn)入av_new_stream函數(shù):

AVStream*av_new_stream(AVFormatContext*s, int id)
{
????AVStream *st;
????int i;

?? ?// 格式上下文不能太多流
????if (s->nb_streams>= MAX_STREAMS)
????????return NULL;

?? ?// 分配一個流
????st = av_mallocz(sizeof(AVStream));
????if (!st)
????????return NULL;

?? ?// 分配解碼器上下文
????st->codec= avcodec_alloc_context();
????if (s->iformat){
????????/* no default bitrate if decoding */
????????st->codec->bit_rate= 0;
????}
????st->index= s->nb_streams;?// 流索引
????st->id = id;?// ID, 為0
????st->start_time= AV_NOPTS_VALUE;?// 開始時間
????st->duration= AV_NOPTS_VALUE;
????????/* we set the current DTS to 0 so that formats without any timestamps
???????????but durations get some timestamps, formats with some unknown
???????????timestamps have their first few packets buffered and the
???????????timestamps corrected before they are returned to the user */

????st->cur_dts= 0;?// 當(dāng)前的解碼時間截
????st->first_dts= AV_NOPTS_VALUE;?// 起始的解碼時間截
????st->probe_packets= MAX_PROBE_PACKETS;?//?探測的最大包數(shù)

????/* default pts setting is MPEG-like */

????av_set_pts_info(st, 33, 1, 90000);?//?設(shè)置PTS顯示時間截信息
????st->last_IP_pts= AV_NOPTS_VALUE;?
????for(i=0; i<MAX_REORDER_DELAY+1; i++)
????????st->pts_buffer[i]= AV_NOPTS_VALUE;
????st->reference_dts= AV_NOPTS_VALUE;

????st->sample_aspect_ratio= (AVRational){0,1};

????s->streams[s->nb_streams++]= st;?//?記錄流, 同時流數(shù)加一
????return st;
}


分配編碼解碼器上下文: ?

staticconst AVClass av_codec_context_class = { "AVCodecContext", context_to_name, options, LIBAVUTIL_VERSION_INT};


void avcodec_get_context_defaults2(AVCodecContext*s, enum AVMediaType codec_type){
????int flags=0;
????memset(s, 0,sizeof(AVCodecContext));

????s->av_class=&av_codec_context_class;

????s->codec_type= codec_type;
????if(codec_type== AVMEDIA_TYPE_AUDIO)
????????flags= AV_OPT_FLAG_AUDIO_PARAM;
????else if(codec_type== AVMEDIA_TYPE_VIDEO)
????????flags= AV_OPT_FLAG_VIDEO_PARAM;
????else if(codec_type== AVMEDIA_TYPE_SUBTITLE)
????????flags= AV_OPT_FLAG_SUBTITLE_PARAM;
????av_opt_set_defaults2(s, flags, flags);

????s->time_base=(AVRational){0,1};
????s->get_buffer= avcodec_default_get_buffer;
????s->release_buffer= avcodec_default_release_buffer;
????s->get_format= avcodec_default_get_format;
????s->execute= avcodec_default_execute;
????s->execute2= avcodec_default_execute2;
????s->sample_aspect_ratio=(AVRational){0,1};
????s->pix_fmt= PIX_FMT_NONE;
????s->sample_fmt= SAMPLE_FMT_NONE;

????s->palctrl= NULL;
????s->reget_buffer= avcodec_default_reget_buffer;
????s->reordered_opaque= AV_NOPTS_VALUE;
}

AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){
????AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));

????if(avctx==NULL)return NULL;

????avcodec_get_context_defaults2(avctx, codec_type);

????return avctx;
}

void avcodec_get_context_defaults(AVCodecContext*s){
????avcodec_get_context_defaults2(s, AVMEDIA_TYPE_UNKNOWN);
}

AVCodecContext *avcodec_alloc_context(void){
????return avcodec_alloc_context2(AVMEDIA_TYPE_UNKNOWN);
}


總結(jié)

以上是生活随笔為你收集整理的ffmpeg分析系列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久在草 | 久久艹国产 | 午夜精品一区二区三区免费视频 | 免费看片成人 | 亚洲精品国产精品久久99热 | av在线进入 | 九九av| 午夜精品一区二区三区视频免费看 | 欧美性黄网官网 | 涩涩网站在线播放 | 在线日韩视频 | adc在线观看 | 91在线91| 九热精品 | 伊人资源站 | 五月婷婷中文网 | www.一区二区三区 | 亚洲国产一区二区精品专区 | 最近的中文字幕大全免费版 | 久久超碰99| 最新成人在线 | 精品久久国产精品 | 91av手机在线| av线上看| 97免费在线观看 | 色偷偷88888欧美精品久久久 | 欧美日韩国产精品一区二区三区 | 日韩精品久久久久久久电影竹菊 | 成人午夜电影网站 | 久久久久网站 | 成人欧美一区二区三区黑人麻豆 | 亚洲精品视频免费 | 久亚洲| 天天射天天射 | 亚洲精色 | 日本精品一区二区三区在线播放视频 | www.五月天激情 | 亚洲欧美日韩国产一区二区三区 | 亚洲精品色视频 | 丁香六月天婷婷 | 国产精品网红直播 | 精品国产电影一区二区 | 久久免费的精品国产v∧ | 91精品在线观看视频 | 欧美精品久久久久久久久免 | 久久久国产一区二区三区四区小说 | 国产高清久久 | 久久伊人五月天 | mm1313亚洲精品国产 | 五月天久久精品 | 国产理论在线 | 久久国产精品免费 | 欧美国产日韩在线观看 | 美女福利视频一区二区 | 999久久久国产精品 高清av免费观看 | 午夜三级大片 | 国产精品18毛片一区二区 | 久久综合狠狠狠色97 | 超碰在线人人97 | 中文字幕在线观看完整版电影 | 色偷偷888欧美精品久久久 | 最近中文国产在线视频 | 国产热re99久久6国产精品 | 国产精品美女视频网站 | 亚洲影音先锋 | 中文字幕一区二区三 | 97狠狠操 | 久草在线视频国产 | 日韩av电影网站在线观看 | 一区二区不卡高清 | 国内精品久久影院 | 国产亚洲婷婷免费 | 午夜久久成人 | 黄色官网在线观看 | 国产黄色理论片 | 日韩亚洲国产精品 | 国产精品一区在线观看你懂的 | 欧美日韩免费观看一区二区三区 | 色综合久久悠悠 | 久久福利在线 | 成人免费网视频 | 人成免费网站 | 日本精品二区 | 欧美亚洲精品在线观看 | 麻豆视频在线观看 | 激情影音先锋 | 婷婷午夜激情 | 欧美 亚洲 另类 激情 另类 | 久久精品首页 | 99精品久久只有精品 | 国产日本在线观看 | 天天干,天天射,天天操,天天摸 | 成人av在线影院 | 夜夜摸夜夜爽 | 久久久精品一区二区三区 | 天天草天天干天天射 | 婷婷色中文 | 色婷婷视频 | 日韩视频中文字幕 | 久久免费毛片视频 | 黄色片网站 | 五月婷婷开心中文字幕 | 国产精品1000 | 天天综合91 | 成x99人av在线www| 欧美日韩视频在线播放 | 国产一级黄色免费看 | 国产精品久久伊人 | 日韩激情精品 | 亚洲激色 | 99精品国产99久久久久久福利 | 国产91在线免费视频 | 国产午夜精品久久久久久久久久 | 久久亚洲综合色 | 国产精品久久久久aaaa | 操高跟美女 | 五月天激情电影 | 中文字幕资源网 国产 | 九九热精品在线 | 96在线 | 在线免费看黄色 | 亚洲一二三区精品 | 五月综合色婷婷 | 久久这里只有精品23 | 中文字幕在线观看免费高清完整版 | 有码一区二区三区 | 黄色日本片| 色资源在线观看 | 天天干天天操天天射 | 成人app在线播放 | a在线观看国产 | 月丁香婷婷 | 91精品国 | 九九九九精品 | 99久免费精品视频在线观看 | 免费福利在线观看 | 午夜av在线 | 91在线视频免费91 | 91九色蝌蚪视频网站 | 日本黄色免费网站 | 成人免费观看在线视频 | 久久久久久伊人 | 亚洲三级网 | av电影在线播放 | av解说在线观看 | 波多野结衣在线视频免费观看 | 中文字幕在线观看视频免费 | 天天天天爽| 337p西西人体大胆瓣开下部 | 天天天射 | 欧美激情视频一二三区 | 久久久久久蜜av免费网站 | 在线免费观看一区二区三区 | 9999国产精品| 日日爽视频 | 欧美久久久久久久久 | 999热视频 | 国产欧美精品一区二区三区四区 | 黄色日本片 | 四虎在线免费观看视频 | 波多野结衣视频在线 | 久久国产精品久久w女人spa | av三级在线免费观看 | 国产精品嫩草影视久久久 | 日韩网站免费观看 | 成人午夜网 | 国产精品免费视频一区二区 | 久久久久免费网 | 狠狠干狠狠插 | 91在线视频 | 精品a级片 | 久久免费视频3 | 国产中文字幕在线看 | 久久综合狠狠综合 | 中文字幕av免费在线观看 | 日韩av一区二区三区四区 | 91精彩在线视频 | av在线播放网址 | 精品影院一区二区久久久 | 丝袜美女在线 | 日韩三级在线观看 | www久久久久| 美女网站在线观看 | 亚洲国产精品500在线观看 | 日韩av快播电影网 | 摸阴视频| 久久精品视频播放 | 亚洲成人影音 | 九九在线视频 | 亚洲精品国产精品国自产观看 | 色中色资源站 | 欧洲一区二区三区精品 | 999久久久免费视频 午夜国产在线观看 | 亚洲精品国精品久久99热一 | 欧亚日韩精品一区二区在线 | 最新真实国产在线视频 | 国产午夜精品免费一区二区三区视频 | 黄色一级大片在线观看 | 亚洲四虎| 91九色老 | 国产不卡免费av | 中文字幕久久久精品 | 五月婷婷视频在线观看 | 国产高清视频网 | 欧美日韩视频一区二区 | 四虎5151久久欧美毛片 | 国产美女久久久 | 天天性天天草 | 国内精品在线一区 | 成人国产精品久久久久久亚洲 | 亚洲 欧美 变态 国产 另类 | 91精品国产综合久久福利 | 国产91精品看黄网站在线观看动漫 | 韩国av电影在线观看 | 亚洲理论片在线观看 | 500部大龄熟乱视频使用方法 | 韩日色视频 | 久久久久久久久久久久久久电影 | 狠狠狠色丁香综合久久天下网 | www.久久久.com | 日本 在线 视频 中文 有码 | 在线看小早川怜子av | 一区二区三区在线观看免费 | 日本爱爱片| 欧洲激情在线 | 丁香久久久 | 成人在线播放av | 黄色大片日本免费大片 | 美女视频黄在线 | 久草免费在线观看视频 | 人人狠狠 | 麻豆一区在线观看 | 五月激情综合婷婷 | 美女网站视频免费都是黄 | 成年人免费看片网站 | 亚洲在线视频观看 | 日韩高清www| 国产精久久久久久久 | 玖玖在线看| 在线观看欧美成人 | 久久久久国产精品免费网站 | 亚洲情影院| 久久黄色a级片 | 国产视频首页 | 奇米网444 | 波多野结衣在线视频免费观看 | 欧美日韩久久一区 | 国产成人福利片 | 免费看片亚洲 | 成人午夜电影在线观看 | 日韩国产在线观看 | 黄色av免费电影 | 免费久久99精品国产 | 国产精品不卡av | 亚洲精品美女久久久 | 色在线中文字幕 | 狠狠色丁香婷婷综合最新地址 | 国产精品久久久久久欧美 | 在线观看视频国产 | 免费看v片 | 国内精品久久久久久久久久 | 国产经典av | 91日韩在线 | av在线免费观看网站 | 亚洲精品视频在线观看免费视频 | 天天爱天天干天天爽 | 99在线观看免费视频精品观看 | av一级在线 | 婷婷伊人综合亚洲综合网 | 九色琪琪久久综合网天天 | 国产一二区在线观看 | 久久精品国产美女 | 正在播放五月婷婷狠狠干 | 99久热在线精品 | 韩国一区在线 | 久久久国产精品免费 | 天天干天天天 | 日韩欧美高清视频在线观看 | 婷婷黄色片 | 国产精品久久久久久久久岛 | 一级黄网 | 免费69视频 | 一区二区三区日韩在线观看 | 999久久国产精品免费观看网站 | 日韩精品中文字幕在线 | 欧美91精品国产自产 | 久久久久久久久久久久影院 | 亚洲久草在线 | 日日干天天射 | 欧美午夜寂寞影院 | 亚洲日韩精品欧美一区二区 | 五月婷婷操| 国产精品视频免费在线观看 | 四虎国产精品成人免费影视 | 亚洲成av人影院 | 欧美乱码精品一区二区 | 又黄又爽又无遮挡的视频 | 国产一区观看 | 91热精品| 亚洲欧美成人 | 精品一区二区久久久久久久网站 | 久久久久久久久久久高潮一区二区 | 狠狠色丁香久久婷婷综合_中 | 中文字幕电影高清在线观看 | 热re99久久精品国产99热 | 日韩理论电影在线观看 | 亚洲高清av在线 | 久久av免费电影 | 国产日本在线播放 | 五月天欧美精品 | 天天操天天干天天爱 | 欧美怡红院视频 | 久久免费视频播放 | 色婷婷导航 | 国产色影院 | 国产无遮挡又黄又爽馒头漫画 | 香蕉在线影院 | 亚洲精品中文字幕在线观看 | 亚洲国产福利视频 | 最新日韩中文字幕 | 干干干操操操 | 国产亚洲亚洲 | 亚洲国产伊人 | 狠狠干夜夜爽 | 97在线免费视频观看 | 尤物97国产精品久久精品国产 | 99久久精品免费看国产 | 九九久久影院 | 天天干夜夜操视频 | 久久伦理 | 久久首页 | 99精品偷拍视频一区二区三区 | 欧美极品一区二区三区 | 一区av在线播放 | 成人在线播放免费观看 | 亚洲区另类春色综合小说 | 亚洲午夜久久久久久久久 | a色视频| 中文字幕免费观看视频 | 91超碰免费在线 | 婷婷深爱网 | 国产免费av一区二区三区 | 91精品国产欧美一区二区 | 91视频这里只有精品 | 亚洲成熟女人毛片在线 | 五月婷婷中文网 | 中文字幕婷婷 | 精品欧美在线视频 | 午夜精品视频免费在线观看 | 91av视频在线观看 | 综合铜03| 在线观看一区 | 婷婷午夜天 | a级免费观看 | 超碰伊人网 | 99r精品视频在线观看 | 97在线观看免费高清完整版在线观看 | 中文字幕日本在线观看 | 久久久久免费精品 | 久久毛片视频 | 久久精品91久久久久久再现 | 免费久久久久久 | 天天色天天艹 | 97免费在线观看视频 | 欧美日韩3p| 亚洲欧洲精品一区二区 | 爱射综合| 日韩理论在线观看 | 国产69精品久久久久99尤 | 国产亚洲欧美精品久久久久久 | 97综合在线| 午夜视频亚洲 | 97视频一区| 成人欧美一区二区三区黑人麻豆 | 韩国一区在线 | 欧美日韩精品国产 | 天天色天天综合 | 免费看的国产视频网站 | 国产不卡在线播放 | 天天射天天干天天爽 | 欧美极度另类性三渗透 | 色综合久久综合网 | 一区二区三区高清不卡 | 人人爽人人爽人人爽学生一级 | 国产成人精品女人久久久 | 主播av在线 | 91免费高清在线观看 | 中文字幕黄色网址 | 亚洲我射av | 啪一啪在线 | 午夜精品区 | 国产成人一级 | 91社区国产高清 | 99免费在线播放99久久免费 | 国产亚洲婷婷免费 | 欧美一级免费 | 亚洲最新av在线网址 | 国产精品高潮呻吟久久av无 | 又色又爽的网站 | 日日干日日色 | 在线视频 91 | 一区二区三区高清在线观看 | aaa黄色毛片 | 亚洲一级黄色片 | 四虎影视精品 | 国产在线欧美 | 丁香婷婷激情五月 | 国产又粗又猛又色 | 韩日电影在线观看 | 国内综合精品午夜久久资源 | 99精品国产99久久久久久福利 | 麻豆 free xxxx movies hd | 亚洲人成人在线 | 狂野欧美激情性xxxx欧美 | 91人人在线 | 一区二区三区动漫 | 日日爽天天爽 | 91亚洲国产| 国产麻豆果冻传媒在线观看 | 国产在线精品视频 | 日韩久久久久久久 | 亚洲人成网站精品片在线观看 | 这里只有精品视频在线 | 欧美性脚交 | 射射色 | 亚洲欧洲精品久久 | 最近中文字幕大全 | 国内丰满少妇猛烈精品播 | 亚洲精品国产品国语在线 | 青青河边草免费视频 | 天天干,天天射,天天操,天天摸 | 亚州av成人 | 综合国产视频 | 久精品视频在线 | 99视频国产精品免费观看 | 韩国精品福利一区二区三区 | 国产精品久久久久久久婷婷 | 日韩免费高清 | 免费在线观看中文字幕 | 免费日韩 精品中文字幕视频在线 | 精品国产乱码久久久久久三级人 | 国产精品18久久久久久vr | 操综合| 一区二区三区四区精品 | 国产 日韩 欧美 自拍 | 亚洲国产精品电影在线观看 | 久草在线视频首页 | 国内精品久久久久影院一蜜桃 | 国产精品剧情 | 国产成人精品国内自产拍免费看 | 福利一区二区在线 | 一区二区国产精品 | 亚洲黄色在线 | 五月婷婷天堂 | 天天天天综合 | 91精品视频免费看 | 日韩中文在线字幕 | 日韩激情片在线观看 | 天天弄天天操 | 91亚色在线观看 | 麻豆成人网 | 99r在线 | 国产香蕉视频 | 国产精品毛片一区二区在线 | 国内偷拍精品视频 | 欧美一级片免费观看 | 黄色大片免费播放 | 久久av网| 日韩欧美电影在线 | 国产成人一级 | 国产精品国产三级在线专区 | 中文日韩在线 | 精品国产乱码 | 日韩一区二区三区观看 | 国产在线一卡 | 欧美一区二区三区免费观看 | 超碰在线99 | 国产一区在线视频播放 | 久久国产高清视频 | 欧美精品久久久久久久久久白贞 | 久久国产精品久久久 | 亚洲成av人片在线观看香蕉 | 国产高清不卡在线 | 粉嫩一区二区三区粉嫩91 | 97操操| 西西www4444大胆视频 | 在线导航av | 色综合久久中文综合久久牛 | 久艹在线观看视频 | 在线观看麻豆av | av福利第一导航 | 久久99国产精品免费 | 日韩欧美xxx | 亚洲精品在线免费看 | 青草视频在线 | 九九久久久 | 在线视频黄 | 午夜精品福利一区二区三区蜜桃 | 国产精品男女啪啪 | 中文字幕国语官网在线视频 | 中文字幕网址 | 久久午夜精品视频 | 综合天堂av久久久久久久 | 在线观看黄av | 国产欧美精品xxxx另类 | 久久色视频 | 999视频网 | 在线视频 亚洲 | 超碰在线91| 在线成人免费电影 | 中文字幕在线观看av | 成人小电影在线看 | 欧美日韩国产欧美 | 久久久久久不卡 | 黄色午夜 | 97人人澡人人爽人人模亚洲 | 69久久夜色精品国产69 | 久久久久麻豆v国产 | 久久艹影院 | 涩涩网站在线 | 久久99日韩 | 人人爽人人 | 美女视频久久黄 | 国产婷婷视频在线 | 色婷婷 亚洲 | 四虎影视国产精品免费久久 | 激情五月婷婷综合 | 免费在线激情电影 | 欧美日韩国产一区 | 91精品老司机久久一区啪 | 国产在线观看免 | 国产一二三区在线观看 | 中文字幕人成乱码在线观看 | 伊人久久精品久久亚洲一区 | 天天综合导航 | 97超碰免费在线 | 91视频国产高清 | 黄色国产高清 | 五月婷婷开心中文字幕 | 91中文字幕永久在线 | 成人网中文字幕 | 国产精品久久久久影院 | 久久天天躁狠狠躁夜夜不卡公司 | 日韩午夜高清 | 国产欧美精品xxxx另类 | 黄色软件大全网站 | 免费观看一级 | 国产精品 日韩 欧美 | 在线精品亚洲 | 久久天天躁| 亚洲日本韩国一区二区 | 中文字幕精品三级久久久 | 久久综合久久综合这里只有精品 | 91香蕉国产 | 天天综合网国产 | 最近中文字幕免费视频 | 91精品少妇偷拍99 | 亚洲精品乱码久久久久久蜜桃欧美 | 免费欧美高清视频 | 福利一区在线 | 在线免费黄网站 | 国产淫a | 热久久99这里有精品 | 美女黄网站视频免费 | 一级淫片在线观看 | 亚洲精品一区二区三区在线观看 | 成人h动漫在线看 | 国产精品一区二区久久国产 | 色综合久久中文字幕综合网 | 国产大陆亚洲精品国产 | 精品一区二区久久久久久久网站 | 久久免费中文视频 | 九色精品免费永久在线 | 欧美午夜理伦三级在线观看 | 99在线免费观看 | 国产日产精品久久久久快鸭 | 国产欧美日韩视频 | 伊人五月天婷婷 | av电影在线不卡 | 国产成人在线免费观看 | 免费看一级特黄a大片 | 久草在线这里只有精品 | 九色最新网址 | 欧美精品免费一区二区 | 中文字幕高清免费日韩视频在线 | 精品黄色片 | 黄色av电影在线 | 国产精品久久久久久久久久久久久 | 安徽妇搡bbbb搡bbbb | 99在线热播精品免费 | 九九国产精品视频 | 久久视频免费在线 | 精品国产一区二区三区噜噜噜 | 狠狠狠色丁香婷婷综合久久88 | 国产福利在线免费 | 色姑娘综合网 | 国产精品精品 | 精品视频国产一区 | 天天插天天干天天操 | 日韩伦理一区二区三区av在线 | 国产精品久久久久久久久免费看 | 国产探花视频在线播放 | 久草在线这里只有精品 | 成年人免费看片 | 国产在线高清 | 人人干网站| 色五丁香 | 91色九色 | 三级视频片 | 成人国产电影在线观看 | 综合色综合| 久久久久成人精品免费播放动漫 | 国产乱码精品一区二区三区介绍 | 中文字幕在线视频一区二区 | 狠狠色狠狠综合久久 | av电影免费在线看 | 久久精品一区二区三区国产主播 | 亚洲精品麻豆视频 | 国产馆在线播放 | 国产涩涩在线观看 | 日韩黄色一级电影 | 亚洲粉嫩av | 久草在线看片 | 婷婷丁香激情五月 | 欧美日韩超碰 | 看黄色91 | 亚洲欧洲精品久久 | 91九色蝌蚪视频网站 | 在线黄色国产电影 | 中文字幕一区二区在线观看 | 91亚洲精品视频 | 美女久久网站 | 久草精品视频 | 欧美在线1区 | 久久色在线观看 | 911国产在线观看 | 免费成人在线网站 | 久久久九色精品国产一区二区三区 | 欧美日韩中文国产 | 成人午夜精品久久久久久久3d | 99精品免费久久久久久久久日本 | 久久y | 亚洲成人资源网 | 久久爱综合 | 精品久久久久久综合日本 | 欧美亚洲精品一区 | 玖玖综合网 | 九九热免费精品视频 | 波多野结衣视频一区 | 亚洲精品乱码久久久久久高潮 | 激情视频网页 | 成人在线视频你懂的 | 国产一区二区三区四区在线 | 日韩三区在线观看 | 精品亚洲免费 | 国产精品女同一区二区三区久久夜 | 午夜久久福利视频 | 91香蕉视频黄色 | 日韩精品一区二区久久 | 亚洲天天综合 | 国产黄色视 | 久久毛片视频 | 久久久久久久久久久久久久av | 成人黄色免费在线观看 | ,久久福利影视 | 亚洲 中文 欧美 日韩vr 在线 | av在线电影免费观看 | 色婷婷精品大在线视频 | 九九av| 蜜臀aⅴ精品一区二区三区 久久视屏网 | 91视频三区| 国产精品久久久久久久久久妇女 | 欧美视频在线观看免费网址 | 一区中文字幕 | 伊人五月 | www天天操 | 美女免费视频观看网站 | 美女视频黄的免费的 | 在线观看一区 | 久久久久久久久精 | 97国产大学生情侣酒店的特点 | 99热在线国产精品 | 成人小视频在线 | 亚洲一区免费在线 | 亚洲成av人影院 | 国产 日韩 在线 亚洲 字幕 中文 | 国产福利网站 | 一区视频在线 | 四虎国产精品成人免费影视 | 午夜丰满寂寞少妇精品 | 夜夜躁狠狠躁 | 免费福利视频导航 | 日韩中出在线 | 亚洲天堂网在线观看视频 | 久久精品久久99精品久久 | 国产精品免费在线播放 | 四虎精品成人免费网站 | 欧美日本不卡视频 | 成年人免费看的视频 | 国产精品毛片一区二区 | 97香蕉久久国产在线观看 | 国产视频在线免费 | 亚洲精品中文在线资源 | 99热在线国产 | 天天爽综合网 | 日本99干网 | 日韩欧美国产激情在线播放 | 欧美 亚洲 另类 激情 另类 | 欧美视频不卡 | 久久97久久97精品免视看 | 国产探花视频在线播放 | 人人干狠狠干 | 在线观看黄色av | 亚洲精品国偷拍自产在线观看蜜桃 | 伊人手机在线 | 在线视频专区 | 久久国产综合视频 | 国产精品 中文在线 | 一区二区网 | 99精品视频播放 | 国产伦精品一区二区三区高清 | 午夜av免费观看 | 成人免费在线播放视频 | 久久爱资源网 | 国产91精品欧美 | 中文av一区二区 | 精品一区二区三区电影 | 成人试看120秒 | 欧美va在线观看 | 日p视频在线观看 | 日韩国产在线观看 | 色视频成人在线观看免 | 91在线视频一区 | 国产精品麻豆果冻传媒在线播放 | 99久久精品国产系列 | 色网站国产精品 | 91视频黄色 | 在线观看国产 | 亚洲精品国产精品国自产在线 | 四虎精品成人免费网站 | 在线观看 亚洲 | 一本色道久久精品 | 久久久99精品免费观看 | 99在线精品免费视频九九视 | 又黄又爽的视频在线观看网站 | 夜夜夜草| 久久久久日本精品一区二区三区 | 欧美黑人巨大xxxxx | 国产 视频 久久 | 日韩在线二区 | 91网在线看| 久草视频看看 | 97在线视频免费 | 日韩av在线一区二区 | 极品美女被弄高潮视频网站 | 天天操天天操天天操天天 | 蜜臀一区二区三区精品免费视频 | 亚洲mv大片欧洲mv大片免费 | 国产成人精品一区二区三区网站观看 | 成人在线网站观看 | 一级性视频 | 色婷婷婷 | 亚洲成av人影片在线观看 | 999超碰| 日本字幕网| 日韩精品一区电影 | 日韩极品在线 | 成人在线黄色 | 日韩手机在线观看 | 五月天天在线 | 欧美永久视频 | 一区二区三区四区五区在线 | 欧美另类z0zx | 色成人亚洲 | www天天操 | 天天天天天操 | 五月婷婷视频在线 | 69国产盗摄一区二区三区五区 | 国产视频99| 日韩精品免费一区二区三区 | 97中文字幕 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩精品一区二区三区三炮视频 | 亚州人成在线播放 | 91资源在线 | 成人少妇影院yyyy | 在线免费成人 | 狠狠色丁香婷婷综合久小说久 | 欧美色图亚洲图片 | 国产不卡精品视频 | 日本中文字幕观看 | 久久久久久久综合色一本 | 午夜久久影视 | 欧美午夜激情网 | 免费能看的黄色片 | 成人午夜影视 | 日韩中文字幕视频在线观看 | 在线不卡中文字幕播放 | av超碰在线 | 在线播放精品一区二区三区 | 亚洲国产丝袜在线观看 | 九九免费在线视频 | 国产中文字幕在线播放 | 婷婷综合激情 | 黄色一级性片 | 香蕉在线视频播放网站 | 91av电影| www四虎影院 | 色综合久久中文综合久久牛 | 免费看黄在线网站 | 欧美日韩国产精品一区二区三区 | 福利视频精品 | 性色av免费在线观看 | 婷婷丁香五 | 91丨九色丨蝌蚪丰满 | 日韩视频在线不卡 | 69精品久久久 | 国产精品麻豆果冻传媒在线播放 | 操操操操网 | 欧美激情视频久久 | 国产精品免费久久久久久久久久中文 | 一区二精品 | 草久在线观看视频 | 婷婷色中文字幕 | www.夜夜夜| 在线视频 精品 | 欧美在线你懂的 | 国产毛片久久久 | 色婷婷激情四射 | 免费a一级 | 国产精品ⅴa有声小说 | 狠狠狠狠狠干 | 亚洲涩综合 | 成人毛片一区 | 亚洲另类视频 | 男女视频久久久 | 久久久91精品国产 | 国产黄色片在线 | 黄p在线播放| 国产一卡久久电影永久 | 亚洲国产成人精品在线 | 国产精品黄色 | 综合精品在线 | 亚洲精品国偷拍自产在线观看 | 97色在线观看 | 精品国产区在线 | 婷婷六月综合亚洲 | 天天操天天是 | 日韩在线观看你懂得 | a在线免费 | 天天干天天想 | 久久综合狠狠综合 | 久久久91精品国产 | 久久精品一二三区 | 911亚洲精品第一 | 精品国产乱码久久久久久久 | 欧美久久久久久久 | 久久免费国产精品1 | 国产视频一区二区在线播放 | 色婷婷激情综合 | 91av欧美| 99久久久久国产精品免费 | 久久国产精品免费观看 | 97视频免费看 | 69视频在线| 欧美日韩视频在线播放 | 国产日韩视频在线播放 | 国产精品第72页 | 香蕉视频18 | 日韩欧美高清在线 | 国产中文字幕在线播放 | 97香蕉久久国产在线观看 | 久草在在线 | 久久免费在线观看视频 | 亚洲六月丁香色婷婷综合久久 | 久久在线免费观看 | 亚洲天堂精品视频在线观看 | 亚州av网站 | 色婷婷综合久久久久中文字幕1 | 婷婷激情综合五月天 | 开心激情婷婷 | 99久久精品国产亚洲 | 亚洲激情婷婷 | 丁香六月久久综合狠狠色 | 日日草视频 | 精品亚洲免a | 成人在线你懂得 | 国产日产av | 国产五月婷 | www.亚洲激情.com | 视频在线国产 | 欧美日韩国产免费视频 | 国产精品久久久久久久婷婷 | 国产在线综合视频 | 日韩大片在线观看 | 免费av 在线| 18久久久久久 | 日本免费一二三区 | 91成人黄色| 四虎影视成人永久免费观看视频 | 91探花国产综合在线精品 | 91系列在线观看 | 天天爱天天舔 | 不卡av免费在线观看 | 毛片a级片 | 五月天亚洲婷婷 | 国产精品中文字幕av | 国产精品96久久久久久吹潮 | 日韩欧美在线综合网 | 十八岁以下禁止观看的1000个网站 | 国模视频一区二区 | 中文字幕乱码电影 | 精品嫩模福利一区二区蜜臀 | 五月天丁香亚洲 | 国产区 在线 | 久久成人人人人精品欧 | 91福利试看 | 国产成人精品一区二区三区在线 | 久久久精选 | 国内精品久久久久国产 | 中文在线天堂资源 | 亚洲 欧洲 国产 精品 | 色多多在线观看 | 狠狠操狠狠干天天操 | 91人人澡人人爽 | 在线你懂 | 久久99欧美 | 97在线免费视频 | av一区二区三区在线 | 亚av在线 | 少妇性bbb搡bbb爽爽爽欧美 | 成人黄色在线电影 | 国产精品一区二区果冻传媒 | 91丨九色丨蝌蚪丨老版 | 亚洲综合视频在线观看 | 国产精品一区二区久久 | 免费激情在线电影 | 超碰在线观看av.com | av黄色在线播放 | 亚洲一二区视频 | 天堂在线视频免费观看 | 狠狠躁天天躁综合网 | av不卡在线看 | 亚洲最新在线视频 | 国产一区二区午夜 | 九色精品免费永久在线 | 日日夜夜精品免费视频 | 奇米影视999 | 国产精品自产拍在线观看网站 | 国产999精品 | 国产 精品 资源 | 麻豆你懂的 | 国产成人一区二 | 国产真实在线 | 日韩特级片 | 日韩理论电影网 | 91精品在线免费视频 | 99视频在线观看一区三区 | 91正在播放 | 精品国产乱码久久久久久久 | а天堂中文最新一区二区三区 | 日韩1页 | 国产在线观看一区 | 国产福利久久 | 成人av视屏 | 美女国产精品 | 亚洲黄色小说网址 | 狠狠狠狠狠狠 | 国产不卡视频在线 | av在线免费网 | 伊人成人久久 | 国产精品久久久久一区二区三区 | 在线看片一区 | 狠狠躁夜夜躁人人爽视频 | 亚洲成aⅴ人在线观看 | 最近中文字幕国语免费高清6 | 有码中文字幕 | 97av视频在线| 视频国产精品 | 探花视频免费在线观看 | 日日夜夜精品免费观看 | 欧洲一区二区在线观看 | 成人av片免费看 | 99久久99久国产黄毛片 | 狠狠干 狠狠操 | 国产麻豆精品久久一二三 | 在线国产能看的 | 国产精品午夜免费福利视频 | 99久高清在线观看视频99精品热在线观看视频 | 91理论电影 | aaa亚洲精品一二三区 | 操操综合网| 黄色一级片视频 | 国产精品理论视频 | 综合天堂av久久久久久久 | 日日干夜夜骑 | 亚洲精品国偷拍自产在线观看 | 伊人官网|