diff options
author | Andreas Huber <andih@google.com> | 2010-04-12 16:05:57 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-04-12 16:05:57 -0700 |
commit | 81f82c32459029bf0744e28c73f95a7f18cab5ac (patch) | |
tree | 7bc1f309ecd5f3d7ce4f3377837ccd3cb7728bbf /media/libstagefright/MPEG4Extractor.cpp | |
parent | 874b55f51c4c062c65aee043ec0f26044b504556 (diff) | |
download | frameworks_av-81f82c32459029bf0744e28c73f95a7f18cab5ac.zip frameworks_av-81f82c32459029bf0744e28c73f95a7f18cab5ac.tar.gz frameworks_av-81f82c32459029bf0744e28c73f95a7f18cab5ac.tar.bz2 |
Distinguish QCELP audio from mpeg4 audio, ignore QCELP audio tracks since we don't have a decoder for it, ignore potentially malformed metadata for AMR NB and WB tracks.
Change-Id: Ic9a9198413431db4ea40bb63b9de91aa8a7183af
related-to-bug: 2587341
Diffstat (limited to 'media/libstagefright/MPEG4Extractor.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index bd3925a..0e21d08 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -741,19 +741,25 @@ status_t MPEG4Extractor::parseChunk(off_t *offset, int depth) { uint16_t data_ref_index = U16_AT(&buffer[6]); uint16_t num_channels = U16_AT(&buffer[16]); + uint16_t sample_size = U16_AT(&buffer[18]); + uint32_t sample_rate = U32_AT(&buffer[24]) >> 16; + if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, - FourCC2MIME(chunk_type)) - || !strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, + FourCC2MIME(chunk_type))) { + // AMR NB audio is always mono, 8kHz + num_channels = 1; + sample_rate = 8000; + } else if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, FourCC2MIME(chunk_type))) { - // AMR audio is always mono. + // AMR WB audio is always mono, 16kHz num_channels = 1; + sample_rate = 16000; } - uint16_t sample_size = U16_AT(&buffer[18]); - uint32_t sample_rate = U32_AT(&buffer[24]) >> 16; - - // printf("*** coding='%s' %d channels, size %d, rate %d\n", - // chunk, num_channels, sample_size, sample_rate); +#if 0 + printf("*** coding='%s' %d channels, size %d, rate %d\n", + chunk, num_channels, sample_size, sample_rate); +#endif mLastTrack->meta->setCString(kKeyMIMEType, FourCC2MIME(chunk_type)); mLastTrack->meta->setInt32(kKeyChannelCount, num_channels); @@ -1235,6 +1241,18 @@ status_t MPEG4Extractor::verifyTrack(Track *track) { status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio( const void *esds_data, size_t esds_size) { ESDS esds(esds_data, esds_size); + + uint8_t objectTypeIndication; + if (esds.getObjectTypeIndication(&objectTypeIndication) != OK) { + return ERROR_MALFORMED; + } + + if (objectTypeIndication == 0xe1) { + // This isn't MPEG4 audio at all, it's QCELP 14k... + mLastTrack->meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_QCELP); + return OK; + } + const uint8_t *csd; size_t csd_size; if (esds.getCodecSpecificInfo( |