⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slice.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    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, ref_field, motion_x, motion_y, 16, 0);		      \}									      \									      \static void motion_fi_16x8_##FORMAT (mpeg2_decoder_t * const decoder,	      \				     motion_t * const motion,		      \				     mpeg2_mc_fct * const * const table)      \{									      \    int motion_x, motion_y;						      \    uint8_t ** ref_field;						      \    unsigned int pos_x, pos_y, xy_half, offset;				      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    ref_field = motion->ref2[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] + 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;					      \									      \    MOTION (table, ref_field, motion_x, motion_y, 8, 0);		      \									      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    ref_field = motion->ref2[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] + 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;					      \									      \    MOTION (table, ref_field, motion_x, motion_y, 8, 8);		      \}									      \									      \static void motion_fi_dmv_##FORMAT (mpeg2_decoder_t * const decoder,	      \				    motion_t * const motion,		      \				    mpeg2_mc_fct * const * const table)	      \{									      \    int motion_x, motion_y, 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]);	      \    motion->pmv[1][0] = motion->pmv[0][0] = motion_x;			      \    NEEDBITS (bit_buf, bits, bit_ptr);					      \    other_x = ((motion_x + (motion_x > 0)) >> 1) + get_dmv (decoder);	      \									      \    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;			      \    other_y = (((motion_y + (motion_y > 0)) >> 1) + get_dmv (decoder) +	      \	       decoder->dmv_offset);					      \									      \    MOTION (mpeg2_mc.put, motion->ref[0], motion_x, motion_y, 16, 0);	      \    MOTION (mpeg2_mc.avg, motion->ref[1], other_x, other_y, 16, 0);	      \}									      \MOTION_FUNCTIONS (420, MOTION_420, MOTION_FIELD_420, MOTION_DMV_420,		  MOTION_ZERO_420)MOTION_FUNCTIONS (422, MOTION_422, MOTION_FIELD_422, MOTION_DMV_422,		  MOTION_ZERO_422)MOTION_FUNCTIONS (444, MOTION_444, MOTION_FIELD_444, MOTION_DMV_444,		  MOTION_ZERO_444)/* like motion_frame, but parsing without actual motion compensation */static void motion_fr_conceal (mpeg2_decoder_t * const decoder){    int tmp;    NEEDBITS (bit_buf, bits, bit_ptr);    tmp = (decoder->f_motion.pmv[0][0] +           get_motion_delta (decoder, decoder->f_motion.f_code[0]));    tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]);    decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp;    NEEDBITS (bit_buf, bits, bit_ptr);    tmp = (decoder->f_motion.pmv[0][1] +           get_motion_delta (decoder, decoder->f_motion.f_code[1]));    tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]);    decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp;    DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */}static void motion_fi_conceal (mpeg2_decoder_t * const decoder){    int tmp;    NEEDBITS (bit_buf, bits, bit_ptr);    DUMPBITS (bit_buf, bits, 1); /* remove field_select */    tmp = (decoder->f_motion.pmv[0][0] +           get_motion_delta (decoder, decoder->f_motion.f_code[0]));    tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[0]);    decoder->f_motion.pmv[1][0] = decoder->f_motion.pmv[0][0] = tmp;    NEEDBITS (bit_buf, bits, bit_ptr);    tmp = (decoder->f_motion.pmv[0][1] +           get_motion_delta (decoder, decoder->f_motion.f_code[1]));    tmp = bound_motion_vector (tmp, decoder->f_motion.f_code[1]);    decoder->f_motion.pmv[1][1] = decoder->f_motion.pmv[0][1] = tmp;    DUMPBITS (bit_buf, bits, 1); /* remove marker_bit */}#undef bit_buf#undef bits#undef bit_ptr#define MOTION_CALL(routine,direction)				\do {								\    if ((direction) & MACROBLOCK_MOTION_FORWARD)		\	routine (decoder, &(decoder->f_motion), mpeg2_mc.put);	\    if ((direction) & MACROBLOCK_MOTION_BACKWARD)		\	routine (decoder, &(decoder->b_motion),			\		 ((direction) & MACROBLOCK_MOTION_FORWARD ?	\		  mpeg2_mc.avg : mpeg2_mc.put));		\} while (0)#define NEXT_MACROBLOCK							\do {									\    decoder->offset += 16;						\    if (decoder->offset == decoder->width) {				\	do { /* just so we can use the break statement */		\	    if (decoder->convert) {					\		decoder->convert (decoder->convert_id, decoder->dest,	\				  decoder->v_offset);			\		if (decoder->coding_type == B_TYPE)			\		    break;						\	    }								\	    decoder->dest[0] += decoder->slice_stride;			\	    decoder->dest[1] += decoder->slice_uv_stride;		\	    decoder->dest[2] += decoder->slice_uv_stride;		\	} while (0);							\	decoder->v_offset += 16;					\	if (decoder->v_offset > decoder->limit_y) {			\	    if (mpeg2_cpu_state_restore)				\		mpeg2_cpu_state_restore (&cpu_state);			\	    return;							\	}								\	decoder->offset = 0;						\    }									\} while (0)void mpeg2_init_fbuf (mpeg2_decoder_t * decoder, uint8_t * current_fbuf[3],		      uint8_t * forward_fbuf[3], uint8_t * backward_fbuf[3]){    int offset, stride, height, bottom_field;    stride = decoder->stride_frame;    bottom_field = (decoder->picture_structure == BOTTOM_FIELD);    offset = bottom_field ? stride : 0;    height = decoder->height;    decoder->picture_dest[0] = current_fbuf[0] + offset;    decoder->picture_dest[1] = current_fbuf[1] + (offset >> 1);    decoder->picture_dest[2] = current_fbuf[2] + (offset >> 1);    decoder->f_motion.ref[0][0] = forward_fbuf[0] + offset;    decoder->f_motion.ref[0][1] = forward_fbuf[1] + (offset >> 1);    decoder->f_motion.ref[0][2] = forward_fbuf[2] + (offset >> 1);    decoder->b_motion.ref[0][0] = backward_fbuf[0] + offset;    decoder->b_motion.ref[0][1] = backward_fbuf[1] + (offset >> 1);    decoder->b_motion.ref[0][2] = backward_fbuf[2] + (offset >> 1);    if( decoder->picture_structure != FRAME_PICTURE )    {        decoder->dmv_offset = bottom_field ? 1 : -1;        decoder->f_motion.ref2[0] = decoder->f_motion.ref[bottom_field];        decoder->f_motion.ref2[1] = decoder->f_motion.ref[!bottom_field];        decoder->b_motion.ref2[0] = decoder->b_motion.ref[bottom_field];        decoder->b_motion.ref2[1] = decoder->b_motion.ref[!bottom_field];        offset = stride - offset;        if( decoder->second_field && (decoder->coding_type != B_TYPE) )            forward_fbuf = current_fbuf;        decoder->f_motion.ref[1][0] = forward_fbuf[0] + offset;        decoder->f_motion.ref[1][1] = forward_fbuf[1] + (offset >> 1);        decoder->f_motion.ref[1][2] = forward_fbuf[2] + (offset >> 1);        decoder->b_motion.ref[1][0] = backward_fbuf[0] + offset;        decoder->b_motion.ref[1][1] = backward_fbuf[1] + (offset >> 1);        decoder->b_motion.ref[1][2] = backward_fbuf[2] + (offset >> 1);        stride <<= 1;        height >>= 1;    }    decoder->stride = stride;    decoder->uv_stride = stride >> 1;    decoder->slice_stride = 16 * stride;    decoder->slice_uv_stride =    decoder->slice_stride >> (2 - decoder->chroma_format);    decoder->limit_x = 2 * decoder->width - 32;    decoder->limit_y_16 = 2 * height - 32;    decoder->limit_y_8 = 2 * height - 16;    decoder->limit_y = height - 16;    if( decoder->mpeg1 )    {        decoder->motion_parser[0] = motion_zero_420;        decoder->motion_parser[MC_FRAME] = motion_mp1;        decoder->motion_parser[4] = motion_reuse_420;    }    else if( decoder->picture_structure == FRAME_PICTURE )    {        if (decoder->chroma_format == 0)        {            decoder->motion_parser[0] = motion_zero_420;            decoder->motion_parser[MC_FIELD] = motion_fr_field_420;            decoder->motion_parser[MC_FRAME] = motion_fr_frame_420;            decoder->motion_parser[MC_DMV] = motion_fr_dmv_420;            decoder->motion_parser[4] = motion_reuse_420;        }        else if (decoder->chroma_format == 1)        {            decoder->motion_parser[0] = motion_zero_422;            decoder->motion_parser[MC_FIELD] = motion_fr_field_422;            decoder->motion_parser[MC_FRAME] = motion_fr_frame_422;            decoder->motion_parser[MC_DMV] = motion_fr_dmv_422;            decoder->motion_parser[4] = motion_reuse_422;        } else        {            decoder->motion_parser[0] = motion_zero_444;            decoder->motion_parser[MC_FIELD] = motion_fr_field_444;            decoder->motion_parser[MC_FRAME] = motion_fr_frame_444;            decoder->motion_parser[MC_DMV] = motion_fr_dmv_444;            decoder->motion_parser[4] = motion_reuse_444;        }    }    else    {        if (decoder->chroma_format == 0)        {            decoder->motion_parser[0] = motion_zero_420;            decoder->motion_parser[MC_FIELD] = motion_fi_field_420;            decoder->motion_parser[MC_16X8] = motion_fi_16x8_420;            decoder->motion_parser[MC_DMV] = motion_fi_dmv_420;            decoder->motion_parser[4] = motion_reuse_420;        }        else if (decoder->chroma_format == 1)        {            decoder->motion_parser[0] = motion_zero_422;            decoder->motion_parser[MC_FIELD] = motion_fi_field_422;            decoder->motion_parser[MC_16X8] = motion_fi_16x8_422;            decoder->motion_parser[MC_DMV] = motion_fi_dmv_422;            decoder->motion_parser[4] = motion_reuse_422;        }        else        {            decoder->motion_parser[0] = motion_zero_444;            decoder->motion_parser[MC_FIELD] = motion_fi_field_444;            decoder->motion_parser[MC_16X8] = motion_fi_16x8_444;            decoder->motion_parser[MC_DMV] = motion_fi_dmv_444;            decoder->motion_parser[4] = motion_reuse_444;        }    }}

⌨️ 快捷键说明

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