美文网首页
2018-09-14

2018-09-14

作者: 辛翊 | 来源:发表于2018-09-17 11:58 被阅读25次

Moudle 数据结构,在plugins目录下load

struct obs_module {
    char *mod_name;
    const char *file;
    char *bin_path;
    char *data_path;
    void *module;
    bool loaded;

    bool        (*load)(void);                                                /**< 初始化module,并注册组件obs_register_*** */
    void        (*unload)(void);
    void        (*post_load)(void);
    void        (*set_locale)(const char *locale);
    void        (*free_locale)(void);
    uint32_t    (*ver)(void);
    void        (*set_pointer)(obs_module_t *module);    
    const char *(*name)(void);
    const char *(*description)(void);
    const char *(*author)(void);

    struct obs_module *next;
};

View 数据结构

struct obs_view {
    pthread_mutex_t                 channels_mutex;
    obs_source_t                    *channels[MAX_CHANNELS];
};

Display 数据结构

struct obs_display {
    bool                            size_changed;
    bool                            enabled;
    uint32_t                        cx, cy;
    uint32_t                        background_color;
    gs_swapchain_t                  *swap;                      //一个display对应一个swpchain
    pthread_mutex_t                 draw_callbacks_mutex;
    pthread_mutex_t                 draw_info_mutex;
    DARRAY(struct draw_callback)    draw_callbacks;

    struct obs_display              *next;
    struct obs_display              **prev_next;
};

Core-video 核心视频数据结构

struct obs_vframe_info {
    uint64_t timestamp;
    int count;
};

struct obs_core_video {
    graphics_t                      *graphics;                                 //Subsystem d3d、opengl
    gs_stagesurf_t                  *copy_surfaces[NUM_TEXTURES];
    gs_texture_t                    *render_textures[NUM_TEXTURES];
    gs_texture_t                    *output_textures[NUM_TEXTURES];
    gs_texture_t                    *convert_textures[NUM_TEXTURES];
    bool                            textures_rendered[NUM_TEXTURES];
    bool                            textures_output[NUM_TEXTURES];
    bool                            textures_copied[NUM_TEXTURES];
    bool                            textures_converted[NUM_TEXTURES];
    struct circlebuf                vframe_info_buffer;
    gs_effect_t                     *default_effect;
    gs_effect_t                     *default_rect_effect;
    gs_effect_t                     *opaque_effect;
    gs_effect_t                     *solid_effect;
    gs_effect_t                     *conversion_effect;
    gs_effect_t                     *bicubic_effect;
    gs_effect_t                     *lanczos_effect;
    gs_effect_t                     *bilinear_lowres_effect;
    gs_effect_t                     *premultiplied_alpha_effect;
    gs_samplerstate_t               *point_sampler;
    gs_stagesurf_t                  *mapped_surface;
    int                             cur_texture;
    long                            raw_active;

    uint64_t                        video_time;
    uint64_t                        video_avg_frame_time_ns;
    double                          video_fps;
    video_t                         *video;                                    //VideoOutput
    pthread_t                       video_thread;
    uint32_t                        total_frames;
    uint32_t                        lagged_frames;
    bool                            thread_initialized;

    bool                            gpu_conversion;
    const char                      *conversion_tech;
    uint32_t                        conversion_height;
    uint32_t                        plane_offsets[3];
    uint32_t                        plane_sizes[3];
    uint32_t                        plane_linewidth[3];

    uint32_t                        output_width;
    uint32_t                        output_height;
    uint32_t                        base_width;
    uint32_t                        base_height;
    float                           color_matrix[16];
    enum obs_scale_type             scale_type;

    gs_texture_t                    *transparent_texture;

    gs_effect_t                     *deinterlace_discard_effect;
    gs_effect_t                     *deinterlace_discard_2x_effect;
    gs_effect_t                     *deinterlace_linear_effect;
    gs_effect_t                     *deinterlace_linear_2x_effect;
    gs_effect_t                     *deinterlace_blend_effect;
    gs_effect_t                     *deinterlace_blend_2x_effect;
    gs_effect_t                     *deinterlace_yadif_effect;
    gs_effect_t                     *deinterlace_yadif_2x_effect;

    struct obs_video_info           ovi;
};

Core-data 核心数据结构

struct obs_core_data {
    struct obs_source               *first_source;
    struct obs_source               *first_audio_source;
    struct obs_display              *first_display;
    struct obs_output               *first_output;
    struct obs_encoder              *first_encoder;
    struct obs_service              *first_service;

    pthread_mutex_t                 sources_mutex;
    pthread_mutex_t                 displays_mutex;
    pthread_mutex_t                 outputs_mutex;
    pthread_mutex_t                 encoders_mutex;
    pthread_mutex_t                 services_mutex;
    pthread_mutex_t                 audio_sources_mutex;
    pthread_mutex_t                 draw_callbacks_mutex;
    DARRAY(struct draw_callback)    draw_callbacks;
    DARRAY(struct tick_callback)    tick_callbacks;

    struct obs_view                 main_view;

    long long                       unnamed_index;

    volatile bool                   valid;
};

Core 内核

全局唯一

包含以上核心数据,video、audio、data、hotkeys

struct obs_core {
    struct obs_module               *first_module;
    DARRAY(struct obs_module_path)  module_paths;
/*--------------------------------------source info--------------------------------------------*/
 /**
按照source类型,分类存储每一个被注册的source的source_info
enum obs_source_type {
    OBS_SOURCE_TYPE_INPUT,
    OBS_SOURCE_TYPE_FILTER,
    OBS_SOURCE_TYPE_TRANSITION,
    OBS_SOURCE_TYPE_SCENE,
}; 
 */
    DARRAY(struct obs_source_info)  source_types;                         
    DARRAY(struct obs_source_info)  input_types;
    DARRAY(struct obs_source_info)  filter_types;
    DARRAY(struct obs_source_info)  transition_types;
    DARRAY(struct obs_output_info)  output_types;
/*--------------------------------------encoder info--------------------------------------------*/
/*
enum obs_encoder_type {
    OBS_ENCODER_AUDIO, 
    OBS_ENCODER_VIDEO  
};
*/
    DARRAY(struct obs_encoder_info) encoder_types;
    DARRAY(struct obs_service_info) service_types;
    DARRAY(struct obs_modal_ui)     modal_ui_callbacks;
    DARRAY(struct obs_modeless_ui)  modeless_ui_callbacks;

    signal_handler_t                *signals;
    proc_handler_t                  *procs;

    char                            *locale;
    char                            *module_config_path;
    bool                            name_store_owned;
    profiler_name_store_t           *name_store;

    /* segmented into multiple sub-structures to keep things a bit more
     * clean and organized */
    struct obs_core_video           video;
    struct obs_core_audio           audio;
    struct obs_core_data            data;
    struct obs_core_hotkeys         hotkeys;
};

Context 共享的上下文环境数据

struct obs_context_data {
    char                            *name;                                             /**< source 名称eg."Window Capture" *** */
    void                            *data;                                               /**< source.create,source 相关联的源对象 *** */
    obs_data_t                      *settings;                                    /**< 对souces的json配置文件里 settings属性的引用 *** */  
    signal_handler_t                *signals;                                  /** < singnal句柄,绑定source_signals回调函数 *** */
    proc_handler_t                  *procs;
    enum obs_obj_type               type;                                     /**< obj类型source、output、encoder
、service *** */  

    DARRAY(obs_hotkey_id)           hotkeys;
    DARRAY(obs_hotkey_pair_id)      hotkey_pairs;
    obs_data_t                      *hotkey_data;

    DARRAY(char*)                   rename_cache;
    pthread_mutex_t                 rename_cache_mutex;

    pthread_mutex_t                 *mutex;
    struct obs_context_data         *next;
    struct obs_context_data         **prev_next;

    bool                            private;                                             /**< 是否私有化,source为filter时是true *** */                                
};

Soucre 源数据结构

struct obs_source {
    struct obs_context_data         context;
    struct obs_source_info          info;
    struct obs_weak_source          *control;

    /* general exposed flags that can be set for the source */
    uint32_t                        flags;
    uint32_t                        default_flags;

    /* indicates ownership of the info.id buffer */
    bool                            owns_info_id;

    /* signals to call the source update in the video thread */
    bool                            defer_update;

    /* ensures show/hide are only called once */
    volatile long                   show_refs;

    /* ensures activate/deactivate are only called once */
    volatile long                   activate_refs;

    /* used to indicate that the source has been removed and all
     * references to it should be released (not exactly how I would prefer
     * to handle things but it's the best option) */
    bool                            removed;

    bool                            active;
    bool                            showing;

    /* used to temporarily disable sources if needed */
    bool                            enabled;

    /* timing (if video is present, is based upon video) */
    volatile bool                   timing_set;
    volatile uint64_t               timing_adjust;
    uint64_t                        resample_offset;
    uint64_t                        last_audio_ts;
    uint64_t                        next_audio_ts_min;
    uint64_t                        next_audio_sys_ts_min;
    uint64_t                        last_frame_ts;
    uint64_t                        last_sys_timestamp;
    bool                            async_rendered;

    /* audio */
    bool                            audio_failed;
    bool                            audio_pending;
    bool                            pending_stop;
    bool                            user_muted;
    bool                            muted;
    struct obs_source               *next_audio_source;
    struct obs_source               **prev_next_audio_source;
    uint64_t                        audio_ts;
    struct circlebuf                audio_input_buf[MAX_AUDIO_CHANNELS];
    size_t                          last_audio_input_buf_size;
    DARRAY(struct audio_action)     audio_actions;
    float                           *audio_output_buf[MAX_AUDIO_MIXES][MAX_AUDIO_CHANNELS];
    struct resample_info            sample_info;
    audio_resampler_t               *resampler;
    pthread_mutex_t                 audio_actions_mutex;
    pthread_mutex_t                 audio_buf_mutex;
    pthread_mutex_t                 audio_mutex;
    pthread_mutex_t                 audio_cb_mutex;
    DARRAY(struct audio_cb_info)    audio_cb_list;
    struct obs_audio_data           audio_data;
    size_t                          audio_storage_size;
    uint32_t                        audio_mixers;
    float                           user_volume;
    float                           volume;
    int64_t                         sync_offset;
    int64_t                         last_sync_offset;

    /* async video data */
    gs_texture_t                    *async_texture;
    gs_texrender_t                  *async_texrender;
    struct obs_source_frame         *cur_async_frame;
    bool                            async_gpu_conversion;
    enum video_format               async_format;
    enum video_format               async_cache_format;
    enum gs_color_format            async_texture_format;
    float                           async_color_matrix[16];
    bool                            async_full_range;
    float                           async_color_range_min[3];
    float                           async_color_range_max[3];
    int                             async_plane_offset[2];
    bool                            async_flip;
    bool                            async_active;
    bool                            async_update_texture;
    bool                            async_unbuffered;
    bool                            async_decoupled;
    struct obs_source_frame         *async_preload_frame;
    DARRAY(struct async_frame)      async_cache;
    DARRAY(struct obs_source_frame*)async_frames;
    pthread_mutex_t                 async_mutex;
    uint32_t                        async_width;
    uint32_t                        async_height;
    uint32_t                        async_cache_width;
    uint32_t                        async_cache_height;
    uint32_t                        async_convert_width;
    uint32_t                        async_convert_height;

    /* async video deinterlacing */
    uint64_t                        deinterlace_offset;
    uint64_t                        deinterlace_frame_ts;
    gs_effect_t                     *deinterlace_effect;
    struct obs_source_frame         *prev_async_frame;
    gs_texture_t                    *async_prev_texture;
    gs_texrender_t                  *async_prev_texrender;
    uint32_t                        deinterlace_half_duration;
    enum obs_deinterlace_mode       deinterlace_mode;
    bool                            deinterlace_top_first;
    bool                            deinterlace_rendered;

    /* filters */
    struct obs_source               *filter_parent;
    struct obs_source               *filter_target;
    DARRAY(struct obs_source*)      filters;
    pthread_mutex_t                 filter_mutex;
    gs_texrender_t                  *filter_texrender;
    enum obs_allow_direct_render    allow_direct;
    bool                            rendering_filter;

    /* sources specific hotkeys */
    obs_hotkey_pair_id              mute_unmute_key;
    obs_hotkey_id                   push_to_mute_key;
    obs_hotkey_id                   push_to_talk_key;
    bool                            push_to_mute_enabled;
    bool                            push_to_mute_pressed;
    bool                            user_push_to_mute_pressed;
    bool                            push_to_talk_enabled;
    bool                            push_to_talk_pressed;
    bool                            user_push_to_talk_pressed;
    uint64_t                        push_to_mute_delay;
    uint64_t                        push_to_mute_stop_time;
    uint64_t                        push_to_talk_delay;
    uint64_t                        push_to_talk_stop_time;

    /* transitions */
    uint64_t                        transition_start_time;
    uint64_t                        transition_duration;
    pthread_mutex_t                 transition_tex_mutex;
    gs_texrender_t                  *transition_texrender[2];
    pthread_mutex_t                 transition_mutex;
    obs_source_t                    *transition_sources[2];
    bool                            transitioning_video;
    bool                            transitioning_audio;
    bool                            transition_source_active[2];
    uint32_t                        transition_alignment;
    uint32_t                        transition_actual_cx;
    uint32_t                        transition_actual_cy;
    uint32_t                        transition_cx;
    uint32_t                        transition_cy;
    uint32_t                        transition_fixed_duration;
    bool                            transition_use_fixed_duration;
    enum obs_transition_mode        transition_mode;
    enum obs_transition_scale_type  transition_scale_type;
    struct matrix4                  transition_matrices[2];

    struct audio_monitor            *monitor;
    enum obs_monitoring_type        monitoring_type;

    obs_data_t                      *private_settings;
};

VideoInof 视频配置信息 首次从配置文件中获取

struct obs_video_info {
#ifndef SWIG
    /**
     * Graphics module to use (usually "libobs-opengl" or "libobs-d3d11")
     */
    const char          *graphics_module;
#endif

    uint32_t            fps_num;       /**< Output FPS numerator */
    uint32_t            fps_den;       /**< Output FPS denominator */

    uint32_t            base_width;    /**< Base compositing width */
    uint32_t            base_height;   /**< Base compositing height */

    uint32_t            output_width;  /**< Output width */
    uint32_t            output_height; /**< Output height */
    enum video_format   output_format; /**< Output format */

    /** Video adapter index to use (NOTE: avoid for optimus laptops) */
    uint32_t            adapter;

    /** Use shaders to convert to different color formats */
    bool                gpu_conversion;

    enum video_colorspace colorspace;  /**< YUV type (if YUV) */
    enum video_range_type range;       /**< YUV range (if YUV) */

    enum obs_scale_type scale_type;    /**< How to scale if scaling */
};

VideoOutPut 数据结构

struct video_output {
    struct video_output_info   info;

    pthread_t                  thread;
    pthread_mutex_t            data_mutex;
    bool                       stop;

    os_sem_t                   *update_semaphore;
    uint64_t                   frame_time;              //每一帧的时间,纳秒级别,例如fps=30则为33333333
    uint32_t                   skipped_frames;
    uint32_t                   total_frames;

    bool                       initialized;

    pthread_mutex_t            input_mutex;
    DARRAY(struct video_input) inputs;

    size_t                     available_frames;
    size_t                     first_added;
    size_t                     last_added;
    struct cached_frame_info   cache[MAX_CACHE_SIZE];
};

相关文章

网友评论

      本文标题:2018-09-14

      本文链接:https://www.haomeiwen.com/subject/kbbogftx.html