Hello Nicolas,
On 07/07/2016 08:00 PM, Nicolas George wrote:
If your worker thread is blocked on an I/O operation when the application
tries to close the muxer, it will send the corresponding messages and call
pthread_join(). Since the worker thread is still blocked in the I/O
operation, it will be stuck like that forever. To avoid that, the main
thread needs to arrange for the I/O operation to be cancelled
asynchronously, and that is what the interrupt callbeck is for.
On the other hand, we do not want to cancel writing the trailer if it is
just a little slow, so there must be some kind of timeout.
I actually thought about this and maybe I am still missing something,
but how is this different from the situation without FIFO muxer? Please,
correct me if I am wrong:
When the FIFO is not used, let's say an I/O operation somewhere inside
write_packet call blocks for a long time - actually it means it is
spinning in a cycle "wait for io with short timeout"<->"check return
value of interrupt callback". When the application decides to interrupt
the operation, it sets some interrupt condition (ffmpeg increments
received_nb_signals when receives SIGINT). The next call to interrupt
callback will cause the IO function to return AVERROR_EXIT causing
write_packet to fail with same error.
When the FIFO is used the write_packet call will return immediately. The
I/O blocking will happen in consumer thread, in some of the
fifo_thread_write_packet calls. Let's say that during that time all
packets are send to queue and write_trailer is called. The main thread
is blocked by pthread_join(). However when the interrupt condition is
set (for example by receiving SIGINT as in ffmpeg), this is still
handled by the blocking IO function which will return AVERROR_EXIT
causing fifo_thread_write_packet to fail with the same error, causing
the thread to terminate which unblocks write_trailer.
My point is that the same asynchronous mechanism which is supposed to
work in case of blocking I/O operation should work also in case
pthread_join is blocking, so the I/O operation should be terminated the
same way returning AVERROR_EXIT which will cause consumer thread to
terminate and unblock pthread_join call...
Am I missing something?
Thank you for your help
Regards,
Jan
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel