• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "viddec_mp4_decodevideoobjectplane.h"
2 
mp4_DecodeVideoObjectPlane(mp4_Info_t * pInfo)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