* vpar_pool.c : management of the pool of decoder threads
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: vpar_pool.c,v 1.3 2001/12/09 17:01:37 sam Exp $
+ * $Id: vpar_pool.c,v 1.9 2002/06/01 12:32:00 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include "defs.h"
-
#include <string.h> /* memcpy(), memset() */
#include <stdlib.h> /* realloc() */
-#include "common.h"
-#include "intf_msg.h"
-#include "threads.h"
-#include "mtime.h"
-
-#include "video.h"
-#include "video_output.h"
-
-#include "modules_export.h"
-#include "stream_control.h"
-#include "input_ext-dec.h"
-
+#include <vlc/vlc.h>
+#include <vlc/vout.h>
+#include <vlc/decoder.h>
#include "vdec_ext-plugins.h"
#include "vpar_pool.h"
int j;
/* Initialize mutex and cond. */
- vlc_mutex_init( &p_vpar->pool.lock );
+ vlc_mutex_init( p_vpar->p_fifo, &p_vpar->pool.lock );
vlc_cond_init( &p_vpar->pool.wait_empty );
vlc_cond_init( &p_vpar->pool.wait_undecoded );
/* Initialize fake video decoder structure (used when
* decoder == parser). */
- if ( (p_vpar->pool.p_vdec =
- (vdec_thread_t *)malloc( sizeof(vdec_thread_t) )) == NULL )
+ p_vpar->pool.p_vdec = vlc_object_create( p_vpar->p_fifo,
+ sizeof(vdec_thread_t) );
+ if ( p_vpar->pool.p_vdec == NULL )
{
- intf_ErrMsg("vdec error: not enough memory for vdec_CreateThread() to create the new thread");
+ msg_Err( p_vpar->p_fifo, "out of memory" );
p_vpar->p_fifo->b_error = 1;
return;
}
- p_vpar->pool.p_vdec->b_die = 0;
p_vpar->pool.p_vdec->p_pool = &p_vpar->pool;
vdec_InitThread( p_vpar->pool.p_vdec );
+ vlc_object_attach( p_vpar->pool.p_vdec, p_vpar->p_fifo );
+
for( j = 0; j < 12; j++ )
{
p_vpar->pool.mb.p_idcts[j].pi_block =
- memalign( 16, 64 * sizeof(dctelem_t) );
+ vlc_memalign( &p_vpar->pool.mb.p_idcts[j].pi_block_orig,
+ 16, 64 * sizeof(dctelem_t) );
}
}
int i_new_smp;
stream_ctrl_t * p_control;
- p_control = p_vpar->p_config->p_stream_ctrl;
+ p_control = p_vpar->p_fifo->p_stream_ctrl;
vlc_mutex_lock( &p_control->control_lock );
i_new_smp = p_control->i_smp;
vlc_mutex_unlock( &p_control->control_lock );
{
int j;
+ vlc_object_unlink_all( p_vpar->pool.pp_vdec[i] );
vdec_DestroyThread( p_vpar->pool.pp_vdec[i] );
for( j = 0; j < 12; j++ )
{
- free( p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block );
+ free( p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block_orig );
}
}
for( j = 0; j < 12; j++ )
{
p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block =
- memalign( 16, 64 * sizeof(dctelem_t) );
+ vlc_memalign( &p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block_orig,
+ 16, 64 * sizeof(dctelem_t) );
}
p_vpar->pool.pp_vdec[i] = vdec_CreateThread( &p_vpar->pool );
+ vlc_object_attach( p_vpar->pool.pp_vdec[i], p_vpar->p_fifo );
}
}
{
int i;
+ for( i = 0; i < 12; i++ )
+ {
+ free( p_vpar->pool.mb.p_idcts[i].pi_block_orig );
+ }
+
for( i = 0; i < p_vpar->pool.i_smp; i++ )
{
int j;
+ vlc_object_unlink_all( p_vpar->pool.pp_vdec[i] );
vdec_DestroyThread( p_vpar->pool.pp_vdec[i] );
for( j = 0; j < 12; j++ )
{
- free( p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block );
+ free( p_vpar->pool.p_macroblocks[i].p_idcts[j].pi_block_orig );
}
}
}
/* Free fake video decoder (used when parser == decoder). */
+ vlc_object_unlink_all( p_vpar->pool.p_vdec );
vdec_EndThread( p_vpar->pool.p_vdec );
+ vlc_object_destroy( p_vpar->pool.p_vdec );
/* Destroy lock and cond. */
vlc_mutex_destroy( &p_vpar->pool.lock );