中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

宣傳部總結網(wǎng)站建設網(wǎng)絡銷售靠譜嗎

宣傳部總結網(wǎng)站建設,網(wǎng)絡銷售靠譜嗎,html5做的籃球網(wǎng)站,廣州市網(wǎng)絡廣告推廣企業(yè)ffplay源碼分析-main函數(shù)入口分析 基于ffmpeg6.0源碼分析。 流程 使用ffplay播放視頻文件,會觸發(fā)main函數(shù)的調(diào)用。main函數(shù)中會進行以下操作: 從命令行中解析日志級別、日志是否需要落文件、是否要輸出banner信息。banner信息包含版權、庫的版本。注…

ffplay源碼分析-main函數(shù)入口分析

基于ffmpeg6.0源碼分析。

流程

使用ffplay播放視頻文件,會觸發(fā)main函數(shù)的調(diào)用。main函數(shù)中會進行以下操作:

  1. 從命令行中解析日志級別、日志是否需要落文件、是否要輸出banner信息。banner信息包含版權、庫的版本。
  2. 注冊解碼器、復用器、協(xié)議。
  • avdevice_register_all會將輸出formats和輸入formats注冊到allformats.c的變量中。
    allformat.c
void avpriv_register_devices(const FFOutputFormat * const o[], const AVInputFormat * const i[])
{// 還是個原子操作賦值。atomic_store_explicit(&outdev_list_intptr, (uintptr_t)o, memory_order_relaxed);atomic_store_explicit(&indev_list_intptr,  (uintptr_t)i, memory_order_relaxed);
}

alldevices.c

void avdevice_register_all(void)
{avpriv_register_devices(outdev_list, indev_list);
}

其中outdev_list來自outdev_list.c文件,idev_list來自indev_list.c文件。這2個文件是自動生成的。所以我猜它是根據(jù)我們不同的配置來生成不同的內(nèi)容。
我的indev_list.c

static const AVInputFormat * const indev_list[] = {
&ff_avfoundation_demuxer,
&ff_lavfi_demuxer,
NULL };

我的outdev_list.c

static const FFOutputFormat * const outdev_list[] = {
&ff_audiotoolbox_muxer,
&ff_sdl2_muxer,
NULL };
  1. 初始化網(wǎng)絡,會根據(jù)使用的是openssl還是guntls進行初始化,對于window,有可能需要調(diào)用一下WSAStartup,ms-socket。
void ff_tls_deinit(void)
{
#if CONFIG_TLS_PROTOCOL
#if CONFIG_OPENSSLff_openssl_deinit();
#endif
#if CONFIG_GNUTLSff_gnutls_deinit();
#endif
#endif
}int ff_network_init(void)
{
#if HAVE_WINSOCK2_HWSADATA wsaData;// Windowsif (WSAStartup(MAKEWORD(1,1), &wsaData))return 0;
#endifreturn 1;
}
  1. 監(jiān)聽程序退出信號,這一步是為了能響應用戶關閉程序的操作。比如在播放過程中,在命令行中按ctrl-c就會退出程序。
static void sigterm_handler(int sig)
{exit(123);
}
  1. 顯示banner信息,banner信息包含版本、配置等。
void show_banner(int argc, char **argv, const OptionDef *options)
{int idx = locate_option(argc, argv, options, "version");if (hide_banner || idx)return;// 打印ffmpeg的版本,版權信息、配置信息print_program_info (INDENT|SHOW_COPYRIGHT, AV_LOG_INFO);// 打印子庫的配置信息print_all_libs_info(INDENT|SHOW_CONFIG,  AV_LOG_INFO);// 打印字庫的版本信息print_all_libs_info(INDENT|SHOW_VERSION, AV_LOG_INFO);
}
  1. 解析命令行參數(shù),得到需要播放的文件,解析成功之后全局變量input_filename存儲的就是輸入的文件。
void parse_options(void *optctx, int argc, char **argv, const OptionDef *options,void (*parse_arg_function)(void *, const char*))
{const char *opt;int optindex, handleoptions = 1, ret;prepare_app_arguments(&argc, &argv); // 空的,不用管optindex = 1;while (optindex < argc) {opt = argv[optindex++];if (handleoptions && opt[0] == '-' && opt[1] != '\0') {if (opt[1] == '-' && opt[2] == '\0') {handleoptions = 0; // 如果參數(shù)是"--" ,即沒有拼參數(shù)名,則跳過。continue;}opt++;// 如果小于0,說明解析參數(shù)發(fā)生了錯誤。if ((ret = parse_option(optctx, opt, argv[optindex], options)) < 0)exit_program(1); // 退出程序。optindex += ret;} else {if (parse_arg_function)  // 如果上一個參數(shù)是跳過的(handleoptiongs是0),或者參數(shù)不是"-"開始的一個字符串,不能只是一個"-",則執(zhí)行這個函數(shù)。parse_arg_function(optctx, opt); // 這種情況opt可能是要處理文件。}}
}
// parse_arg_function 就指向這個函數(shù):
static void opt_input_file(void *optctx, const char *filename)
{if (input_filename) {av_log(NULL, AV_LOG_FATAL,"Argument '%s' provided as input filename, but '%s' was already specified.\n",filename, input_filename);exit(1);}if (!strcmp(filename, "-"))filename = "fd:";input_filename = filename; // 要播放的輸入文件。
}
  1. 如果沒解析到要播放的文件,輸出幫助信息,并退出程序。
  2. 初始化SDL庫,ffplay播放音頻、視頻都用到SDL庫。
  3. 根據(jù)用戶的配置、SDL的版本、來設置SDL顯示窗口的配置,比如是否顯示窗口邊界。使用默認大小來創(chuàng)建一個SDL窗口。
 int flags = SDL_WINDOW_HIDDEN;if (alwaysontop)
#if SDL_VERSION_ATLEAST(2,0,5)flags |= SDL_WINDOW_ALWAYS_ON_TOP;
#elseav_log(NULL, AV_LOG_WARNING, "Your SDL version doesn't support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n");
#endifif (borderless) // 命令參數(shù)可以控制flags |= SDL_WINDOW_BORDERLESS; // 控制SDL顯示的窗口是否需要邊界elseflags |= SDL_WINDOW_RESIZABLE;#ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITORSDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
#endif// 使用默認大小、窗口配置flags創(chuàng)建窗口。window = SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // https://wiki.libsdl.org/SDL2/SDL_HINT_RENDER_SCALE_QUALITY
  1. 創(chuàng)建renderer,renderer是SDK繪制圖形必須要用到的東西。以及是否有可用的texture。
 if (window) {// 創(chuàng)建renderer, 可以用這個畫圖形。renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if (!renderer) {av_log(NULL, AV_LOG_WARNING, "Failed to initialize a hardware accelerated renderer: %s\n", SDL_GetError());renderer = SDL_CreateRenderer(window, -1, 0);}if (renderer) {if (!SDL_GetRendererInfo(renderer, &renderer_info)) // 獲取renderer的信息。av_log(NULL, AV_LOG_VERBOSE, "Initialized %s renderer.\n", renderer_info.name);}}if (!window || !renderer || !renderer_info.num_texture_formats) { // 如果沒有渲染的條件,則退出程序。av_log(NULL, AV_LOG_FATAL, "Failed to create window or renderer: %s", SDL_GetError());do_exit(NULL);}... 
  1. 打開輸入文件。
  2. 進入循環(huán),監(jiān)聽鍵盤、鼠標事件,循環(huán)渲染視頻。

代碼

int main(int argc, char **argv)
{int flags;VideoState *is; // 用來保存全局狀態(tài)init_dynload(); // 僅window會有用,安全問題,會將當前目錄從DLL庫搜索目錄中刪除。av_log_set_flags(AV_LOG_SKIP_REPEATED); // 設置日志如果是重復文案是否跳過parse_loglevel(argc, argv, options); // 從參數(shù)中解析日志級別、日志是否要落文件、是否要輸出banner信息。/* register all codecs, demux and protocols */
#if CONFIG_AVDEVICEavdevice_register_all();
#endifavformat_network_init();// 處理用戶退出程序操作。 https://zh.m.wikipedia.org/wiki/Unix%E4%BF%A1%E5%8F%B7#SIGTERMsignal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  Ctrl-C   */signal(SIGTERM, sigterm_handler); /* Termination (ANSI). when user terminate  */// 顯示banner, 就是打印動態(tài)庫的版權、版本等信息。show_banner(argc, argv, options);parse_options(NULL, argc, argv, options, opt_input_file);if (!input_filename) {show_usage(); // 如果沒有從參數(shù)中解析出要播放的文件,輸出錯誤日志提示用戶,并退出程序。av_log(NULL, AV_LOG_FATAL, "An input file must be specified\n");av_log(NULL, AV_LOG_FATAL,"Use -h to get full help or, even better, run 'man %s'\n", program_name);exit(1);}if (display_disable) { // 用戶參數(shù)可以控制這個開關,默認關閉。video_disable = 1;}flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER; // 設置SDL初始化時的flags。包含了SDL音頻子系統(tǒng)、SDL視頻子系統(tǒng)、SDL時間子系統(tǒng)、事件子系統(tǒng)。if (audio_disable) // // 用戶參數(shù)可以控制這個開關,默認關閉。flags &= ~SDL_INIT_AUDIO;else {/* Try to work around an occasional ALSA buffer underflow issue when the* period size is NPOT due to ALSA resampling by forcing the buffer size. */if (!SDL_getenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE")) // 奇怪的fix.SDL_setenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE","1", 1);}if (display_disable)flags &= ~SDL_INIT_VIDEO;if (SDL_Init (flags)) { // 初始化SDL,https://wiki.libsdl.org/SDL2/SDL_Initav_log(NULL, AV_LOG_FATAL, "Could not initialize SDL - %s\n", SDL_GetError());av_log(NULL, AV_LOG_FATAL, "(Did you set the DISPLAY variable?)\n");exit(1);}// 不監(jiān)聽系統(tǒng)事件和用戶自定義事件。https://wiki.libsdl.org/SDL2/SDL_EventSDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);SDL_EventState(SDL_USEREVENT, SDL_IGNORE);if (!display_disable) {int flags = SDL_WINDOW_HIDDEN;if (alwaysontop)
#if SDL_VERSION_ATLEAST(2,0,5)flags |= SDL_WINDOW_ALWAYS_ON_TOP;
#elseav_log(NULL, AV_LOG_WARNING, "Your SDL version doesn't support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n");
#endifif (borderless)flags |= SDL_WINDOW_BORDERLESS; // 控制SDL顯示的窗口是否需要邊界elseflags |= SDL_WINDOW_RESIZABLE;#ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITORSDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
#endif// 使用默認大小、窗口配置flags創(chuàng)建窗口。window = SDL_CreateWindow(program_name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, default_width, default_height, flags);SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // https://wiki.libsdl.org/SDL2/SDL_HINT_RENDER_SCALE_QUALITYif (window) {// 創(chuàng)建renderer, 可以用這個畫圖形。renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if (!renderer) {av_log(NULL, AV_LOG_WARNING, "Failed to initialize a hardware accelerated renderer: %s\n", SDL_GetError());renderer = SDL_CreateRenderer(window, -1, 0);}if (renderer) {if (!SDL_GetRendererInfo(renderer, &renderer_info)) // 獲取renderer的信息。av_log(NULL, AV_LOG_VERBOSE, "Initialized %s renderer.\n", renderer_info.name);}}if (!window || !renderer || !renderer_info.num_texture_formats) { // 如果沒有渲染的條件,則退出程序。av_log(NULL, AV_LOG_FATAL, "Failed to create window or renderer: %s", SDL_GetError());do_exit(NULL);}}// 打開輸入文件, 如果用戶強制設置了fmt file_iformat則不為nullis = stream_open(input_filename, file_iformat);if (!is) {av_log(NULL, AV_LOG_FATAL, "Failed to initialize VideoState!\n");do_exit(NULL);}// 循環(huán),監(jiān)聽鍵盤事件、刷新界面。event_loop(is); /* never returns */return 0;
}
http://www.risenshineclean.com/news/27487.html

相關文章:

  • 公司網(wǎng)站備案條件推廣計劃怎么做
  • 大昌建設集團有限公司網(wǎng)站sem網(wǎng)絡推廣是什么
  • 滕州市 網(wǎng)站建設公司廣州30萬人感染
  • 石家莊搜索排名提升杭州seo整站優(yōu)化
  • 網(wǎng)站怎么編輯石家莊關鍵詞快速排名
  • 網(wǎng)站使用什么數(shù)據(jù)庫競價推廣哪里開戶
  • html個人網(wǎng)頁代碼模板太原百度快速優(yōu)化
  • 園區(qū)做網(wǎng)站國外免費建站網(wǎng)站
  • 3d效果圖軟件seo的基礎是什么
  • 杭州哪家做企業(yè)網(wǎng)站網(wǎng)絡廣告
  • 南通公司建站模板百度號碼認證申訴平臺
  • 外貿(mào)網(wǎng)站建設價格應用商店aso優(yōu)化
  • 市委辦公廳網(wǎng)站 做合格黨辦人推廣策劃方案模板
  • 深圳政府在線網(wǎng)站石家莊網(wǎng)絡seo推廣
  • 群暉套件wordpressseo優(yōu)化教程視頻
  • 便宜做網(wǎng)站灰色行業(yè)推廣平臺網(wǎng)站
  • 網(wǎng)站模板怎么做有沒有免費的廣告平臺
  • 北京做網(wǎng)站的軟文街怎么樣
  • 做電子商務網(wǎng)站需要什么軟件seo標題優(yōu)化褲子關鍵詞
  • 電子商務網(wǎng)站規(guī)劃的原則是什么專門做排名的軟件
  • wp網(wǎng)站源碼百度最新財報
  • 網(wǎng)站制作論文題目網(wǎng)絡營銷師主要做什么
  • 怎樣制作自己的網(wǎng)站網(wǎng)頁游戲推廣平臺
  • 百容千域可以免費做網(wǎng)站嗎上海廣告公司
  • 機械門戶網(wǎng)站建設特點市場營銷推廣策劃
  • 百度收錄網(wǎng)站怎么更改關鍵詞長沙網(wǎng)站優(yōu)化指導
  • 有什么做任務的網(wǎng)站嗎網(wǎng)絡營銷有哪些模式
  • 企業(yè)汽車網(wǎng)站建設關鍵詞優(yōu)化難度查詢
  • 韓國女足還能出線嗎愛站seo綜合查詢
  • 做網(wǎng)站的公司叫什么名字國際新聞最新消息戰(zhàn)爭