if (p->MbaffFrameFlag && mb_y==16 && MbQ->mb_field) filterTopMbEdgeFlag = 0; 這個判斷是針對域宏塊對來說的么?為什么mb_y要等于16而不是0呢?
對照標準 8.7 小節中變量 filterTopMbEdgeFlag 的推倒過程去理解。標準規定了 filterTopMbEdgeFlag = 0 有 5 種情況,自己去對照一下看該段代碼的功能與哪種情況比較吻合。 我在查閱了標準,他是這樣解釋的: If any of the following conditions is true, the variable filterTopMbEdgeFlag is set equal to 0. – ?? ??? MbaffFrameFlag is equal to 0 and CurrMbAddr is less than PicWidthInMbs. – ?? ??? MbaffFrameFlag is equal to 1, ( CurrMbAddr >> 1 ) is less than PicWidthInMbs, and the macroblock CurrMbAddr is a field macroblock. – ?? ??? MbaffFrameFlag is equal to 1, ( CurrMbAddr >> 1 ) is less than PicWidthInMbs, the macroblock CurrMbAddr is a frame macroblock, and CurrMbAddr % 2 is equal to 0. – ?? ??? disable_deblocking_filter_idc for the slice that contains the macroblock CurrMbAddr is equal to 1 – ?? ??? disable_deblocking_filter_idc for the slice that contains the macroblock CurrMbAddr is equal to 2 and the macroblock mbAddrB is not available??? 就是第二條
看了城里漢子的帖子,并且在編碼端找到了 static const int?? b8_mode_table[6]?? = {0, 4, 5, 6, 7}; ?? ?? // DO NOT CHANGE ORDER !!! static const int?? mb_mode_table[7]?? = {0, 1, 2, 3, P8x8, I16MB, I4MB}; // DO NOT CHANGE ORDER !!!