Loading include/media/stagefright/MediaDefs.h +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ extern const char *MEDIA_MIMETYPE_AUDIO_AMR_NB; extern const char *MEDIA_MIMETYPE_AUDIO_AMR_WB; extern const char *MEDIA_MIMETYPE_AUDIO_MPEG; extern const char *MEDIA_MIMETYPE_AUDIO_AAC; extern const char *MEDIA_MIMETYPE_AUDIO_QCELP; extern const char *MEDIA_MIMETYPE_AUDIO_RAW; extern const char *MEDIA_MIMETYPE_CONTAINER_MPEG4; Loading media/libstagefright/AwesomePlayer.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -763,9 +763,14 @@ status_t AwesomePlayer::initAudioDecoder() { mDurationUs = durationUs; } } } mAudioSource->start(); } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { // For legacy reasons we're simply going to ignore the absence // of an audio decoder for QCELP instead of aborting playback // altogether. return OK; } return mAudioSource != NULL ? OK : UNKNOWN_ERROR; } Loading media/libstagefright/ESDS.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ ESDS::ESDS(const void *data, size_t size) mSize(size), mInitCheck(NO_INIT), mDecoderSpecificOffset(0), mDecoderSpecificLength(0) { mDecoderSpecificLength(0), mObjectTypeIndication(0) { memcpy(mData, data, size); mInitCheck = parse(); Loading @@ -40,6 +41,16 @@ status_t ESDS::InitCheck() const { return mInitCheck; } status_t ESDS::getObjectTypeIndication(uint8_t *objectTypeIndication) const { if (mInitCheck != OK) { return mInitCheck; } *objectTypeIndication = mObjectTypeIndication; return OK; } status_t ESDS::getCodecSpecificInfo(const void **data, size_t *size) const { if (mInitCheck != OK) { return mInitCheck; Loading Loading @@ -164,6 +175,8 @@ status_t ESDS::parseDecoderConfigDescriptor(size_t offset, size_t size) { return ERROR_MALFORMED; } mObjectTypeIndication = mData[offset]; offset += 13; size -= 13; Loading media/libstagefright/MPEG4Extractor.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -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 audio is always mono. // 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 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); Loading Loading @@ -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( Loading media/libstagefright/MediaDefs.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ const char *MEDIA_MIMETYPE_AUDIO_AMR_NB = "audio/3gpp"; const char *MEDIA_MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb"; const char *MEDIA_MIMETYPE_AUDIO_MPEG = "audio/mpeg"; const char *MEDIA_MIMETYPE_AUDIO_AAC = "audio/mp4a-latm"; const char *MEDIA_MIMETYPE_AUDIO_QCELP = "audio/qcelp"; const char *MEDIA_MIMETYPE_AUDIO_RAW = "audio/raw"; const char *MEDIA_MIMETYPE_CONTAINER_MPEG4 = "video/mpeg4"; Loading Loading
include/media/stagefright/MediaDefs.h +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ extern const char *MEDIA_MIMETYPE_AUDIO_AMR_NB; extern const char *MEDIA_MIMETYPE_AUDIO_AMR_WB; extern const char *MEDIA_MIMETYPE_AUDIO_MPEG; extern const char *MEDIA_MIMETYPE_AUDIO_AAC; extern const char *MEDIA_MIMETYPE_AUDIO_QCELP; extern const char *MEDIA_MIMETYPE_AUDIO_RAW; extern const char *MEDIA_MIMETYPE_CONTAINER_MPEG4; Loading
media/libstagefright/AwesomePlayer.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -763,9 +763,14 @@ status_t AwesomePlayer::initAudioDecoder() { mDurationUs = durationUs; } } } mAudioSource->start(); } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) { // For legacy reasons we're simply going to ignore the absence // of an audio decoder for QCELP instead of aborting playback // altogether. return OK; } return mAudioSource != NULL ? OK : UNKNOWN_ERROR; } Loading
media/libstagefright/ESDS.cpp +14 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ ESDS::ESDS(const void *data, size_t size) mSize(size), mInitCheck(NO_INIT), mDecoderSpecificOffset(0), mDecoderSpecificLength(0) { mDecoderSpecificLength(0), mObjectTypeIndication(0) { memcpy(mData, data, size); mInitCheck = parse(); Loading @@ -40,6 +41,16 @@ status_t ESDS::InitCheck() const { return mInitCheck; } status_t ESDS::getObjectTypeIndication(uint8_t *objectTypeIndication) const { if (mInitCheck != OK) { return mInitCheck; } *objectTypeIndication = mObjectTypeIndication; return OK; } status_t ESDS::getCodecSpecificInfo(const void **data, size_t *size) const { if (mInitCheck != OK) { return mInitCheck; Loading Loading @@ -164,6 +175,8 @@ status_t ESDS::parseDecoderConfigDescriptor(size_t offset, size_t size) { return ERROR_MALFORMED; } mObjectTypeIndication = mData[offset]; offset += 13; size -= 13; Loading
media/libstagefright/MPEG4Extractor.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -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 audio is always mono. // 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 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); Loading Loading @@ -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( Loading
media/libstagefright/MediaDefs.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ const char *MEDIA_MIMETYPE_AUDIO_AMR_NB = "audio/3gpp"; const char *MEDIA_MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb"; const char *MEDIA_MIMETYPE_AUDIO_MPEG = "audio/mpeg"; const char *MEDIA_MIMETYPE_AUDIO_AAC = "audio/mp4a-latm"; const char *MEDIA_MIMETYPE_AUDIO_QCELP = "audio/qcelp"; const char *MEDIA_MIMETYPE_AUDIO_RAW = "audio/raw"; const char *MEDIA_MIMETYPE_CONTAINER_MPEG4 = "video/mpeg4"; Loading