欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
ffmpeg分析系列之五(打開(kāi)輸入的文件)
ffmpeg分析系列之五(打開(kāi)輸入的文件)
1. 打開(kāi)文件:

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

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

ByteIOContext *pb = NULL; // 字節IO上下文
if ((err=url_fopen(&pb, filename, URL_RDONLY)) < 0) { // 只讀方式打開(kāi)輸入的文件
goto fail;
}
if (buf_size > 0) { // 因 buf_size == 0, 不成立
url_setbufsize(pb, buf_size);

}


進(jìn)入url_fopen函數:

int url_fopen(ByteIOContext **s, // 輸出參數: 字節IO上下文
const char *filename, // 文件名
int flags) // 標志
{
URLContext *h; // URL(統一資源定位)上下文
int err;

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


進(jìn)入url_open函數:

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

const char *filename, // 文件名

int flags) // 標志

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

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

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

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

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


進(jìn)入url_open_protocol函數:

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

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

const char *filename, // 文件名

int flags// 標志
{
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// 標志
uc->is_streamed = 0// 默認不是流, 可以在up->url_open函數里修改
uc->max_packet_size = 0; // 
包最大多大, 默認為0, 可以在up->url_open函數里修改

// 打開(kāi)URL
err = up->url_open(uc, filename, flags);
if (err < 0) {
av_free(uc);
goto fail;
}

if( (flags & (URL_WRONLY | URL_RDWR)// 如果以可寫(xiě)方式打開(kāi)

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

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

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


// 輸出
參數: URL上下文

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

先來(lái)看看url_get_max_packet_size函數

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

進(jìn)入url_fdopen函數:

int url_fdopen(

ByteIOContext **s, // 輸出參數: 字節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);

*= av_mallocz(sizeof(ByteIOContext)); // 分配字節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; // 讀暫停函數
(*s)->read_seek = (int64_t (*)(void *, int, int64_t, int))h->prot->url_read_seek; // 讀seek函數
}
return 0;
}


進(jìn)入init_put_byte函數:

int init_put_byte(ByteIOContext *s, // 字節IO上下文
unsigned char *buffer, // 緩沖
int buffer_size, // 緩沖的大小
int write_flag, // 寫(xiě)標志
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),// 寫(xiě)包
int64_t (*seek)(void *opaque, int64_t offset, int whence)) // 調整文件指針
{
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;
}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
ffmpeg框架詳解之容器格式分析 | 云里飄博客
FFMpeg對MPEG2 TS流解碼的流程分析 - DVB相關(guān) - popy
ffmpeg分析系列
C#下載圖片方法Coding
FFMPEG完美入門(mén)資料
如何用java獲取網(wǎng)絡(luò )文件的大小(多線(xiàn)程)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久