#include "decoder_fifo.h"
#include "video.h"
#include "video_output.h"
-#include "video_parser.h"
-#include "undec_picture.h"
-#include "video_fifo.h"
+#include "vdec_idct.h"
#include "video_decoder.h"
+#include "vdec_motion.h"
+
+#include "vpar_blocks.h"
+#include "vpar_headers.h"
+#include "video_fifo.h"
+#include "video_parser.h"
/*
* Local prototypes
{
macroblock_t * p_mb;
- if( (p_mb = GetMacroblock( &p_vdec->p_vpar.vfifo )) != NULL )
+ if( (p_mb = vpar_GetMacroblock( &p_vdec->p_vpar->vfifo )) != NULL )
{
DecodeMacroblock( p_vdec, p_mb );
}
*******************************************************************************/
static void ErrorThread( vdec_thread_t *p_vdec )
{
- undec_picture_t * p_undec_p;
+ macroblock_t * p_mb;
/* Wait until a `die' order */
while( !p_vdec->b_die )
{
- p_undec_p = GetPicture( p_vdec->p_vpar.vfifo );
- DestroyPicture( p_vdec->p_vpar.vfifo, p_undec_p );
+ p_mb = vpar_GetMacroblock( &p_vdec->p_vpar->vfifo );
+ vpar_DestroyMacroblock( &p_vdec->p_vpar->vfifo, p_mb );
/* Sleep a while */
msleep( VDEC_IDLE_SLEEP );
/*
* Inverse DCT (ISO/IEC 13818-2 section Annex A)
*/
- (*p_mb->pf_idct[i_b])( p_mb, p_mb->ppi_blocks[i_b], p_mb->pi_sparse_pos[i_b] );
+ (p_mb->pf_idct[i_b])( p_mb->ppi_blocks[i_b], p_mb->pi_sparse_pos[i_b] );
/*
* Adding prediction and coefficient data (ISO/IEC 13818-2 section 7.6.8)
*/
- (*p_mb->pf_addb[i_b])( p_mb->ppi_blocks[i_b],
+ (p_mb->pf_addb[i_b])( p_mb->ppi_blocks[i_b],
p_mb->p_data[i_b], p_mb->i_lum_incr );
}
/*
* Inverse DCT (ISO/IEC 13818-2 section Annex A)
*/
- (*p_mb->pf_idct[i_b])( p_mb, p_mb->ppi_blocks[i_b], p_mb->pi_sparse_pos[i_b] );
+ (p_mb->pf_idct[i_b])( p_mb->ppi_blocks[i_b], p_mb->pi_sparse_pos[i_b] );
/*
* Adding prediction and coefficient data (ISO/IEC 13818-2 section 7.6.8)
*/
- (*p_mb->pf_addb[i_b])( p_mb->ppi_blocks[i_b],
+ (p_mb->pf_addb[i_b])( p_mb->ppi_blocks[i_b],
p_mb->p_data[i_b], p_mb->i_chroma_incr );
}
* Decoding is finished, release the macroblock and free
* unneeded memory.
*/
- vpar_ReleaseMacroblock( &p_vdec->p_vpar.vfifo, p_mb );
+ vpar_ReleaseMacroblock( &p_vdec->p_vpar->vfifo, p_mb );
}
/*******************************************************************************
#include "decoder_fifo.h"
#include "video.h"
#include "video_output.h"
-#include "video_parser.h"
-#include "video_fifo.h"
+#include "vdec_idct.h"
#include "video_decoder.h"
+#include "vdec_motion.h"
+
+#include "vpar_blocks.h"
+#include "vpar_headers.h"
+#include "video_fifo.h"
+#include "video_parser.h"
/*
* Local prototypes
static __inline__ int MacroblockAddressIncrement( vpar_thread_t * p_vpar );
static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
macroblock_t * p_mb );
+static void vpar_DecodeMPEG1Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
+static void vpar_DecodeMPEG1Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
+static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
+static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
-typedef (void *) f_decode_block_t( vpar_thread_t *, macroblock_t *, int );
+typedef void (*f_decode_block_t)( vpar_thread_t *, macroblock_t *, int );
/*****************************************************************************
* vpar_ParseMacroblock : Parse the next macroblock
vdec_MotionField, vdec_MotionFrame};
/* Reset DC predictors (7.2.1). */
- p_vpar->slice.pi_dct_pred[0] = p_vpar->slice.pi_dct_pred[1]
- = p_vpar->slice.pi_dct_pred[2]
+ p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
+ = p_vpar->slice.pi_dc_dct_pred[2]
= pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
if( p_vpar->picture.i_coding_type == P_CODING_TYPE )
if( (p_mb = p_vpar->picture.pp_mb[i_mb_base + i_mb] =
vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
{
- p_vpar->picture.b_error = TRUE;
+ p_vpar->picture.b_error = 1;
intf_ErrMsg("vpar error: macroblock list is empty !");
return;
}
if( (p_mb = p_vpar->picture.pp_mb[i_mb_base + *pi_mb_address] =
vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
{
- p_vpar->picture.b_error = TRUE;
+ p_vpar->picture.b_error = 1;
intf_ErrMsg("vpar error: macroblock list is empty !");
return;
}
/* Calculate block coordinates. */
p_mb->p_data[i_b] = pi_data[i_b] + pi_pos[i_b >> 2]
+ pi_y[i_b]*pi_width[i_b >> 2]
- + (p_vpar->mb.b_dct_type & ((i_b & 2) >> 1))
+ + (p_vpar->mb.b_dct_type & ((i_b & 2) >> 1));
/* INACHEVÉ parce que trop pourri ! */
}
else
static int pi_dc_dct_reinit[4] = {128,256,512,1024};
/* Reset DC predictors (7.2.1). */
- p_vpar->slice.pi_dct_pred[0] = p_vpar->slice.pi_dct_pred[1]
- = p_vpar->slice.pi_dct_pred[2]
+ p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
+ = p_vpar->slice.pi_dc_dct_pred[2]
= pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
}
else if( !p_vpar->picture.b_concealment_mv )
static int ppi_mv_format[2][4] = { {0, 1, 1, 1}, {0, 1, 2, 1} };
/* Get macroblock_type. */
- p_vpar->mb.i_mb_type = (*p_vpar->picture.pf_macroblock_type)
+ p_vpar->mb.i_mb_type = (p_vpar->picture.pf_macroblock_type)
( vpar_thread_t * p_vpar );
/* SCALABILITY : warning, we don't know if spatial_temporal_weight_code
* has to be dropped, take care if you use scalable streams. */
/* DumpBits( &p_vpar->bit_stream, 2 ); */
- if( !(p_vpar->mb.i_mb_type & (MB_MOTION_FORWARD | MB_MOTION_BACKWARD))
+ if( !(p_vpar->mb.i_mb_type & (MB_MOTION_FORWARD || MB_MOTION_BACKWARD))
|| p_vpar->picture.b_frame_pred_frame_dct )
{
/* If mb_type has neither MOTION_FORWARD nor MOTION_BACKWARD, this
p_vpar->mb.i_motion_type = GetBits( &p_vpar->bit_stream, 2 );
}
- p_mb->f_motion = pf_motion[p_vpar->picture.b_frame_structure]
+ p_mb->pf_motion = pf_motion[p_vpar->picture.b_frame_structure]
[p_vpar->mb.i_motion_type];
p_vpar->mb.i_mv_count = ppi_mv_count[p_vpar->picture.b_frame_structure]
[p_vpar->mb.i_motion_type];
if( (p_vpar->picture.i_structure == FRAME_STRUCTURE) &&
(!p_vpar->picture.b_frame_pred_frame_dct) &&
- (p_var->mb.i_mb_type & (MB_PATTERN|MB_INTRA)) )
+ (p_vpar->mb.i_mb_type & (MB_PATTERN|MB_INTRA)) )
{
p_vpar->mb.b_dct_type = GetBits( &p_vpar->bit_stream, 1 );
}
/*****************************************************************************
* vpar_DecodeMPEG1Non : decode MPEG-1 non-intra blocks
*****************************************************************************/
-void vpar_DecodeMPEG1Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
+static void vpar_DecodeMPEG1Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
{
/* À pomper dans Berkeley. Pour toutes ces fonctions, il faut mettre
p_mb->pf_idct[i_b] à :
{
/* Remove end_of_macroblock (always 1, prevents startcode emulation)
* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
- DumpBits( &p_vpar->fifo, 1 );
+ DumpBits( &p_vpar->bit_stream, 1 );
}
}
/*****************************************************************************
* vpar_DecodeMPEG1Intra : decode MPEG-1 intra blocks
*****************************************************************************/
-void vpar_DecodeMPEG1Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
+static void vpar_DecodeMPEG1Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
{
/* À pomper dans Berkeley. */
{
/* Remove end_of_macroblock (always 1, prevents startcode emulation)
* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
- DumpBits( &p_vpar->fifo, 1 );
+ DumpBits( &p_vpar->bit_stream, 1 );
}
}
/*****************************************************************************
* vpar_DecodeMPEG2Non : decode MPEG-2 non-intra blocks
*****************************************************************************/
-void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
+static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
{
/* À pomper dans Berkeley. Bien sûr les matrices seront différentes... */
}
/*****************************************************************************
* vpar_DecodeMPEG2Intra : decode MPEG-2 intra blocks
*****************************************************************************/
-void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
+static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
{
/* À pomper dans Berkeley. */
}