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"