Hi everyone,
I have got some troubles with ffmpeg plug-in.
I found, that it can play video file only one time. After finishing file, the 
second playing starting without sound and after 1 second has become frozen.

I found that the next code in plug-in processes the finishing of stream of 
packets:

        // 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;
        }

As a result, video either is looped or is stopped as stream. However, the state 
END_OF_STREAM in class FFmpegDecoderAudio interrupts computing present time and 
interrupts synchronization between audio and video streams

        if (m_packet.type == FFmpegPacket::PACKET_DATA)
        {
            if (m_packet.packet.pts != int64_t(AV_NOPTS_VALUE))
            {
                const double pts = av_q2d(m_stream->time_base) * 
m_packet.packet.pts;
                m_clocks.audioSetBufferEndPts(pts);
            }

            m_bytes_remaining = m_packet.packet.size;
            m_packet_data = m_packet.packet.data;
        }
        else if (m_packet.type == FFmpegPacket::PACKET_END_OF_STREAM)
        {
            m_end_of_stream = true;
        }
        else if (m_packet.type == FFmpegPacket::PACKET_FLUSH)
        {
            avcodec_flush_buffers(m_context);
        }

        // just output silence when we reached the end of stream
        if (m_end_of_stream)
        {
            memset(buffer, 0, size);
            return size;
        }

More over, class FFmpegImageStream does not have any callback function for the 
catching of the moment finishing of file. It means that the branch of _status 
== PLAYING is still when video stream is finished

                // Обработка команд управления
while (! done)
{
                        // Обработка условия воспроизведения
            if (_status == PLAYING)
            {


I create one decision of these problems:

if (loop())
 {
                                // Если воспроизведение зацикленно, то 
повторить цикл
m_clocks.reset(m_start);
rewindButDontFlushQueues();

m_stop = false;
}
else
{

if(m_device)
m_state = END_OF_STREAM; // Если источник сигнала видеоустройство
else
{
                                
FFmpegImageStream * const this_ = 
reinterpret_cast<FFmpegImageStream*>(m_imageStream);
                                                                                
f(this_)
{
this_->microSleep(3000000);

this_->rewind();
                                                
this_->pause();
}
                                                                                
}

}

Where m_device is a bool switch which has state true for live cam and false for 
local file. For the second state FFmpegImageStream has been gotten and after 
stopping process on 3 second the stream is rewind and state to pause. The video 
file can be played repeatedly.
I know that this trick looks ugly and wait any another idea.

With best regards.

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=52854#52854





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to