--- encoder.c 2002/09/28 13:01:02 1.76.2.4 +++ encoder.c 2002/10/02 12:57:25 1.76.2.9 @@ -39,7 +39,7 @@ * MinChen * 14.04.2002 added FrameCodeB() * - * $Id: encoder.c,v 1.76.2.4 2002/09/28 13:01:02 chl Exp $ + * $Id: encoder.c,v 1.76.2.9 2002/10/02 12:57:25 suxen_drol Exp $ * ****************************************************************************/ @@ -411,7 +411,10 @@ pEnc->queue_size = 0; pEnc->mbParam.m_stamp = 0; + pEnc->m_framenum = 0; + pEnc->current->stamp = 0; + pEnc->reference->stamp = 0; pParam->handle = (void *) pEnc; @@ -600,8 +603,8 @@ static __inline void inc_frame_num(Encoder * pEnc) { + pEnc->current->stamp = pEnc->mbParam.m_stamp; // first frame is zero pEnc->mbParam.m_stamp += pEnc->mbParam.fincr; - pEnc->current->stamp = pEnc->mbParam.m_stamp; } @@ -637,9 +640,9 @@ pCur->ticks = (int32_t)pCur->stamp % time_base; pCur->seconds = ((int32_t)pCur->stamp / time_base) - ((int32_t)pRef->stamp / time_base) ; -/* HEAVY DEBUG OUTPUT remove when timecodes prove to be stable + //HEAVY DEBUG OUTPUT remove when timecodes prove to be stable - fprintf(stderr,"WriteVop: %d - %d \n", +/* fprintf(stderr,"WriteVop: %d - %d \n", ((int32_t)pCur->stamp / time_base), ((int32_t)pRef->stamp / time_base)); fprintf(stderr,"set_timecodes: VOP %1d stamp=%lld ref_stamp=%lld base=%d\n", pCur->coding_type, pCur->stamp, pRef->stamp, time_base); @@ -741,16 +744,26 @@ if (pEnc->bframenum_head > 0) { pEnc->bframenum_head = pEnc->bframenum_tail = 0; + /* write an empty marker to the bitstream. + + for divx5 decoder compatibility, this marker must consist + of a not-coded p-vop, with a time_base of zero, and time_increment + indentical to the future-referece frame. + */ + if ((pEnc->global & XVID_GLOBAL_PACKED)) { + int tmp; DPRINTF(DPRINTF_DEBUG,"*** EMPTY bf: head=%i tail=%i queue: head=%i tail=%i size=%i", pEnc->bframenum_head, pEnc->bframenum_tail, pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); - set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); - BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); BitstreamPad(&bs); - BitstreamPutBits(&bs, 0x7f, 8); + + tmp = pEnc->current->seconds; + pEnc->current->seconds = 0; /* force time_base = 0 */ + BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); + pEnc->current->seconds = tmp; pFrame->length = BitstreamLength(&bs); pFrame->intra = 0; @@ -812,22 +825,20 @@ pEnc->queue_head = (pEnc->queue_head + 1) % pEnc->mbParam.max_bframes; pEnc->queue_size--; - } else if (BitstreamPos(&bs) == 0) { + } else { - DPRINTF(DPRINTF_DEBUG,"*** SKIP bf: head=%i tail=%i queue: head=%i tail=%i size=%i", - pEnc->bframenum_head, pEnc->bframenum_tail, - pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); + /* if nothing was encoded, write an 'ignore this frame' flag + to the bitstream */ - pFrame->intra = 0; + if (BitstreamPos(&bs) == 0) { - set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); - BitstreamWriteVopHeader(&bs, &pEnc->mbParam, pEnc->current, 0); // write N_VOP - BitstreamPad(&bs); - pFrame->length = BitstreamLength(&bs); - - return XVID_ERR_OK; + DPRINTF(DPRINTF_DEBUG,"*** SKIP bf: head=%i tail=%i queue: head=%i tail=%i size=%i", + pEnc->bframenum_head, pEnc->bframenum_tail, + pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); - } else { + BitstreamPutBits(&bs, 0x7f, 8); + pFrame->intra = 0; + } pFrame->length = BitstreamLength(&bs); return XVID_ERR_OK; @@ -1109,6 +1120,8 @@ pEnc->current->motion_flags = pFrame->motion; pEnc->mbParam.hint = &pFrame->hint; + inc_frame_num(pEnc); + /* disable alternate scan flag if interlacing is not enabled */ if ((pEnc->current->global_flags & XVID_ALTERNATESCAN) && !(pEnc->current->global_flags & XVID_INTERLACING)) @@ -1243,7 +1256,6 @@ DEBUG(temp); #endif - inc_frame_num(pEnc); pEnc->iFrameNum++; stop_global_timer(); @@ -1542,12 +1554,9 @@ pEnc->sStat.iMvCount = 0; pEnc->mbParam.m_fcode = 2; -// pEnc->time_pp = ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)); - if (pEnc->current->global_flags & XVID_HINTEDME_GET) { HintedMEGet(pEnc, 1); } -// pEnc->last_pframe = (int32_t)pEnc->mbParam.m_stamp; return 1; // intra } @@ -1794,9 +1803,6 @@ *pBits = BitstreamPos(bs) - *pBits; -// pEnc->time_pp = ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)); -// pEnc->last_pframe = (int32_t)pEnc->mbParam.m_stamp; - return 0; // inter } @@ -1849,7 +1855,7 @@ start_timer(); MotionEstimationBVOP(&pEnc->mbParam, frame, - ((int32_t)(frame->stamp - pEnc->reference->stamp)), // time_bp + ((int32_t)(pEnc->current->stamp - frame->stamp)), // time_bp ((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)), // time_pp pEnc->reference->mbs, f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv,