ALOGV("readerEntry, full(wtf!!!), mVideoQ.size: %d, mVideoQ.nb_packets: %d, mAudioQ.size: %d, mAudioQ.nb_packets: %d",
mVideoQ.size, mVideoQ.nb_packets, mAudioQ.size, mAudioQ.nb_packets);
#endif
+ // avoid deadlock, the audio and video data in the video is offset too large.
+ if ((mAudioQ.size == 0) && mAudioQ.wait_for_data) {
+ ALOGE("abort audio queue, since offset to video data too large");
+ packet_queue_abort(&mAudioQ);
+ }
+ if ((mVideoQ.size == 0) && mVideoQ.wait_for_data) {
+ ALOGE("abort video queue, since offset to audio data too large");
+ packet_queue_abort(&mVideoQ);
+ }
/* wait 10 ms */
mExtractorMutex.lock();
mCondition.waitRelative(mExtractorMutex, milliseconds(10));
return ret;
}
+int packet_queue_is_wait_for_data(PacketQueue *q)
+{
+ Mutex::Autolock autoLock(q->lock);
+ return q->wait_for_data;
+}
+
int packet_queue_put_nullpacket(PacketQueue *q, int stream_index)
{
AVPacket pkt1, *pkt = &pkt1;
ret = 0;
break;
} else {
+ q->wait_for_data = 1;
q->cond.waitRelative(q->lock, 10000000LL);
}
}
+ q->wait_for_data = 0;
return ret;
}
AVPacketList *first_pkt, *last_pkt;
int nb_packets;
int size;
+ int wait_for_data;
int abort_request;
Mutex lock;
Condition cond;
void packet_queue_flush(PacketQueue *q);
void packet_queue_start(PacketQueue *q);
void packet_queue_abort(PacketQueue *q);
+int packet_queue_is_wait_for_data(PacketQueue *q);
int packet_queue_put(PacketQueue *q, AVPacket *pkt);
int packet_queue_put_nullpacket(PacketQueue *q, int stream_index);
int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block);