Skip to content
Snippets Groups Projects
Commit b81ccd96 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

media input: wait if emitFrame failed

Avoid infinite loop when no frame is available.

Change-Id: I40885381adb66d9f7a10a99e8e92ae06706efbad
parent 0b0d6a85
Branches
No related tags found
No related merge requests found
......@@ -152,11 +152,9 @@ AudioInput::readFromQueue()
{
if (!decoder_)
return;
if (paused_) {
if (paused_ || !decoder_->emitFrame(true)) {
std::this_thread::sleep_for(MS_PER_PACKET);
return;
}
decoder_->emitFrame(true);
}
void
......
......@@ -261,17 +261,17 @@ MediaDemuxer::clearFrames()
}
}
void
bool
MediaDemuxer::emitFrame(bool isAudio)
{
if (isAudio) {
pushFrameFrom(audioBuffer_, isAudio, audioBufferMutex_);
return pushFrameFrom(audioBuffer_, isAudio, audioBufferMutex_);
} else {
pushFrameFrom(videoBuffer_, isAudio, videoBufferMutex_);
return pushFrameFrom(videoBuffer_, isAudio, videoBufferMutex_);
}
}
void
bool
MediaDemuxer::pushFrameFrom(
std::queue<std::unique_ptr<AVPacket, std::function<void(AVPacket*)>>>& buffer,
bool isAudio,
......@@ -284,24 +284,23 @@ MediaDemuxer::pushFrameFrom(
} else {
needFrameCb_();
}
return;
return false;
}
auto packet = std::move(buffer.front());
if (!packet) {
return;
return false;
}
auto streamIndex = packet->stream_index;
if (static_cast<unsigned>(streamIndex) >= streams_.size() || streamIndex < 0) {
return;
}
auto& cb = streams_[streamIndex];
if (!cb) {
return;
return false;
}
if (auto& cb = streams_[streamIndex]) {
buffer.pop();
lock.unlock();
cb(*packet.get());
}
return true;
}
MediaDemuxer::Status
MediaDemuxer::demuxe()
......@@ -437,10 +436,10 @@ MediaDecoder::MediaDecoder(const std::shared_ptr<MediaDemuxer>& demuxer,
setupStream();
}
void
bool
MediaDecoder::emitFrame(bool isAudio)
{
demuxer_->emitFrame(isAudio);
return demuxer_->emitFrame(isAudio);
}
MediaDecoder::MediaDecoder()
......
......@@ -141,7 +141,7 @@ public:
int64_t getDuration() const;
bool seekFrame(int stream_index, int64_t timestamp);
void setNeedFrameCb(std::function<void()> cb);
void emitFrame(bool isAudio);
bool emitFrame(bool isAudio);
private:
bool streamInfoFound_ {false};
......@@ -159,7 +159,7 @@ private:
std::function<void()> needFrameCb_;
std::function<void(bool)> fileFinishedCb_;
void clearFrames();
void pushFrameFrom(std::queue<std::unique_ptr<AVPacket, std::function<void(AVPacket*)>>>& buffer,
bool pushFrameFrom(std::queue<std::unique_ptr<AVPacket, std::function<void(AVPacket*)>>>& buffer,
bool isAudio,
std::mutex& mutex);
int baseWidth_ {};
......@@ -200,7 +200,7 @@ public:
void updateStartTime(int64_t startTime);
void emitFrame(bool isAudio);
bool emitFrame(bool isAudio);
void flushBuffers();
void setSeekTime(int64_t time);
#ifdef RING_ACCEL
......
......@@ -172,11 +172,9 @@ void
VideoInput::process()
{
if (playingFile_) {
if (paused_) {
if (paused_ || !decoder_->emitFrame(false)) {
std::this_thread::sleep_for(std::chrono::milliseconds(20));
return;
}
decoder_->emitFrame(false);
return;
}
if (switchPending_)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment