[Redridge] Support for WMA9 audio decoder

BZ: 32562

This patch contains changes related to AsfStreamParser to enable seek for wma/wmv files.

Signed-off-by: Manjunath <manjunathx.b.s@intel.com>

Change-Id: I7359a77289844261e18da9c4fb9e7ea2bef47689
Reviewed-on: http://android.intel.com:8080/48247
Reviewed-by: Sidorov, Sergey <sergey.sidorov@intel.com>
Reviewed-by: B S, ManjunathX <manjunathx.b.s@intel.com>
Reviewed-by: Shashkina, Julia <julia.shashkina@intel.com>
Reviewed-by: Kandasamy, Muthukumar <muthukumar.kandasamy@intel.com>
Reviewed-by: Krishna, Samaga <samaga.krishna@intel.com>
Reviewed-by: Gupta, ArvindX K <arvindx.k.gupta@intel.com>
Reviewed-by: Hibare, PramodX <pramodx.hibare@intel.com>
Tested-by: Hibare, PramodX <pramodx.hibare@intel.com>
Reviewed-by: Sikkandar D, Madar <madar.sikkandar.d@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/asfparser/AsfStreamParser.cpp b/asfparser/AsfStreamParser.cpp
index 647b2e8..f7e611c 100644
--- a/asfparser/AsfStreamParser.cpp
+++ b/asfparser/AsfStreamParser.cpp
@@ -37,7 +37,7 @@
       mHeaderParsed(false) {
     mHeaderParser = new AsfHeaderParser;
     mDataParser = new AsfDataParser;
-    mSimpleIndexParser = new AsfSimpleIndexParser;
+    mSimpleIndexParser = NULL;
 }
 
 AsfStreamParser::~AsfStreamParser(void) {
@@ -160,10 +160,27 @@
         return ASF_PARSER_FAILED;
     }
 
-    return mSimpleIndexParser->parse(buffer, size);
+    if (mSimpleIndexParser) {
+        delete mSimpleIndexParser;
+        mSimpleIndexParser = NULL;
+    }
+
+    mSimpleIndexParser = new AsfSimpleIndexParser;
+
+    if (mSimpleIndexParser == NULL) return ASF_PARSER_FAILED;
+
+    if (ASF_PARSER_SUCCESS != mSimpleIndexParser->parse(buffer, size)) {
+        delete mSimpleIndexParser;
+        mSimpleIndexParser = NULL;
+        return ASF_PARSER_FAILED;
+    }
+
+    return ASF_PARSER_SUCCESS;
 }
 
 AsfSimpleIndexInfo* AsfStreamParser::getIndexInfo() const {
+    if (!mSimpleIndexParser) return NULL;
+
     return mSimpleIndexParser->getIndexInfo();
 }
 
@@ -180,9 +197,41 @@
         return ASF_PARSER_FAILED;
     }
 
-    seekTime += mHeaderParser->getPreroll()*ASF_SCALE_MS_TO_100NANOSEC;  //add preroll start time
+    if (mSimpleIndexParser) {
+        seekTime += mHeaderParser->getPreroll()*ASF_SCALE_MS_TO_100NANOSEC;  //add preroll start time
+        return mSimpleIndexParser->seek(seekTime, nextSync, packetNumber, targetTime);
+    }
+    else {
+        // no index object, need to seek using average bitrate method
 
-    return mSimpleIndexParser->seek(seekTime, nextSync, packetNumber, targetTime);
+        if (mHeaderParser->hasVideo()){
+            return ASF_PARSER_FAILED;
+        }
+
+        if (!mHeaderParser->hasAudio()) {
+            return ASF_PARSER_FAILED;
+        }
+
+        int totalByteRate=0;
+        AsfAudioStreamInfo* audioInfo = mHeaderParser->getAudioInfo();
+        while (audioInfo != NULL) {
+            totalByteRate += audioInfo->avgByteRate;
+            audioInfo = audioInfo->next;
+        }
+
+        if (totalByteRate == 0) {
+            return ASF_PARSER_FAILED;
+        }
+
+        uint32_t packetSize = mHeaderParser->getDataPacketSize();
+        if (packetSize <= 0) {
+            return ASF_PARSER_FAILED;
+        }
+
+        packetNumber = seekTime/10000000 * totalByteRate / packetSize;
+        targetTime = seekTime;
+        return ASF_PARSER_SUCCESS;
+    }
 }
 
 uint32_t AsfStreamParser::getMaxObjectSize() {