[M4IF Technotes] Motion compensation and skipped macroblocks

Markus Wittkop Markus.Wittkop dynapel.de
Mon Jul 1 19:43:50 EDT 2002


Dear all,
according to my understanding of MPEG4 Part2:Visual both P-VOPs and
S(GMC)-VOPs may occur within a VOL with sprite_enable==GMC. If this is
right, I am confused concerning motion compensation in the case of
skipped co-located macroblocks:
In section 7.6.9.6 of ISO/IEC 14496-2 two rules are given:
"
  1) If the co-located macroblock in the most recently decoded I- or
     P-VOP is skipped, the current B-macroblock is treated as the 
forward
     mode with zero motion vector (MVFx, MVFy).
  2) If the co-located macroblock in the most recently decoded S(GMC)-VOP
     is skipped, this co-located macroblock is treated as a non-skipped
     macroblock with the averaged motion vector defined in subclause
     7.8.7.3 for the current B-macroblock.
"
Hence rule one should be applied irrespective of sprite_enable and rule
two should be applied merely for S(GMC)-VOPs.
Within the syntax (section 6.2.6) these rules are expressed by the
following condition:
"
  if ((co_located_not_coded != 1 ||
      (scalability && (ref_select_code != '11'
       || enhancement_type == 1)) || (sprite_enable == "GMC"
       && backward_reference_vop_coding_type == "S"))
       && video_object_layer_shape != "binary only")
"
Both the sprite usage mode (sprite_enable=="GMC") and the prediction
mode (backward_reference_vop_coding_type == "S") are tested.
However the corresponding condition in the MoMuSys
(MoMuSys-FPDAM1-FPDAM4-001231) reference implementation
reads
"
           if((GetVopCoded(GetVopNextTemp(rec_vop)) == 1)         &&
              (co_mbx>=0)&&(co_mbx<GetImageSizeX(MB_decisions_P)) &&
              (co_mby>=0)&&(co_mby<GetImageSizeY(MB_decisions_P))  &&
              (mode_P[co_mby*GetImageSizeX(MB_decisions_P)+co_mbx]
               ==MBM_SKIPPED)&&(!spatial_scalability)  &&
              /* modified by NTT for GMC coding : start */
              (GetVopSpriteUsage(rec_vop) != GMC_SPRITE) &&
              /* modified by NTT for GMC coding : end */
              (GetVopScalability(rec_vop)==0 ||
               (GetVopScalability(rec_vop)==1 &&
                ref_sel_code==3 && GetVopEnhanceType(rec_vop)==0)))
"
It seems that there is only a test of the sprite usage mode
(GetVopSpriteUsage(rec_vop) != GMC_SPRITE) and no test of the prediction
mode. This would mean that this condition treats a P-VOP within a VOL
with sprite_enable==GMC as a S(GMC)-VOP.
I would very much appreciate if someone could clarify this.
Thanks in advance,
Markus Wittkop


More information about the Mp4-tech mailing list