Re[4]: [XviD-devel] scene change detecting in Bframes mode
peter ross
xvid-devel@xvid.org
Wed, 21 Aug 2002 01:09:36 +1000
> > syskin, i think you've got I-frames and P-frames mixed up.
>
>gruel is right here
my appologies.
> > For each frame we assume its going to be a P-frame ad perform motion
> > estimation. After the m.e. we then decide on the frame type
> > - I-frame: code the i-frame
>
>No I don't like it. I frame should be on a scene change, not a few
>frames after. If you do it a few frames after, then B frames before
>this I frame will use only backward prediction, as they belong to the
>same scene as the I frame. That's gonna be very inefficient.
the IPB-encoder is rather complex, but i assure you it handles all
the issues of reording, backward prediction and such correctly.
when i designed it, i drew up a rough flow-chart sketch of the
encoder. i'll scan it in and post for you someday.
xvid currently handles I-frames followed B-frames correctly. eg.
(display order) PBBPBBI
and if you use DX50IVOP, xvid will ensure the frame prior to an I-frame
is encoded as a P-frame. eg.
(display order) PBBPBPI
xvid also handles the last frame correctly, to prevent this error
(display order) PBBPBB<end of stream>
note: this is not functional with vfw/vdub at the moment.
>Now how? To code a b-frame you need a future P frame. To have a future
>P frame, you need previous P frame. Once you have both P frames, this
>frame can ONLY be B, because if you would decide to make it P/B then
>you would have to trash the future P frame (not valid anymore).
internally xvid has two queues, one for frames which have not been
processed yet, and another for bframes. when you give xvid a frame to be
encoded, the encoder essentially has a three-way if statement:
1. if this is the very first frame, OR a detected keyframe,
then flag this frame as an I-frame and add it to the queue.
now, if there are any bframes waiting, code them accordingly.
otherwise, pop a frame from the queue and code it.
return;
2. otherwise, if we have reached our max_bframes count, then flag
this frame as a P-frame and add it to the queue.
(from here onwwards, we perform the same operation as choice 1).
if there are any bframes waiting, code them accordingly.
otherwise, pop a frame from the queue and code it.
return;
3. otherwise, flag this frame as a bframe and add it to the bframe
queue.
return;
in summary, XVID encodes frames in bitstream, not display order.
goodnight.
-- pete
_________________________________________________________________
MSN Photos is the easiest way to share and print your photos:
http://photos.msn.com/support/worldwide.aspx