MediaBufferPool::~MediaBufferPool() { MediaBuffer *next; for (MediaBuffer *buffer = mFirstBuffer; buffer != NULL; buffer = next) { next = buffer->nextBuffer(); CHECK_EQ(buffer->refcount(), 0); buffer->setObserver(NULL); buffer->release(); } }
status_t AMRWBEncoder::read( MediaBuffer **out, const ReadOptions *options) { status_t err; *out = NULL; int64_t seekTimeUs; ReadOptions::SeekMode mode; CHECK(options == NULL || !options->getSeekTo(&seekTimeUs, &mode)); bool readFromSource = false; int64_t wallClockTimeUs = -1; while (mNumInputSamples < kNumSamplesPerFrame) { if (mInputBuffer == NULL) { err = mSource->read(&mInputBuffer, options); if (err != OK) { /*m@nufront start*/ if (mInputBuffer != NULL) { mInputBuffer->release(); mInputBuffer = NULL; } mStarted = false; mFrameEncodingCompletionCondition.signal(); ZJFLOGD("function out for ERROR_END_OF_STREAM"); return ERROR_END_OF_STREAM; #if 0 if (mNumInputSamples == 0) { return ERROR_END_OF_STREAM; } memset(&mInputFrame[mNumInputSamples], 0, sizeof(int16_t) * (kNumSamplesPerFrame - mNumInputSamples)); mNumInputSamples = kNumSamplesPerFrame; break; #endif /*m@nufront end*/ } size_t align = mInputBuffer->range_length() % sizeof(int16_t); CHECK_EQ(align, 0); int64_t timeUs; if (mInputBuffer->meta_data()->findInt64(kKeyDriftTime, &timeUs)) { wallClockTimeUs = timeUs; } if (mInputBuffer->meta_data()->findInt64(kKeyAnchorTime, &timeUs)) { mAnchorTimeUs = timeUs; } readFromSource = true; } else { readFromSource = false; } size_t copy = (kNumSamplesPerFrame - mNumInputSamples) * sizeof(int16_t); if (copy > mInputBuffer->range_length()) { copy = mInputBuffer->range_length(); } memcpy(&mInputFrame[mNumInputSamples], (const uint8_t *)mInputBuffer->data() + mInputBuffer->range_offset(), copy); mInputBuffer->set_range( mInputBuffer->range_offset() + copy, mInputBuffer->range_length() - copy); if (mInputBuffer->range_length() == 0) { mInputBuffer->release(); mInputBuffer = NULL; } mNumInputSamples += copy / sizeof(int16_t); if (mNumInputSamples >= kNumSamplesPerFrame) { mNumInputSamples %= kNumSamplesPerFrame; break; // Get a whole input frame 640 bytes } } VO_CODECBUFFER inputData; memset(&inputData, 0, sizeof(inputData)); inputData.Buffer = (unsigned char*) mInputFrame; inputData.Length = kInputBufferSize; CHECK(VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData)); /*m@nufrnt start*/ //MediaBuffer *buffer; //CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK); MediaBuffer *buffer; { Mutex::Autolock autoLock(mLock); buffer = new MediaBuffer(1024); ++mNumClientOwnedBuffers; buffer->setObserver(this); buffer->add_ref(); } /*m@nufrnt end*/ uint8_t *outPtr = (uint8_t *)buffer->data(); VO_CODECBUFFER outputData; memset(&outputData, 0, sizeof(outputData)); VO_AUDIO_OUTPUTINFO outputInfo; memset(&outputInfo, 0, sizeof(outputInfo)); VO_U32 ret = VO_ERR_NONE; outputData.Buffer = outPtr; outputData.Length = buffer->size(); ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo); CHECK(ret == VO_ERR_NONE || ret == VO_ERR_INPUT_BUFFER_SMALL); buffer->set_range(0, outputData.Length); ++mNumFramesOutput; int64_t mediaTimeUs = mNumFramesOutput * 20000LL; buffer->meta_data()->setInt64(kKeyTime, mAnchorTimeUs + mediaTimeUs); if (readFromSource && wallClockTimeUs != -1) { buffer->meta_data()->setInt64(kKeyDriftTime, mediaTimeUs - wallClockTimeUs); } *out = buffer; return OK; }