2012-05-19 29 views
8

Piszę oprogramowanie, które szeroko korzysta z ffmpeg i jest wielowątkowe, z wieloma instancjami klasy.Wykrywanie limitu czasu w ffmpeg

Jeśli połączenie sieciowe zostanie przerwane, ffmpeg zawiesza się przy odczycie. Znalazłem sposób przypisać zwrotnego że FFmpeg pożarów okresowo w celu sprawdzenia, czy powinien przerwać lub nie:

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) {...} 

to wszystko jest w porządku, ale nigdzie w internecie mogę znaleźć co * ctx zawiera i jak określić, czy wywołanie zwrotne powinno zwrócić wartość 1 lub 0. Nie mogę przypisać statycznej flagi "Przerwij", ponieważ klasa ma wiele instancji. Nie mogę również debugować kodu, ponieważ z jakiegoś powodu studio graficzne nie chce ustawić punktu przerwania na powrocie 0; linii, twierdząc, że żaden kod wykonywalny nie jest powiązany z lokalizacją. Jakieś pomysły?

Odpowiedz

7

Znaleziony w ffmpeg documentation:

podczas operacji blokowania, callback jest wywoływana z nieprzezroczysty jako parametru. Jeśli wywołanie zwrotne zwróci 1, operacja blokowania zostanie przerwana.

Oto deklaracja int_cb zmienna typu AVIOInterruptCB struct z kodu:

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL }; 

zadeklarowanej nieprzezroczysty parametr jako NULL.

polecam przepisać kod inicjalizacji tak:

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context(); 
formatContext->interrupt_callback.callback = interrupt_cb; 
formatContext->interrupt_callback.opaque = formatContext; 

będzie można uzyskać dostęp do formatContext instancji wewnątrz interrupt_cb:

static int interrupt_cb(void *ctx) 
{ 
    AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx); 
// do something 
    return 0; 
} 
+0

Cześć dzięki, tak, czytam to, nie mam pojęcia, co o paque zawiera. – Sean

+0

Ah OK - więc co powinienem tam umieścić? Jeśli jest statyczna, to nie będzie dobrze grać z wieloma instancjami ... – Sean

+0

OK, świetny, dzięki! Z dostępem do formatuContext jak mogę wykryć, że upłynął limit czasu strumienia? – Sean

2

można przekazać nie tylko AVFormatContext * formatContext, ale jakikolwiek inny użyteczny wskaźnik do jakiegoś przykładu, który zawiera przydatne dane do określenia, który wątek przekroczył limit czasu: