下面贴出安卓N版本MyHandler.h对消息”accu”的处理原文 
  

            //收到'accu'消息,说明AAVCAssembler成功将多个NAL单元组合成了一帧完整的数据,并将存放该帧数据的buffer的引用添加到该buffer里了。case 'accu':{if (mSeekPending) {ALOGV("Stale access unit.");break;}int32_t timeUpdate;if (msg->findInt32("time-update", &timeUpdate) && timeUpdate) {//如果在消息msg里设置了"time-update"字段信息,并且得到的timeUpdate值非零,则需要进行处理//从消息msg里设置的"track-index"字段信息得到trackIndex的值//从消息msg里设置的"rtp-time"字段信息得到rtpTime的值//从消息msg里设置的"ntp-time"字段信息得到ntpTime的值//调用onTimeUpdate(trackIndex, rtpTime, ntpTime)进行处理//break跳出该case处理分支size_t trackIndex;CHECK(msg->findSize("track-index", &trackIndex));uint32_t rtpTime;uint64_t ntpTime;CHECK(msg->findInt32("rtp-time", (int32_t *)&rtpTime));CHECK(msg->findInt64("ntp-time", (int64_t *)&ntpTime));onTimeUpdate(trackIndex, rtpTime, ntpTime);break;}int32_t first;if (msg->findInt32("first-rtcp", &first)) {//如果消息msg里设置了"first-rtcp"字段信息则将mReceivedFirstRTCPPacket的值设置为true//break跳出该case语句处理分支mReceivedFirstRTCPPacket = true;break;}if (msg->findInt32("first-rtp", &first)) {//如果消息msg里设置了"first-rtp"字段信息,则将mReceivedFirstRTPPacket的值设置为true//break跳出该case语句处理分支mReceivedFirstRTPPacket = true;break;}//代码执行到这里说明收到的是正常的一帧数据//将mNumAccessUnitsReceived自增1计数已经收到的帧的数量//调用postAccessUnitTimeoutCheck进行超时检查++mNumAccessUnitsReceived;postAccessUnitTimeoutCheck();//从消息msg的字段信息"track-index"得到trackIndex的值size_t trackIndex;CHECK(msg->findSize("track-index", &trackIndex));if (trackIndex >= mTracks.size()) {//mTracks.size()表示的是支持的最大轨道数目,trackIndex不同超过这个值//trackIndex在0~mTracks.size()-1内ALOGV("late packets ignored.");break;}//由trackIndex得到对应轨道的TrackInfo信息结构体的指针TrackInfo *track = &mTracks.editItemAt(trackIndex);int32_t eos;if (msg->findInt32("eos", &eos)) {//如果消息msg设置了"eos"字段信息,说明该帧位位结尾帧//当收到的帧是结尾帧的时候进行相应处理//这里具体的处理就先不介绍了先放一边,抓住主要矛盾先ALOGI("received BYE on track index %zu", trackIndex);char value[PROPERTY_VALUE_MAX] = {0};if (property_get("rtcp.bye.notify", value, "false")&& !strcasecmp(value, "true")) {sp<AMessage> msg = mNotify->dup();msg->setInt32("what", kWhatByeReceived);msg->post();}if (!mAllTracksHaveTime && dataReceivedOnAllChannels()) {ALOGI("No time established => fake existing data");track->mEOSReceived = true;mTryFakeRTCP = true;mReceivedFirstRTCPPacket = true;fakeTimestamps();} else {postQueueEOS(trackIndex, ERROR_END_OF_STREAM);}return;}if (mSeekPending) {ALOGV("we're seeking, dropping stale packet.");break;}/从消息msg里的"access-unit"字段信息得到存放数据帧buffer的引用//调用onAccessUnitComplete(trackIndex, accessUnit)对该buffer进行处理sp<ABuffer> accessUnit;CHECK(msg->findBuffer("access-unit", &accessUnit));onAccessUnitComplete(trackIndex, accessUnit);break;}

  小结:MyHandler对消息”accu”的处理是:收到正常的数据帧的做法从消息msg里的”access-unit”字段信息得到存放数据帧buffer的引用,然后调用onAccessUnitComplete(trackIndex, accessUnit)进行处理

MyHandler.h对消息accu的处理相关推荐

  1. Android的消息机制: Message/MessageQueue/Handler/Looper

    概览 * Message:消息.消息里面可包含简单数据.Object和Bundle,还可以包含一个Runnable(实际上可看做回调). * MessageQueue:消息队列,供Looper线程消费 ...

  2. 关于windowsx.h的介绍

    很多初中级程序员用C/C++编写WindwosAPI的程序时,经常面对面条式的switch...case语句块 当你在Window过程(回调函数.下称过程)中加入大量诸如WM_COMMAND orWM ...

  3. 进程间通信的方式(三):消息队列

     消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送进程.接受进程而存在.消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.每个数据块都被认为是一个管道,接收进程可以独 ...

  4. Linux 进程间通信:管道、共享内存、消息队列、信号量

    进程间通信 管道 共享内存 消息队列 信号量 进程间通信 https://blog.csdn.net/qq_35423154/article/details/105294963 在之前的一篇博客中讲过 ...

  5. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...

  6. 实现 Win32 程序的消息映射宏(类似 MFC )

    对于消息映射宏,不用多说了,用过 MFC 的人都很清楚.但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏.其实 Windows 的头 ...

  7. IPC通信:Posix消息队列的属性设置

    IPC通信:Posix消息队列的属性设置 Posix消息队列的属性使用如下结构存放: struct mq_attr { long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK) ...

  8. Linux C语言在用户态实现一个低时延通知(eventfd)+轮询(无锁队列ring)机制的消息队列

    目录 fastq.c fastq.h test-0.c test-1.c https://github.com/Rtoax/test/tree/master/ipc/github/fastq fast ...

  9. c++ 消息分发 消息管理

    消息分发机制 当接收到前端发来的消息并解析后 根据包头的消息码来决定分发到哪个模块,以及调用哪个函数 步骤1.需要注册消息码 为了之后找到这个消息码需要干什么事 步骤2.接收到消息并解析后调用根据解析 ...

最新文章

  1. 微课丨华为的18条军规
  2. 二叉查找树(二叉排序树)创建,插入,删除操作。
  3. flash背景透明、置底、禁止放大 右键菜单
  4. C#using static
  5. Java 并发总结——进程与线程
  6. /etc/fstab详解
  7. React-Router面试题汇总
  8. 定界符在php中,php定界符如何使用
  9. C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程
  10. 文件、文件夹操作(I)
  11. vue报错getVueAllUser:67 Uncaught TypeError: Cannot read property 'userId' of undefined
  12. 计算机多媒体处理的是什么意思,多媒体处理的是什么信号
  13. 51nod 1791 合法括号子段
  14. 基于matlab的信号与系统课程设计,信号与系统课程设计基于 MATLAB 完成信号与系统综合设计实验...
  15. HTTP协议和web服务技术---Apche配置
  16. MPI聚合通信之MPI_Bcast函数
  17. 世界顶级机器学习科学家黄恒加入京东,出任京东大数据首席科学家
  18. Linux定时器描述符(timerfd)shiy
  19. 【空间转录组】MIA分析
  20. 82.android 简单的当前运行内存清理

热门文章

  1. iOS 利用 Metal 实现滤镜与动效滤镜
  2. createrepo:创建本地源
  3. NMOS和PMOS管 电流方向和应用电路
  4. 超级计算机 人脑,世界第4超级计算机竟被人脑秒成渣,人类的大脑究竟多厉害?...
  5. 各大AI 开放平台一览
  6. 通过注册表添加受信任站点
  7. C++学生信息管理系统(有头链表+文件存取)
  8. 如何增加微信朋友圈分享链接的小图片
  9. FLUENT进行组分反应模拟
  10. 《MATLAB 神经网络43个案例分析》:第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优