Home | History | Annotate | Download | only in parser
      1 #include "viddec_mp4_decodevideoobjectplane.h"
      2 
      3 mp4_Status_t mp4_DecodeVideoObjectPlane(mp4_Info_t* pInfo)
      4 {
      5     mp4_Status_t status = MP4_STATUS_OK;
      6     uint32_t vop_time=0;
      7 //    mp4_VisualObject_t *vo = &(pInfo->VisualObject);
      8     mp4_VideoObjectLayer_t *vol = &(pInfo->VisualObject.VideoObject);
      9     mp4_GroupOfVideoObjectPlane_t *gvop = &(pInfo->VisualObject.VideoObject.GroupOfVideoObjectPlane);
     10     mp4_VideoObjectPlane_t *vop = &(pInfo->VisualObject.VideoObject.VideoObjectPlane);
     11 
     12     // set VOP time
     13     if (vol->short_video_header)
     14     {
     15         vop_time = vol->vop_sync_time +
     16             pInfo->VisualObject.VideoObject.VideoObjectPlaneH263.temporal_reference * 1001;
     17 
     18 //        if (vo->currentFrame.time > vop_time)
     19         {
     20             vol->vop_sync_time += 256 * 1001;
     21             vop_time += 256 * 1001;
     22         }
     23     }
     24     else
     25     {
     26         if (vop->vop_coding_type == MP4_VOP_TYPE_B)
     27         {
     28             vop_time = vol->vop_sync_time_b + vop->modulo_time_base * vol->vop_time_increment_resolution + vop->vop_time_increment;
     29         }
     30         else
     31         {
     32             if (gvop->time_base > vol->vop_sync_time)
     33                 vol->vop_sync_time = gvop->time_base;
     34 
     35             vop_time = vol->vop_sync_time + vop->modulo_time_base * vol->vop_time_increment_resolution + vop->vop_time_increment;
     36 
     37             if (vol->vop_sync_time_b < vol->vop_sync_time)
     38                 vol->vop_sync_time_b = vol->vop_sync_time;
     39 
     40             if (vop->modulo_time_base != 0)
     41                 vol->vop_sync_time = vop_time - vop->vop_time_increment;
     42         }
     43     }
     44 
     45     if(vop->vop_coded)
     46     {
     47         switch (vop->vop_coding_type)
     48         {
     49             case MP4_VOP_TYPE_S:
     50                 if (vol->sprite_enable != MP4_SPRITE_GMC)
     51                     break;
     52                 // Deliberate fall-through from this case
     53             case MP4_VOP_TYPE_I:
     54             case MP4_VOP_TYPE_P:
     55                 // set past and future time for B-VOP
     56                 vol->pastFrameTime = vol->futureFrameTime;
     57                 vol->futureFrameTime = vop_time;
     58                 break;
     59             default:
     60                 break;
     61         }
     62     }
     63 
     64     if (vop->vop_coded)
     65 //     || (vop_time != vo->currentFrame.time && vop_time != vo->pastFrame.time && vop_time != vo->futureFrame.time) )
     66     {
     67         if(vop->vop_coding_type == MP4_VOP_TYPE_B)
     68         {
     69             if (!vol->Tframe)
     70                 vol->Tframe = (int) (vop_time); // - vo->pastFrame.time);
     71 
     72             if (vop->vop_coded)
     73             {
     74                 vol->TRB = (int) (vop_time - vol->pastFrameTime);
     75                 vol->TRD = (int) (vol->futureFrameTime - vol->pastFrameTime);
     76 
     77                 // defense from bad streams when B-VOPs are before Past and/or Future
     78                 if (vol->TRB <= 0)
     79                     vol->TRB = 1;
     80 
     81                 if (vol->TRD <= 0)
     82                     vol->TRD = 2;
     83 
     84                 if (vol->TRD <= vol->TRB)
     85                 {
     86                     vol->TRB = 1;
     87                     vol->TRD = 2;
     88                 }
     89 
     90                 if (vol->Tframe >= vol->TRD)
     91                     vol->Tframe = vol->TRB;
     92             }
     93         }
     94     }
     95 
     96     return status;
     97 } // mp4_DecodeVideoObjectPlane
     98 
     99