[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() {