* picture. */
#define NB_VDEC 1
+/* Maximum range of values out of the IDCT + motion compensation. Only
+ * used if you define MPEG2_COMPLIANT above. */
+#define VDEC_CROPRANGE 2048
+
/*******************************************************************************
* Generic decoder configuration
*******************************************************************************/
/*??*/
// int *pi_status;
-
/* Input properties */
struct vpar_thread_s * p_vpar; /* video_parser thread */
+ /* Lookup tables */
+#ifdef MPEG2_COMPLIANT
+ u8 pi_crop_buf[VDEC_CROPRANGE];
+ u8 * pi_crop,
+#endif
+
#ifdef STATS
/* Statistics */
count_t c_loops; /* number of loops */
/*****************************************************************************
* Function pointers
*****************************************************************************/
-typedef void (*f_addb_t)( elem_t*, data_t*, int );
+typedef void (*f_addb_t)( vdec_thread_t*, elem_t*, data_t*, int );
/*****************************************************************************
* Prototypes
/* Thread management functions */
vdec_thread_t * vdec_CreateThread ( struct vpar_thread_s *p_vpar /*, int *pi_status */ );
void vdec_DestroyThread ( vdec_thread_t *p_vdec /*, int *pi_status */ );
-void vdec_AddBlock( elem_t*, data_t*, int );
-void vdec_CopyBlock( elem_t*, data_t*, int );
-void vdec_DummyBlock( elem_t*, data_t*, int );
+void vdec_AddBlock( vdec_thread_t*, elem_t*, data_t*, int );
+void vdec_CopyBlock( vdec_thread_t*, elem_t*, data_t*, int );
+void vdec_DummyBlock( vdec_thread_t*, elem_t*, data_t*, int );
*******************************************************************************/
static int InitThread( vdec_thread_t *p_vdec )
{
+#ifdef MPEG2_COMPLIANT
+ int i_dummy;
+#endif
+
intf_DbgMsg("vdec debug: initializing video decoder thread %p\n", p_vdec);
/* Initialize other properties */
p_vdec->c_decoded_b_pictures = 0;
#endif
+#ifdef MPEG2_COMPLIANT
+ /* Init crop table */
+ p_vdec->pi_crop = p_vdec->pi_crop_buf + (VDEC_CROPRANGE >> 1);
+ for( i_dummy = -VDEC_CROPRANGE; i_dummy < -256; i_dummy ++ )
+ {
+ p_vdec->pi_crop[i_dummy] = -256;
+ }
+ for( ; i_dummy < 255; i_dummy ++ )
+ {
+ p_vdec->pi_crop[i_dummy] = i_dummy;
+ }
+ for( ; i_dummy < (VDEC_CROPRANGE >> 1) -1; i_dummy++ )
+ {
+ p_vdec->pi_crop[i_dummy] = 255;
+ }
+#endif
+
/* Mark thread as running and return */
intf_DbgMsg("vdec debug: InitThread(%p) succeeded\n", p_vdec);
return( 0 );
/*******************************************************************************
* vdec_AddBlock : add a block
*******************************************************************************/
-void vdec_AddBlock( elem_t * p_block, data_t * p_data, int i_incr )
+void vdec_AddBlock( vdec_thread_t * p_vdec, elem_t * p_block, data_t * p_data,
+ int i_incr )
{
int i_x, i_y;
{
for( i_x = 0; i_x < 8; i_x++ )
{
- /* ??? Need clip to be MPEG-2 compliant */
+#ifdef MPEG2_COMPLIANT
+ *p_data = p_vdec->pi_clip[*p_data + *p_block++];
+ p_data++;
+#else
*p_data++ += *p_block++;
+#endif
}
p_data += i_incr;
}
/*******************************************************************************
* vdec_CopyBlock : copy a block
*******************************************************************************/
-void vdec_CopyBlock( elem_t * p_block, data_t * p_data, int i_incr )
+void vdec_CopyBlock( vdec_thread_t * p_vdec, elem_t * p_block, data_t * p_data,
+ int i_incr )
{
int i_x, i_y;
/*******************************************************************************
* vdec_DummyBlock : dummy function that does nothing
*******************************************************************************/
-void vdec_DummyBlock( elem_t * p_block, data_t * p_data, int i_incr )
+void vdec_DummyBlock( vdec_thread_t * p_vdec, elem_t * p_block, data_t * p_data,
+ int i_incr )
{
}
/*
* Initialize the input properties
*/
- /* Initialize the parser fifo's data lock and conditional variable and set * its buffer as empty */
+ /* 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;
}
/* Initialize lookup tables */
-#ifdef MPEG2_COMPLIANT
+#if defined(MPEG2_COMPLIANT) && !defined(VDEC_DFT)
vpar_InitCrop( p_vpar );
#endif
InitMbAddrInc( p_vpar );
* vpar_InitCrop : Initialize the crop table for saturation
* (ISO/IEC 13818-2 section 7.4.3)
*****************************************************************************/
-#ifdef MPEG2_COMPLIANT
+#if defined(MPEG2_COMPLIANT) && !defined(VDEC_DFT)
void vpar_InitCrop( vpar_thread_t * p_vpar )
{
int i_dummy;