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