status_t TimedTextSRTSource::getText( const MediaSource::ReadOptions *options, AString *text, int64_t *startTimeUs, int64_t *endTimeUs) { if (mTextVector.size() == 0) { return ERROR_END_OF_STREAM; } text->clear(); int64_t seekTimeUs; MediaSource::ReadOptions::SeekMode mode; if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) { int64_t lastEndTimeUs = mTextVector.valueAt(mTextVector.size() - 1).endTimeUs; if (seekTimeUs < 0) { return ERROR_OUT_OF_RANGE; } else if (seekTimeUs >= lastEndTimeUs) { return ERROR_END_OF_STREAM; } else { // binary search size_t low = 0; size_t high = mTextVector.size() - 1; size_t mid = 0; while (low <= high) { mid = low + (high - low)/2; int diff = compareExtendedRangeAndTime(mid, seekTimeUs); if (diff == 0) { break; } else if (diff < 0) { low = mid + 1; } else { high = mid - 1; } } mIndex = mid; } } if (mIndex >= mTextVector.size()) { return ERROR_END_OF_STREAM; } const TextInfo &info = mTextVector.valueAt(mIndex); *startTimeUs = mTextVector.keyAt(mIndex); *endTimeUs = info.endTimeUs; mIndex++; char *str = new char[info.textLen]; if (mSource->readAt(info.offset, str, info.textLen) < info.textLen) { delete[] str; return ERROR_IO; } text->append(str, info.textLen); delete[] str; return OK; }
status_t TimedTextSRTSource::getText( const MediaSource::ReadOptions *options, MagicString *text, int64_t *startTimeUs, int64_t *endTimeUs) { if (mTextVector.size() == 0) { return ERROR_END_OF_STREAM; } text->clear(); int64_t seekTimeUs; MediaSource::ReadOptions::SeekMode mode; if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) { int64_t lastEndTimeUs = mTextVector.valueAt(mTextVector.size() - 1).endTimeUs; if (seekTimeUs < 0) { return ERROR_OUT_OF_RANGE; } else if (seekTimeUs >= lastEndTimeUs) { return ERROR_END_OF_STREAM; } else { // binary search size_t low = 0; size_t high = mTextVector.size() - 1; size_t mid = 0; while (low <= high) { mid = low + (high - low)/2; int diff = compareExtendedRangeAndTime(mid, seekTimeUs); /*if (diff == 0xFF){ //Can not found subtitle information ALOGE("[SRT GetText] Can Not Found Any Subtitle Information At Time:%lld", seekTimeUs); return ERROR_OUT_OF_RANGE; }*/ if (diff == 0) { break; } else if (diff < 0) { low = mid + 1; } else { high = mid - 1; } } mIndex = mid; } } if (mIndex >= mTextVector.size()) { return ERROR_END_OF_STREAM; } const TextInfo &info = mTextVector.valueAt(mIndex); *startTimeUs = mTextVector.keyAt(mIndex); *endTimeUs = info.endTimeUs; ALOGE("[SRT GetText] Information sTime=%lld, endTime=%lld, index=%d", *startTimeUs, *endTimeUs, mIndex); mIndex++; char *str = new char[info.textLen]; if (FileCacheManager::getInstance().readFromCache(mSource, info.offset, str, info.textLen) < info.textLen) { delete[] str; return ERROR_IO; } text->append(str, 0, info.textLen, mFileEncodeType); TimedTextUtil::removeStyleInfo(text); MagicString::print("[GetText]", *text); delete[] str; return OK; }