JB: Enabling WMA9 audio decoding support
BZ: 50306
part-2 of the patchset -
This patch contain changes in AsfExtractor in order to
support WMA decoding.
Change-Id: Ic066f1fae0a103ad05b576780261a748bff95733
Signed-off-by: Manjunath <manjunathx.b.s@intel.com>
Reviewed-on: http://android.intel.com:8080/61986
Reviewed-by: Sikkandar D, Madar <madar.sikkandar.d@intel.com>
Reviewed-by: Kandasamy, Muthukumar <muthukumar.kandasamy@intel.com>
Tested-by: Gupta, ArvindX K <arvindx.k.gupta@intel.com>
Reviewed-by: P C, SreekanthX <sreekanthx.p.c@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/frameworks/asf_extractor/AsfExtractor.cpp b/frameworks/asf_extractor/AsfExtractor.cpp
index 9a10581..1bdf0a0 100644
--- a/frameworks/asf_extractor/AsfExtractor.cpp
+++ b/frameworks/asf_extractor/AsfExtractor.cpp
@@ -43,6 +43,17 @@
namespace android {
+// The audio format tags that represent the input categories supported
+// by the Windows Media Audio decoder, don't change it
+enum WMAAudioFormats {
+ WAVE_FORMAT_MSAUDIO1 = 0x160,
+ WAVE_FORMAT_WMAUDIO2 = 0x161,
+ WAVE_FORMAT_WMAUDIO3X = 0x162,
+ WAVE_FORMAT_WMAUDIO_LOSSLESS = 0x163,
+ WAVE_FORMAT_WMAVOICE9 = 0x000A,
+ WAVE_FORMAT_WMAVOICE10 = 0x000B,
+};
+
class ASFSource : public MediaSource {
public:
ASFSource(const sp<AsfExtractor> &extractor, int trackIndex)
@@ -173,9 +184,11 @@
return BAD_VALUE;
}
+ int64_t seekTimeUs;
+ MediaSource::ReadOptions::SeekMode mode;
if (!mParser->hasVideo() || (mParser->hasVideo() && mHasIndexObject)) {
- if (options != NULL) {
- status_t err = seek_l(track, options);
+ if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) {
+ status_t err = seek_l(track, seekTimeUs, mode);
if (err != OK) {
return err;
}
@@ -273,9 +286,13 @@
}
}
- if (mParser->hasVideo() || mParser->hasAudio()) {
+ if (mParser->hasVideo()) {
ALOGV("MEDIA_MIMETYPE_CONTAINER_ASF");
mFileMetaData->setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_ASF);
+ } else if (mParser->hasAudio() && mParser->getAudioInfo()->codecID >= WAVE_FORMAT_MSAUDIO1 &&
+ mParser->getAudioInfo()->codecID <= WAVE_FORMAT_WMAUDIO_LOSSLESS) {
+ LOGV("MEDIA_MIMETYPE_AUDIO_WMA", mParser->getAudioInfo()->codecID);
+ mFileMetaData->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
} else {
ALOGE("Content does not have neither audio nor video.");
return ERROR_UNSUPPORTED;
@@ -354,20 +371,20 @@
static const char* CodecID2MIME(uint32_t codecID) {
switch (codecID) {
// WMA version 1
- case 0x0160:
+ case WAVE_FORMAT_MSAUDIO1:
// WMA version 2 (7, 8, 9 series)
- case 0x0161:
+ case WAVE_FORMAT_WMAUDIO2:
// WMA 9/10 profressional (WMA version 3)
- case 0x0162:
+ case WAVE_FORMAT_WMAUDIO3X:
return MEDIA_MIMETYPE_AUDIO_WMA;
// WMA 9 lossless
- case 0x0163:
+ case WAVE_FORMAT_WMAUDIO_LOSSLESS:
//return MEDIA_MIMETYPE_AUDIO_WMA_LOSSLESS;
return MEDIA_MIMETYPE_AUDIO_WMA;
// WMA voice 9
- case 0x000A:
+ case WAVE_FORMAT_WMAVOICE9:
// WMA voice 10
- case 0x000B:
+ case WAVE_FORMAT_WMAVOICE10:
ALOGW("WMA voice 9/10 is not supported.");
return "audio/wma-voice";
default:
@@ -378,8 +395,7 @@
status_t AsfExtractor::setupTracks() {
- ALOGW("Audio is temporarily disabled!!!!!!!!!!!!!!");
- AsfAudioStreamInfo* audioInfo = NULL;//mParser->getAudioInfo();
+ AsfAudioStreamInfo* audioInfo = mParser->getAudioInfo();
AsfVideoStreamInfo* videoInfo = mParser->getVideoInfo();
Track* track;
while (audioInfo || videoInfo) {
@@ -401,10 +417,22 @@
track->bufferPool = new MediaBufferPool;
if (audioInfo) {
+ LOGV("streamNumber = %d\n, encryptedContentFlag= %d\n, timeOffset = %lld\n,
+ codecID = %d\n, numChannels=%d\n, sampleRate=%d\n, avgBitRate = %d\n,
+ blockAlignment =%d\n, bitsPerSample=%d\n, codecDataSize=%d\n",
+ audioInfo->streamNumber, audioInfo->encryptedContentFlag,
+ audioInfo->timeOffset, audioInfo->codecID, audioInfo->numChannels,
+ audioInfo->sampleRate, audioInfo->avgByteRate*8, audioInfo->blockAlignment,
+ audioInfo->bitsPerSample, audioInfo->codecDataSize);
+
track->streamNumber = audioInfo->streamNumber;
track->encrypted = audioInfo->encryptedContentFlag;
track->meta->setInt32(kKeyChannelCount, audioInfo->numChannels);
track->meta->setInt32(kKeySampleRate, audioInfo->sampleRate);
+ track->meta->setInt32(kKeyWmaBlockAlign, audioInfo->blockAlignment);
+ track->meta->setInt32(kKeyBitPerSample, audioInfo->bitsPerSample);
+ track->meta->setInt32(kKeyBitRate, audioInfo->avgByteRate*8);
+ track->meta->setInt32(kKeyWmaFormatTag, audioInfo->codecID);
if (audioInfo->codecDataSize) {
track->meta->setData(
@@ -452,7 +480,7 @@
return OK;
}
-status_t AsfExtractor::seek_l(Track* track, const MediaSource::ReadOptions *options) {
+status_t AsfExtractor::seek_l(Track* track, int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode) {
Mutex::Autolock lockSeek(mReadLock);
// It is expected seeking will happen on all the tracks with the same seeking options.
@@ -470,11 +498,6 @@
track->seekCompleted = false;
return OK;
}
- int64_t seekTimeUs;
- MediaSource::ReadOptions::SeekMode mode;
- if(!options->getSeekTo(&seekTimeUs,&mode)) {
- return OK;
- }
uint64_t targetSampleTimeUs = 0;
diff --git a/frameworks/asf_extractor/AsfExtractor.h b/frameworks/asf_extractor/AsfExtractor.h
index adb8e9d..4e17083 100644
--- a/frameworks/asf_extractor/AsfExtractor.h
+++ b/frameworks/asf_extractor/AsfExtractor.h
@@ -105,7 +105,7 @@
status_t setupTracks();
inline Track* getTrackByTrackIndex(int index);
inline Track* getTrackByStreamNumber(int stream);
- status_t seek_l(Track* track, const MediaSource::ReadOptions *options);
+ status_t seek_l(Track* track, int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode);
status_t read_l(Track *track, MediaBuffer **buffer);
status_t readPacket();
};
diff --git a/frameworks/asf_extractor/MetaDataExt.h b/frameworks/asf_extractor/MetaDataExt.h
index 6476b9b..bee1431 100644
--- a/frameworks/asf_extractor/MetaDataExt.h
+++ b/frameworks/asf_extractor/MetaDataExt.h
@@ -22,7 +22,7 @@
namespace android {
-#define MEDIA_MIMETYPE_AUDIO_WMA "audio/wma"
+#define MEDIA_MIMETYPE_AUDIO_WMA "audio/x-ms-wma"
#define MEDIA_MIMETYPE_AUDIO_AC3 "audio/ac3"
#define MEDIA_MIMETYPE_VIDEO_WMV "video/wmv"
#define MEDIA_MIMETYPE_CONTAINER_ASF "video/x-ms-asf"