Пауза и поиск в андроид stagefright Media Player

У меня есть аппаратная плата RK3288, и я пытаюсь использовать на ней программный декодер.
Я уже интегрировал свой программный декодер с андроидным сценическим игроком.
Он отлично интегрирован, и видео также работает полностью ..

Но теперь проблема в том, что, когда я делаю паузу или ищу видео, всплывающее окно говорит

«Не могу воспроизвести это видео»

Когда я нажимаю кнопку паузы, она снова вызывает конструктор awesomeplayer (я проверил это с помощью printf).

Так что, пожалуйста, кто-нибудь может указать, где мне не хватает в моем коде? или есть какие-то другие изменения, необходимые?

My Onqueuefilled Function (которая похожа на SoftAVC.cpp)

   void IntdecHEVC::onQueueFilled(OMX_U32 portIndex) {
UNUSED(portIndex);
if (checkp) {
return;
}

IAccessUnit pic_val;
DisplayPic Display_val;
int32_t got_frame;
int32_t timeDelay, timeTaken;
unsigned int p;
if (mSignalledError) {
return;
}
if (mOutputPortSettingsChange != NONE) {
return;
}List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex);
List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex);

while (!outQueue.empty()) {
BufferInfo *inInfo;
OMX_BUFFERHEADERTYPE *inHeader = NULL;

BufferInfo *outInfo;
OMX_BUFFERHEADERTYPE *outHeader = NULL;
uint8_t *pBuf;

inInfo = NULL;
inHeader = NULL;
Display_val.eosFlag = false;

if (!mIsInFlush) {
if (!inQueue.empty()) {
inInfo = *inQueue.begin();
inHeader = inInfo->mHeader;

} else {
break;
}
}outInfo = *outQueue.begin();
outHeader = outInfo->mHeader;
outHeader->nFlags = 0;
outHeader->nTimeStamp = 0;
outHeader->nOffset = 0;if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) {

mReceivedEOS = true;
Display_val.eosFlag = true;
if (inHeader->nFilledLen == 0) {

inQueue.erase(inQueue.begin());
inInfo->mOwnedByUs = false;
notifyEmptyBufferDone(inHeader);
inHeader = NULL;
setFlushMode();
}
}

if (inHeader != NULL) {

pic_val.bufferData = inHeader->pBuffer + inHeader->nOffset;
pic_val.bufferLength = inHeader->nFilledLen;
pic_val.pts = inHeader->nTimeStamp;

}

if (outHeader)
pBuf = outHeader->pBuffer;

Display_val.pobLumaSl  = pBuf;
Display_val.pobCromaCb = pBuf + (mWidth * mHeight);
Display_val.pobCromaCr = //pBuf + (mWidth*mHeight) + (m_lOriginalWidthUV*m_lHeightUV);

Display_val.pobCromaCb +(m_lOriginalWidthUV*m_lHeightUV);GETTIME(&mTimeStart, NULL);
/* Compute time elapsed between end of previous decode()
* to start of current decode() */
TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);// set the height and width of the picture */
pic_val.width = mWidth;
pic_val.height = mHeight;

mInterface.api_inte265Decode(&pic_val); //decoding data

handlePortSettingChangeEvent(&pic_val);
GETTIME(&mTimeEnd, NULL);
/* Compute time taken for decode() */
TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
got_frame = mInterface.api_inte265GetPic(&Display_val);

if (got_frame) {

FormatIYUV(&Display_val);       //copy data to outputbuffer 1-4/* added to check decoded data by pooja*/
if (1) {

unsigned int i;
unsigned int MAX_SIZE = Display_val.width * Display_val.height;

for (i = 0; i < MAX_SIZE; i++) {
fwrite(&Display_val.pobLumaSl[i], sizeof(uint8_t), 1, fb);
}

MAX_SIZE = (Display_val.width >> 1) * (Display_val.height >> 1);

for (i = 0; i < MAX_SIZE; i++) {
fwrite(&Display_val.pobCromaCb[i], sizeof(uint8_t), 1, fb);
}

for (i = 0; i < MAX_SIZE; i++) {
fwrite(&Display_val.pobCromaCr[i], sizeof(uint8_t), 1, fb);
}

}

if (outHeader != NULL) {

outHeader->nFilledLen = (Display_val.width * Display_val.height * 3) / 2;

outHeader->nTimeStamp = Display_val.pts;

outInfo->mOwnedByUs = false;
outQueue.erase(outQueue.begin());
outInfo = NULL;
notifyFillBufferDone(outHeader);
outHeader = NULL;
}
} else if (mIsInFlush) {

/* If in flush mode and no output is returned by the codec,
* then come out of flush mode */
mIsInFlush = false;

/* If EOS was recieved on input port and there is no output
* from the codec, then signal EOS on output port */
if (mReceivedEOS) {

if (outHeader != NULL) {

outHeader->nFilledLen = 0;
outHeader->nFlags |= OMX_BUFFERFLAG_EOS;              // 12-4-2016
outInfo->mOwnedByUs = false;
outQueue.erase(outQueue.begin());
outInfo = NULL;
notifyFillBufferDone(outHeader);
outHeader = NULL;
resetPlugin();
resetDecoder();     // added
checkp = true;               //15-4-2016
// break;                        //13-4-2016
return;                     //14-4-2016
}
}
}/* If input EOS is seen and decoder is not in flush mode,
* set the decoder in flush mode.
* There can be a case where EOS is sent along with last picture data
* In that case, only after decoding that input data, decoder has to be
* put in flush. This case is handled here  */

if (mReceivedEOS && !mIsInFlush) {

setFlushMode();
}/* Notify to client that empty buffer is done - pooja*/
if (inHeader != NULL) {
//inHeader->nFilledLen = 0;

inInfo->mOwnedByUs = false;
inQueue.erase(inQueue.begin());
inInfo = NULL;
notifyEmptyBufferDone(inHeader);
inHeader = NULL;
}}       // end !outQueue.empty()) loop}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]