static int aml_vrtc_read_time(struct device *dev, struct rtc_time *tm) { u32 time_t = read_te(); rtc_time_to_tm(time_t, tm); return 0; }
/*! * \param *dc The current DecodingContext. * \param mb_type The macroblock prediction type. * \param *sub_mb_type The sub macroblock prediction type. * * Find the sub macroblock prediction type (intra prediction mode or motion vectors exctraction). */ static void sub_mb_pred(DecodingContext_t *dc, const unsigned int mb_type, unsigned int *sub_mb_type) { TRACE_INFO(MB, " > " BLD_GREEN "sub_mb_pred()\n" CLR_RESET); // Shortcut Macroblock_t *mb = dc->mb_array[dc->CurrMbAddr]; slice_t *slice = dc->active_slice; // Read sub_mb_type int mbPartIdx = 0; for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++) { if (dc->entropy_coding_mode_flag) sub_mb_type[mbPartIdx] = read_ae(dc, SE_sub_mb_type); else sub_mb_type[mbPartIdx] = read_ue(dc->bitstr); } // ref_idx_l0 for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++) { if ((slice->num_ref_idx_l0_active_minus1 > 0 || slice->mb_field_decoding_flag != slice->field_pic_flag) && mb_type != P_8x8ref0 && sub_mb_type[mbPartIdx] != B_Direct_8x8 && SubMbPredMode(slice->slice_type, sub_mb_type[mbPartIdx]) != Pred_L1) { if (dc->entropy_coding_mode_flag) mb->ref_idx_l0[mbPartIdx] = read_ae(dc, SE_ref_idx_lx); else mb->ref_idx_l0[mbPartIdx] = read_te(dc->bitstr, 0); } } // ref_idx_l1 for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++) { if ((slice->num_ref_idx_l1_active_minus1 > 0 || slice->mb_field_decoding_flag != slice->field_pic_flag) && sub_mb_type[mbPartIdx] != B_Direct_8x8 && SubMbPredMode(slice->slice_type, sub_mb_type[mbPartIdx]) != Pred_L0) { if (dc->entropy_coding_mode_flag) mb->ref_idx_l1[mbPartIdx] = read_ae(dc, SE_ref_idx_lx); else mb->ref_idx_l1[mbPartIdx] = read_te(dc->bitstr, 0); } } // mvd_l0 for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++) { if (sub_mb_type[mbPartIdx] != B_Direct_8x8 && SubMbPredMode(slice->slice_type, sub_mb_type[mbPartIdx]) != Pred_L1) { int subMbPartIdx = 0; for (subMbPartIdx = 0; subMbPartIdx < NumSubMbPart(slice->slice_type, sub_mb_type[mbPartIdx]); subMbPartIdx++) { if (dc->entropy_coding_mode_flag) { mb->mvd_l0[mbPartIdx][subMbPartIdx][0] = read_ae(dc, SE_mvd_lx0); mb->mvd_l0[mbPartIdx][subMbPartIdx][1] = read_ae(dc, SE_mvd_lx1); } else { mb->mvd_l0[mbPartIdx][subMbPartIdx][0] = read_se(dc->bitstr); mb->mvd_l0[mbPartIdx][subMbPartIdx][1] = read_se(dc->bitstr); } } } } // mvd_l1 for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++) { if (sub_mb_type[mbPartIdx] != B_Direct_8x8 && SubMbPredMode(slice->slice_type, sub_mb_type[mbPartIdx]) != Pred_L0) { int subMbPartIdx = 0; for (subMbPartIdx = 0; subMbPartIdx < NumSubMbPart(slice->slice_type, sub_mb_type[mbPartIdx]); subMbPartIdx++) { if (dc->entropy_coding_mode_flag) { mb->mvd_l1[mbPartIdx][subMbPartIdx][0] = read_ae(dc, SE_mvd_lx0); mb->mvd_l1[mbPartIdx][subMbPartIdx][1] = read_ae(dc, SE_mvd_lx1); } else { mb->mvd_l1[mbPartIdx][subMbPartIdx][0] = read_se(dc->bitstr); mb->mvd_l1[mbPartIdx][subMbPartIdx][1] = read_se(dc->bitstr); } } } } }
/*! * \brief Read prediction informations for current macroblock. * \param *dc The current DecodingContext. * \param *mb The current macroblock. * * Intra prediction infos are a table containing prediction mode for each blocks. * Inter prediction infos are motion vectors. */ static void mb_pred(DecodingContext_t *dc, Macroblock_t *mb) { TRACE_INFO(MB, " > " BLD_GREEN "mb_pred()\n" CLR_RESET); if (mb->MbPartPredMode[0] == Intra_4x4 || mb->MbPartPredMode[0] == Intra_8x8 || mb->MbPartPredMode[0] == Intra_16x16) { if (mb->MbPartPredMode[0] == Intra_4x4) { // Read intra prediction mode for all 16 4x4 luma blocks unsigned int luma4x4BlkIdx = 0; for (luma4x4BlkIdx = 0; luma4x4BlkIdx < 16; luma4x4BlkIdx++) { if (dc->entropy_coding_mode_flag) mb->prev_intra4x4_pred_mode_flag[luma4x4BlkIdx] = read_ae(dc, SE_prev_intraxxx_pred_mode_flag); else mb->prev_intra4x4_pred_mode_flag[luma4x4BlkIdx] = read_bit(dc->bitstr); if (mb->prev_intra4x4_pred_mode_flag[luma4x4BlkIdx] == false) { if (dc->entropy_coding_mode_flag) mb->rem_intra4x4_pred_mode[luma4x4BlkIdx] = read_ae(dc, SE_rem_intraxxx_pred_mode); else mb->rem_intra4x4_pred_mode[luma4x4BlkIdx] = read_bits(dc->bitstr, 3); } } } else if (mb->MbPartPredMode[0] == Intra_8x8) { // Read intra prediction mode for all 4 8x8 luma blocks unsigned int luma8x8BlkIdx = 0; for (luma8x8BlkIdx = 0; luma8x8BlkIdx < 4; luma8x8BlkIdx++) { if (dc->entropy_coding_mode_flag) mb->prev_intra8x8_pred_mode_flag[luma8x8BlkIdx] = read_ae(dc, SE_prev_intraxxx_pred_mode_flag); else mb->prev_intra8x8_pred_mode_flag[luma8x8BlkIdx] = read_bit(dc->bitstr); if (mb->prev_intra8x8_pred_mode_flag[luma8x8BlkIdx] == false) { if (dc->entropy_coding_mode_flag) mb->rem_intra8x8_pred_mode[luma8x8BlkIdx] = read_ae(dc, SE_rem_intraxxx_pred_mode); else mb->rem_intra8x8_pred_mode[luma8x8BlkIdx] = read_bits(dc->bitstr, 3); } } } // Read intra prediction mode for chroma blocks if (dc->ChromaArrayType == 1 || dc->ChromaArrayType == 2) { if (dc->entropy_coding_mode_flag) mb->IntraChromaPredMode = read_ae(dc, SE_intra_chroma_pred_mode); else mb->IntraChromaPredMode = read_ue(dc->bitstr); } } else if (mb->MbPartPredMode[0] != Direct) { // ref_idx_l0 unsigned int mbPartIdx = 0; for (mbPartIdx = 0; mbPartIdx < mb->NumMbPart; mbPartIdx++) { if ((dc->active_slice->num_ref_idx_l0_active_minus1 > 0 || dc->active_slice->mb_field_decoding_flag != dc->active_slice->field_pic_flag) && MbPartPredMode(mb, dc->active_slice->slice_type, mbPartIdx) != Pred_L1) { if (dc->entropy_coding_mode_flag) mb->ref_idx_l0[mbPartIdx] = read_ae(dc, SE_ref_idx_lx); else mb->ref_idx_l0[mbPartIdx] = read_te(dc->bitstr, 0); } } // ref_idx_l1 for (mbPartIdx = 0; mbPartIdx < mb->NumMbPart; mbPartIdx++) { if ((dc->active_slice->num_ref_idx_l1_active_minus1 > 0 || dc->active_slice->mb_field_decoding_flag != dc->active_slice->field_pic_flag) && MbPartPredMode(mb, dc->active_slice->slice_type, mbPartIdx) != Pred_L0) { if (dc->entropy_coding_mode_flag) mb->ref_idx_l1[mbPartIdx] = read_ae(dc, SE_ref_idx_lx); else mb->ref_idx_l1[mbPartIdx] = read_te(dc->bitstr, 0); } } // mvd_l0 for (mbPartIdx = 0; mbPartIdx < mb->NumMbPart; mbPartIdx++) { if (MbPartPredMode(mb, dc->active_slice->slice_type, mbPartIdx) != Pred_L1) { if (dc->entropy_coding_mode_flag) { mb->mvd_l0[mbPartIdx][0][0] = read_ae(dc, SE_mvd_lx0); mb->mvd_l0[mbPartIdx][0][1] = read_ae(dc, SE_mvd_lx1); } else { mb->mvd_l0[mbPartIdx][0][0] = read_te(dc->bitstr, 0); mb->mvd_l0[mbPartIdx][0][1] = read_te(dc->bitstr, 0); } } } // mvd_l1 for (mbPartIdx = 0; mbPartIdx < mb->NumMbPart; mbPartIdx++) { if (MbPartPredMode(mb, dc->active_slice->slice_type, mbPartIdx) != Pred_L0) { if (dc->entropy_coding_mode_flag) { mb->mvd_l1[mbPartIdx][0][0] = read_ae(dc, SE_mvd_lx0); mb->mvd_l1[mbPartIdx][0][1] = read_ae(dc, SE_mvd_lx1); } else { mb->mvd_l1[mbPartIdx][0][0] = read_te(dc->bitstr, 0); mb->mvd_l1[mbPartIdx][0][1] = read_te(dc->bitstr, 0); } } } } }
/** This function permits to decode the image reference of each sub-macroblock. @param data The NAL unit. @param position The current position in the NAL. @param block Contains all parameters of the current macroblock. @param slice The slice structure. */ int sub_mb_pred_svc ( const unsigned char *ai_pcData, int *position, const SLICE *ai_pstSlice, DATA *aio_pstMacroblock, RESIDU *Current_residu) { int mbPartIdx ; int subMbPartIdx ; //Recovery of the sub-macroblock type GetCavlcSubMbType(ai_pcData, position, Current_residu); #ifdef ERROR_DETECTION //Error detection if(ErrorsCheckSubMbType( Current_residu -> SubMbType, ai_pstSlice -> slice_type? MaxBSubMbType:MaxPSubMbType)){ return 1; } #endif //Recovery of the image reference of each sub-macroblock if( ai_pstSlice -> AdaptiveMotionPredictionFlag && Current_residu -> InCropWindow ) { for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if (sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L1 && sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct) { aio_pstMacroblock -> MotionPredL0 [mbPartIdx] = getNbits(ai_pcData, position, 1); } } //Recovery of the image reference of each sub-macroblock for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if ( sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L0 && sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct) { aio_pstMacroblock -> MotionPredL1 [mbPartIdx] = getNbits(ai_pcData, position, 1); } } }else{ aio_pstMacroblock -> MotionPredL0[0] = aio_pstMacroblock -> MotionPredL0[1] = aio_pstMacroblock -> MotionPredL0[2] = aio_pstMacroblock -> MotionPredL0[3] = aio_pstMacroblock -> MotionPredL1[0] = aio_pstMacroblock -> MotionPredL1[1] = aio_pstMacroblock -> MotionPredL1[2] = aio_pstMacroblock -> MotionPredL1[3] = ai_pstSlice -> DefaultMotionPredictionFlag; } if (ai_pstSlice -> num_RefIdxL0_active_minus1 != 0){ for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if ((Current_residu -> MbType != P_8x8ref0) && (!aio_pstMacroblock -> MotionPredL0[mbPartIdx]) && (sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct) && (sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L1)) { aio_pstMacroblock -> RefIdxL0 [mbPartIdx] = read_te(ai_pcData, position, ai_pstSlice -> num_RefIdxL0_active_minus1); } } } #ifdef ERROR_DETECTION //Error Detection if(ErrorsCheckSubRefLx(aio_pstMacroblock -> RefIdxL0, ai_pstSlice -> num_RefIdxL0_active_minus1)){ return 1; } #endif //Recovery of the image reference of each sub-macroblock if (ai_pstSlice -> num_RefIdxL1_active_minus1 != 0){ for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if ((sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct) && (sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L0) && (!aio_pstMacroblock -> MotionPredL1[mbPartIdx])) { aio_pstMacroblock -> RefIdxL1 [mbPartIdx] = read_te(ai_pcData, position, ai_pstSlice -> num_RefIdxL1_active_minus1); } } } #ifdef ERROR_DETECTION //Error Detection if(ErrorsCheckSubRefLx(aio_pstMacroblock -> RefIdxL1, ai_pstSlice -> num_RefIdxL1_active_minus1)){ return 1; } #endif //Recovery of the motion vector of each sub-macroblock for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if ( sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct && sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L1 ) { for ( subMbPartIdx = 0 ; subMbPartIdx < sub_num_part[ ai_pstSlice -> slice_type][ Current_residu -> SubMbType [mbPartIdx]] ; subMbPartIdx++ ) { int index = ( mbPartIdx << 2) + subMbPartIdx; aio_pstMacroblock -> MvdL0 [index][0] = read_se(ai_pcData, position); aio_pstMacroblock -> MvdL0 [index][1] = read_se(ai_pcData, position); } } } //Recovery of the motion vector of each sub-macroblock for ( mbPartIdx = 0 ; mbPartIdx < 4 ; mbPartIdx++ ) { if ( sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != B_direct && sub_mb_type_name[ai_pstSlice -> slice_type][Current_residu -> SubMbType [mbPartIdx]] != Pred_L0 ) { for ( subMbPartIdx = 0 ; subMbPartIdx < sub_num_part[ ai_pstSlice -> slice_type][ Current_residu -> SubMbType [mbPartIdx]] ; subMbPartIdx++ ) { int index = ( mbPartIdx << 2) + subMbPartIdx; aio_pstMacroblock -> MvdL1 [index][0] = read_se(ai_pcData, position); aio_pstMacroblock -> MvdL1 [index][1] = read_se(ai_pcData, position); } } } return 0; }
/** This function permits to decode the prediction mode or the image reference. @param ai_pcData The NAL unit. @param position The current position in the NAL. @param block Contains all parameters of the current macroblock. @param ai_pstSlice The slice structure. @param ao_pstIntra_pred_mode Contains the prediction mode for the current macroblock. */ int mb_pred_svc( const unsigned char *ai_pcData, int *position, const SLICE *ai_pstSlice, DATA *aio_pstMacroblock, RESIDU *Current_residu, short *intra4x4_pred_mode_cache) { int mbPartIdx ; //Recovery of the prediction mode if(IS_I(aio_pstMacroblock -> MbPartPredMode [0])){ if(mb_pred_I(ai_pcData, position, Current_residu, Current_residu -> Intra16x16DCLevel, intra4x4_pred_mode_cache)){ return 1; } } else if ( aio_pstMacroblock -> MbPartPredMode [0] != B_direct ) { if( ai_pstSlice -> AdaptiveMotionPredictionFlag && Current_residu -> InCropWindow ) { if(ReadMotionPredSVC(ai_pcData, position, aio_pstMacroblock -> MotionPredL0, aio_pstMacroblock, Pred_L1)) return 1; if(ReadMotionPredSVC(ai_pcData, position, aio_pstMacroblock -> MotionPredL1, aio_pstMacroblock, Pred_L0)) return 1; }else{ aio_pstMacroblock -> MotionPredL0[0] = aio_pstMacroblock -> MotionPredL0[1] = aio_pstMacroblock -> MotionPredL0[2] = aio_pstMacroblock -> MotionPredL0[3] = aio_pstMacroblock -> MotionPredL1[0] = aio_pstMacroblock -> MotionPredL1[1] = aio_pstMacroblock -> MotionPredL1[2] = aio_pstMacroblock -> MotionPredL1[3] = ai_pstSlice -> DefaultMotionPredictionFlag; } if ( ai_pstSlice -> num_RefIdxL0_active_minus1 != 0 ){ for ( mbPartIdx = 0 ; mbPartIdx < aio_pstMacroblock -> NumMbPart ; mbPartIdx++ ) { if ( (aio_pstMacroblock -> MbPartPredMode [mbPartIdx] != Pred_L1 ) && (!aio_pstMacroblock -> MotionPredL0[mbPartIdx])) { aio_pstMacroblock -> RefIdxL0 [mbPartIdx] = read_te(ai_pcData, position, ai_pstSlice -> num_RefIdxL0_active_minus1); } } } #ifdef ERROR_DETECTION //Error detection if(ErrorsCheckRefLx(aio_pstMacroblock -> RefIdxL0, ai_pstSlice -> num_RefIdxL0_active_minus1)){ return 1; } #endif //Recovery of of the image reference for the frame if ( ai_pstSlice -> num_RefIdxL1_active_minus1 != 0 ){ for ( mbPartIdx = 0 ; mbPartIdx < aio_pstMacroblock -> NumMbPart ; mbPartIdx++ ) { if ((aio_pstMacroblock -> MbPartPredMode [mbPartIdx] != Pred_L0) && (!aio_pstMacroblock -> MotionPredL1[mbPartIdx])) { aio_pstMacroblock -> RefIdxL1 [mbPartIdx] = read_te(ai_pcData, position, ai_pstSlice -> num_RefIdxL1_active_minus1); } } } #ifdef ERROR_DETECTION //Error detection if(ErrorsCheckRefLx(aio_pstMacroblock -> RefIdxL1, ai_pstSlice -> num_RefIdxL1_active_minus1)){ return 1; } #endif //Recovery of of the motion vector for the frame P for ( mbPartIdx = 0 ; mbPartIdx < aio_pstMacroblock -> NumMbPart ; mbPartIdx++ ) { /* Pour eviter de traiter les Images B*/ if ( aio_pstMacroblock -> MbPartPredMode [mbPartIdx] != Pred_L1 ) { aio_pstMacroblock -> MvdL0 [mbPartIdx << 2][0] = read_se(ai_pcData, position); aio_pstMacroblock -> MvdL0 [mbPartIdx << 2][1] = read_se(ai_pcData, position); } } //Recovery of of the motion vector for the frame B for ( mbPartIdx = 0 ; mbPartIdx < aio_pstMacroblock -> NumMbPart ; mbPartIdx++ ) { if ( aio_pstMacroblock -> MbPartPredMode [mbPartIdx] != Pred_L0 ) { aio_pstMacroblock -> MvdL1 [ mbPartIdx << 2][0] = read_se(ai_pcData, position); aio_pstMacroblock -> MvdL1 [ mbPartIdx << 2][1] = read_se(ai_pcData, position); } } }else{ Current_residu -> Mode = 4; for (mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++){ Current_residu -> SubMbType [mbPartIdx] = 3; } } return 0; }