* vpar_blocks.c : blocks parsing
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: vpar_blocks.c,v 1.67 2000/12/21 17:19:54 massiot Exp $
+ * $Id: vpar_blocks.c,v 1.72 2001/01/18 05:13:23 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Jean-Marc Dressler <polux@via.ecp.fr>
*****************************************************************************/
#include "defs.h"
-#include <sys/types.h> /* on BSD, uio.h needs types.h */
-#include <sys/uio.h> /* "input.h" */
#include <string.h> /* memset */
#include "config.h"
#include "video.h"
#include "video_output.h"
+#include "video_decoder.h"
+#include "vdec_motion.h"
#include "../video_decoder/vdec_idct.h"
-#include "../video_decoder/video_decoder.h"
-#include "../video_decoder/vdec_motion.h"
-#include "../video_decoder/vpar_blocks.h"
+#include "vpar_blocks.h"
#include "../video_decoder/vpar_headers.h"
#include "../video_decoder/vpar_synchro.h"
#include "../video_decoder/video_parser.h"
FillDCTTable( p_vpar->ppl_dct_coef[1], pl_DCT_tab6, 1, 16, 16 );
}
+/*****************************************************************************
+ * vpar_InitScanTable : Initialize scan table
+ *****************************************************************************/
+void vpar_InitScanTable( vpar_thread_t * p_vpar )
+{
+ int i;
+
+ memcpy( p_vpar->ppi_scan, pi_scan, sizeof(pi_scan) );
+ p_vpar->pf_norm_scan( p_vpar->ppi_scan );
+
+ /* If scan table has changed, we must change the quantization matrices. */
+ for( i = 0; i < 64; i++ )
+ {
+ p_vpar->pi_default_intra_quant[ p_vpar->ppi_scan[0][i] ] =
+ pi_default_intra_quant[ pi_scan[0][i] ];
+ p_vpar->pi_default_nonintra_quant[ p_vpar->ppi_scan[0][i] ] =
+ pi_default_nonintra_quant[ pi_scan[0][i] ];
+ }
+}
+
/*
* Block parsing
/* There should be no D picture in non-intra blocks */
if( p_vpar->picture.i_coding_type == D_CODING_TYPE )
- intf_ErrMsg("vpar error : D-picture in non intra block\n");
+ intf_ErrMsg("vpar error : D-picture in non intra block");
/* Decoding of the AC coefficients */
break;
case DCT_EOB:
-#ifdef HAVE_MMX
- /* The MMX IDCT has a precision problem with non-intra
- * blocks. */
- p_mb->ppi_blocks[i_b][0] += 4;
-#endif
if( i_nc <= 1 )
{
- p_mb->pf_idct[i_b] = vdec_SparseIDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_sparse_idct;
p_mb->pi_sparse_pos[i_b] = i_coef;
}
else
{
- p_mb->pf_idct[i_b] = vdec_IDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_idct;
}
return;
break;
}
- i_pos = pi_scan[p_vpar->picture.b_alternate_scan][i_parse];
+ i_pos = p_vpar->ppi_scan[p_vpar->picture.b_alternate_scan][i_parse];
i_level = ( ((i_level << 1) + 1) * p_vpar->mb.i_quantizer_scale
* p_vpar->sequence.nonintra_quant.pi_matrix[i_pos] ) >> 4;
p_mb->ppi_blocks[i_b][i_pos] = b_sign ? -i_level : i_level;
}
- intf_ErrMsg("vpar error: DCT coeff (non-intra) is out of bounds\n");
+ intf_ErrMsg("vpar error: DCT coeff (non-intra) is out of bounds");
p_vpar->picture.b_error = 1;
}
case DCT_EOB:
if( i_nc <= 1 )
{
- p_mb->pf_idct[i_b] = vdec_SparseIDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_sparse_idct;
p_mb->pi_sparse_pos[i_b] = i_coef;
}
else
{
- p_mb->pf_idct[i_b] = vdec_IDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_idct;
}
return;
}
/* Determine the position of the block in the frame */
- i_pos = pi_scan[p_vpar->picture.b_alternate_scan][i_parse];
+ i_pos = p_vpar->ppi_scan[p_vpar->picture.b_alternate_scan][i_parse];
i_level = ( i_level *
p_vpar->mb.i_quantizer_scale *
p_vpar->sequence.intra_quant.pi_matrix[i_pos] ) >> 3;
p_mb->ppi_blocks[i_b][i_pos] = b_sign ? -i_level : i_level;
}
- intf_ErrMsg("vpar error: DCT coeff (intra) is out of bounds\n");
+ intf_ErrMsg("vpar error: DCT coeff (intra) is out of bounds");
p_vpar->picture.b_error = 1;
}
boolean_t b_dc;
boolean_t b_sign;
boolean_t b_chroma;
- int * pi_quant;
+ u8 * pi_quant;
/* Give the chromatic component (0, 1, 2) */
i_cc = pi_cc_index[i_b];
#endif
if( i_nc <= 1 )
{
- p_mb->pf_idct[i_b] = vdec_SparseIDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_sparse_idct;
p_mb->pi_sparse_pos[i_b] = i_coef;
}
else
{
- p_mb->pf_idct[i_b] = vdec_IDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_idct;
}
return;
break;
}
- i_pos = pi_scan[p_vpar->picture.b_alternate_scan][i_parse];
+ i_pos = p_vpar->ppi_scan[p_vpar->picture.b_alternate_scan][i_parse];
i_level = ( ((i_level << 1) + 1) * p_vpar->mb.i_quantizer_scale
* pi_quant[i_pos] ) >> 5;
p_mb->ppi_blocks[i_b][i_pos] = b_sign ? -i_level : i_level;
}
- intf_ErrMsg("vpar error: DCT coeff (non-intra) is out of bounds\n");
+ intf_ErrMsg("vpar error: DCT coeff (non-intra) is out of bounds");
p_vpar->picture.b_error = 1;
}
boolean_t b_vlc_intra;
boolean_t b_sign;
boolean_t b_chroma;
- int * pi_quant;
+ u8 * pi_quant;
/* Give the chromatic component (0, 1, 2) */
i_cc = pi_cc_index[i_b];
case DCT_EOB:
if( i_nc <= 1 )
{
- p_mb->pf_idct[i_b] = vdec_SparseIDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_sparse_idct;
p_mb->pi_sparse_pos[i_b] = i_coef;
}
else
{
- p_mb->pf_idct[i_b] = vdec_IDCT;
+ p_mb->pf_idct[i_b] = p_vpar->pf_idct;
}
return;
}
/* Determine the position of the block in the frame */
- i_pos = pi_scan[p_vpar->picture.b_alternate_scan][i_parse];
+ i_pos = p_vpar->ppi_scan[p_vpar->picture.b_alternate_scan][i_parse];
i_level = ( i_level *
p_vpar->mb.i_quantizer_scale *
pi_quant[i_pos] ) >> 4;
p_mb->ppi_blocks[i_b][i_pos] = b_sign ? -i_level : i_level;
}
- intf_ErrMsg("vpar error: DCT coeff (intra) is out of bounds\n");
+ intf_ErrMsg("vpar error: DCT coeff (intra) is out of bounds");
p_vpar->picture.b_error = 1;
}
if( (i_code -= 12) < 0 )
{
p_vpar->picture.b_error = 1;
- intf_DbgMsg( "vpar debug: Invalid motion_vector code\n" );
+ intf_DbgMsg( "vpar debug: Invalid motion_vector code" );
return 0;
}
{
macroblock_t * p_mb;
- static f_motion_t pf_motion_skipped[4][4] =
- {
- {NULL, NULL, NULL, NULL},
- {NULL, vdec_MotionFieldField420, vdec_MotionFieldField420,
- vdec_MotionFrameFrame420},
- {NULL, vdec_MotionFieldField422, vdec_MotionFieldField422,
- vdec_MotionFrameFrame422},
- {NULL, vdec_MotionFieldField444, vdec_MotionFieldField444,
- vdec_MotionFrameFrame444},
- };
-
if( i_coding_type == I_CODING_TYPE )
{
- intf_DbgMsg("vpar error: skipped macroblock in I-picture\n");
+ intf_DbgMsg("vpar error: skipped macroblock in I-picture");
p_vpar->picture.b_error = 1;
return;
}
i_structure, b_second_field );
/* Motion type is picture structure. */
- p_mb->pf_motion = pf_motion_skipped[i_chroma_format]
- [i_structure];
+ p_mb->pf_motion = p_vpar->ppf_motion_skipped[i_chroma_format]
+ [i_structure];
p_mb->i_coded_block_pattern = 0;
/* Motion direction and motion vectors depend on the coding type. */
boolean_t b_second_field ) /* second field of a
* field picture */
{
- static f_motion_t pppf_motion[4][2][4] =
- {
- { {NULL, NULL, NULL, NULL},
- {NULL, NULL, NULL, NULL}
- },
- { {NULL, vdec_MotionFieldField420, vdec_MotionField16x8420,
- vdec_MotionFieldDMV420},
- {NULL, vdec_MotionFrameField420, vdec_MotionFrameFrame420,
- vdec_MotionFrameDMV420}
- },
- { {NULL, vdec_MotionFieldField422, vdec_MotionField16x8422,
- vdec_MotionFieldDMV422},
- {NULL, vdec_MotionFrameField422, vdec_MotionFrameFrame422,
- vdec_MotionFrameDMV422}
- },
- { {NULL, vdec_MotionFieldField444, vdec_MotionField16x8444,
- vdec_MotionFieldDMV444},
- {NULL, vdec_MotionFrameField444, vdec_MotionFrameFrame444,
- vdec_MotionFrameDMV444}
- }
- };
static int pi_x[12] = {0,8,0,8,0,0,0,0,8,8,8,8};
static int pi_y[2][12] = { {0,0,8,8,0,0,8,8,0,0,8,8},
{0,0,1,1,0,0,1,1,0,0,1,1} };
if( i_inc < 0 )
{
- intf_ErrMsg( "vpar error: bad address increment (%d)\n", i_inc );
+ intf_ErrMsg( "vpar error: bad address increment (%d)", i_inc );
p_vpar->picture.b_error = 1;
return;
}
= 1 << (7 + p_vpar->picture.i_intra_dc_precision);
/* Motion function pointer. */
- p_mb->pf_motion = pppf_motion[i_chroma_format]
- [i_structure == FRAME_STRUCTURE]
- [p_vpar->mb.i_motion_type];
+ p_mb->pf_motion = p_vpar->pppf_motion[i_chroma_format]
+ [i_structure == FRAME_STRUCTURE]
+ [p_vpar->mb.i_motion_type];
if( p_mb->i_mb_type & MB_PATTERN )
{
if( *pi_mb_address < i_mb_address_save )
{
- intf_ErrMsg( "vpar error: slices do not follow, maybe a PES has been trashed\n" );
+ intf_ErrMsg( "vpar error: slices do not follow, maybe a PES has been trashed" );
p_vpar->picture.b_error = 1;
return;
}
if( ppf_parse_mb[i_structure]
[p_vpar->picture.i_coding_type] == NULL )
{
- intf_ErrMsg( "vpar error: bad ppf_parse_mb function pointer (struct:%d, coding type:%d)\n",
+ intf_ErrMsg( "vpar error: bad ppf_parse_mb function pointer (struct:%d, coding type:%d)",
i_structure, i_coding_type );
}
else
< SLICE_START_CODE_MIN) ||
(i_dummy > SLICE_START_CODE_MAX) )
{
- intf_DbgMsg("vpar debug: premature end of picture\n");
+ intf_DbgMsg("vpar debug: premature end of picture");
p_vpar->picture.b_error = 1;
break;
}