Commit 5671a4b5 authored by Christophe Massiot's avatar Christophe Massiot

video_decoder : ajout de la crop table dans AddBlock ;

video_parser : correction d'une erreur dans le commit pr�c�dent (on ne
fera pas la saturation dans le cas d'une DFT, de toute fa�on)
parent bb5805a3
...@@ -249,6 +249,10 @@ ...@@ -249,6 +249,10 @@
* picture. */ * picture. */
#define NB_VDEC 1 #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 * Generic decoder configuration
*******************************************************************************/ *******************************************************************************/
......
...@@ -33,10 +33,15 @@ typedef struct vdec_thread_s ...@@ -33,10 +33,15 @@ typedef struct vdec_thread_s
/*??*/ /*??*/
// int *pi_status; // int *pi_status;
/* Input properties */ /* Input properties */
struct vpar_thread_s * p_vpar; /* video_parser thread */ 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 #ifdef STATS
/* Statistics */ /* Statistics */
count_t c_loops; /* number of loops */ count_t c_loops; /* number of loops */
...@@ -54,7 +59,7 @@ typedef struct vdec_thread_s ...@@ -54,7 +59,7 @@ typedef struct vdec_thread_s
/***************************************************************************** /*****************************************************************************
* Function pointers * 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 * Prototypes
...@@ -64,6 +69,6 @@ struct vpar_thread_s; ...@@ -64,6 +69,6 @@ struct vpar_thread_s;
/* Thread management functions */ /* Thread management functions */
vdec_thread_t * vdec_CreateThread ( struct vpar_thread_s *p_vpar /*, int *pi_status */ ); 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_DestroyThread ( vdec_thread_t *p_vdec /*, int *pi_status */ );
void vdec_AddBlock( elem_t*, data_t*, int ); void vdec_AddBlock( vdec_thread_t*, elem_t*, data_t*, int );
void vdec_CopyBlock( elem_t*, data_t*, int ); void vdec_CopyBlock( vdec_thread_t*, elem_t*, data_t*, int );
void vdec_DummyBlock( elem_t*, data_t*, int ); void vdec_DummyBlock( vdec_thread_t*, elem_t*, data_t*, int );
...@@ -126,6 +126,10 @@ void vdec_DestroyThread( vdec_thread_t *p_vdec /*, int *pi_status */ ) ...@@ -126,6 +126,10 @@ void vdec_DestroyThread( vdec_thread_t *p_vdec /*, int *pi_status */ )
*******************************************************************************/ *******************************************************************************/
static int InitThread( vdec_thread_t *p_vdec ) 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); intf_DbgMsg("vdec debug: initializing video decoder thread %p\n", p_vdec);
/* Initialize other properties */ /* Initialize other properties */
...@@ -138,6 +142,23 @@ static int InitThread( vdec_thread_t *p_vdec ) ...@@ -138,6 +142,23 @@ static int InitThread( vdec_thread_t *p_vdec )
p_vdec->c_decoded_b_pictures = 0; p_vdec->c_decoded_b_pictures = 0;
#endif #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 */ /* Mark thread as running and return */
intf_DbgMsg("vdec debug: InitThread(%p) succeeded\n", p_vdec); intf_DbgMsg("vdec debug: InitThread(%p) succeeded\n", p_vdec);
return( 0 ); return( 0 );
...@@ -278,7 +299,8 @@ static void DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb ) ...@@ -278,7 +299,8 @@ static void DecodeMacroblock( vdec_thread_t *p_vdec, macroblock_t * p_mb )
/******************************************************************************* /*******************************************************************************
* vdec_AddBlock : add a block * 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; int i_x, i_y;
...@@ -286,8 +308,12 @@ void vdec_AddBlock( elem_t * p_block, data_t * p_data, int i_incr ) ...@@ -286,8 +308,12 @@ void vdec_AddBlock( elem_t * p_block, data_t * p_data, int i_incr )
{ {
for( i_x = 0; i_x < 8; i_x++ ) 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++; *p_data++ += *p_block++;
#endif
} }
p_data += i_incr; p_data += i_incr;
} }
...@@ -296,7 +322,8 @@ void vdec_AddBlock( elem_t * p_block, data_t * p_data, int i_incr ) ...@@ -296,7 +322,8 @@ void vdec_AddBlock( elem_t * p_block, data_t * p_data, int i_incr )
/******************************************************************************* /*******************************************************************************
* vdec_CopyBlock : copy a block * 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; int i_x, i_y;
...@@ -322,6 +349,7 @@ void vdec_CopyBlock( elem_t * p_block, data_t * p_data, int i_incr ) ...@@ -322,6 +349,7 @@ void vdec_CopyBlock( elem_t * p_block, data_t * p_data, int i_incr )
/******************************************************************************* /*******************************************************************************
* vdec_DummyBlock : dummy function that does nothing * 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 )
{ {
} }
...@@ -81,7 +81,8 @@ vpar_thread_t * vpar_CreateThread( /* video_cfg_t *p_cfg, */ input_thread_t *p_i ...@@ -81,7 +81,8 @@ vpar_thread_t * vpar_CreateThread( /* video_cfg_t *p_cfg, */ input_thread_t *p_i
/* /*
* Initialize the input properties * 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_mutex_init( &p_vpar->fifo.data_lock );
vlc_cond_init( &p_vpar->fifo.data_wait ); vlc_cond_init( &p_vpar->fifo.data_wait );
p_vpar->fifo.i_start = 0; p_vpar->fifo.i_start = 0;
...@@ -221,7 +222,7 @@ static int InitThread( vpar_thread_t *p_vpar ) ...@@ -221,7 +222,7 @@ static int InitThread( vpar_thread_t *p_vpar )
} }
/* Initialize lookup tables */ /* Initialize lookup tables */
#ifdef MPEG2_COMPLIANT #if defined(MPEG2_COMPLIANT) && !defined(VDEC_DFT)
vpar_InitCrop( p_vpar ); vpar_InitCrop( p_vpar );
#endif #endif
InitMbAddrInc( p_vpar ); InitMbAddrInc( p_vpar );
......
...@@ -142,7 +142,7 @@ extern int pi_scan[2][64] = ...@@ -142,7 +142,7 @@ extern int pi_scan[2][64] =
* vpar_InitCrop : Initialize the crop table for saturation * vpar_InitCrop : Initialize the crop table for saturation
* (ISO/IEC 13818-2 section 7.4.3) * (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 ) void vpar_InitCrop( vpar_thread_t * p_vpar )
{ {
int i_dummy; int i_dummy;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment