📄 slice.c
字号:
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 + -