2012-05-19 23 views
8

Estoy escribiendo algunos programas que usan ffmpeg de manera extensiva y es multihebra, con instancias de clases múltiples.detectando un tiempo de espera en ffmpeg

Si la conexión de red se cae, ffmpeg se bloquea al leer. He encontrado un método para asignar una devolución de llamada que ffmpeg incendios periódicamente para comprobar si se debe abortar o no:

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

esto está bien, pero en ninguna parte en la web puedo encontrar qué * ctx contiene y cómo determinar si la devolución de llamada debería devolver 1 o 0. No puedo asignar un indicador estático de "abortar" ya que la clase tiene muchas instancias. Tampoco puedo depurar el código porque, por algún motivo, visual studio se niega a establecer un punto de interrupción en el retorno 0; línea, afirmando que no hay código ejecutable asociado a la ubicación. ¿Algunas ideas?

Respuesta

7

encontrados en la ffmpeg documentation:

Durante las operaciones de bloqueo, de devolución de llamada se denomina con opaco como parámetro. Si la devolución de llamada devuelve 1, se cancelará la operación de bloqueo .

Aquí está la declaración int_cb variable del tipo struct AVIOInterruptCB de su código:

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

Usted declaró parámetro opaca como NULL.

lo recomiendo a reescribir el código de inicialización de la siguiente manera:

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

usted será capaz de acceder a la instancia formatContext dentro interrupt_cb:

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

Hola, gracias, sí, lo leí, no tengo ni idea de qué paque contiene. – Sean

+0

Ah, bien, entonces, ¿qué debería poner allí? Si se trata de una constante estática, no funcionará bien con varias instancias ... – Sean

+0

OK brilliant, thanks! Con acceso al formatoContexto, ¿cómo puedo detectar que la transmisión ha expirado? – Sean

2

se puede pasar no sólo AVFormatContext * formatContext, pero cualquier otro puntero útil a alguna instancia, que contiene datos útiles para determinar qué tiempo se agotó

Cuestiones relacionadas