addon.MediaStream,erizo::MediaStream 还有addon.MediaXXX,erizo::MediaXXX

news2024/9/21 2:36:21

9. MediaStream 和erizo::MediaStream 类的继承关系

erizo::MediaStream

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaStream.h

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h

在这里插入图片描述

erizo::MediaSource

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h

/**
 * A MediaSource is any class that produces audio or video data.
 */
class MediaSource: public virtual Monitor {
 protected:
    // SSRCs coming from the source
    uint32_t audio_source_ssrc_;
    std::vector<uint32_t> video_source_ssrc_list_;
    MediaSink* video_sink_;
    MediaSink* audio_sink_;
    MediaSink* event_sink_;
    // can it accept feedback
    FeedbackSink* source_fb_sink_;

 public:
    void setAudioSink(MediaSink* audio_sink) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        this->audio_sink_ = audio_sink;
    }
    void setVideoSink(MediaSink* video_sink) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        this->video_sink_ = video_sink;
    }
    void setEventSink(MediaSink* event_sink) {
      boost::mutex::scoped_lock lock(monitor_mutex_);
      this->event_sink_ = event_sink;
    }

    FeedbackSink* getFeedbackSink() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return source_fb_sink_;
    }
    virtual int sendPLI() = 0;
    uint32_t getVideoSourceSSRC() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        if (video_source_ssrc_list_.empty()) {
          return 0;
        }
        return video_source_ssrc_list_[0];
    }
    void setVideoSourceSSRC(uint32_t ssrc) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        if (video_source_ssrc_list_.empty()) {
          video_source_ssrc_list_.push_back(ssrc);
          return;
        }
        video_source_ssrc_list_[0] = ssrc;
    }
    std::vector<uint32_t> getVideoSourceSSRCList() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return video_source_ssrc_list_;  //  return by copy to avoid concurrent access
    }
    void setVideoSourceSSRCList(const std::vector<uint32_t>& new_ssrc_list) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        video_source_ssrc_list_ = new_ssrc_list;
    }
    uint32_t getAudioSourceSSRC() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return audio_source_ssrc_;
    }
    void setAudioSourceSSRC(uint32_t ssrc) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        audio_source_ssrc_ = ssrc;
    }

    bool isVideoSourceSSRC(uint32_t ssrc) {
      auto found_ssrc = std::find_if(video_source_ssrc_list_.begin(), video_source_ssrc_list_.end(),
          [ssrc](uint32_t known_ssrc) {
          return known_ssrc == ssrc;
          });
      return (found_ssrc != video_source_ssrc_list_.end());
    }

    bool isAudioSourceSSRC(uint32_t ssrc) {
      return audio_source_ssrc_ == ssrc;
    }

    MediaSource() : audio_source_ssrc_{0}, video_source_ssrc_list_{std::vector<uint32_t>(1, 0)},
      video_sink_{nullptr}, audio_sink_{nullptr}, event_sink_{nullptr}, source_fb_sink_{nullptr} {}
    virtual ~MediaSource() {}

    virtual void close() = 0;
};

erizo::MediaSink

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h

/*
 * A MediaSink
 */
class MediaSink: public virtual Monitor {
 protected:
    // SSRCs received by the SINK
    uint32_t audio_sink_ssrc_;
    uint32_t video_sink_ssrc_;
    // Is it able to provide Feedback
    FeedbackSource* sink_fb_source_;

 public:
    int deliverAudioData(std::shared_ptr<DataPacket> data_packet) {
        return this->deliverAudioData_(data_packet);
    }
    int deliverVideoData(std::shared_ptr<DataPacket> data_packet) {
        return this->deliverVideoData_(data_packet);
    }
    uint32_t getVideoSinkSSRC() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return video_sink_ssrc_;
    }
    void setVideoSinkSSRC(uint32_t ssrc) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        video_sink_ssrc_ = ssrc;
    }
    uint32_t getAudioSinkSSRC() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return audio_sink_ssrc_;
    }
    void setAudioSinkSSRC(uint32_t ssrc) {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        audio_sink_ssrc_ = ssrc;
    }
    bool isVideoSinkSSRC(uint32_t ssrc) {
      return ssrc == video_sink_ssrc_;
    }
    bool isAudioSinkSSRC(uint32_t ssrc) {
      return ssrc == audio_sink_ssrc_;
    }
    FeedbackSource* getFeedbackSource() {
        boost::mutex::scoped_lock lock(monitor_mutex_);
        return sink_fb_source_;
    }
    int deliverEvent(MediaEventPtr event) {
      return this->deliverEvent_(event);
    }
    MediaSink() : audio_sink_ssrc_{0}, video_sink_ssrc_{0}, sink_fb_source_{nullptr} {}
    virtual ~MediaSink() {}

    virtual void close() = 0;

 private:
    virtual int deliverAudioData_(std::shared_ptr<DataPacket> data_packet) = 0;
    virtual int deliverVideoData_(std::shared_ptr<DataPacket> data_packet) = 0;
    virtual int deliverEvent_(MediaEventPtr event) = 0;
};

