@@ -205,7 +205,12 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) {
205
205
}
206
206
207
207
if (mFirstPicture && !outQueue.empty ()) {
208
- drainOneOutputBuffer (mFirstPictureId , mFirstPicture );
208
+ if (!drainOneOutputBuffer (mFirstPictureId , mFirstPicture )) {
209
+ ALOGE (" Drain failed" );
210
+ notify (OMX_EventError, OMX_ErrorUndefined, 0 , NULL );
211
+ mSignalledError = true ;
212
+ return ;
213
+ }
209
214
delete[] mFirstPicture ;
210
215
mFirstPicture = NULL ;
211
216
mFirstPictureId = -1 ;
@@ -255,11 +260,15 @@ void SoftAVC::saveFirstOutputBuffer(int32_t picId, uint8_t *data) {
255
260
memcpy (mFirstPicture , data, mPictureSize );
256
261
}
257
262
258
- void SoftAVC::drainOneOutputBuffer (int32_t picId, uint8_t * data) {
263
+ bool SoftAVC::drainOneOutputBuffer (int32_t picId, uint8_t * data) {
259
264
List<BufferInfo *> &outQueue = getPortQueue (kOutputPortIndex );
260
265
BufferInfo *outInfo = *outQueue.begin ();
261
- outQueue.erase (outQueue.begin ());
262
266
OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader ;
267
+ if (outHeader->nAllocLen - outHeader->nOffset < mPictureSize ) {
268
+ android_errorWriteLog (0x534e4554 , " 27833616" );
269
+ return false ;
270
+ }
271
+ outQueue.erase (outQueue.begin ());
263
272
OMX_BUFFERHEADERTYPE *header = mPicToHeaderMap .valueFor (picId);
264
273
outHeader->nTimeStamp = header->nTimeStamp ;
265
274
outHeader->nFlags = header->nFlags ;
@@ -270,6 +279,7 @@ void SoftAVC::drainOneOutputBuffer(int32_t picId, uint8_t* data) {
270
279
delete header;
271
280
outInfo->mOwnedByUs = false ;
272
281
notifyFillBufferDone (outHeader);
282
+ return true ;
273
283
}
274
284
275
285
void SoftAVC::drainAllOutputBuffers (bool eos) {
@@ -282,7 +292,12 @@ void SoftAVC::drainAllOutputBuffers(bool eos) {
282
292
mHandle , &decodedPicture, eos /* flush */ )) {
283
293
int32_t picId = decodedPicture.picId ;
284
294
uint8_t *data = (uint8_t *) decodedPicture.pOutputPicture ;
285
- drainOneOutputBuffer (picId, data);
295
+ if (!drainOneOutputBuffer (picId, data)) {
296
+ ALOGE (" Drain failed" );
297
+ notify (OMX_EventError, OMX_ErrorUndefined, 0 , NULL );
298
+ mSignalledError = true ;
299
+ return ;
300
+ }
286
301
}
287
302
}
288
303
0 commit comments