| #include "viddec_mp4_decodevideoobjectplane.h" |
| |
| mp4_Status_t mp4_DecodeVideoObjectPlane(mp4_Info_t* pInfo) |
| { |
| mp4_Status_t status = MP4_STATUS_OK; |
| uint32_t vop_time=0; |
| // mp4_VisualObject_t *vo = &(pInfo->VisualObject); |
| mp4_VideoObjectLayer_t *vol = &(pInfo->VisualObject.VideoObject); |
| mp4_GroupOfVideoObjectPlane_t *gvop = &(pInfo->VisualObject.VideoObject.GroupOfVideoObjectPlane); |
| mp4_VideoObjectPlane_t *vop = &(pInfo->VisualObject.VideoObject.VideoObjectPlane); |
| |
| // set VOP time |
| if (vol->short_video_header) |
| { |
| vop_time = vol->vop_sync_time + |
| pInfo->VisualObject.VideoObject.VideoObjectPlaneH263.temporal_reference * 1001; |
| |
| // if (vo->currentFrame.time > vop_time) |
| { |
| vol->vop_sync_time += 256 * 1001; |
| vop_time += 256 * 1001; |
| } |
| } |
| else |
| { |
| if (vop->vop_coding_type == MP4_VOP_TYPE_B) |
| { |
| vop_time = vol->vop_sync_time_b + vop->modulo_time_base * vol->vop_time_increment_resolution + vop->vop_time_increment; |
| } |
| else |
| { |
| if (gvop->time_base > vol->vop_sync_time) |
| vol->vop_sync_time = gvop->time_base; |
| |
| vop_time = vol->vop_sync_time + vop->modulo_time_base * vol->vop_time_increment_resolution + vop->vop_time_increment; |
| |
| if (vol->vop_sync_time_b < vol->vop_sync_time) |
| vol->vop_sync_time_b = vol->vop_sync_time; |
| |
| if (vop->modulo_time_base != 0) |
| vol->vop_sync_time = vop_time - vop->vop_time_increment; |
| } |
| } |
| |
| if (vop->vop_coded) |
| { |
| switch (vop->vop_coding_type) |
| { |
| case MP4_VOP_TYPE_S: |
| if (vol->sprite_enable != MP4_SPRITE_GMC) |
| break; |
| // Deliberate fall-through from this case |
| case MP4_VOP_TYPE_I: |
| case MP4_VOP_TYPE_P: |
| // set past and future time for B-VOP |
| vol->pastFrameTime = vol->futureFrameTime; |
| vol->futureFrameTime = vop_time; |
| break; |
| default: |
| break; |
| } |
| } |
| |
| if (vop->vop_coded) |
| // || (vop_time != vo->currentFrame.time && vop_time != vo->pastFrame.time && vop_time != vo->futureFrame.time) ) |
| { |
| if (vop->vop_coding_type == MP4_VOP_TYPE_B) |
| { |
| if (!vol->Tframe) |
| vol->Tframe = (int) (vop_time); // - vo->pastFrame.time); |
| |
| if (vop->vop_coded) |
| { |
| vol->TRB = (int) (vop_time - vol->pastFrameTime); |
| vol->TRD = (int) (vol->futureFrameTime - vol->pastFrameTime); |
| |
| // defense from bad streams when B-VOPs are before Past and/or Future |
| if (vol->TRB <= 0) |
| vol->TRB = 1; |
| |
| if (vol->TRD <= 0) |
| vol->TRD = 2; |
| |
| if (vol->TRD <= vol->TRB) |
| { |
| vol->TRB = 1; |
| vol->TRD = 2; |
| } |
| |
| if (vol->Tframe >= vol->TRD) |
| vol->Tframe = vol->TRB; |
| } |
| } |
| } |
| |
| return status; |
| } // mp4_DecodeVideoObjectPlane |
| |