erizo::FeedbackSink

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h

class FeedbackSink {
 public:
    virtual ~FeedbackSink() {}
    int deliverFeedback(std::shared_ptr<DataPacket> data_packet) {
        return this->deliverFeedback_(data_packet);
    }
 private:
    virtual int deliverFeedback_(std::shared_ptr<DataPacket> data_packet) = 0;
};

erizo::FeedbackSource

source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h

class FeedbackSource {
 protected:
    FeedbackSink* fb_sink_;
 public:
    FeedbackSource(): fb_sink_{nullptr} {}
    virtual ~FeedbackSource() {}
    void setFeedbackSink(FeedbackSink* sink) {
        fb_sink_ = sink;
    }
};

addon.MediaStream

source/agent/webrtc/rtcConn/MediaStream.h

在这里插入图片描述

class MediaStream : public MediaFilter, public erizo::MediaStreamStatsListener, public erizo::MediaStreamEventListener {
 public:
...
}

addon.MediaFilter

source/core/owt_base/MediaWrapper.h

/*
 * Wrapper class of both erizo::MediaSink and erizo::MediaSource
 */
class MediaFilter : public Nan::ObjectWrap {
 public:
    erizo::MediaSink* msink;
    erizo::MediaSource* msource;
};

addon.MediaSource

source/core/owt_base/MediaWrapper.h

/*
 * Wrapper class of erizo::MediaSource
 */
class MediaSource : public Nan::ObjectWrap {
 public:
    erizo::MediaSource* msource;
};

addon.MediaSink

source/core/owt_base/MediaWrapper.h

