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

當(dāng)前位置: 首頁 > news >正文

簡單的個(gè)人網(wǎng)站100種宣傳方式

簡單的個(gè)人網(wǎng)站,100種宣傳方式,推廣網(wǎng)站怎么做能增加咨詢,中山做網(wǎng)站哪家專業(yè)VLC 用 input_thread_t 對(duì)象直接或間接管理音視頻播放有關(guān)的各種資源,包括 Access,Demux,Decode,Output,F(xiàn)ilter 等,這個(gè)類型定義 (位于 vlc-3.0.16/include/vlc_input.h) 如下: struct input_thread_t {VLC_COMMON_MEMBERS };input_thread_t 是個(gè)抽象類型,VLC 中這個(gè)類…

VLC 用 input_thread_t 對(duì)象直接或間接管理音視頻播放有關(guān)的各種資源,包括 AccessDemux,Decode,Output,Filter 等,這個(gè)類型定義 (位于 vlc-3.0.16/include/vlc_input.h) 如下:

struct input_thread_t
{VLC_COMMON_MEMBERS
};

input_thread_t 是個(gè)抽象類型,VLC 中這個(gè)類型的具體實(shí)現(xiàn)為 input_thread_private_t,后者定義 (位于 vlc-3.0.16/src/input/input_internal.h) 如下:

#define INPUT_CONTROL_FIFO_SIZE    100/* input_source_t: gathers all information per input source */
typedef struct
{VLC_COMMON_MEMBERSdemux_t  *p_demux; /**< Demux object (most downstream) *//* Title infos for that input */bool         b_title_demux; /* Titles/Seekpoints provided by demux */int          i_title;input_title_t **title;int i_title_offset;int i_seekpoint_offset;int i_title_start;int i_title_end;int i_seekpoint_start;int i_seekpoint_end;/* Properties */bool b_can_pause;bool b_can_pace_control;bool b_can_rate_control;bool b_can_stream_record;bool b_rescale_ts;double f_fps;/* */int64_t i_pts_delay;bool       b_eof;   /* eof of demuxer */} input_source_t;typedef struct
{int         i_type;vlc_value_t val;
} input_control_t;/** Private input fields */
typedef struct input_thread_private_t
{struct input_thread_t input;/* Global properties */bool        b_preparsing;bool        b_can_pause;bool        b_can_rate_control;bool        b_can_pace_control;/* Current state */int         i_state;bool        is_running;bool        is_stopped;bool        b_recording;int         i_rate;/* Playtime configuration and state */int64_t     i_start;    /* :start-time,0 by default */int64_t     i_stop;     /* :stop-time, 0 if none */int64_t     i_time;     /* Current time */bool        b_fast_seek;/* :input-fast-seek *//* Output */bool            b_out_pace_control; /* XXX Move it ot es_sout ? */sout_instance_t *p_sout;            /* Idem ? */es_out_t        *p_es_out;es_out_t        *p_es_out_display;vlc_viewpoint_t viewpoint;bool            viewpoint_changed;vlc_renderer_item_t *p_renderer;/* Title infos FIXME multi-input (not easy) ? */int          i_title;const input_title_t **title;int i_title_offset;int i_seekpoint_offset;/* User bookmarks FIXME won't be easy with multiples input */seekpoint_t bookmark;int         i_bookmark;seekpoint_t **pp_bookmark;/* Input attachment */int i_attachment;input_attachment_t **attachment;const demux_t **attachment_demux;/* Main input properties *//* Input item */input_item_t   *p_item;/* Main source */input_source_t *master;/* Slave sources (subs, and others) */int            i_slave;input_source_t **slave;/* Resources */input_resource_t *p_resource;input_resource_t *p_resource_private;/* Stats counters */struct {counter_t *p_read_packets;counter_t *p_read_bytes;counter_t *p_input_bitrate;counter_t *p_demux_read;counter_t *p_demux_bitrate;counter_t *p_demux_corrupted;counter_t *p_demux_discontinuity;counter_t *p_decoded_audio;counter_t *p_decoded_video;counter_t *p_decoded_sub;counter_t *p_sout_sent_packets;counter_t *p_sout_sent_bytes;counter_t *p_sout_send_bitrate;counter_t *p_played_abuffers;counter_t *p_lost_abuffers;counter_t *p_displayed_pictures;counter_t *p_lost_pictures;vlc_mutex_t counters_lock;} counters;/* Buffer of pending actions */vlc_mutex_t lock_control;vlc_cond_t  wait_control;int i_control;input_control_t control[INPUT_CONTROL_FIFO_SIZE];vlc_thread_t thread;vlc_interrupt_t interrupt;
} input_thread_private_t;

播放 VLC 播放列表中的一個(gè)音視頻流的時(shí)候,音視頻流的播放通過 PlayItem() 函數(shù)起動(dòng),這個(gè)函數(shù)被調(diào)用的調(diào)用棧如下:

Thread 3 "vlc" hit Breakpoint 14, PlayItem (p_item=<optimized out>, p_playlist=0xaaaaaab37980) at playlist/thread.c:227
227	        if( input_Start( p_input_thread ) )
(gdb) bt
#0  PlayItem (p_item=<optimized out>, p_playlist=0xaaaaaab37980) at playlist/thread.c:227
#1  Next (p_playlist=0xaaaaaab37980) at playlist/thread.c:474
#2  Thread (data=0xaaaaaab37980) at playlist/thread.c:499
#3  0x0000fffff7e4d5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

PlayItem() 函數(shù)定義 (位于 vlc-3.0.16/src/playlist/thread.c) 如下:

static bool PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
{playlist_private_t *p_sys = pl_priv(p_playlist);input_item_t *p_input = p_item->p_input;vlc_renderer_item_t *p_renderer;PL_ASSERT_LOCKED;msg_Dbg( p_playlist, "creating new input thread" );p_item->i_nb_played++;set_current_status_item( p_playlist, p_item );p_renderer = p_sys->p_renderer;/* Retain the renderer now to avoid it to be released by* playlist_SetRenderer when we exit the locked scope. If the last reference* was to be released, we would use a dangling pointer */if( p_renderer )vlc_renderer_item_hold( p_renderer );assert( p_sys->p_input == NULL );PL_UNLOCK;libvlc_MetadataCancel( p_playlist->obj.libvlc, p_item );input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL,p_sys->p_input_resource,p_renderer );if( p_renderer )vlc_renderer_item_release( p_renderer );if( likely(p_input_thread != NULL) ){var_AddCallback( p_input_thread, "intf-event",InputEvent, p_playlist );if( input_Start( p_input_thread ) ){var_DelCallback( p_input_thread, "intf-event",InputEvent, p_playlist );vlc_object_release( p_input_thread );p_input_thread = NULL;}}/* TODO store art policy in playlist private data */char *psz_arturl = input_item_GetArtURL( p_input );/* p_input->p_meta should not be null after a successful CreateThread */bool b_has_art = !EMPTY_STR( psz_arturl );if( !b_has_art || strncmp( psz_arturl, "attachment://", 13 ) ){PL_DEBUG( "requesting art for new input thread" );libvlc_ArtRequest( p_playlist->obj.libvlc, p_input, META_REQUEST_OPTION_NONE );}free( psz_arturl );PL_LOCK;p_sys->p_input = p_input_thread;PL_UNLOCK;var_SetAddress( p_playlist, "input-current", p_input_thread );PL_LOCK;return p_input_thread != NULL;
}

PlayItem() 函數(shù)接收 playlist_item_t 類型的 p_item 參數(shù),這個(gè)類型定義 (位于 vlc-3.0.16/include/vlc_playlist.h) 如下:

/** playlist item / node */
struct playlist_item_t
{input_item_t           *p_input;    /**< Linked input item */playlist_item_t      **pp_children; /**< Children nodes/items */playlist_item_t       *p_parent;    /**< Item parent */int                    i_children;  /**< Number of children, -1 if not a node */unsigned               i_nb_played; /**< Times played */int                    i_id;        /**< Playlist item specific id */uint8_t                i_flags;     /**< Flags \see playlist_item_flags_e */
};

playlist_item_t 類型包含一個(gè)類型為 input_item_t 的字段 p_input,其中包含要播放的音視頻流的各種信息,如 URI,名稱,基礎(chǔ)流的個(gè)數(shù)及格式等,input_item_t 類型的詳細(xì)定義 (位于 vlc-3.0.16/include/vlc_input_item.h) 如下:

struct info_t
{char *psz_name;            /**< Name of this info */char *psz_value;           /**< Value of the info */
};struct info_category_t
{char   *psz_name;      /**< Name of this category */int    i_infos;        /**< Number of infos in the category */struct info_t **pp_infos;     /**< Pointer to an array of infos */
};/*** Describes an input and is used to spawn input_thread_t objects.*/
struct input_item_t
{char       *psz_name;            /**< text describing this item */char       *psz_uri;             /**< mrl of this item */int        i_options;            /**< Number of input options */char       **ppsz_options;       /**< Array of input options */uint8_t    *optflagv;            /**< Some flags of input options */unsigned   optflagc;input_item_opaque_t *opaques;    /**< List of opaque pointer values */mtime_t    i_duration;           /**< Duration in microseconds */int        i_categories;         /**< Number of info categories */info_category_t **pp_categories; /**< Pointer to the first info category */int         i_es;                /**< Number of es format descriptions */es_format_t **es;                /**< Es formats */input_stats_t *p_stats;          /**< Statistics */vlc_meta_t *p_meta;int         i_epg;               /**< Number of EPG entries */vlc_epg_t   **pp_epg;            /**< EPG entries */int64_t     i_epg_time;          /** EPG timedate as epoch time */const vlc_epg_t *p_epg_table;    /** running/selected program cur/next EPG table */int         i_slaves;            /**< Number of slaves */input_item_slave_t **pp_slaves;  /**< Slave entries that will be loaded bythe input_thread */vlc_event_manager_t event_manager;vlc_mutex_t lock;                 /**< Lock for the item */uint8_t     i_type;              /**< Type (file, disc, ... see input_item_type_e) */bool        b_net;               /**< Net: always true for TYPE_STREAM, itdepends for others types */bool        b_error_when_reading;/**< Error When Reading */int         i_preparse_depth;    /**< How many level of sub items can be preparsed:-1: recursive, 0: none, >0: n levels */bool        b_preparse_interact; /**< Force interaction with the user whenpreparsing.*/
};

這里的幾個(gè)類型的結(jié)構(gòu)關(guān)系大概如下圖所示:
VLC Objects
PlayItem() 函數(shù)主要是調(diào)用 input_Create() 函數(shù)創(chuàng)建 input_thread_t/input_thread_private_t 對(duì)象,并調(diào)用 input_Start() 函數(shù)啟動(dòng)對(duì)音視頻流的處理。

input_Create()input_Start() 函數(shù)函數(shù)定義 (位于 vlc-3.0.16/src/input/input.c) 如下:

input_thread_t *input_Create( vlc_object_t *p_parent,input_item_t *p_item,const char *psz_log, input_resource_t *p_resource,vlc_renderer_item_t *p_renderer )
{return Create( p_parent, p_item, psz_log, false, p_resource, p_renderer );
}. . . . . .
/*** Start a input_thread_t created by input_Create.** You must not start an already running input_thread_t.** \param the input thread to start*/
int input_Start( input_thread_t *p_input )
{input_thread_private_t *priv = input_priv(p_input);void *(*func)(void *) = Run;if( priv->b_preparsing )func = Preparse;assert( !priv->is_running );/* Create thread and wait for its readiness. */priv->is_running = !vlc_clone( &priv->thread, func, priv,VLC_THREAD_PRIORITY_INPUT );if( !priv->is_running ){input_ChangeState( p_input, ERROR_S );msg_Err( p_input, "cannot create input thread" );return VLC_EGENERIC;}return VLC_SUCCESS;
}. . . . . .static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,const char *psz_header, bool b_preparsing,input_resource_t *p_resource,vlc_renderer_item_t *p_renderer )
{/* Allocate descriptor */input_thread_private_t *priv;priv = vlc_custom_create( p_parent, sizeof( *priv ), "input" );if( unlikely(priv == NULL) )return NULL;input_thread_t *p_input = &priv->input;. . . . . .}
static void *Run( void *data )
{input_thread_private_t *priv = data;input_thread_t *p_input = &priv->input;vlc_interrupt_set(&priv->interrupt);if( !Init( p_input ) ){if( priv->b_can_pace_control && priv->b_out_pace_control ){/* We don't want a high input priority here or we'll* end-up sucking up all the CPU time */vlc_set_priority( priv->thread, VLC_THREAD_PRIORITY_LOW );}MainLoop( p_input, true ); /* FIXME it can be wrong (like with VLM) *//* Clean up */End( p_input );}input_SendEventDead( p_input );return NULL;
}

除了 b_preparsing 參數(shù)傳 false 外,input_Create() 函數(shù)將接收的各個(gè)參數(shù)傳給 Create(),通過后者創(chuàng)建 input_thread_private_t 對(duì)象。input_Start() 函數(shù)啟動(dòng)一個(gè)新的線程處理音視頻流,默認(rèn)情況下,新起的線程跑 Run() 函數(shù),但如果設(shè)置了 b_preparsing,新起的線程跑 Preparse() 函數(shù)。

播放列表中各個(gè)音頻流的信息,也通過 input_thread_t 獲取。當(dāng)我們往 VLC 的播放列表拖入一個(gè)文件時(shí),UI 事件向播放列表添加一個(gè)輸入項(xiàng),輸入項(xiàng)最終被放入播放列表預(yù)解析器的待解析隊(duì)列中,這個(gè)調(diào)用過程如下面的調(diào)用棧所示:

#0  background_worker_Push (worker=0xaaaaaaae2e40, entity=entity@entry=0xffffc885fec0, id=id@entry=0xffffc87f5ac0, timeout=timeout@entry=-1) at misc/background_worker.c:211
#1  0x0000fffff7ced04c in playlist_preparser_Push (preparser=0xaaaaaaadbe00, item=item@entry=0xffffc885fec0, i_options=META_REQUEST_OPTION_NONE, timeout=-1, id=0xffffc87f5ac0)at playlist/preparser.c:178
#2  0x0000fffff7cca748 in vlc_MetadataRequest(libvlc=0xaaaaaaab58e0, item=item@entry=0xffffc885fec0, i_options=i_options@entry=META_REQUEST_OPTION_NONE, timeout=timeout@entry=-1, id=id@entry=0xffffc87f5ac0) at libvlc.c:504
#3  0x0000fffff7ceee5c in playlist_Preparse (p_item=0xffffc87f5ac0, p_playlist=0xaaaaaab37980) at playlist/item.c:750
#4  playlist_NodeAddInput (p_playlist=p_playlist@entry=0xaaaaaab37980, p_input=p_input@entry=0xffffc885fec0, p_parent=<optimized out>, i_pos=i_pos@entry=-1) at playlist/item.c:541
#5  0x0000fffff7ceef20 in playlist_AddInput (p_playlist=p_playlist@entry=0xaaaaaab37980, p_input=p_input@entry=0xffffc885fec0, play_now=play_now@entry=false, b_playlist=b_playlist@entry=true)at playlist/item.c:504
#6  0x0000fffff7ceefe4 in playlist_AddExt(p_playlist=0xaaaaaab37980, psz_uri=<optimized out>, psz_name=<optimized out>, play_now=false, i_options=0, ppsz_options=0x0, i_option_flags=2, b_playlist=true) at playlist/item.c:483
#7  0x0000ffffe51d4440 in Open::openMRLwithOptions(intf_thread_t*, QString const&, QStringList*, bool, bool, char const*)(p_intf=0xaaaaaad8e8d0, mrl=..., options=<optimized out>, b_start=false, b_playlist=true, title=0x0) at /usr/include/aarch64-linux-gnu/qt5/QtCore/qarraydata.h:61
#8  0x0000ffffe51ba768 in MainInterface::dropEventPlay(QDropEvent*, bool, bool) (this=0xffffc81475f0, event=0xffffe319d020, b_play=<optimized out>, b_playlist=true)at gui/qt/main_interface.cpp:1580
#9  0x0000ffffe4b96378 in QWidget::event(QEvent*) () at /usr/lib/aarch64-linux-gnu/libQt5Widgets.so.5
#10 0x0000ffffe4b52ac0 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/aarch64-linux-gnu/libQt5Widgets.so.5
#11 0x0000ffffe4b5a2e0 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/aarch64-linux-gnu/libQt5Widgets.so.5
#12 0x0000ffffe40acb90 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/aarch64-linux-gnu/libQt5Core.so.5

其中 input_item_t 對(duì)象在 playlist_AddExt() 函數(shù)中創(chuàng)建,它所屬的 playlist_item_t 對(duì)象則在 playlist_AddInput() 函數(shù)中通過 playlist_NodeAddInput() 創(chuàng)建。VLC 起一個(gè)后臺(tái)線程來預(yù)解析音視頻流,VLC 調(diào)用 PreparserOpenInput() 函數(shù)預(yù)解析音視頻流,這個(gè)函數(shù)被調(diào)用的調(diào)用棧如下:

Thread 32 "vlc" hit Breakpoint 7, PreparserOpenInput (preparser_=0xaaaaaaadbe00, item_=0xffffc8730830, out=0xffffb021e790) at playlist/preparser.c:55
55	    playlist_preparser_t* preparser = preparser_;
(gdb) bt
#0  PreparserOpenInput (preparser_=0xaaaaaaadbe00, item_=0xffffc8730830, out=0xffffb021e790) at playlist/preparser.c:55
#1  0x0000fffff7d43c1c in Thread (data=0xaaaaaaae2e40) at misc/background_worker.c:115
#2  0x0000fffff7e4d5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

PreparserOpenInput() 函數(shù)定義 (位于 vlc-3.0.16/src/playlist/preparser.c) 如下:

static int PreparserOpenInput( void* preparser_, void* item_, void** out )
{playlist_preparser_t* preparser = preparser_;input_thread_t* input = input_CreatePreparser( preparser->owner, item_ );i
http://www.risenshineclean.com/news/46577.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)模板的seo快速排名源碼
  • 三門峽建設(shè)網(wǎng)站哪家好深圳網(wǎng)絡(luò)推廣
  • 注冊(cè)公司后才可以做獨(dú)立網(wǎng)站嗎個(gè)人主頁網(wǎng)頁設(shè)計(jì)
  • 中國建設(shè)部官方網(wǎng)站魯班獎(jiǎng)網(wǎng)絡(luò)推廣的方法包括
  • 四川城鄉(xiāng)建設(shè)委員會(huì)的網(wǎng)站深圳百度競(jìng)價(jià)托管公司
  • 做網(wǎng)站的空間汽車行業(yè)網(wǎng)站建設(shè)
  • 大型o2o網(wǎng)站開發(fā)時(shí)間怎么建造自己的網(wǎng)站
  • 開網(wǎng)站買自己做的東西什么是淘寶seo
  • 河南建設(shè)廳八大員查詢網(wǎng)站搜索引擎優(yōu)化關(guān)鍵字
  • 紅鵲豆網(wǎng)絡(luò)網(wǎng)站站建設(shè)營銷思路八大要點(diǎn)
  • 怎樣給網(wǎng)站或者商品做推廣抖音seo軟件工具
  • 廈門做網(wǎng)站建設(shè)榜單優(yōu)化
  • 給一個(gè)裝修公司怎么做網(wǎng)站今日新聞播報(bào)
  • 用手機(jī)制作ppt的軟件seo站長綜合查詢工具
  • 哪種語言做的網(wǎng)站好seo診斷站長
  • 福州綠光網(wǎng)站建設(shè)工作室seo sem是啥
  • led燈什么網(wǎng)站做推廣好百度小說排行榜2020
  • 網(wǎng)站空間 價(jià)格網(wǎng)站流量數(shù)據(jù)
  • 專業(yè)的網(wǎng)站建設(shè)商家免費(fèi)網(wǎng)站建設(shè)平臺(tái)
  • 網(wǎng)站被劫持怎么辦百度官方版
  • j建設(shè)網(wǎng)站制作網(wǎng)站教學(xué)
  • 專門做服裝批發(fā)的網(wǎng)站有哪些自己怎么做網(wǎng)頁推廣
  • 企業(yè)網(wǎng)站怎么做連接seo搜索引擎優(yōu)化視頻
  • php做動(dòng)漫網(wǎng)站google搜索優(yōu)化
  • 政府網(wǎng)站建設(shè)原則西安seo站內(nèi)優(yōu)化
  • 外國網(wǎng)站學(xué)習(xí)做任務(wù) 升級(jí)100大看免費(fèi)行情的軟件
  • 蘭州易天網(wǎng)站建設(shè)公司有哪些cpm廣告聯(lián)盟平臺(tái)
  • 租服務(wù)器的網(wǎng)站seo兼職怎么收費(fèi)
  • 淘寶里網(wǎng)站建設(shè)公司可以嗎地推十大推廣app平臺(tái)
  • 做網(wǎng)站怎么切圖網(wǎng)站seo收錄工具