Loading media/libstagefright/MPEG4Extractor.cpp +62 −0 Original line number Original line Diff line number Diff line Loading @@ -899,6 +899,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { } } } } if (mLastTrack == NULL) { return ERROR_MALFORMED; } mLastTrack->sampleTable = new SampleTable(mDataSource); mLastTrack->sampleTable = new SampleTable(mDataSource); } } Loading Loading @@ -996,6 +999,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { ALOGW("ignoring edit list with %d entries", entry_count); ALOGW("ignoring edit list with %d entries", entry_count); } else if (mHeaderTimescale == 0) { } else if (mHeaderTimescale == 0) { ALOGW("ignoring edit list because timescale is 0"); ALOGW("ignoring edit list because timescale is 0"); } else if (mLastTrack == NULL) { return ERROR_MALFORMED; } else { } else { off64_t entriesoffset = data_offset + 8; off64_t entriesoffset = data_offset + 8; uint64_t segment_duration; uint64_t segment_duration; Loading Loading @@ -1048,6 +1053,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('f', 'r', 'm', 'a'): case FOURCC('f', 'r', 'm', 'a'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint32_t original_fourcc; uint32_t original_fourcc; if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) { if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) { Loading @@ -1068,6 +1076,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'e', 'n', 'c'): case FOURCC('t', 'e', 'n', 'c'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_size < 32) { if (chunk_size < 32) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1119,6 +1130,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'k', 'h', 'd'): case FOURCC('t', 'k', 'h', 'd'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err; status_t err; if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) { if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) { Loading Loading @@ -1166,6 +1180,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('m', 'd', 'h', 'd'): case FOURCC('m', 'd', 'h', 'd'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 4) { if (chunk_data_size < 4) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1257,6 +1274,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'd'): case FOURCC('s', 't', 's', 'd'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 8) { if (chunk_data_size < 8) { return ERROR_MALFORMED; return ERROR_MALFORMED; } } Loading Loading @@ -1313,6 +1333,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 'a', 'm', 'r'): case FOURCC('s', 'a', 'm', 'r'): case FOURCC('s', 'a', 'w', 'b'): case FOURCC('s', 'a', 'w', 'b'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint8_t buffer[8 + 20]; uint8_t buffer[8 + 20]; if (chunk_data_size < (ssize_t)sizeof(buffer)) { if (chunk_data_size < (ssize_t)sizeof(buffer)) { // Basic AudioSampleEntry size. // Basic AudioSampleEntry size. Loading Loading @@ -1416,6 +1439,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 'c', 'o'): case FOURCC('s', 't', 'c', 'o'): case FOURCC('c', 'o', '6', '4'): case FOURCC('c', 'o', '6', '4'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setChunkOffsetParams( mLastTrack->sampleTable->setChunkOffsetParams( chunk_type, data_offset, chunk_data_size); chunk_type, data_offset, chunk_data_size); Loading @@ -1431,6 +1457,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'c'): case FOURCC('s', 't', 's', 'c'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSampleToChunkParams( mLastTrack->sampleTable->setSampleToChunkParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1447,6 +1476,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'z'): case FOURCC('s', 't', 's', 'z'): case FOURCC('s', 't', 'z', '2'): case FOURCC('s', 't', 'z', '2'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSampleSizeParams( mLastTrack->sampleTable->setSampleSizeParams( chunk_type, data_offset, chunk_data_size); chunk_type, data_offset, chunk_data_size); Loading Loading @@ -1530,6 +1562,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setTimeToSampleParams( mLastTrack->sampleTable->setTimeToSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1545,6 +1580,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setCompositionTimeToSampleParams( mLastTrack->sampleTable->setCompositionTimeToSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1560,6 +1598,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSyncSampleParams( mLastTrack->sampleTable->setSyncSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading Loading @@ -1610,6 +1651,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('e', 's', 'd', 's'): case FOURCC('e', 's', 'd', 's'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 4) { if (chunk_data_size < 4) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1654,6 +1698,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('a', 'v', 'c', 'C'): case FOURCC('a', 'v', 'c', 'C'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } sp<ABuffer> buffer = new ABuffer(chunk_data_size); sp<ABuffer> buffer = new ABuffer(chunk_data_size); Loading @@ -1675,6 +1722,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('h', 'v', 'c', 'C'): case FOURCC('h', 'v', 'c', 'C'): { { sp<ABuffer> buffer = new ABuffer(chunk_data_size); sp<ABuffer> buffer = new ABuffer(chunk_data_size); if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (buffer->data() == NULL) { if (buffer->data() == NULL) { ALOGE("b/28471206"); ALOGE("b/28471206"); Loading @@ -1696,6 +1746,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('d', '2', '6', '3'): case FOURCC('d', '2', '6', '3'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } /* /* * d263 contains a fixed 7 bytes part: * d263 contains a fixed 7 bytes part: * vendor - 4 bytes * vendor - 4 bytes Loading Loading @@ -1932,6 +1985,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'x', '3', 'g'): case FOURCC('t', 'x', '3', 'g'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint32_t type; uint32_t type; const void *data; const void *data; size_t size = 0; size_t size = 0; Loading Loading @@ -2047,6 +2103,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 'i', 'd', 'x'): case FOURCC('s', 'i', 'd', 'x'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } parseSegmentIndex(data_offset, chunk_data_size); parseSegmentIndex(data_offset, chunk_data_size); *offset += chunk_size; *offset += chunk_size; return UNKNOWN_ERROR; // stop parsing after sidx return UNKNOWN_ERROR; // stop parsing after sidx Loading Loading @@ -2409,6 +2468,9 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) { int32_t delay, padding; int32_t delay, padding; if (sscanf(mLastCommentData, if (sscanf(mLastCommentData, " %*x %x %x %*x", &delay, &padding) == 2) { " %*x %x %x %*x", &delay, &padding) == 2) { if (mLastTrack == NULL) { return ERROR_MALFORMED; } mLastTrack->meta->setInt32(kKeyEncoderDelay, delay); mLastTrack->meta->setInt32(kKeyEncoderDelay, delay); mLastTrack->meta->setInt32(kKeyEncoderPadding, padding); mLastTrack->meta->setInt32(kKeyEncoderPadding, padding); } } Loading Loading
media/libstagefright/MPEG4Extractor.cpp +62 −0 Original line number Original line Diff line number Diff line Loading @@ -899,6 +899,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { } } } } if (mLastTrack == NULL) { return ERROR_MALFORMED; } mLastTrack->sampleTable = new SampleTable(mDataSource); mLastTrack->sampleTable = new SampleTable(mDataSource); } } Loading Loading @@ -996,6 +999,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { ALOGW("ignoring edit list with %d entries", entry_count); ALOGW("ignoring edit list with %d entries", entry_count); } else if (mHeaderTimescale == 0) { } else if (mHeaderTimescale == 0) { ALOGW("ignoring edit list because timescale is 0"); ALOGW("ignoring edit list because timescale is 0"); } else if (mLastTrack == NULL) { return ERROR_MALFORMED; } else { } else { off64_t entriesoffset = data_offset + 8; off64_t entriesoffset = data_offset + 8; uint64_t segment_duration; uint64_t segment_duration; Loading Loading @@ -1048,6 +1053,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('f', 'r', 'm', 'a'): case FOURCC('f', 'r', 'm', 'a'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint32_t original_fourcc; uint32_t original_fourcc; if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) { if (mDataSource->readAt(data_offset, &original_fourcc, 4) < 4) { Loading @@ -1068,6 +1076,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'e', 'n', 'c'): case FOURCC('t', 'e', 'n', 'c'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_size < 32) { if (chunk_size < 32) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1119,6 +1130,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'k', 'h', 'd'): case FOURCC('t', 'k', 'h', 'd'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err; status_t err; if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) { if ((err = parseTrackHeader(data_offset, chunk_data_size)) != OK) { Loading Loading @@ -1166,6 +1180,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('m', 'd', 'h', 'd'): case FOURCC('m', 'd', 'h', 'd'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 4) { if (chunk_data_size < 4) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1257,6 +1274,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'd'): case FOURCC('s', 't', 's', 'd'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 8) { if (chunk_data_size < 8) { return ERROR_MALFORMED; return ERROR_MALFORMED; } } Loading Loading @@ -1313,6 +1333,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 'a', 'm', 'r'): case FOURCC('s', 'a', 'm', 'r'): case FOURCC('s', 'a', 'w', 'b'): case FOURCC('s', 'a', 'w', 'b'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint8_t buffer[8 + 20]; uint8_t buffer[8 + 20]; if (chunk_data_size < (ssize_t)sizeof(buffer)) { if (chunk_data_size < (ssize_t)sizeof(buffer)) { // Basic AudioSampleEntry size. // Basic AudioSampleEntry size. Loading Loading @@ -1416,6 +1439,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 'c', 'o'): case FOURCC('s', 't', 'c', 'o'): case FOURCC('c', 'o', '6', '4'): case FOURCC('c', 'o', '6', '4'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setChunkOffsetParams( mLastTrack->sampleTable->setChunkOffsetParams( chunk_type, data_offset, chunk_data_size); chunk_type, data_offset, chunk_data_size); Loading @@ -1431,6 +1457,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'c'): case FOURCC('s', 't', 's', 'c'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSampleToChunkParams( mLastTrack->sampleTable->setSampleToChunkParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1447,6 +1476,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 't', 's', 'z'): case FOURCC('s', 't', 's', 'z'): case FOURCC('s', 't', 'z', '2'): case FOURCC('s', 't', 'z', '2'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSampleSizeParams( mLastTrack->sampleTable->setSampleSizeParams( chunk_type, data_offset, chunk_data_size); chunk_type, data_offset, chunk_data_size); Loading Loading @@ -1530,6 +1562,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setTimeToSampleParams( mLastTrack->sampleTable->setTimeToSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1545,6 +1580,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setCompositionTimeToSampleParams( mLastTrack->sampleTable->setCompositionTimeToSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading @@ -1560,6 +1598,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } status_t err = status_t err = mLastTrack->sampleTable->setSyncSampleParams( mLastTrack->sampleTable->setSyncSampleParams( data_offset, chunk_data_size); data_offset, chunk_data_size); Loading Loading @@ -1610,6 +1651,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('e', 's', 'd', 's'): case FOURCC('e', 's', 'd', 's'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (chunk_data_size < 4) { if (chunk_data_size < 4) { return ERROR_MALFORMED; return ERROR_MALFORMED; Loading Loading @@ -1654,6 +1698,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('a', 'v', 'c', 'C'): case FOURCC('a', 'v', 'c', 'C'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } sp<ABuffer> buffer = new ABuffer(chunk_data_size); sp<ABuffer> buffer = new ABuffer(chunk_data_size); Loading @@ -1675,6 +1722,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('h', 'v', 'c', 'C'): case FOURCC('h', 'v', 'c', 'C'): { { sp<ABuffer> buffer = new ABuffer(chunk_data_size); sp<ABuffer> buffer = new ABuffer(chunk_data_size); if (mLastTrack == NULL) { return ERROR_MALFORMED; } if (buffer->data() == NULL) { if (buffer->data() == NULL) { ALOGE("b/28471206"); ALOGE("b/28471206"); Loading @@ -1696,6 +1746,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('d', '2', '6', '3'): case FOURCC('d', '2', '6', '3'): { { *offset += chunk_size; *offset += chunk_size; if (mLastTrack == NULL) { return ERROR_MALFORMED; } /* /* * d263 contains a fixed 7 bytes part: * d263 contains a fixed 7 bytes part: * vendor - 4 bytes * vendor - 4 bytes Loading Loading @@ -1932,6 +1985,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('t', 'x', '3', 'g'): case FOURCC('t', 'x', '3', 'g'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } uint32_t type; uint32_t type; const void *data; const void *data; size_t size = 0; size_t size = 0; Loading Loading @@ -2047,6 +2103,9 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { case FOURCC('s', 'i', 'd', 'x'): case FOURCC('s', 'i', 'd', 'x'): { { if (mLastTrack == NULL) { return ERROR_MALFORMED; } parseSegmentIndex(data_offset, chunk_data_size); parseSegmentIndex(data_offset, chunk_data_size); *offset += chunk_size; *offset += chunk_size; return UNKNOWN_ERROR; // stop parsing after sidx return UNKNOWN_ERROR; // stop parsing after sidx Loading Loading @@ -2409,6 +2468,9 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) { int32_t delay, padding; int32_t delay, padding; if (sscanf(mLastCommentData, if (sscanf(mLastCommentData, " %*x %x %x %*x", &delay, &padding) == 2) { " %*x %x %x %*x", &delay, &padding) == 2) { if (mLastTrack == NULL) { return ERROR_MALFORMED; } mLastTrack->meta->setInt32(kKeyEncoderDelay, delay); mLastTrack->meta->setInt32(kKeyEncoderDelay, delay); mLastTrack->meta->setInt32(kKeyEncoderPadding, padding); mLastTrack->meta->setInt32(kKeyEncoderPadding, padding); } } Loading