bool FFmpegDecoder::readNextPacketNormal() { AVPacket packet; if (! m_pending_packet) { bool end_of_stream = false; // Read the next frame packet if (av_read_frame(m_format_context.get(), &packet) < 0) { if (url_ferror(m_format_context->pb) == 0) end_of_stream = true; else throw std::runtime_error("av_read_frame() failed"); } if (end_of_stream) { // If we reach the end of the stream, change the decoder state if (loop()) { m_clocks.reset(m_start); rewindButDontFlushQueues(); } else m_state = END_OF_STREAM; return false; } else { // Make the packet data available beyond av_read_frame() logical scope. if (av_dup_packet(&packet) < 0) throw std::runtime_error("av_dup_packet() failed"); m_pending_packet = FFmpegPacket(packet); } } // Send data packet if (m_pending_packet.type == FFmpegPacket::PACKET_DATA) { if (m_pending_packet.packet.stream_index == m_audio_index) { if (m_audio_queue.timedPush(m_pending_packet, 10)) { m_pending_packet.release(); return true; } } else if (m_pending_packet.packet.stream_index == m_video_index) { if (m_video_queue.timedPush(m_pending_packet, 10)) { m_pending_packet.release(); return true; } } else { m_pending_packet.clear(); return true; } } return false; }
bool FFmpegDecoder::readNextPacketNormal() { AVPacket packet; if (! m_pending_packet) { bool end_of_stream = false; // Read the next frame packet int error = av_read_frame(m_format_context.get(), &packet); if (error < 0) { if (error == static_cast<int>(AVERROR_EOF) || m_format_context.get()->pb->eof_reached) end_of_stream = true; else { OSG_FATAL << "av_read_frame() returned " << AvStrError(error) << std::endl; throw std::runtime_error("av_read_frame() failed"); } } if (end_of_stream) { // If we reach the end of the stream, change the decoder state if (loop()) { m_clocks.reset(m_start); rewindButDontFlushQueues(); } else m_state = END_OF_STREAM; return false; } else { // Make the packet data available beyond av_read_frame() logical scope. if ((error = av_dup_packet(&packet)) < 0) { OSG_FATAL << "av_dup_packet() returned " << AvStrError(error) << std::endl; throw std::runtime_error("av_dup_packet() failed"); } m_pending_packet = FFmpegPacket(packet); } } // Send data packet if (m_pending_packet.type == FFmpegPacket::PACKET_DATA) { if (m_pending_packet.packet.stream_index == m_audio_index) { if (m_audio_queue.timedPush(m_pending_packet, 10)) { m_pending_packet.release(); return true; } } else if (m_pending_packet.packet.stream_index == m_video_index) { if (m_video_queue.timedPush(m_pending_packet, 10)) { m_pending_packet.release(); return true; } } else { m_pending_packet.clear(); return true; } } return false; }