slice.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,200 行 · 第 1/5 页

C
2,200
字号
#define bits (decoder->bitstream_bits)#define bit_ptr (decoder->bitstream_ptr)    NEEDBITS (bit_buf, bits, bit_ptr);    /* Get the intra DC coefficient and inverse quantize it */    #ifdef JZ4740_MXU_OPT    /*    if (cc == 0)            decoder->dc_dct_pred[0] += get_luma_dc_dct_diff (decoder);    else            decoder->dc_dct_pred[cc] += get_chroma_dc_dct_diff (decoder);        decoder->DCTblock[0] = decoder->dc_dct_pred[cc];*/     if (cc == 0)        decoder->dc_dct_pred[0] += get_luma_dc_dct_diff (decoder);    else        decoder->dc_dct_pred[cc] += get_chroma_dc_dct_diff (decoder);    decoder->DCTblock[0] =        decoder->dc_dct_pred[cc] << (3 -decoder->intra_dc_precision);            #else    if (cc == 0)        decoder->DCTblock[0] =            decoder->dc_dct_pred[0] += get_luma_dc_dct_diff (decoder);    else        decoder->DCTblock[0] =            decoder->dc_dct_pred[cc] += get_chroma_dc_dct_diff (decoder);    #endif    if (decoder->mpeg1) {	if (decoder->coding_type != D_TYPE)	    get_mpeg1_intra_block (decoder);    } else if (decoder->intra_vlc_format)	get_intra_block_B15 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]);    else	get_intra_block_B14 (decoder, decoder->quantizer_matrix[cc ? 2 : 0]);    mpeg2_idct_copy (decoder->DCTblock, dest, stride);#undef bit_buf#undef bits#undef bit_ptr}static inline void slice_non_intra_DCT (mpeg2_decoder_t * const decoder,					const int cc,					uint8_t * const dest, const int stride){    int last;    if (decoder->mpeg1)	last = get_mpeg1_non_intra_block (decoder);    else	last = get_non_intra_block (decoder,				    decoder->quantizer_matrix[cc ? 3 : 1]);    mpeg2_idct_add (last, decoder->DCTblock, dest, stride);}#define MOTION_420(table,ref,motion_x,motion_y,size,y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = 2 * decoder->v_offset + motion_y + 2 * y;			      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y_ ## size)) {			      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size;	      \	motion_y = pos_y - 2 * decoder->v_offset - 2 * y;		      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \		    ref[0] + (pos_x >> 1) + (pos_y >> 1) * decoder->stride,   \		    decoder->stride, size);				      \    motion_x /= 2;	motion_y /= 2;					      \    xy_half = ((motion_y & 1) << 1) | (motion_x & 1);			      \    offset = (((decoder->offset + motion_x) >> 1) +			      \	      ((((decoder->v_offset + motion_y) >> 1) + y/2) *		      \	       decoder->uv_stride));					      \    table[4+xy_half] (decoder->dest[1] + y/2 * decoder->uv_stride +	      \		      (decoder->offset >> 1), ref[1] + offset,		      \		      decoder->uv_stride, size/2);			      \    table[4+xy_half] (decoder->dest[2] + y/2 * decoder->uv_stride +	      \		      (decoder->offset >> 1), ref[2] + offset,		      \		      decoder->uv_stride, size/2)#define MOTION_FIELD_420(table,ref,motion_x,motion_y,dest_field,op,src_field) \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    table[xy_half] (decoder->dest[0] + dest_field * decoder->stride +	      \		    decoder->offset,					      \		    (ref[0] + (pos_x >> 1) +				      \		     ((pos_y op) + src_field) * decoder->stride),	      \		    2 * decoder->stride, 8);				      \    motion_x /= 2;	motion_y /= 2;					      \    xy_half = ((motion_y & 1) << 1) | (motion_x & 1);			      \    offset = (((decoder->offset + motion_x) >> 1) +			      \	      (((decoder->v_offset >> 1) + (motion_y op) + src_field) *	      \	       decoder->uv_stride));					      \    table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride +    \		      (decoder->offset >> 1), ref[1] + offset,		      \		      2 * decoder->uv_stride, 4);			      \    table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride +    \		      (decoder->offset >> 1), ref[2] + offset,		      \		      2 * decoder->uv_stride, 4)#define MOTION_DMV_420(table,ref,motion_x,motion_y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride;		      \    table[xy_half] (decoder->dest[0] + decoder->offset,			      \		    ref[0] + offset, 2 * decoder->stride, 8);		      \    table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset,     \		    ref[0] + decoder->stride + offset,			      \		    2 * decoder->stride, 8);				      \    motion_x /= 2;	motion_y /= 2;					      \    xy_half = ((motion_y & 1) << 1) | (motion_x & 1);			      \    offset = (((decoder->offset + motion_x) >> 1) +			      \	      (((decoder->v_offset >> 1) + (motion_y & ~1)) *		      \	       decoder->uv_stride));					      \    table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1),	      \		      ref[1] + offset, 2 * decoder->uv_stride, 4);	      \    table[4+xy_half] (decoder->dest[1] + decoder->uv_stride +		      \		      (decoder->offset >> 1),				      \		      ref[1] + decoder->uv_stride + offset,		      \		      2 * decoder->uv_stride, 4);			      \    table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1),	      \		      ref[2] + offset, 2 * decoder->uv_stride, 4);	      \    table[4+xy_half] (decoder->dest[2] + decoder->uv_stride +		      \		      (decoder->offset >> 1),				      \		      ref[2] + decoder->uv_stride + offset,		      \		      2 * decoder->uv_stride, 4)#define MOTION_ZERO_420(table,ref)					      \    table[0] (decoder->dest[0] + decoder->offset,			      \	      (ref[0] + decoder->offset +				      \	       decoder->v_offset * decoder->stride), decoder->stride, 16);    \    offset = ((decoder->offset >> 1) +					      \	      (decoder->v_offset >> 1) * decoder->uv_stride);		      \    table[4] (decoder->dest[1] + (decoder->offset >> 1),		      \	      ref[1] + offset, decoder->uv_stride, 8);			      \    table[4] (decoder->dest[2] + (decoder->offset >> 1),		      \	      ref[2] + offset, decoder->uv_stride, 8)#define MOTION_422(table,ref,motion_x,motion_y,size,y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = 2 * decoder->v_offset + motion_y + 2 * y;			      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y_ ## size)) {			      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size;	      \	motion_y = pos_y - 2 * decoder->v_offset - 2 * y;		      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride;		      \    table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \		    ref[0] + offset, decoder->stride, size);		      \    offset = (offset + (motion_x & (motion_x < 0))) >> 1;		      \    motion_x /= 2;							      \    xy_half = ((pos_y & 1) << 1) | (motion_x & 1);			      \    table[4+xy_half] (decoder->dest[1] + y * decoder->uv_stride +	      \		      (decoder->offset >> 1), ref[1] + offset,		      \		      decoder->uv_stride, size);			      \    table[4+xy_half] (decoder->dest[2] + y * decoder->uv_stride +	      \		      (decoder->offset >> 1), ref[2] + offset,		      \		      decoder->uv_stride, size)#define MOTION_FIELD_422(table,ref,motion_x,motion_y,dest_field,op,src_field) \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride;	      \    table[xy_half] (decoder->dest[0] + dest_field * decoder->stride +	      \		    decoder->offset, ref[0] + offset,			      \		    2 * decoder->stride, 8);				      \    offset = (offset + (motion_x & (motion_x < 0))) >> 1;		      \    motion_x /= 2;							      \    xy_half = ((pos_y & 1) << 1) | (motion_x & 1);			      \    table[4+xy_half] (decoder->dest[1] + dest_field * decoder->uv_stride +    \		      (decoder->offset >> 1), ref[1] + offset,		      \		      2 * decoder->uv_stride, 8);			      \    table[4+xy_half] (decoder->dest[2] + dest_field * decoder->uv_stride +    \		      (decoder->offset >> 1), ref[2] + offset,		      \		      2 * decoder->uv_stride, 8)#define MOTION_DMV_422(table,ref,motion_x,motion_y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride;		      \    table[xy_half] (decoder->dest[0] + decoder->offset,			      \		    ref[0] + offset, 2 * decoder->stride, 8);		      \    table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset,     \		    ref[0] + decoder->stride + offset,			      \		    2 * decoder->stride, 8);				      \    offset = (offset + (motion_x & (motion_x < 0))) >> 1;		      \    motion_x /= 2;							      \    xy_half = ((pos_y & 1) << 1) | (motion_x & 1);			      \    table[4+xy_half] (decoder->dest[1] + (decoder->offset >> 1),	      \		      ref[1] + offset, 2 * decoder->uv_stride, 8);	      \    table[4+xy_half] (decoder->dest[1] + decoder->uv_stride +		      \		      (decoder->offset >> 1),				      \		      ref[1] + decoder->uv_stride + offset,		      \		      2 * decoder->uv_stride, 8);			      \    table[4+xy_half] (decoder->dest[2] + (decoder->offset >> 1),	      \		      ref[2] + offset, 2 * decoder->uv_stride, 8);	      \    table[4+xy_half] (decoder->dest[2] + decoder->uv_stride +		      \		      (decoder->offset >> 1),				      \		      ref[2] + decoder->uv_stride + offset,		      \		      2 * decoder->uv_stride, 8)#define MOTION_ZERO_422(table,ref)					      \    offset = decoder->offset + decoder->v_offset * decoder->stride;	      \    table[0] (decoder->dest[0] + decoder->offset,			      \	      ref[0] + offset, decoder->stride, 16);			      \    offset >>= 1;							      \    table[4] (decoder->dest[1] + (decoder->offset >> 1),		      \	      ref[1] + offset, decoder->uv_stride, 16);			      \    table[4] (decoder->dest[2] + (decoder->offset >> 1),		      \	      ref[2] + offset, decoder->uv_stride, 16)#define MOTION_444(table,ref,motion_x,motion_y,size,y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = 2 * decoder->v_offset + motion_y + 2 * y;			      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y_ ## size)) {			      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y_ ## size;	      \	motion_y = pos_y - 2 * decoder->v_offset - 2 * y;		      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + (pos_y >> 1) * decoder->stride;		      \    table[xy_half] (decoder->dest[0] + y * decoder->stride + decoder->offset, \		    ref[0] + offset, decoder->stride, size);		      \    table[xy_half] (decoder->dest[1] + y * decoder->stride + decoder->offset, \		    ref[1] + offset, decoder->stride, size);		      \    table[xy_half] (decoder->dest[2] + y * decoder->stride + decoder->offset, \		    ref[2] + offset, decoder->stride, size)#define MOTION_FIELD_444(table,ref,motion_x,motion_y,dest_field,op,src_field) \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + ((pos_y op) + src_field) * decoder->stride;	      \    table[xy_half] (decoder->dest[0] + dest_field * decoder->stride +	      \		    decoder->offset, ref[0] + offset,			      \		    2 * decoder->stride, 8);				      \    table[xy_half] (decoder->dest[1] + dest_field * decoder->stride +	      \		    decoder->offset, ref[1] + offset,			      \		    2 * decoder->stride, 8);				      \    table[xy_half] (decoder->dest[2] + dest_field * decoder->stride +	      \		    decoder->offset, ref[2] + offset,			      \		    2 * decoder->stride, 8)#define MOTION_DMV_444(table,ref,motion_x,motion_y)			      \    pos_x = 2 * decoder->offset + motion_x;				      \    pos_y = decoder->v_offset + motion_y;				      \    if (unlikely (pos_x > decoder->limit_x)) {				      \	pos_x = ((int)pos_x < 0) ? 0 : decoder->limit_x;		      \	motion_x = pos_x - 2 * decoder->offset;				      \    }									      \    if (unlikely (pos_y > decoder->limit_y)) {				      \	pos_y = ((int)pos_y < 0) ? 0 : decoder->limit_y;		      \	motion_y = pos_y - decoder->v_offset;				      \    }									      \    xy_half = ((pos_y & 1) << 1) | (pos_x & 1);				      \    offset = (pos_x >> 1) + (pos_y & ~1) * decoder->stride;		      \    table[xy_half] (decoder->dest[0] + decoder->offset,			      \		    ref[0] + offset, 2 * decoder->stride, 8);		      \    table[xy_half] (decoder->dest[0] + decoder->stride + decoder->offset,     \		    ref[0] + decoder->stride + offset,			      \		    2 * decoder->stride, 8);				      \    table[xy_half] (decoder->dest[1] + decoder->offset,			      \		    ref[1] + offset, 2 * decoder->stride, 8);		      \    table[xy_half] (decoder->dest[1] + decoder->stride + decoder->offset,     \		    ref[1] + decoder->stride + offset,			      \		    2 * decoder->stride, 8);				      \    table[xy_half] (decoder->dest[2] + decoder->offset,			      \		    ref[2] + offset, 2 * decoder->stride, 8);		      \    table[xy_half] (decoder->dest[2] + decoder->stride + decoder->offset,     \		    ref[2] + decoder->stride + offset,			      \		    2 * decoder->stride, 8)#define MOTION_ZERO_444(table,ref)					      \    offset = decoder->offset + decoder->v_offset * decoder->stride;	      \    table[0] (decoder->dest[0] + decoder->offset,			      \	      ref[0] + offset, decoder->stride, 16);			      \    table[4] (decoder->dest[1] + decoder->offset,			      \	      ref[1] + offset, decoder->stride, 16);			      \    table[4] (decoder->dest[2] + decoder->offset,			      \	      ref[2] + offset, decoder->stride, 16)#define bit_buf (decoder->bitstream_buf)#define bits (decoder->bitstream_bits)#define bit_ptr (decoder->bitstream_ptr)static void motion_mp1 (mpeg2_decoder_t * const decoder,			motion_t * const motion,			mpeg2_mc_fct * const * const table){    int motion_x, motion_y;    unsigned int pos_x, pos_y, xy_half, offset;    NEEDBITS (bit_buf, bits, bit_ptr);    motion_x = (motion->pmv[0][0] +		(get_motion_delta (decoder,				   motion->f_code[0]) << motion->f_code[1]));    motion_x = bound_motion_vector (motion_x,				    motion->f_code[0] + motion->f_code[1]);    motion->pmv[0][0] = motion_x;    NEEDBITS (bit_buf, bits, bit_ptr);    motion_y = (motion->pmv[0][1] +		(get_motion_delta (decoder,				   motion->f_code[0]) << motion->f_code[1]));    motion_y = bound_motion_vector (motion_y,				    motion->f_code[0] + motion->f_code[1]);    motion->pmv[0][1] = motion_y;    MOTION_420 (table, motion->ref[0], motion_x, motion_y, 16, 0);}#define MOTION_FUNCTIONS(FORMAT,MOTION,MOTION_FIELD,MOTION_DMV,MOTION_ZERO)   \									      \static void motion_fr_frame_##FORMAT (mpeg2_decoder_t * const decoder,	      \				      motion_t * const motion,		      \				      mpeg2_mc_fct * const * const table)     \{									      \    int motion_x, motion_y;						      \    unsigned int pos_x, pos_y, xy_half, offset;				      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    motion_x = motion->pmv[0][0] + get_motion_delta (decoder,		      \						     motion->f_code[0]);      \    motion_x = bound_motion_vector (motion_x, motion->f_code[0]);	      \    motion->pmv[1][0] = motion->pmv[0][0] = motion_x;			      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    motion_y = motion->pmv[0][1] + get_motion_delta (decoder,		      \						     motion->f_code[1]);      \    motion_y = bound_motion_vector (motion_y, motion->f_code[1]);	      \    motion->pmv[1][1] = motion->pmv[0][1] = motion_y;			      \									      \    MOTION (table, motion->ref[0], motion_x, motion_y, 16, 0);		      \}									      \									      \static void motion_fr_field_##FORMAT (mpeg2_decoder_t * const decoder,	      \				      motion_t * const motion,		      \				      mpeg2_mc_fct * const * const table)     \{									      \    int motion_x, motion_y, field;					      \    unsigned int pos_x, pos_y, xy_half, offset;				      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    field = UBITS (bit_buf, 1);						      \    DUMPBITS (bit_buf, bits, 1);					      \									      \    motion_x = motion->pmv[0][0] + get_motion_delta (decoder,		      \						     motion->f_code[0]);      \    motion_x = bound_motion_vector (motion_x, motion->f_code[0]);	      \    motion->pmv[0][0] = motion_x;					      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    motion_y = ((motion->pmv[0][1] >> 1) +				      \		get_motion_delta (decoder, motion->f_code[1]));		      \    /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */	      \    motion->pmv[0][1] = motion_y << 1;					      \									      \    MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 0, & ~1, field); \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    field = UBITS (bit_buf, 1);						      \    DUMPBITS (bit_buf, bits, 1);					      \									      \    motion_x = motion->pmv[1][0] + get_motion_delta (decoder,		      \						     motion->f_code[0]);      \    motion_x = bound_motion_vector (motion_x, motion->f_code[0]);	      \    motion->pmv[1][0] = motion_x;					      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    motion_y = ((motion->pmv[1][1] >> 1) +				      \		get_motion_delta (decoder, motion->f_code[1]));		      \    /* motion_y = bound_motion_vector (motion_y, motion->f_code[1]); */	      \    motion->pmv[1][1] = motion_y << 1;					      \									      \    MOTION_FIELD (table, motion->ref[0], motion_x, motion_y, 1, & ~1, field); \}									      \									      \static void motion_fr_dmv_##FORMAT (mpeg2_decoder_t * const decoder,	      \				    motion_t * const motion,		      \				    mpeg2_mc_fct * const * const table)	      \{									      \    int motion_x, motion_y, dmv_x, dmv_y, m, other_x, other_y;		      \    unsigned int pos_x, pos_y, xy_half, offset;				      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    motion_x = motion->pmv[0][0] + get_motion_delta (decoder,		      \						     motion->f_code[0]);      \    motion_x = bound_motion_vector (motion_x, motion->f_code[0

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?