- /* Initialize the decoder fifo's data lock and conditional variable
- * and set its buffer as empty */
- vlc_mutex_init( &p_vpar->fifo.data_lock );
- vlc_cond_init( &p_vpar->fifo.data_wait );
- p_vpar->fifo.i_start = 0;
- p_vpar->fifo.i_end = 0;
- /* Initialize the bit stream structure */
- p_vpar->bit_stream.p_input = p_input;
- p_vpar->bit_stream.p_decoder_fifo = &p_vpar->fifo;
- p_vpar->bit_stream.fifo.buffer = 0;
- p_vpar->bit_stream.fifo.i_available = 0;
-
- /* FIXME !!!!?? */
- p_vpar->p_vout = p_main->p_intf->p_vout;
+ p_vpar->p_motion_module = module_Need( MODULE_CAPABILITY_MOTION, NULL );
+
+ if( p_vpar->p_motion_module == NULL )
+ {
+ intf_ErrMsg( "vpar error: no suitable motion compensation module" );
+ free( p_vpar );
+ return( 0 );
+ }
+
+#define M ( p_vpar->pppf_motion )
+#define S ( p_vpar->ppf_motion_skipped )
+#define F ( p_vpar->p_motion_module->p_functions->motion.functions.motion )
+ M[0][0][0] = M[0][0][1] = M[0][0][2] = M[0][0][3] = NULL;
+ M[0][1][0] = M[0][1][1] = M[0][1][2] = M[0][1][3] = NULL;
+ M[1][0][0] = NULL;
+ M[1][1][0] = NULL;
+ M[2][0][0] = NULL;
+ M[2][1][0] = NULL;
+ M[3][0][0] = NULL;
+ M[3][1][0] = NULL;
+
+ M[1][0][1] = F.pf_field_field_420;
+ M[1][1][1] = F.pf_frame_field_420;
+ M[2][0][1] = F.pf_field_field_422;
+ M[2][1][1] = F.pf_frame_field_422;
+ M[3][0][1] = F.pf_field_field_444;
+ M[3][1][1] = F.pf_frame_field_444;
+
+ M[1][0][2] = F.pf_field_16x8_420;
+ M[1][1][2] = F.pf_frame_frame_420;
+ M[2][0][2] = F.pf_field_16x8_422;
+ M[2][1][2] = F.pf_frame_frame_422;
+ M[3][0][2] = F.pf_field_16x8_444;
+ M[3][1][2] = F.pf_frame_frame_444;
+
+ M[1][0][3] = F.pf_field_dmv_420;
+ M[1][1][3] = F.pf_frame_dmv_420;
+ M[2][0][3] = F.pf_field_dmv_422;
+ M[2][1][3] = F.pf_frame_dmv_422;
+ M[3][0][3] = F.pf_field_dmv_444;
+ M[3][1][3] = F.pf_frame_dmv_444;
+
+ S[0][0] = S[0][1] = S[0][2] = S[0][3] = NULL;
+ S[1][0] = NULL;
+ S[2][0] = NULL;
+ S[3][0] = NULL;
+
+ S[1][1] = F.pf_field_field_420;
+ S[2][1] = F.pf_field_field_422;
+ S[3][1] = F.pf_field_field_444;
+
+ S[1][2] = F.pf_field_field_420;
+ S[2][2] = F.pf_field_field_422;
+ S[3][2] = F.pf_field_field_444;
+
+ S[1][3] = F.pf_frame_frame_420;
+ S[2][3] = F.pf_frame_frame_422;
+ S[3][3] = F.pf_frame_frame_444;
+#undef F
+#undef S
+#undef M
+
+ /*
+ * Choose the best IDCT module
+ */
+ p_vpar->p_idct_module = module_Need( MODULE_CAPABILITY_IDCT, NULL );
+
+ if( p_vpar->p_idct_module == NULL )
+ {
+ intf_ErrMsg( "vpar error: no suitable IDCT module" );
+ module_Unneed( p_vpar->p_motion_module );
+ free( p_vpar );
+ return( 0 );
+ }
+
+#define f p_vpar->p_idct_module->p_functions->idct.functions.idct
+ p_vpar->pf_init = f.pf_init;
+ p_vpar->pf_sparse_idct = f.pf_sparse_idct;
+ p_vpar->pf_idct = f.pf_idct;
+ p_vpar->pf_norm_scan = f.pf_norm_scan;
+#undef f