MyHandler.h对消息"accu"的处理

  下面贴出安卓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)进行处理

void sendDriverCtrl( int & sendSocket, const double & simTime, const unsigned int & simFrame ) { Framework::RDBHandler myHandler; myHandler.initMsg(); RDB_DRIVER_CTRL_t *myDriver = ( RDB_DRIVER_CTRL_t* ) myHandler.addPackage( simTime, simFrame, RDB_PKG_ID_DRIVER_CTRL ); if ( !myDriver ) return; // do we have a valid nearest object? bool haveSensorObject = ( mNearestObject.base.id > 0 ); // sensor object must not be older than 1.0s double ownSpeed = sqrt( mOwnObject.ext.speed.x * mOwnObject.ext.speed.x + mOwnObject.ext.speed.y * mOwnObject.ext.speed.y ); double accelTgtDist = 0.0; double accelTgtSpeed = ( 30.0 - ownSpeed ) / 5.0; // default speed should be own preferred speed if ( haveSensorObject ) { // let's go for the same speed as preceding vehicle: if ( mNearestObject.ext.speed.x < -1.0e-3 ) accelTgtSpeed = 2.0 * mNearestObject.ext.speed.x / 5.0; else accelTgtSpeed = 0.0; // let's go for a 2s distance double tgtDist = ownSpeed * 2.0; if ( tgtDist < 10.0 ) // minimum distance to keep tgtDist = 10.0; accelTgtDist = ( mNearestObject.base.pos.x - tgtDist ) / 10.0; } fprintf( stderr, "sendDriverCtrl: accelDist = %.5lf, accelSpeed = %.5lf\n", accelTgtDist, accelTgtSpeed ); myDriver->playerId = 1; myDriver->accelTgt = accelTgtDist + accelTgtSpeed; myDriver->validityFlags = RDB_DRIVER_INPUT_VALIDITY_TGT_ACCEL | RDB_DRIVER_INPUT_VALIDITY_ADD_ON; int retVal = send( sendSocket, ( const char* ) ( myHandler.getMsg() ), myHandler.getMsgTotalSize(), 0 ); if ( !retVal ) fprintf( stderr, "sendDriverCtrl: could not send driver control\n" ); else fprintf( stderr, "sentDriverCtrl\n" ); }
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值