?? video.cpp
字號:
vid_stream->slice.extra_info = get_extra_bit_info(vid_stream); /* Reset past intrablock address. */ vid_stream->mblock.past_intra_addr = -2; /* Reset previous recon motion vectors. */ vid_stream->mblock.recon_right_for_prev = 0; vid_stream->mblock.recon_down_for_prev = 0; vid_stream->mblock.recon_right_back_prev = 0; vid_stream->mblock.recon_down_back_prev = 0; /* Reset macroblock address. */ vid_stream->mblock.mb_address = ((vid_stream->slice.vert_pos - 1) * vid_stream->mb_width) - 1; /* Reset past dct dc y, cr, and cb values. */#ifdef USE_ATI vid_stream->block.dct_dc_y_past = 0; vid_stream->block.dct_dc_cr_past = 0; vid_stream->block.dct_dc_cb_past = 0;#else vid_stream->block.dct_dc_y_past = 1024 << 3; vid_stream->block.dct_dc_cr_past = 1024 << 3; vid_stream->block.dct_dc_cb_past = 1024 << 3;#endif return PARSE_OK;}/* *-------------------------------------------------------------- * * ParseMacroBlock -- * * Parseoff macroblock. Reconstructs DCT values. Applies * inverse DCT, reconstructs motion vectors, calculates and * set pixel values for macroblock in current pict image * structure. * * Results: * Here's where everything really happens. Welcome to the * heart of darkness. * * Side effects: * Bit stream irreversibly parsed off. * *-------------------------------------------------------------- */static int ParseMacroBlock( VidStream* vid_stream ){ int addr_incr; unsigned int data; int mask, i, recon_right_for, recon_down_for, recon_right_back, recon_down_back; int zero_block_flag; BOOLEAN mb_quant = 0, mb_motion_forw = 0, mb_motion_back = 0, mb_pattern = 0;#ifndef DISABLE_DITHER int no_dith_flag = 0; int ditherType = vid_stream->ditherType;#endif#ifdef ANALYSIS mbSizeCount = bitCountRead();#endif#ifdef USE_ATI /* Empty macroblock */ vid_stream->block.dct_recon[0][0] = 0xFFFFFFFF; vid_stream->block.dct_recon[1][0] = 0xFFFFFFFF; vid_stream->block.dct_recon[2][0] = 0xFFFFFFFF; vid_stream->block.dct_recon[3][0] = 0xFFFFFFFF; vid_stream->block.dct_recon[4][0] = 0xFFFFFFFF; vid_stream->block.dct_recon[5][0] = 0xFFFFFFFF;#endif /* * Parse off macroblock address increment and add to macroblock address. */ do { unsigned int ind; show_bits11(ind); DecodeMBAddrInc(addr_incr); if (mb_addr_inc[ind].num_bits==0) { addr_incr = 1; } if (addr_incr == MB_ESCAPE) { vid_stream->mblock.mb_address += 33; addr_incr = MB_STUFFING; } } while (addr_incr == MB_STUFFING); vid_stream->mblock.mb_address += addr_incr; if( vid_stream->mblock.mb_address > (int) (vid_stream->mb_height * vid_stream->mb_width - 1) ) return SKIP_TO_START_CODE; /* * If macroblocks have been skipped, process skipped macroblocks. */ if (vid_stream->mblock.mb_address - vid_stream->mblock.past_mb_addr > 1) { if (vid_stream->picture.code_type == P_TYPE) ProcessSkippedPFrameMBlocks(vid_stream); else if (vid_stream->picture.code_type == B_TYPE) ProcessSkippedBFrameMBlocks(vid_stream); } /* Set past macroblock address to current macroblock address. */ vid_stream->mblock.past_mb_addr = vid_stream->mblock.mb_address; /* Based on picture type decode macroblock type. */ switch (vid_stream->picture.code_type) { case I_TYPE: DecodeMBTypeI(mb_quant, mb_motion_forw, mb_motion_back, mb_pattern, vid_stream->mblock.mb_intra); break; case P_TYPE: DecodeMBTypeP(mb_quant, mb_motion_forw, mb_motion_back, mb_pattern, vid_stream->mblock.mb_intra); break; case B_TYPE: DecodeMBTypeB(mb_quant, mb_motion_forw, mb_motion_back, mb_pattern, vid_stream->mblock.mb_intra); break; case D_TYPE: fprintf(stderr, "ERROR: MPEG-1 Streams with D-frames are not supported\n"); exit(1); } /* If quantization flag set, parse off new quantization scale. */ if (mb_quant == TRUE) { get_bits5(data); vid_stream->slice.quant_scale = data; } /* If forward motion vectors exist... */ if (mb_motion_forw == TRUE) { /* Parse off and decode horizontal forward motion vector. */ DecodeMotionVectors(vid_stream->mblock.motion_h_forw_code); /* If horiz. forward r data exists, parse off. */ if ((vid_stream->picture.forw_f != 1) && (vid_stream->mblock.motion_h_forw_code != 0)) { get_bitsn(vid_stream->picture.forw_r_size, data); vid_stream->mblock.motion_h_forw_r = data; } /* Parse off and decode vertical forward motion vector. */ DecodeMotionVectors(vid_stream->mblock.motion_v_forw_code); /* If vert. forw. r data exists, parse off. */ if ((vid_stream->picture.forw_f != 1) && (vid_stream->mblock.motion_v_forw_code != 0)) { get_bitsn(vid_stream->picture.forw_r_size, data); vid_stream->mblock.motion_v_forw_r = data; } } /* If back motion vectors exist... */ if (mb_motion_back == TRUE) { /* Parse off and decode horiz. back motion vector. */ DecodeMotionVectors(vid_stream->mblock.motion_h_back_code); /* If horiz. back r data exists, parse off. */ if ((vid_stream->picture.back_f != 1) && (vid_stream->mblock.motion_h_back_code != 0)) { get_bitsn(vid_stream->picture.back_r_size, data); vid_stream->mblock.motion_h_back_r = data; } /* Parse off and decode vert. back motion vector. */ DecodeMotionVectors(vid_stream->mblock.motion_v_back_code); /* If vert. back r data exists, parse off. */ if ((vid_stream->picture.back_f != 1) && (vid_stream->mblock.motion_v_back_code != 0)) { get_bitsn(vid_stream->picture.back_r_size, data); vid_stream->mblock.motion_v_back_r = data; } }#ifdef ANALYSIS if (vid_stream->mblock.mb_intra) { stat_a[0].i_mbnum++; mbCBPPtr = stat_a[0].i_mbcbp; mbCoeffPtr = stat_a[0].i_mbcoeff; mbSizePtr = &(stat_a[0].i_mbsize); } else if (mb_motion_back && mb_motion_forw) { stat_a[0].bi_mbnum++; mbCBPPtr = stat_a[0].bi_mbcbp; mbCoeffPtr = stat_a[0].bi_mbcoeff; mbSizePtr = &(stat_a[0].bi_mbsize); } else if (mb_motion_back) { stat_a[0].b_mbnum++; mbCBPPtr = stat_a[0].b_mbcbp; mbCoeffPtr = stat_a[0].b_mbcoeff; mbSizePtr = &(stat_a[0].b_mbsize); } else { stat_a[0].p_mbnum++; mbCBPPtr = stat_a[0].p_mbcbp; mbCoeffPtr = stat_a[0].p_mbcoeff; mbSizePtr = &(stat_a[0].p_mbsize); }#endif /* If mblock pattern flag set, parse and decode CBP (code block pattern). */ if (mb_pattern == TRUE) { DecodeCBP(vid_stream->mblock.cbp); } /* Otherwise, set CBP to zero. */ else vid_stream->mblock.cbp = 0;#ifdef ANALYSIS mbCBPPtr[vid_stream->mblock.cbp]++;#endif /* Reconstruct motion vectors depending on picture type. */ if (vid_stream->picture.code_type == P_TYPE) { /* * If no forw motion vectors, reset previous and current vectors to 0. */ if (!mb_motion_forw) { recon_right_for = 0; recon_down_for = 0; vid_stream->mblock.recon_right_for_prev = 0; vid_stream->mblock.recon_down_for_prev = 0; } /* * Otherwise, compute new forw motion vectors. Reset previous vectors to * current vectors. */ else { ComputeForwVector(&recon_right_for, &recon_down_for, vid_stream); } } if (vid_stream->picture.code_type == B_TYPE) { /* Reset prev. and current vectors to zero if mblock is intracoded. */ if (vid_stream->mblock.mb_intra) { vid_stream->mblock.recon_right_for_prev = 0; vid_stream->mblock.recon_down_for_prev = 0; vid_stream->mblock.recon_right_back_prev = 0; vid_stream->mblock.recon_down_back_prev = 0; } else { /* If no forw vectors, current vectors equal prev. vectors. */ if (!mb_motion_forw) { recon_right_for = vid_stream->mblock.recon_right_for_prev; recon_down_for = vid_stream->mblock.recon_down_for_prev; } /* * Otherwise compute forw. vectors. Reset prev vectors to new values. */ else { ComputeForwVector(&recon_right_for, &recon_down_for, vid_stream); } /* If no back vectors, set back vectors to prev back vectors. */ if (!mb_motion_back) { recon_right_back = vid_stream->mblock.recon_right_back_prev; recon_down_back = vid_stream->mblock.recon_down_back_prev; } /* Otherwise compute new vectors and reset prev. back vectors. */ else { ComputeBackVector(&recon_right_back, &recon_down_back, vid_stream); } /* * Store vector existence flags in structure for possible skipped * macroblocks to follow. */ vid_stream->mblock.bpict_past_forw = mb_motion_forw; vid_stream->mblock.bpict_past_back = mb_motion_back; } }#ifndef DISABLE_DITHER /* For each possible block in macroblock. */ if (ditherType == GRAY_DITHER || ditherType == GRAY2_DITHER || ditherType == GRAY256_DITHER || ditherType == GRAY2562_DITHER || ditherType == MONO_DITHER || ditherType == MONO_THRESHOLD) { for (mask = 32, i = 0; i < 4; mask >>= 1, i++) { /* If block exists... */ if ((vid_stream->mblock.mb_intra) || (vid_stream->mblock.cbp & mask)) { zero_block_flag = 0; ParseReconBlock(i, vid_stream); } else { zero_block_flag = 1; } /* If macroblock is intra coded... */ if (vid_stream->mblock.mb_intra) { ReconIMBlock(vid_stream, i); } else if (mb_motion_forw && mb_motion_back) { ReconBiMBlock(vid_stream, i, recon_right_for, recon_down_for, recon_right_back, recon_down_back, zero_block_flag); } else if (mb_motion_forw || (vid_stream->picture.code_type == P_TYPE)) { ReconPMBlock(vid_stream, i, recon_right_for, recon_down_for, zero_block_flag); } else if (mb_motion_back) { ReconBMBlock(vid_stream, i, recon_right_back, recon_down_back, zero_block_flag); } } /* Kill the Chrominance blocks... */ if ((vid_stream->mblock.mb_intra) || (vid_stream->mblock.cbp & 0x2)) { ParseAwayBlock(4, vid_stream); } if ((vid_stream->mblock.mb_intra) || (vid_stream->mblock.cbp & 0x1)) { ParseAwayBlock(5, vid_stream); } } else { if ((ditherType == MBORDERED_DITHER) && (vid_stream->mblock.cbp == 0) && (vid_stream->picture.code_type == 3) && (!vid_stream->mblock.mb_intra) && (!(mb_motion_forw && mb_motion_back))) { MBOrderedDitherDisplayCopy(vid_stream, vid_stream->mblock.mb_address, mb_motion_forw, recon_right_for, recon_down_for, mb_motion_back, recon_right_back, recon_down_back, vid_stream->past->display, vid_stream->future->display); vid_stream->ditherFlags[vid_stream->mblock.mb_address] = 0; no_dith_flag = 1; } else {#endif for (mask = 32, i = 0; i < 6; mask >>= 1, i++) { /* If block exists... */ if ((vid_stream->mblock.mb_intra) || (vid_stream->mblock.cbp & mask)) { zero_block_flag = 0; ParseReconBlock(i, vid_stream); } else { zero_block_flag = 1; }#ifndef USE_ATI /* If macroblock is intra coded... */ if (vid_stream->mblock.mb_intra) { ReconIMBlock(vid_stream, i); } else if (mb_motion_forw && mb_motion_back) { ReconBiMBlock(vid_stream, i, recon_right_for, recon_down_for, recon_right_back, recon_down_back, zero_block_flag); } else if (mb_motion_forw || (vid_stream->picture.code_type == P_TYPE)) { ReconPMBlock(vid_stream, i, recon_right_for, recon_down_for, zero_block_flag); } else if (mb_motion_back) { ReconBMBlock(vid_stream, i, recon_right_back, recon_down_back, zero_block_flag); }#endif }#ifdef USE_ATI vhar128_macroblock(vid_stream->ati_handle, (vid_stream->mblock.mb_address % vid_stream->mb_width) << 4, (vid_stream->mblock.mb_address / vid_stream->mb_width) << 4, vid_stream->mblock.mb_intra, mb_motion_back, mb_motion_forw, recon_right_back, recon_down_back, recon_right_for, recon_down_for, vid_stream->block.dct_recon);#endif#ifndef DISABLE_DITHER } }#endif#ifndef DISABLE_DITHER if ((ditherType == MBORDERED_DITHER) && (!no_dith_flag)) { if ((vid_stream->picture.code_type == 2) && (vid_stream->mblock.cbp == 0) && (!vid_stream->mblock.mb_intra)) { MBOrderedDitherDisplayCopy(vid_stream, vid_stream->mblock.mb_address, 1, recon_right_for, recon_down_for, 0, 0, 0, vid_stream->future->display, (unsigned char *) NULL); vid_stream->ditherFlags[vid_stream->mblock.mb_address] = 0; } else { vid_stream->ditherFlags[vid_stream->mblock.mb_address] = 1; } }#endif /* If D Type picture, flush marker bit. */ if (vid_stream->picture.code_type == 4) flush_bits(1); /* If macroblock was intracoded, set macroblock past intra address. */ if (vid_stream->mblock.mb_intra) vid_stream->mblock.past_intra_addr = vid_stream->mblock.mb_address; /* Store macroblock error for filter info */ if (vid_stream->mblock.mb_intra) vid_stream->current->mb_qscale[vid_stream->mblock.mb_address] = 0; else vid_stream->current->mb_qscale[vid_stream->mblock.mb_address] = vid_stream->slice.quant_scale;#ifdef ANALYSIS *mbSizePtr += bitCountRead() - mbSizeCount;#endif return PARSE_OK;}/* software decoder follows */#ifndef USE_ATI/* *-------------------------------------------------------------- * * ReconIMBlock -- * * Reconstructs intra coded macroblock. * * Results: * None. * * Side effects: * None. * *-------------------------------------------------------------- */#if defined(USE_CROP_TABLE) && !defined(NDEBUG)/* If people really
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -