обнаружение таймаута в 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;, утверждая, что никакой исполняемый код не связан с местоположением. Есть идеи?

689   2  

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

    Ничего не найдено.