class MediaSink : public Nan::ObjectWrap {
 public:
    erizo::MediaSink* msink;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++进阶4-AVLTree】尽可能条理清晰地为你讲解比普通BST更强的——AVLTree

今天&#xff0c;带来AVLTree的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 AVLTree是一种自平衡的二叉搜索树。 它通过控制左右子树的高度差不超过1来调节平衡&#xff0c;从而提高搜索&#xff0c;插入和删除的效率。 实现 结构 AVLTree为了能自动调节平衡&#…

第十四章行为性模式—策略模式

文章目录 命令模式解决的问题结构实例存在的问题适用场景 JDK源码解析 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模式分为类行为模式…

Java阶段三Day07

Java阶段三Day07 文章目录 Java阶段三Day07Spring Security自定义UserDetails密码加密授权 JDK包结构文档注释规范JDK APIString APIString是不可变对象String常量池内存编码及长度使用indexOf实现检索使用substring获取子串trim去除两侧空白charAtstartsWith和endsWith大小写变…

3.1 矩阵连乘问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 学习目标&#xff1a; 如果我要学习动态规划中的矩阵连乘问题&#xff0c;我会采取以下学习方法&#xff1a; 1. **理解问题的背景和目标&#xff1a;首…

pytorch中分布式Collective通信API学习

随着各种大模型的不断迭出&#xff0c;感觉现在的NLP领域已经来到了大模型的时代。那么怎么来训练一个大模型呢&#xff1f;其中比较关键的一个技术基础就是分布式训练。在阅读GLM源码的时候&#xff0c;感觉其中的分布式训练代码不是很熟悉&#xff0c;看起来有点吃力&#xf…

【Nature 2023】Computational approaches streamlining drug discovery

今天为大家介绍的是一篇发表于“Nature”上面的综述文章“Computational approaches streamlining drug discovery”&#xff0c; Computer-aided drug discovery has been around for decades, although the past few years have seen a tectonic shift towards embracing com…

马尔科夫链 Markov chain

马尔科夫链 1.实例参考文献 马尔科夫链(Markov chain)及其模型在机器学习中应用广泛&#xff0c;本文结合一些参考资料做一个总结。 注意的是&#xff0c;本文中提到的马尔科夫链&#xff0c;要与隐马尔科夫(HMM)作以区分。 1.实例 设某人的训练计划中有以下四项运动&#x…

通过VCP(VMware Certified Professional)认证

文章目录 小结要求考试证书参考 小结 通过VCP(VMware Certified Professional)认证&#xff0c;去年参加了VMware的培训&#xff0c;今年通过VMware Certified Professional (2V0-21.20)的考试&#xff0c;拿到证书。 要求 需要参加VMware的指定的培训&#xff0c;我在去年五…

【数据结构】 数组 array

一、什么是数组 连续内存空间&#xff0c;存储的一组相同类型的元素 二、常用操作 1.原理 access&#xff1a;通过索引直接读取元素的值 时间复杂度&#xff1a;O(1) search&#xff1a;遍历查找某个元素 时间复杂度&#xff1a;O(N) insert&#xff1a;插入位置后的元素依…

Generative AI 新世界 | 大语言模型(LLMs)在 Amazon SageMaker 上的动手实践

在上一篇《Generative AI 新世界&#xff1a;大型语言模型&#xff08;LLMs&#xff09;概述》中&#xff0c;我们一起探讨了大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析&#xff08;Amazon Titan、LLaMA、PaLM-E 等&#xf…

QT超市管理系统

QT超市管理系统 前言QT介绍.pro文件主文件&#xff08;main函数&#xff09;窗口函数&#xff08;mainwindow&#xff09;用户登录&#xff08;user_login&#xff09;超市系统数据库&#xff08;maketsql&#xff09;超市商品的增删改查(dlg_addmak)收款码界面(picture)结语 前…

亚马逊云科技探路可持续,数智创未来

气候变化是全人类的共同挑战。应对气候变化&#xff0c;事关永续发展&#xff0c;关乎人类前途命运。2020年中国在联合国大会上亚马逊云科技作出庄严承诺&#xff0c;要在2030年实现碳达峰&#xff0c;2060年实现碳中和&#xff0c;这是个全球性的规划&#xff0c;也是个庄严的…

Yolov8轻量化:MobileNetV3,轻量级骨架首选

1.轻量化网络简介 轻量化网络是指在保持模型性能的前提下,尽可能减小模型参数量和计算量的神经网络。这种网络通常被用于在移动设备等资源受限的场景中部署,以提高模型的实时性和运行效率。 轻量化网络的设计思路可以包括以下几个方面: 去除冗余层和参数:通过剪枝、蒸馏等技…

MFC(五)菜单栏和工具栏

这篇文章我们来完成菜单设计和工具栏设计 菜单设计 1.点开资源视图>Menu>IDR_MAINFRAME 通过IDR_MAINFRAME我们可以编辑该资源定义&#xff0c;包括主菜单、其他菜单、工具栏等内容&#xff0c;IDR_MAINFRAME即为默认的主窗口的资源标识符 2.右键相应菜单>新插入&…

数据结构 --- 红黑树

红黑树也是一种自平衡的二叉搜索树&#xff0c;和AVL树比较&#xff0c;插入和删除时&#xff0c;旋转的次数更少。 红黑树的特性&#xff1a; 所有节点都有颜色&#xff1a;红色或者黑色所有null均视为黑色红色节点不能相邻根节点是黑色从根节点到任意一个叶子节点&#xff…

5分钟带你了解,SAS硬盘和SATA硬盘的区别?

一、SAS和SATA的关系 SAS的接口技术可以向下兼容SATA。具体来说&#xff0c;二者的兼容性主要体现在物理层和协议层的兼容。 在物理层&#xff0c;SAS接口和SATA接口完全兼容&#xff0c;SATA硬盘可以直接使用在SAS的环境中&#xff0c;从接口标准上而言&#xff0c;SATA是SAS的…

接口隔离原则:接口里的方法,你都用得到吗?

文章目录 前言接口隔离原则1、角色的合理划分2、定制服务3、接口污染 胖接口减肥总结 前言 在前面几篇文章中中&#xff0c;我们讲的设计原则基本上都是关于如何设计一个类。SRP 告诉我们&#xff0c;一个类的变化来源应该是单一的&#xff1b;OCP 说&#xff0c;不要随意修改…

Fiddler抓包工具之fiddler设置断点和简单的并发测试

断点有两种方式&#xff1a; 1、全局断点 2、局部断点 全局断点 全局断点的特点是&#xff1a;不能针对一个请求&#xff0c;是给所有抓到的请求打断点 全局断点如何设置&#xff1a; 1、快速设置断点&#xff1a;直接点击底部状态栏断点处 &#xff1b;点击第一下是请求…

比赛记录:Educational Codeforces Round 149 (Rated for Div. 2) A~D

传送门:CF 前提提要:这场狠狠的掉分.C题刚开始少了一个特判,导致自己对自己的构造方法产生了疑问,然后就一直在做无用思考,后来交的时候排名就贼后面,然后D题的题面简直稀烂(虽然D题看懂之后极其简单…),赛时根本看不懂D题意,最终rating掉完.不亏是教育场,被狠狠的教育了 A题…

Web的基本漏洞--命令执行漏洞

目录 一、命令执行漏洞 1.命令执行漏洞的原理 2.命令执行漏洞分类 3.命令执行漏洞的危害 4.命令执行漏洞的防范措施 5.命令执行漏洞的绕过 一、命令执行漏洞 命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一&#xff0c;也属于代码执行的范畴。命令执行…