обнаружение таймаута в ffmpeg
Я пишу некоторое программное обеспечение, которое широко использует ffmpeg, и оно многопоточное, с несколькими экземплярами класса.
Если сетевое соединение выпадает ffmpeg зависает на чтении. Я нашел способ назначить обратный вызов, который ffmpeg периодически запускает, чтобы проверить, должен ли он прерваться или нет:
static int interrupt_cb(void *ctx)
{
// do something
return 0;
}
static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };
...
AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback = int_cb;
if ( libffmpeg::avformat_open_input( &formatContext, fileName, NULL, NULL ) !=0 ) {...}
Все это прекрасно, но нигде в Интернете я не могу найти, что содержит *ctx и как определить, должен ли обратный вызов возвращать 1 или 0. Я не могу назначить статику флаг "прервать", так как класс имеет много экземпляров. Я также не могу отладить код, так как по какой-то причине visual studio отказывается установить точку останова в строке return 0;, утверждая, что никакой исполняемый код не связан с местоположением. Есть идеи?
2 ответов:
Найдено в документации ffmpeg :
Во время операций блокировки обратный вызов вызывается с непрозрачным как параметр. Если обратный вызов возвращает 1 , то операция блокировки будет быть прерванным.
Вот объявление переменной int_cb типа AVIOInterruptCB struct из вашего кода:
static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };Вы объявили непрозрачный параметр как
NULL.Я бы рекомендовал переписать код инициализации следующим образом:
AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( ); formatContext->interrupt_callback.callback = interrupt_cb; formatContext->interrupt_callback.opaque = formatContext;Вы будете возможность доступа к экземпляру formatContext внутри
interrupt_cb:static int interrupt_cb(void *ctx) { AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx); // do something return 0; }
Вы можете передать не только AVFormatContext* formatContext, но и любой другой полезный указатель на некоторый экземпляр, который содержит полезные данные для определения, какой поток тайм-аут
Comments