Merge "DO NOT MERGE Fix divide by zero" into klp-dev
diff --git a/media/libeffects/visualizer/EffectVisualizer.cpp b/media/libeffects/visualizer/EffectVisualizer.cpp
index d072ceb..eee135e 100644
--- a/media/libeffects/visualizer/EffectVisualizer.cpp
+++ b/media/libeffects/visualizer/EffectVisualizer.cpp
@@ -600,9 +600,14 @@
     case VISUALIZER_CMD_MEASURE: {
         if (pReplyData == NULL || replySize == NULL ||
                 *replySize < (sizeof(int32_t) * MEASUREMENT_COUNT)) {
-            ALOGV("VISUALIZER_CMD_MEASURE() error *replySize %" PRIu32
-                    " < (sizeof(int32_t) * MEASUREMENT_COUNT) %" PRIu32, *replySize,
-                    sizeof(int32_t) * MEASUREMENT_COUNT);
+            if (replySize == NULL) {
+                ALOGV("VISUALIZER_CMD_MEASURE() error replySize NULL");
+            } else {
+                ALOGV("VISUALIZER_CMD_MEASURE() error *replySize %" PRIu32
+                        " < (sizeof(int32_t) * MEASUREMENT_COUNT) %" PRIu32,
+                        *replySize,
+                        uint32_t(sizeof(int32_t)) * MEASUREMENT_COUNT);
+            }
             android_errorWriteLog(0x534e4554, "30229821");
             return -EINVAL;
         }
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 7a64c20..d12cafa 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1066,8 +1066,10 @@
         if (err != OK) {
               ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d",
                     mComponentName.c_str(), err);
-
-              return err;
+              if (mOMX->livesLocally(mNode, getpid())) {
+                  return err;
+              }
+              ALOGI("ignoring failure to use internal MediaCodec key.");
           }
       }
 
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 9ea8a25..0ab82cd 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -866,6 +866,9 @@
                     }
                 }
 
+                if (mLastTrack == NULL) {
+                    return ERROR_MALFORMED;
+                }
                 mLastTrack->sampleTable = new SampleTable(mDataSource);
             }
 
@@ -970,6 +973,9 @@
             } else if (mHeaderTimescale == 0) {
                 ALOGW("ignoring edit list because timescale is 0");
             } else {
+                if (mLastTrack == NULL) {
+                    return ERROR_MALFORMED;
+                }
                 off64_t entriesoffset = data_offset + 8;
                 uint64_t segment_duration;
                 int64_t media_time;
@@ -1021,6 +1027,9 @@
 
         case FOURCC('f', 'r', 'm', 'a'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             uint32_t original_fourcc;
             if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) {
                 return ERROR_IO;
@@ -1040,6 +1049,9 @@
 
         case FOURCC('t', 'e', 'n', 'c'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             if (chunk_size < 32) {
                 return ERROR_MALFORMED;
             }
@@ -1090,6 +1102,9 @@
 
         case FOURCC('t', 'k', 'h', 'd'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err;
             if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) {
                 return err;
@@ -1135,6 +1150,9 @@
 
         case FOURCC('m', 'd', 'h', 'd'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             if (chunk_data_size < 4) {
                 return ERROR_MALFORMED;
             }
@@ -1239,6 +1257,9 @@
             uint32_t entry_count = U32_AT(&buffer[4]);
 
             if (entry_count > 1) {
+                if (mLastTrack == NULL) {
+                    return ERROR_MALFORMED;
+                }
                 // For 3GPP timed text, there could be multiple tx3g boxes contain
                 // multiple text display formats. These formats will be used to
                 // display the timed text.
@@ -1273,6 +1294,9 @@
         case FOURCC('s', 'a', 'm', 'r'):
         case FOURCC('s', 'a', 'w', 'b'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             uint8_t buffer[8 + 20];
             if (chunk_data_size < (ssize_t)sizeof(buffer)) {
                 // Basic AudioSampleEntry size.
@@ -1322,6 +1346,9 @@
         case FOURCC('h', '2', '6', '3'):
         case FOURCC('a', 'v', 'c', '1'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             mHasVideo = true;
 
             uint8_t buffer[78];
@@ -1374,6 +1401,9 @@
         case FOURCC('s', 't', 'c', 'o'):
         case FOURCC('c', 'o', '6', '4'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setChunkOffsetParams(
                         chunk_type, data_offset, chunk_data_size);
@@ -1388,6 +1418,9 @@
 
         case FOURCC('s', 't', 's', 'c'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setSampleToChunkParams(
                         data_offset, chunk_data_size);
@@ -1403,6 +1436,9 @@
         case FOURCC('s', 't', 's', 'z'):
         case FOURCC('s', 't', 'z', '2'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setSampleSizeParams(
                         chunk_type, data_offset, chunk_data_size);
@@ -1483,6 +1519,9 @@
 
         case FOURCC('s', 't', 't', 's'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setTimeToSampleParams(
                         data_offset, chunk_data_size);
@@ -1497,6 +1536,9 @@
 
         case FOURCC('c', 't', 't', 's'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setCompositionTimeToSampleParams(
                         data_offset, chunk_data_size);
@@ -1511,6 +1553,9 @@
 
         case FOURCC('s', 't', 's', 's'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             status_t err =
                 mLastTrack->sampleTable->setSyncSampleParams(
                         data_offset, chunk_data_size);
@@ -1560,6 +1605,9 @@
 
         case FOURCC('e', 's', 'd', 's'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             if (chunk_data_size < 4) {
                 return ERROR_MALFORMED;
             }
@@ -1603,6 +1651,9 @@
 
         case FOURCC('a', 'v', 'c', 'C'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             sp<ABuffer> buffer = new ABuffer(chunk_data_size);
 
             if (buffer->data() == NULL) {
@@ -1624,6 +1675,9 @@
 
         case FOURCC('d', '2', '6', '3'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             /*
              * d263 contains a fixed 7 bytes part:
              *   vendor - 4 bytes
@@ -1783,6 +1837,9 @@
 
         case FOURCC('t', 'x', '3', 'g'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             uint32_t type;
             const void *data;
             size_t size = 0;
@@ -1863,6 +1920,9 @@
 
         case FOURCC('s', 'i', 'd', 'x'):
         {
+            if (mLastTrack == NULL) {
+                return ERROR_MALFORMED;
+            }
             parseSegmentIndex(data_offset, chunk_data_size);
             *offset += chunk_size;
             return UNKNOWN_ERROR; // stop parsing after sidx
@@ -2225,6 +2285,9 @@
                     int32_t delay, padding;
                     if (sscanf(mLastCommentData,
                                " %*x %x %x %*x", &delay, &padding) == 2) {
+                        if (mLastTrack == NULL) {
+                            return ERROR_MALFORMED;
+                        }
                         mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
                         mLastTrack->meta->setInt32(kKeyEncoderPadding, padding);
                     }