status_t M2VDecoder::read( MediaBuffer **out, const ReadOptions *options) { *out = NULL; //LOGI("M2VDecoder::read in"); int64_t seekTimeUs; ReadOptions::SeekMode mode; if (options && options->getSeekTo(&seekTimeUs, &mode)) { ALOGV("seek requested to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); CHECK(seekTimeUs >= 0); mPendingSeekTimeUs = seekTimeUs; mPendingSeekMode = mode; if (mInputBuffer) { mInputBuffer->release(); mInputBuffer = NULL; } sDecApi.reset_class_On2Decoder(pOn2Dec); } if (mInputBuffer == NULL) { ALOGV("fetching new input buffer."); bool seeking = false; for (;;) { if (mPendingSeekTimeUs >= 0) { ALOGV("reading data from timestamp %lld (%.2f secs)", mPendingSeekTimeUs, mPendingSeekTimeUs / 1E6); } ReadOptions seekOptions; if (mPendingSeekTimeUs >= 0) { seeking = true; seekOptions.setSeekTo(mPendingSeekTimeUs, mPendingSeekMode); mPendingSeekTimeUs = -1; } status_t err = mSource->read(&mInputBuffer, &seekOptions); seekOptions.clearSeekTo(); if (err != OK) { *out = NULL; return (*out == NULL) ? err : (status_t)OK; } if (mInputBuffer->range_length() > 0) { break; } mInputBuffer->release(); mInputBuffer = NULL; } if (seeking) { int64_t targetTimeUs; if (mInputBuffer->meta_data()->findInt64(kKeyTargetTime, &targetTimeUs) && targetTimeUs >= 0) { mTargetTimeUs = targetTimeUs; } else { mTargetTimeUs = -1; } } } MediaBuffer *aOutBuf = new MediaBuffer(sizeof(VPU_FRAME)); uint8_t * aOutBuffer = (uint8_t *)aOutBuf->data(); uint32_t aOutputLength = 0; uint8_t * pInput = (uint8_t *)mInputBuffer->data(); uint32_t aInBufSize = mInputBuffer->range_length(); //int64_t inputTime = 0LL; //mInputBuffer->meta_data()->findInt64(kKeyTime, &inputTime); int64_t outputTime = 0LL; /*if(mNumFramesOutput == 0) { pInput += 16; aInBufSize -= 16; }*/ //LOGI("before decoder m2v inputlen %d",aInBufSize); //LOGI("inpout data %c %c %c %c",pInput[0],pInput[1],pInput[2],pInput[3]); memset(aOutBuffer,0,sizeof(VPU_FRAME)); if(sDecApi.dec_oneframe_class_On2Decoder( pOn2Dec, aOutBuffer, (uint32_t*)&aOutputLength, pInput, &aInBufSize)){ sDecApi.get_oneframe_class_On2Decoder(pOn2Dec, aOutBuffer,(uint32_t*)&aOutputLength); aOutBuf->releaseframe(); mInputBuffer->release(); mInputBuffer = NULL; ALOGE("m2vdec failed"); return UNKNOWN_ERROR; } //LOGI("after decoder m2v aInBufSize %d aOutputLength %d ",aInBufSize,aOutputLength); if(mInputBuffer) { mInputBuffer->release(); mInputBuffer = NULL; } if (mInputBuffer == NULL) { for (;;) { status_t err = mSource->read(&mInputBuffer); if (err != OK) { *out = NULL; return (*out == NULL) ? err : (status_t)OK; } if (mInputBuffer->range_length() > 0) { break; } mInputBuffer->release(); mInputBuffer = NULL; } } sDecApi.get_oneframe_class_On2Decoder(pOn2Dec, aOutBuffer,(uint32_t*)&aOutputLength); if(aOutputLength) mNumFramesOutput++; VPU_FRAME *frame = (VPU_FRAME *)aOutBuffer; outputTime = ((int64_t)(frame->ShowTime.TimeHigh) <<32) | ((int64_t)(frame->ShowTime.TimeLow)); outputTime *=1000; aOutBuf->meta_data()->setInt64(kKeyTime,outputTime); if(aOutputLength <= 0) aOutBuf->set_range(0, 0); *out = aOutBuf; //LOGI("M2VDecoder::read out"); return OK; }