diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index b171a36..b2f6407 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -17,6 +17,9 @@
 //#define LOG_NDEBUG 0
 #define LOG_TAG "StagefrightRecorder"
 #include <inttypes.h>
+// TODO/workaround: including base logging now as it conflicts with ADebug.h
+// and it must be included first.
+#include <android-base/logging.h>
 #include <utils/Log.h>
 
 #include "WebmWriter.h"
@@ -585,7 +588,7 @@
         const float coefficient = 0.8f;
         mVideoBitRate = (bitRate * coefficient) / 1000 * 1000;
     }
-    if (mOutputFormat == OUTPUT_FORMAT_RTP_AVP &&  mStarted && mPauseStartTimeUs == 0) {
+    if (mOutputFormat == OUTPUT_FORMAT_RTP_AVP && mStarted && mPauseStartTimeUs == 0) {
         mVideoEncoderSource->setEncodingBitrate(mVideoBitRate);
         ARTPWriter* rtpWriter  = static_cast<ARTPWriter*>(mWriter.get());
         rtpWriter->setTMMBNInfo(mOpponentID, bitRate);
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 738e42a..47362ef 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -1703,8 +1703,9 @@
 }
 
 void NuPlayer::setTargetBitrate(int bitrate) {
-    if (mSource != NULL)
+    if (mSource != NULL) {
         mSource->setTargetBitrate(bitrate);
+    }
 }
 
 void NuPlayer::onPause() {
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h
index 2f83224..adb7075 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h
@@ -102,7 +102,7 @@
 
     void updateInternalTimers();
 
-    void setTargetBitrate(int bitrate);
+    void setTargetBitrate(int bitrate /* bps */);
 
 protected:
     virtual ~NuPlayer();
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 857e095..2a50fc2 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -817,7 +817,7 @@
 }
 
 status_t NuPlayerDriver::setParameter(
-        int key, const Parcel& request ) {
+        int key, const Parcel &request ) {
     if (key == KEY_PARAMETER_RTP_ATTRIBUTES) {
         mPlayer->setTargetBitrate(request.readInt32());
         return OK;
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.cpp b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
index 5388bfd..b1901e8 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
@@ -114,7 +114,8 @@
         // index(i) should be started from 1. 0 is reserved for [root]
         mRTPConn->addStream(sockRtp, sockRtcp, desc, i + 1, notify, false);
         mRTPConn->setSelfID(info->mSelfID);
-        mRTPConn->setJbTime((info->mJbTime <= 3000 && info->mJbTime >= 40) ? info->mJbTime : 300);
+        mRTPConn->setJbTime(
+                (info->mJbTimeMs <= 3000 && info->mJbTimeMs >= 40) ? info->mJbTimeMs : 300);
 
         info->mRTPSocket = sockRtp;
         info->mRTCPSocket = sockRtcp;
@@ -669,7 +670,7 @@
         newTrackInfo.mIsAudio = isAudioKey;
         mTracks.push(newTrackInfo);
         info = &mTracks.editTop();
-        info->mJbTime = 300;
+        info->mJbTimeMs = 300;
     }
 
     if (key == "rtp-param-mime-type") {
@@ -713,7 +714,7 @@
         int64_t networkHandle = atoll(value);
         setSocketNetwork(networkHandle);
     } else if (key == "rtp-param-jitter-buffer-time") {
-        info->mJbTime = atoi(value);
+        info->mJbTimeMs = atoi(value);
     }
 
     return OK;
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.h b/media/libmediaplayerservice/nuplayer/RTPSource.h
index 5d70142..fb2d3b9 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.h
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.h
@@ -129,8 +129,8 @@
         int32_t mTimeScale;
         int32_t mAS;
 
-        /* RTP jitter buffer time in millsecond */
-        uint32_t mJbTime;
+        /* RTP jitter buffer time in milliseconds */
+        uint32_t mJbTimeMs;
         /* Unique ID indicates itself */
         uint32_t mSelfID;
         /* extmap:<value> for CVO will be set to here */
diff --git a/media/libstagefright/include/HevcUtils.h b/media/libstagefright/include/HevcUtils.h
index 469acb3..335de2f 100644
--- a/media/libstagefright/include/HevcUtils.h
+++ b/media/libstagefright/include/HevcUtils.h
@@ -90,8 +90,8 @@
     // Note that this method does not write the start code.
     bool write(size_t index, uint8_t* dest, size_t size);
     status_t makeHvcc(uint8_t *hvcc, size_t *hvccSize, size_t nalSizeLength);
-    void FindHEVCDimensions(const sp<ABuffer> &SpsBuffer, int32_t *width,
-                                                int32_t *height);
+    void FindHEVCDimensions(
+            const sp<ABuffer> &SpsBuffer, int32_t *width, int32_t *height);
 
     Info getInfo() const { return mInfo; }
 
diff --git a/media/libstagefright/rtsp/AAVCAssembler.cpp b/media/libstagefright/rtsp/AAVCAssembler.cpp
index efbde54..a0b66a7 100644
--- a/media/libstagefright/rtsp/AAVCAssembler.cpp
+++ b/media/libstagefright/rtsp/AAVCAssembler.cpp
@@ -39,7 +39,7 @@
       mNextExpectedSeqNo(0),
       mAccessUnitDamaged(false),
       mFirstIFrameProvided(false),
-      mLastIFrameProvidedAt(0) {
+      mLastIFrameProvidedAtMs(0) {
 }
 
 AAVCAssembler::~AAVCAssembler() {
@@ -52,17 +52,18 @@
 
     List<sp<ABuffer> >::iterator it = queue->begin();
 
-    uint16_t queueHeadSeqNum;
-    if (it != queue->end())
-        queueHeadSeqNum = (*it)->int32Data();
+    if (it == queue->end()) {
+        return nackCount /* 0 */;
+    }
 
-    // move to the packet after that RTCP:NACK sent.
-    while (it != queue->end()) {
+    uint16_t queueHeadSeqNum = (*it)->int32Data();
+
+    // move to the packet after which RTCP:NACK was sent.
+    for (; it != queue->end(); ++it) {
         int32_t seqNum = (*it)->int32Data();
-        if (seqNum < source->mHighestNackNumber)
-            it++;
-        else
+        if (seqNum >= source->mHighestNackNumber) {
             break;
+        }
     }
 
     int32_t nackStartAt = -1;
@@ -70,20 +71,21 @@
     while (it != queue->end()) {
         int32_t seqBeforeLast = (*it)->int32Data();
         // increase iterator.
-        if ((++it) == queue->end())
+        if ((++it) == queue->end()) {
             break;
+        }
         int32_t seqLast = (*it)->int32Data();
 
         if ((seqLast - seqBeforeLast) < 0) {
-            ALOGD("addNack : found end of seqNum from(%d) to(%d)", seqBeforeLast, seqLast);
+            ALOGD("addNack: found end of seqNum from(%d) to(%d)", seqBeforeLast, seqLast);
             source->mHighestNackNumber = 0;
         }
 
         // missed packet found
         if (seqLast > (seqBeforeLast + 1) &&
-            // we didn't send RTCP:NACK for this packet yet.
-            (seqLast - 1) > source->mHighestNackNumber) {
-            source->mHighestNackNumber = seqLast -1;
+                // we didn't send RTCP:NACK for this packet yet.
+                (seqLast - 1) > source->mHighestNackNumber) {
+            source->mHighestNackNumber = seqLast - 1;
             nackStartAt = seqBeforeLast + 1;
             break;
         }
@@ -92,10 +94,10 @@
 
     if (nackStartAt != -1) {
         nackCount = source->mHighestNackNumber - nackStartAt + 1;
-        ALOGD("addNack : nackCount=%d, nackFrom=%d, nackTo=%d", nackCount,
-            nackStartAt, source->mHighestNackNumber);
+        ALOGD("addNack: nackCount=%d, nackFrom=%d, nackTo=%d", nackCount,
+                nackStartAt, source->mHighestNackNumber);
 
-        uint16_t mask = (uint16_t)(0xffff) >> (16-nackCount+1);
+        uint16_t mask = (uint16_t)(0xffff) >> (16 - nackCount + 1);
         source->setSeqNumToNACK(nackStartAt, mask, queueHeadSeqNum);
     }
 
@@ -116,9 +118,10 @@
     int64_t startTime = source->mFirstSysTime / 1000;
     int64_t nowTime = ALooper::GetNowUs() / 1000;
     int64_t playedTime = nowTime - startTime;
-    int64_t playedTimeRtp = source->mFirstRtpTime +
-        (((uint32_t)playedTime) * (source->mClockRate / 1000));
-    const uint32_t jitterTime = (uint32_t)(source->mClockRate / ((float)1000 / (source->mJbTime)));
+    int64_t playedTimeRtp =
+        source->mFirstRtpTime + (((uint32_t)playedTime) * (source->mClockRate / 1000));
+    const uint32_t jitterTime =
+        (uint32_t)(source->mClockRate / ((float)1000 / (source->mJbTimeMs)));
     uint32_t expiredTimeInJb = rtpTime + jitterTime;
     bool isExpired = expiredTimeInJb <= (playedTimeRtp);
     bool isTooLate200 = expiredTimeInJb < (playedTimeRtp - jitterTime);
@@ -138,8 +141,9 @@
         return NOT_ENOUGH_DATA;
     }
 
-    if (isTooLate200)
+    if (isTooLate200) {
         ALOGW("=== WARNING === buffer arrived 200ms late. === WARNING === ");
+    }
 
     if (isTooLate300) {
         ALOGW("buffer arrived after 300ms ... \t Diff in Jb=%lld \t Seq# %d",
@@ -221,15 +225,18 @@
 }
 
 void AAVCAssembler::checkIFrameProvided(const sp<ABuffer> &buffer) {
+    if (buffer->size() == 0) {
+        return;
+    }
     const uint8_t *data = buffer->data();
     unsigned nalType = data[0] & 0x1f;
     if (nalType == 0x5) {
         mFirstIFrameProvided = true;
-        mLastIFrameProvidedAt = ALooper::GetNowUs() / 1000;
+        mLastIFrameProvidedAtMs = ALooper::GetNowUs() / 1000;
 
         uint32_t rtpTime;
         CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
-        ALOGD("got First I-frame to be decoded. rtpTime=%d, size=%zu", rtpTime, buffer->size());
+        ALOGD("got First I-frame to be decoded. rtpTime=%u, size=%zu", rtpTime, buffer->size());
     }
 }
 
@@ -352,16 +359,18 @@
             size_t size = buffer->size();
 
             if ((uint32_t)buffer->int32Data() != expectedSeqNo) {
-                ALOGV("sequence not complete, expected seqNo %d, got %d, nalType %d",
-                     expectedSeqNo, (uint32_t)buffer->int32Data(), nalType);
+                ALOGD("sequence not complete, expected seqNo %u, got %u, nalType %u",
+                     expectedSeqNo, (unsigned)buffer->int32Data(), nalType);
                 snapped = true;
 
-                if (!pFrame)
+                if (!pFrame) {
                     return WRONG_SEQUENCE_NUMBER;
+                }
             }
 
-            if (!snapped)
+            if (!snapped) {
                 connected++;
+            }
 
             uint32_t rtpTime;
             CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
@@ -383,7 +392,7 @@
             totalSize += size - 2;
             ++totalCount;
 
-            expectedSeqNo = buffer->int32Data() + 1;
+            expectedSeqNo = (uint32_t)buffer->int32Data() + 1;
 
             if (data[1] & 0x40) {
                 if (pFrame && !recycleUnit(startSeqNo, expectedSeqNo,
@@ -500,13 +509,13 @@
     msg->post();
 }
 
-int32_t AAVCAssembler::pickProperSeq(const Q *q, uint32_t jit, int64_t play) {
-    sp<ABuffer> buffer = *(q->begin());
+int32_t AAVCAssembler::pickProperSeq(const Queue *queue, uint32_t jit, int64_t play) {
+    sp<ABuffer> buffer = *(queue->begin());
     uint32_t rtpTime;
     int32_t nextSeqNo = buffer->int32Data();
 
-    Q::const_iterator it = q->begin();
-    while (it != q->end()) {
+    Queue::const_iterator it = queue->begin();
+    while (it != queue->end()) {
         CHECK((*it)->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
         // if pkt in time exists, that should be the next pivot
         if (rtpTime + jit >= play) {
@@ -531,17 +540,17 @@
     return isRecycle;
 }
 
-int32_t AAVCAssembler::deleteUnitUnderSeq(Q *q, uint32_t seq) {
-    int32_t initSize = q->size();
-    Q::iterator it = q->begin();
-    while (it != q->end()) {
+int32_t AAVCAssembler::deleteUnitUnderSeq(Queue *queue, uint32_t seq) {
+    int32_t initSize = queue->size();
+    Queue::iterator it = queue->begin();
+    while (it != queue->end()) {
         if ((uint32_t)(*it)->int32Data() >= seq) {
             break;
         }
         it++;
     }
-    q->erase(q->begin(), it);
-    return initSize - q->size();
+    queue->erase(queue->begin(), it);
+    return initSize - queue->size();
 }
 
 inline void AAVCAssembler::printNowTimeUs(int64_t start, int64_t now, int64_t play) {
@@ -558,10 +567,10 @@
         const sp<ARTPSource> &source) {
     AssemblyStatus status = addNALUnit(source);
     if (status == MALFORMED_PACKET) {
-        uint64_t timeAfterLastIFrame = (ALooper::GetNowUs() / 1000) - mLastIFrameProvidedAt;
-        if (timeAfterLastIFrame > 1000) {
-            ALOGV("request FIR to get a new I-Frame, time after "
-                    "last I-Frame in miils %llu", (unsigned long long)timeAfterLastIFrame);
+        uint64_t msecsSinceLastIFrame = (ALooper::GetNowUs() / 1000) - mLastIFrameProvidedAtMs;
+        if (msecsSinceLastIFrame > 1000) {
+            ALOGV("request FIR to get a new I-Frame, time since "
+                    "last I-Frame %llu ms", (unsigned long long)msecsSinceLastIFrame);
             source->onIssueFIRByAssembler();
         }
     }
@@ -570,7 +579,7 @@
 
 void AAVCAssembler::packetLost() {
     CHECK(mNextExpectedSeqNoValid);
-    ALOGD("packetLost (expected %d)", mNextExpectedSeqNo);
+    ALOGD("packetLost (expected %u)", mNextExpectedSeqNo);
     ++mNextExpectedSeqNo;
 }
 
diff --git a/media/libstagefright/rtsp/AAVCAssembler.h b/media/libstagefright/rtsp/AAVCAssembler.h
index ac2c9a0..913a868 100644
--- a/media/libstagefright/rtsp/AAVCAssembler.h
+++ b/media/libstagefright/rtsp/AAVCAssembler.h
@@ -25,14 +25,13 @@
 
 namespace android {
 
-using Q = List<sp<ABuffer> >;
-
 struct ABuffer;
 struct AMessage;
 
 struct AAVCAssembler : public ARTPAssembler {
     explicit AAVCAssembler(const sp<AMessage> &notify);
 
+    typedef List<sp<ABuffer> > Queue;
 protected:
     virtual ~AAVCAssembler();
 
@@ -48,7 +47,7 @@
     uint32_t mNextExpectedSeqNo;
     bool mAccessUnitDamaged;
     bool mFirstIFrameProvided;
-    uint64_t mLastIFrameProvidedAt;
+    uint64_t mLastIFrameProvidedAtMs;
     List<sp<ABuffer> > mNALUnits;
 
     int32_t addNack(const sp<ARTPSource> &source);
@@ -60,10 +59,10 @@
 
     void submitAccessUnit();
 
-    int32_t pickProperSeq(const Q *q, uint32_t jit, int64_t play);
-    bool recycleUnit(uint32_t start, uint32_t end, uint32_t conneceted,
+    int32_t pickProperSeq(const Queue *q, uint32_t jit, int64_t play);
+    bool recycleUnit(uint32_t start, uint32_t end, uint32_t connected,
             size_t avail, float goodRatio);
-    int32_t deleteUnitUnderSeq(Q *q, uint32_t seq);
+    int32_t deleteUnitUnderSeq(Queue *q, uint32_t seq);
     void printNowTimeUs(int64_t start, int64_t now, int64_t play);
     void printRTPTime(uint32_t rtp, int64_t play, uint32_t exp, bool isExp);
 
diff --git a/media/libstagefright/rtsp/AHEVCAssembler.cpp b/media/libstagefright/rtsp/AHEVCAssembler.cpp
index f652cc1..148a0ba 100644
--- a/media/libstagefright/rtsp/AHEVCAssembler.cpp
+++ b/media/libstagefright/rtsp/AHEVCAssembler.cpp
@@ -49,7 +49,7 @@
       mNextExpectedSeqNo(0),
       mAccessUnitDamaged(false),
       mFirstIFrameProvided(false),
-      mLastIFrameProvidedAt(0),
+      mLastIFrameProvidedAtMs(0),
       mWidth(0),
       mHeight(0) {
 
@@ -66,17 +66,18 @@
 
     List<sp<ABuffer> >::iterator it = queue->begin();
 
-    uint16_t queueHeadSeqNum;
-    if (it != queue->end())
-        queueHeadSeqNum = (*it)->int32Data();
+    if (it == queue->end()) {
+        return nackCount /* 0 */;
+    }
 
-    // move to the packet after that RTCP:NACK sent.
-    while (it != queue->end()) {
+    uint16_t queueHeadSeqNum = (*it)->int32Data();
+
+    // move to the packet after which RTCP:NACK was sent.
+    for (; it != queue->end(); ++it) {
         int32_t seqNum = (*it)->int32Data();
-        if (seqNum < source->mHighestNackNumber)
-            it++;
-        else
+        if (seqNum >= source->mHighestNackNumber) {
             break;
+        }
     }
 
     int32_t nackStartAt = -1;
@@ -84,12 +85,14 @@
     while (it != queue->end()) {
         int32_t seqBeforeLast = (*it)->int32Data();
         // increase iterator.
-        if ((++it) == queue->end())
+        if ((++it) == queue->end()) {
             break;
+        }
+
         int32_t seqLast = (*it)->int32Data();
 
         if ((seqLast - seqBeforeLast) < 0) {
-            ALOGD("addNack : found end of seqNum from(%d) to(%d)", seqBeforeLast, seqLast);
+            ALOGD("addNack: found end of seqNum from(%d) to(%d)", seqBeforeLast, seqLast);
             source->mHighestNackNumber = 0;
         }
 
@@ -106,10 +109,10 @@
 
     if (nackStartAt != -1) {
         nackCount = source->mHighestNackNumber - nackStartAt + 1;
-        ALOGD("addNack : nackCount=%d, nackFrom=%d, nackTo=%d", nackCount,
+        ALOGD("addNack: nackCount=%d, nackFrom=%d, nackTo=%d", nackCount,
             nackStartAt, source->mHighestNackNumber);
 
-        uint16_t mask = (uint16_t)(0xffff) >> (16-nackCount+1);
+        uint16_t mask = (uint16_t)(0xffff) >> (16 - nackCount + 1);
         source->setSeqNumToNACK(nackStartAt, mask, queueHeadSeqNum);
     }
 
@@ -133,7 +136,7 @@
     int64_t playedTime = nowTime - startTime;
     int64_t playedTimeRtp = source->mFirstRtpTime +
         (((uint32_t)playedTime) * (source->mClockRate / 1000));
-    const uint32_t jitterTime = (uint32_t)(source->mClockRate / ((float)1000 / (source->mJbTime)));
+    const uint32_t jitterTime = (uint32_t)(source->mClockRate / ((float)1000 / (source->mJbTimeMs)));
     uint32_t expiredTimeInJb = rtpTime + jitterTime;
     bool isExpired = expiredTimeInJb <= (playedTimeRtp);
     bool isTooLate200 = expiredTimeInJb < (playedTimeRtp - jitterTime);
@@ -153,8 +156,9 @@
         return NOT_ENOUGH_DATA;
     }
 
-    if (isTooLate200)
+    if (isTooLate200) {
         ALOGW("=== WARNING === buffer arrived 200ms late. === WARNING === ");
+    }
 
     if (isTooLate300) {
         ALOGW("buffer arrived after 300ms ... \t Diff in Jb=%lld \t Seq# %d",
@@ -237,6 +241,9 @@
 }
 
 void AHEVCAssembler::checkSpsUpdated(const sp<ABuffer> &buffer) {
+    if (buffer->size() == 0) {
+        return;
+    }
     const uint8_t *data = buffer->data();
     HevcParameterSets paramSets;
     unsigned nalType = (data[0] >> 1) & H265_NALU_MASK;
@@ -254,10 +261,13 @@
 }
 
 void AHEVCAssembler::checkIFrameProvided(const sp<ABuffer> &buffer) {
+    if (buffer->size() == 0) {
+        return;
+    }
     const uint8_t *data = buffer->data();
     unsigned nalType = (data[0] >> 1) & H265_NALU_MASK;
     if (nalType > 0x0F && nalType < 0x18) {
-        mLastIFrameProvidedAt = ALooper::GetNowUs() / 1000;
+        mLastIFrameProvidedAtMs = ALooper::GetNowUs() / 1000;
         if (!mFirstIFrameProvided) {
             mFirstIFrameProvided = true;
             uint32_t rtpTime;
@@ -268,12 +278,12 @@
 }
 
 bool AHEVCAssembler::dropFramesUntilIframe(const sp<ABuffer> &buffer) {
+    if (buffer->size() == 0) {
+        return false;
+    }
     const uint8_t *data = buffer->data();
     unsigned nalType = (data[0] >> 1) & H265_NALU_MASK;
-    if (!mFirstIFrameProvided && nalType < 0x10)
-        return true;
-
-    return false;
+    return !mFirstIFrameProvided && nalType < 0x10;
 }
 
 void AHEVCAssembler::addSingleNALUnit(const sp<ABuffer> &buffer) {
@@ -419,16 +429,18 @@
             size_t size = buffer->size();
 
             if ((uint32_t)buffer->int32Data() != expectedSeqNo) {
-                ALOGV("sequence not complete, expected seqNo %d, got %d, nalType %d",
+                ALOGV("sequence not complete, expected seqNo %u, got %u, nalType %u",
                      expectedSeqNo, (uint32_t)buffer->int32Data(), nalType);
                 snapped = true;
 
-                if (!pFrame)
+                if (!pFrame) {
                     return WRONG_SEQUENCE_NUMBER;
+                }
             }
 
-            if (!snapped)
+            if (!snapped) {
                 connected++;
+            }
 
             uint32_t rtpTime;
             CHECK(buffer->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
@@ -450,7 +462,7 @@
             totalSize += size - 3;
             ++totalCount;
 
-            expectedSeqNo = buffer->int32Data() + 1;
+            expectedSeqNo = (uint32_t)buffer->int32Data() + 1;
 
             if (data[2] & 0x40) {
                 if (pFrame && !recycleUnit(startSeqNo, expectedSeqNo,
@@ -565,13 +577,13 @@
     msg->post();
 }
 
-int32_t AHEVCAssembler::pickProperSeq(const Q *q, uint32_t jit, int64_t play) {
-    sp<ABuffer> buffer = *(q->begin());
+int32_t AHEVCAssembler::pickProperSeq(const Queue *queue, uint32_t jit, int64_t play) {
+    sp<ABuffer> buffer = *(queue->begin());
     uint32_t rtpTime;
     int32_t nextSeqNo = buffer->int32Data();
 
-    Q::const_iterator it = q->begin();
-    while (it != q->end()) {
+    Queue::const_iterator it = queue->begin();
+    while (it != queue->end()) {
         CHECK((*it)->meta()->findInt32("rtp-time", (int32_t *)&rtpTime));
         // if pkt in time exists, that should be the next pivot
         if (rtpTime + jit >= play) {
@@ -596,17 +608,17 @@
     return isRecycle;
 }
 
-int32_t AHEVCAssembler::deleteUnitUnderSeq(Q *q, uint32_t seq) {
-    int32_t initSize = q->size();
-    Q::iterator it = q->begin();
-    while (it != q->end()) {
+int32_t AHEVCAssembler::deleteUnitUnderSeq(Queue *queue, uint32_t seq) {
+    int32_t initSize = queue->size();
+    Queue::iterator it = queue->begin();
+    while (it != queue->end()) {
         if ((uint32_t)(*it)->int32Data() >= seq) {
             break;
         }
         it++;
     }
-    q->erase(q->begin(), it);
-    return initSize - q->size();
+    queue->erase(queue->begin(), it);
+    return initSize - queue->size();
 }
 
 inline void AHEVCAssembler::printNowTimeUs(int64_t start, int64_t now, int64_t play) {
@@ -624,10 +636,10 @@
         const sp<ARTPSource> &source) {
     AssemblyStatus status = addNALUnit(source);
     if (status == MALFORMED_PACKET) {
-        uint64_t timeAfterLastIFrame = (ALooper::GetNowUs() / 1000) - mLastIFrameProvidedAt;
-        if (timeAfterLastIFrame > 1000) {
+        uint64_t msecsSinceLastIFrame = (ALooper::GetNowUs() / 1000) - mLastIFrameProvidedAtMs;
+        if (msecsSinceLastIFrame > 1000) {
             ALOGV("request FIR to get a new I-Frame, time after "
-                    "last I-Frame in miils %llu", (unsigned long long)timeAfterLastIFrame);
+                    "last I-Frame in %llu ms", (unsigned long long)msecsSinceLastIFrame);
             source->onIssueFIRByAssembler();
         }
     }
@@ -636,7 +648,7 @@
 
 void AHEVCAssembler::packetLost() {
     CHECK(mNextExpectedSeqNoValid);
-    ALOGD("packetLost (expected %d)", mNextExpectedSeqNo);
+    ALOGD("packetLost (expected %u)", mNextExpectedSeqNo);
 
     ++mNextExpectedSeqNo;
 }
diff --git a/media/libstagefright/rtsp/AHEVCAssembler.h b/media/libstagefright/rtsp/AHEVCAssembler.h
index 25e45b6..16fc1c8 100644
--- a/media/libstagefright/rtsp/AHEVCAssembler.h
+++ b/media/libstagefright/rtsp/AHEVCAssembler.h
@@ -25,14 +25,14 @@
 
 namespace android {
 
-using Q = List<sp<ABuffer> >;
-
 struct ABuffer;
 struct AMessage;
 
 struct AHEVCAssembler : public ARTPAssembler {
     AHEVCAssembler(const sp<AMessage> &notify);
 
+    typedef List<sp<ABuffer> > Queue;
+
 protected:
     virtual ~AHEVCAssembler();
 
@@ -48,7 +48,7 @@
     uint32_t mNextExpectedSeqNo;
     bool mAccessUnitDamaged;
     bool mFirstIFrameProvided;
-    uint64_t mLastIFrameProvidedAt;
+    uint64_t mLastIFrameProvidedAtMs;
     int32_t mWidth;
     int32_t mHeight;
     List<sp<ABuffer> > mNALUnits;
@@ -64,10 +64,10 @@
 
     void submitAccessUnit();
 
-    int32_t pickProperSeq(const Q *q, uint32_t jit, int64_t play);
+    int32_t pickProperSeq(const Queue *queue, uint32_t jit, int64_t play);
     bool recycleUnit(uint32_t start, uint32_t end, uint32_t conneceted,
              size_t avail, float goodRatio);
-    int32_t deleteUnitUnderSeq(Q *q, uint32_t seq);
+    int32_t deleteUnitUnderSeq(Queue *queue, uint32_t seq);
     void printNowTimeUs(int64_t start, int64_t now, int64_t play);
     void printRTPTime(uint32_t rtp, int64_t play, uint32_t exp, bool isExp);
 
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp
index 9c374ac..07f9dd3 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -80,7 +80,7 @@
       mLastReceiverReportTimeUs(-1),
       mLastBitrateReportTimeUs(-1),
       mTargetBitrate(-1),
-      mJbTime(300) {
+      mJbTimeMs(300) {
 }
 
 ARTPConnection::~ARTPConnection() {
@@ -551,8 +551,9 @@
         (!receiveRTP && s->mNumRTCPPacketsReceived == 0)
             ? sizeSockSt : 0;
 
-    if (mFlags & kViLTEConnection)
+    if (mFlags & kViLTEConnection) {
         remoteAddrLen = 0;
+    }
 
     ssize_t nbytes;
     do {
@@ -1039,11 +1040,12 @@
         source = new ARTPSource(
                 srcId, info->mSessionDesc, info->mIndex, info->mNotifyMsg);
 
-        if (mFlags & kViLTEConnection)
+        if (mFlags & kViLTEConnection) {
             source->setPeriodicFIR(false);
+        }
 
         source->setSelfID(mSelfID);
-        source->setJbTime(mJbTime > 0 ? mJbTime : 300);
+        source->setJbTime(mJbTimeMs > 0 ? mJbTimeMs : 300);
         info->mSources.add(srcId, source);
     } else {
         source = info->mSources.valueAt(index);
@@ -1063,8 +1065,8 @@
     mSelfID = selfID;
 }
 
-void ARTPConnection::setJbTime(const uint32_t jbTime) {
-    mJbTime = jbTime;
+void ARTPConnection::setJbTime(const uint32_t jbTimeMs) {
+    mJbTimeMs = jbTimeMs;
 }
 
 void ARTPConnection::setTargetBitrate(int32_t targetBitrate) {
diff --git a/media/libstagefright/rtsp/ARTPConnection.h b/media/libstagefright/rtsp/ARTPConnection.h
index 25d03f5..7c8218f 100644
--- a/media/libstagefright/rtsp/ARTPConnection.h
+++ b/media/libstagefright/rtsp/ARTPConnection.h
@@ -46,7 +46,7 @@
     void injectPacket(int index, const sp<ABuffer> &buffer);
 
     void setSelfID(const uint32_t selfID);
-    void setJbTime(const uint32_t jbTime);
+    void setJbTime(const uint32_t jbTimeMs);
     void setTargetBitrate(int32_t targetBitrate);
 
     // Creates a pair of UDP datagram sockets bound to adjacent ports
@@ -88,7 +88,7 @@
     int32_t mSelfID;
     int32_t mTargetBitrate;
 
-    uint32_t mJbTime;
+    uint32_t mJbTimeMs;
 
     int32_t mCumulativeBytes;
 
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index 361773e..6303fc4 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -46,7 +46,7 @@
       mFirstRtpTime(0),
       mFirstSysTime(0),
       mClockRate(0),
-      mJbTime(300), // default jitter buffer time is 300ms.
+      mJbTimeMs(300), // default jitter buffer time is 300ms.
       mFirstSsrc(0),
       mHighestNackNumber(0),
       mID(id),
@@ -217,22 +217,23 @@
 
     bool send = false;
     int64_t nowUs = ALooper::GetNowUs();
-    int64_t timeAfterLastFIR = nowUs - mLastFIRRequestUs;
+    int64_t usecsSinceLastFIR = nowUs - mLastFIRRequestUs;
     if (mLastFIRRequestUs < 0) {
         // A first FIR, just send it.
         send = true;
-    }  else if (mIssueFIRByAssembler && (timeAfterLastFIR > 1000000)) {
+    }  else if (mIssueFIRByAssembler && (usecsSinceLastFIR > 1000000)) {
         // A FIR issued by Assembler.
         // Send it if last FIR is not sent within a sec.
         send = true;
-    } else if (mIssueFIRRequests && (timeAfterLastFIR > 5000000)) {
+    } else if (mIssueFIRRequests && (usecsSinceLastFIR > 5000000)) {
         // A FIR issued periodically reagardless packet loss.
         // Send it if last FIR is not sent within 5 secs.
         send = true;
     }
 
-    if (!send)
+    if (!send) {
         return;
+    }
 
     mLastFIRRequestUs = nowUs;
 
@@ -246,7 +247,7 @@
     data[0] = 0x80 | 4;
     data[1] = 206;  // PSFB
     data[2] = 0;
-    data[3] = 4;
+    data[3] = 4;    // total (4+1) * sizeof(int32_t) = 20 bytes
     data[4] = kSourceID >> 24;
     data[5] = (kSourceID >> 16) & 0xff;
     data[6] = (kSourceID >> 8) & 0xff;
@@ -270,8 +271,7 @@
 
     buffer->setRange(buffer->offset(), buffer->size() + (data[3] + 1) * sizeof(int32_t));
 
-    if (mIssueFIRByAssembler)
-        mIssueFIRByAssembler = false;
+    mIssueFIRByAssembler = false;
 
     ALOGV("Added FIR request.");
 }
@@ -303,7 +303,7 @@
     data[0] = 0x80 | 1;
     data[1] = 201;  // RR
     data[2] = 0;
-    data[3] = 7;
+    data[3] = 7;    // total (7+1) * sizeof(int32_t) = 32 bytes
     data[4] = kSourceID >> 24;
     data[5] = (kSourceID >> 16) & 0xff;
     data[6] = (kSourceID >> 8) & 0xff;
@@ -358,8 +358,9 @@
         return;
     }
 
-    if (targetBitrate <= 0)
+    if (targetBitrate <= 0) {
         return;
+    }
 
     uint8_t *data = buffer->data() + buffer->size();
 
@@ -397,8 +398,9 @@
 }
 
 int ARTPSource::addNACK(const sp<ABuffer> &buffer) {
-    if (buffer->size() + 52 > buffer->capacity()) {
-        ALOGW("RTCP buffer too small to accomodate NACK.");
+    constexpr size_t kMaxFCIs = 10; // max number of FCIs
+    if (buffer->size() + (3 + kMaxFCIs) * sizeof(int32_t) > buffer->capacity()) {
+        ALOGW("RTCP buffer too small to accommodate NACK.");
         return -1;
     }
 
@@ -420,11 +422,11 @@
 
     List<int> list;
     List<int>::iterator it;
-    getSeqNumToNACK(list, 10);
-    int cnt = 0;
+    getSeqNumToNACK(list, kMaxFCIs);
+    size_t cnt = 0;
 
-    int* FCI = (int*)(data + 12);
-    for (it = list.begin() ; it != list.end() ; it++) {
+    int *FCI = (int *)(data + 12);
+    for (it = list.begin(); it != list.end() && cnt < kMaxFCIs; it++) {
         *(FCI + cnt) = *it;
         cnt++;
     }
@@ -441,16 +443,13 @@
     int cnt = 0;
 
     std::map<uint16_t, infoNACK>::iterator it;
-    for(it = mNACKMap.begin() ; it != mNACKMap.end() ; it++) {
-        infoNACK& info_it = it->second;
-        // list full
-        if (cnt == size)
-            break;
+    for(it = mNACKMap.begin(); it != mNACKMap.end() && cnt < size; it++) {
+        infoNACK &info_it = it->second;
         if (info_it.needToNACK) {
             info_it.needToNACK = false;
             // switch LSB to MSB for sending N/W
             uint32_t FCI;
-            uint8_t* temp = (uint8_t*)&FCI;
+            uint8_t *temp = (uint8_t *)&FCI;
             temp[0] = (info_it.seqNum >> 8) & 0xff;
             temp[1] = (info_it.seqNum)      & 0xff;
             temp[2] = (info_it.mask >> 8)   & 0xff;
@@ -471,9 +470,9 @@
 
     it = mNACKMap.find(seqNum);
     if (it != mNACKMap.end()) {
-        infoNACK& info_it = it->second;
+        infoNACK &info_it = it->second;
         // renew if (mask or head seq) is changed
-        if((info_it.mask != mask) || (info_it.nowJitterHeadSeqNum != nowJitterHeadSeqNum)) {
+        if ((info_it.mask != mask) || (info_it.nowJitterHeadSeqNum != nowJitterHeadSeqNum)) {
             info_it = info;
         }
     } else {
@@ -482,16 +481,16 @@
 
     // delete all NACK far from current Jitter's first sequence number
     it = mNACKMap.begin();
-    while(it != mNACKMap.end()) {
-        infoNACK& info_it = it->second;
+    while (it != mNACKMap.end()) {
+        infoNACK &info_it = it->second;
 
         int diff = nowJitterHeadSeqNum - info_it.nowJitterHeadSeqNum;
         if (diff > 100) {
             ALOGV("Delete %d pkt from NACK map ", info_it.seqNum);
             it = mNACKMap.erase(it);
-        }
-        else
+        } else {
             it++;
+        }
     }
 
 }
@@ -499,12 +498,13 @@
 uint32_t ARTPSource::getSelfID() {
     return kSourceID;
 }
+
 void ARTPSource::setSelfID(const uint32_t selfID) {
     kSourceID = selfID;
 }
 
-void ARTPSource::setJbTime(const uint32_t jbTime) {
-    mJbTime = jbTime;
+void ARTPSource::setJbTime(const uint32_t jbTimeMs) {
+    mJbTimeMs = jbTimeMs;
 }
 
 void ARTPSource::setPeriodicFIR(bool enable) {
diff --git a/media/libstagefright/rtsp/ARTPSource.h b/media/libstagefright/rtsp/ARTPSource.h
index 9d4ccf2..ea683a0 100644
--- a/media/libstagefright/rtsp/ARTPSource.h
+++ b/media/libstagefright/rtsp/ARTPSource.h
@@ -53,7 +53,7 @@
     void setSeqNumToNACK(uint16_t seqNum, uint16_t mask, uint16_t nowJitterHeadSeqNum);
     uint32_t getSelfID();
     void setSelfID(const uint32_t selfID);
-    void setJbTime(const uint32_t jbTime);
+    void setJbTime(const uint32_t jbTimeMs);
     void setPeriodicFIR(bool enable);
     void notifyPktInfo(int32_t bitrate, int64_t time);
     // FIR needs to be sent by missing packet or broken video image.
@@ -66,7 +66,7 @@
     int64_t mFirstSysTime;
     int32_t mClockRate;
 
-    uint32_t mJbTime;
+    uint32_t mJbTimeMs;
     int32_t mFirstSsrc;
     int32_t mHighestNackNumber;
 
diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp
index 02c9d48..76afb04 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -303,15 +303,15 @@
 }
 
 static const uint8_t SPCSize = 4;      // Start Prefix Code Size
-static const uint8_t startPrefixCode[SPCSize] = {0,0,0,1};
-static const uint8_t spcKMPidx[SPCSize] = {0,0,2,0};
+static const uint8_t startPrefixCode[SPCSize] = {0, 0, 0, 1};
+static const uint8_t spcKMPidx[SPCSize] = {0, 0, 2, 0};
 static void SpsPpsParser(MediaBufferBase *buffer,
-    MediaBufferBase **spsBuffer, MediaBufferBase **ppsBuffer) {
+        MediaBufferBase **spsBuffer, MediaBufferBase **ppsBuffer) {
 
-    while (true) {
-        const uint8_t* NALPtr = (const uint8_t *)buffer->data() + buffer->range_offset();
+    while (buffer->range_length() > 0) {
+        const uint8_t *NALPtr = (const uint8_t *)buffer->data() + buffer->range_offset();
 
-        MediaBufferBase** targetPtr = NULL;
+        MediaBufferBase **targetPtr = NULL;
         if ((*NALPtr & H264_NALU_MASK) == H264_NALU_SPS) {
             targetPtr = spsBuffer;
         } else if ((*NALPtr & H264_NALU_MASK) == H264_NALU_PPS) {
@@ -322,12 +322,13 @@
         ALOGV("SPS(7) or PPS(8) found. Type %d", *NALPtr & H264_NALU_MASK);
 
         uint32_t bufferSize = buffer->range_length();
-        MediaBufferBase*& target = *targetPtr;
+        MediaBufferBase *&target = *targetPtr;
         uint32_t i = 0, j = 0;
         bool isBoundFound = false;
-        for (i = 0; i < bufferSize ; i++) {
-            while (j > 0 && NALPtr[i] != startPrefixCode[j])
-                j = spcKMPidx[j-1];
+        for (i = 0; i < bufferSize; i++) {
+            while (j > 0 && NALPtr[i] != startPrefixCode[j]) {
+                j = spcKMPidx[j - 1];
+            }
             if (NALPtr[i] == startPrefixCode[j]) {
                 j++;
                 if (j == SPCSize) {
@@ -338,8 +339,11 @@
         }
 
         uint32_t targetSize;
-        if (target != NULL)
+        if (target != NULL) {
             target->release();
+        }
+        // note that targetSize is never 0 as the first byte is never part
+        // of a start prefix
         if (isBoundFound) {
             targetSize = i - SPCSize + 1;
             target = MediaBufferBase::Create(targetSize);
@@ -361,13 +365,13 @@
 }
 
 static void VpsSpsPpsParser(MediaBufferBase *buffer,
-    MediaBufferBase **vpsBuffer, MediaBufferBase **spsBuffer, MediaBufferBase **ppsBuffer) {
+        MediaBufferBase **vpsBuffer, MediaBufferBase **spsBuffer, MediaBufferBase **ppsBuffer) {
 
-    while (true) {
-        const uint8_t* NALPtr = (const uint8_t *)buffer->data() + buffer->range_offset();
+    while (buffer->range_length() > 0) {
+        const uint8_t *NALPtr = (const uint8_t *)buffer->data() + buffer->range_offset();
         uint8_t nalType = ((*NALPtr) >> 1) & H265_NALU_MASK;
 
-        MediaBufferBase** targetPtr = NULL;
+        MediaBufferBase **targetPtr = NULL;
         if (nalType == H265_NALU_VPS) {
             targetPtr = vpsBuffer;
         } else if (nalType == H265_NALU_SPS) {
@@ -379,32 +383,44 @@
         }
         ALOGV("VPS(32) SPS(33) or PPS(34) found. Type %d", nalType);
 
-        uint32_t targetSize = buffer->range_length();
-        MediaBufferBase*& target = *targetPtr;
-        uint32_t j;
+        uint32_t bufferSize = buffer->range_length();
+        MediaBufferBase *&target = *targetPtr;
+        uint32_t i = 0, j = 0;
         bool isBoundFound = false;
-        for (j = 0; j < targetSize - SPCSize ; j++) {
-            if (!memcmp(NALPtr + j, startPrefixCode, SPCSize)) {
-                isBoundFound = true;
-                break;
+        for (i = 0; i < bufferSize; i++) {
+            while (j > 0 && NALPtr[i] != startPrefixCode[j]) {
+                j = spcKMPidx[j - 1];
+            }
+            if (NALPtr[i] == startPrefixCode[j]) {
+                j++;
+                if (j == SPCSize) {
+                    isBoundFound = true;
+                    break;
+                }
             }
         }
 
-        if (target != NULL)
+        if (target != NULL) {
             target->release();
+        }
+        uint32_t targetSize;
+        // note that targetSize is never 0 as the first byte is never part
+        // of a start prefix
         if (isBoundFound) {
+            targetSize = i - SPCSize + 1;
             target = MediaBufferBase::Create(j);
             memcpy(target->data(),
                    (const uint8_t *)buffer->data() + buffer->range_offset(),
                    j);
-            buffer->set_range(buffer->range_offset() + j + SPCSize,
-                              buffer->range_length() - j - SPCSize);
+            buffer->set_range(buffer->range_offset() + targetSize + SPCSize,
+                              buffer->range_length() - targetSize - SPCSize);
         } else {
+            targetSize = bufferSize;
             target = MediaBufferBase::Create(targetSize);
             memcpy(target->data(),
                    (const uint8_t *)buffer->data() + buffer->range_offset(),
                    targetSize);
-            buffer->set_range(buffer->range_offset() + targetSize, 0);
+            buffer->set_range(buffer->range_offset() + bufferSize, 0);
             return;
         }
     }
@@ -519,13 +535,15 @@
         if (mMode == H264) {
             StripStartcode(mediaBuf);
             SpsPpsParser(mediaBuf, &mSPSBuf, &mPPSBuf);
-            if (mediaBuf->range_length() > 0)
+            if (mediaBuf->range_length() > 0) {
                 sendAVCData(mediaBuf);
+            }
         } else if (mMode == H265) {
             StripStartcode(mediaBuf);
             VpsSpsPpsParser(mediaBuf, &mVPSBuf, &mSPSBuf, &mPPSBuf);
-            if (mediaBuf->range_length() > 0)
+            if (mediaBuf->range_length() > 0) {
                 sendHEVCData(mediaBuf);
+            }
         } else if (mMode == H263) {
             sendH263Data(mediaBuf);
         } else if (mMode == AMR_NB || mMode == AMR_WB) {
@@ -882,12 +900,13 @@
 }
 
 void ARTPWriter::sendSPSPPSIfIFrame(MediaBufferBase *mediaBuf, int64_t timeUs) {
+    CHECK(mediaBuf->range_length() > 0);
     const uint8_t *mediaData =
         (const uint8_t *)mediaBuf->data() + mediaBuf->range_offset();
 
-    if (mediaBuf->range_length() == 0
-            || (mediaData[0] & H264_NALU_MASK) != H264_NALU_IFRAME)
+    if ((mediaData[0] & H264_NALU_MASK) != H264_NALU_IFRAME) {
         return;
+    }
 
     if (mSPSBuf != NULL) {
         mSPSBuf->meta_data().setInt64(kKeyTime, timeUs);
@@ -903,11 +922,14 @@
 }
 
 void ARTPWriter::sendVPSSPSPPSIfIFrame(MediaBufferBase *mediaBuf, int64_t timeUs) {
+    CHECK(mediaBuf->range_length() > 0);
     const uint8_t *mediaData =
         (const uint8_t *)mediaBuf->data() + mediaBuf->range_offset();
+
     int nalType = ((mediaData[0] >> 1) & H265_NALU_MASK);
-    if (!(nalType >= 16 && nalType <= 21)/*H265_NALU_IFRAME*/)
+    if (!(nalType >= 16 && nalType <= 21) /*H265_NALU_IFRAME*/) {
         return;
+    }
 
     if (mVPSBuf != NULL) {
         mVPSBuf->meta_data().setInt64(kKeyTime, timeUs);
@@ -939,6 +961,7 @@
 
     uint32_t rtpTime = mRTPTimeBase + (timeUs * 9 / 100ll);
 
+    CHECK(mediaBuf->range_length() > 0);
     const uint8_t *mediaData =
         (const uint8_t *)mediaBuf->data() + mediaBuf->range_offset();
 
@@ -956,10 +979,11 @@
         // The data fits into a single packet
         uint8_t *data = buffer->data();
         data[0] = 0x80;
-        if (isNonVCL)
+        if (isNonVCL) {
             data[1] = mPayloadType;  // Marker bit should not be set in case of Non-VCL
-        else
+        } else {
             data[1] = (1 << 7) | mPayloadType;  // M-bit
+        }
         data[2] = (mSeqNo >> 8) & 0xff;
         data[3] = mSeqNo & 0xff;
         data[4] = rtpTime >> 24;
@@ -1074,6 +1098,7 @@
 
     uint32_t rtpTime = mRTPTimeBase + (timeUs * 9 / 100LL);
 
+    CHECK(mediaBuf->range_length() > 0);
     const uint8_t *mediaData =
         (const uint8_t *)mediaBuf->data() + mediaBuf->range_offset();
 
@@ -1523,7 +1548,7 @@
 // TODO : Develop more advanced moderator based on AS & TMMBR value
 void ARTPWriter::ModerateInstantTraffic(uint32_t samplePeriod, uint32_t limitBytes) {
     unsigned int bytes =  mTrafficRec->readBytesForLastPeriod(samplePeriod);
-    if(bytes > limitBytes) {
+    if (bytes > limitBytes) {
         ALOGI("Nuclear moderator. #seq = %d \t\t %d bits / 10ms",
               mSeqNo, bytes * 8);
         usleep(4000);
diff --git a/media/libstagefright/rtsp/TrafficRecorder.h b/media/libstagefright/rtsp/TrafficRecorder.h
index 4796560..f8e7c03 100644
--- a/media/libstagefright/rtsp/TrafficRecorder.h
+++ b/media/libstagefright/rtsp/TrafficRecorder.h
@@ -18,7 +18,7 @@
 
 #define A_TRAFFIC_RECORDER_H_
 
-#include <utils/Log.h>
+#include <android-base/logging.h>
 #include <utils/RefBase.h>
 
 namespace android {
@@ -27,12 +27,12 @@
 template <class Time, class Bytes>
 class TrafficRecorder : public RefBase {
 private:
-    int mSize;
-    int mSizeMask;
-    Time* mTimeArray = NULL;
-    Bytes* mBytesArray = NULL;
-    int mHeadIdx = 0;
-    int mTailIdx = 0;
+    size_t mSize;
+    size_t mSizeMask;
+    Time *mTimeArray = NULL;
+    Bytes *mBytesArray = NULL;
+    size_t mHeadIdx = 0;
+    size_t mTailIdx = 0;
 
     Time mClock = 0;
     Time mLastTimeOfPrint = 0;
@@ -59,29 +59,26 @@
 
 template <class Time, class Bytes>
 TrafficRecorder<Time, Bytes>::TrafficRecorder(size_t size) {
-    int exp;
-    for (exp = 0 ; exp < 32 ; exp++) {
-        if (size <= (1 << exp))
+    size_t exp;
+    for (exp = 0; exp < 32; exp++) {
+        if (size <= (1ul << exp)) {
             break;
+        }
     }
-    mSize = (1 << exp);         // size = 2^exp
+    mSize = (1ul << exp);         // size = 2^exp
     mSizeMask = mSize - 1;
 
-    ALOGV("TrafficRecorder Init size %u", mSize);
-    if (mTimeArray != NULL)
-        free(mTimeArray);
-    if (mBytesArray != NULL)
-        free(mBytesArray);
-    mTimeArray = (Time*)malloc(sizeof(Time) * mSize);
-    mBytesArray = (Bytes*)malloc(sizeof(Bytes) * mSize);
+    LOG(VERBOSE) << "TrafficRecorder Init size " << mSize;
+    mTimeArray = new Time[mSize];
+    mBytesArray = new Bytes[mSize];
 
     init();
 }
 
 template <class Time, class Bytes>
 TrafficRecorder<Time, Bytes>::~TrafficRecorder() {
-    free(mTimeArray);
-    free(mBytesArray);
+    delete[] mTimeArray;
+    delete[] mBytesArray;
 }
 
 template <class Time, class Bytes>
@@ -101,14 +98,14 @@
 Bytes TrafficRecorder<Time, Bytes>::readBytesForLastPeriod(Time period) {
     Bytes bytes = 0;
 
-    int i = mTailIdx;
-    while(i != mHeadIdx) {
-        ALOGV("READ %d time %d \t EndOfPeriod %d", i, mTimeArray[i], mClock - period);
+    size_t i = mTailIdx;
+    while (i != mHeadIdx) {
+        LOG(VERBOSE) << "READ " << i << " time " << mTimeArray[i] << " \t EndOfPeriod " << mClock - period;
         if (mTimeArray[i] < mClock - period) {
             break;
         }
         bytes += mBytesArray[i];
-        i = (i - 1 + mSize) & mSizeMask;
+        i = (i + mSize - 1) & mSizeMask;
     }
     mHeadIdx = i;
     return bytes;
@@ -116,8 +113,8 @@
 
 template <class Time, class Bytes>
 void TrafficRecorder<Time, Bytes>::writeBytes(Bytes bytes) {
-    int writeIdx;
-    if(mClock == mTimeArray[mTailIdx]) {
+    size_t writeIdx;
+    if (mClock == mTimeArray[mTailIdx]) {
         writeIdx = mTailIdx;
         mBytesArray[writeIdx] += bytes;
     } else {
@@ -126,9 +123,9 @@
         mBytesArray[writeIdx] = bytes;
     }
 
-    ALOGV("WRITE %d time %d", writeIdx, mClock);
+    LOG(VERBOSE) << "WRITE " << writeIdx << " time " << mClock;
     if (writeIdx == mHeadIdx) {
-        ALOGW("Traffic recorder size exceeded at %d", mHeadIdx);
+        LOG(WARNING) << "Traffic recorder size exceeded at " << mHeadIdx;
         mHeadIdx = (mHeadIdx + 1) & mSizeMask;
     }
 
@@ -140,7 +137,7 @@
 void TrafficRecorder<Time, Bytes>::printAccuBitsForLastPeriod(Time period, Time unit) {
     Time duration = mClock - mLastTimeOfPrint;
     float numOfUnit = (float)duration / unit;
-    if(duration > period) {
+    if (duration > period) {
         ALOGD("Actual Tx period %.0f ms \t %.0f Bits/Unit",
               numOfUnit * 1000.f, mAccuBytesOfPrint * 8.f / numOfUnit);
         mLastTimeOfPrint = mClock;
@@ -148,6 +145,7 @@
         init();
     }
 }
+
 }  // namespace android
 
 #endif  // A_TRAFFIC_RECORDER_H_
