On Tue, 2009-01-06 at 21:34 +0000, Andrew Church wrote:
> >If I understood correctly, you're worried about the need to do a full
> >copy of a frame when it's cloned, given this new model, am I right?
> 
> Not just for cloned frames, but for every frame in the resulting stream.
> Under the basic model I'm thinking of, intermediate processors (like
> filters) will allocate a new frame buffer for every frame they produce,
> disposing of every frame they receive once they're done with it.  In the
> pathological no-op case, the filter code would look like
> 
>     FrameBuffer *outframe = framebuffer_get();  // from framebuffer pool
>     outframe->frame_num = my_frame_num++;
>     memcpy(outframe->data, inframe->data, inframe->data_size);
>     framebuffer_free(inframe);  // probably done by the function wrapper
>                                 // (as I suggested before) to avoid code
>                                 // duplication in all the filters
> 
> which is an obvious waste of time compared to the zero-copy method.

Ok, understood, but why we can't just continue doing

while (have_frames(MY_POOL_ID)) {
    FrameBuffer *frame = framebuffer_get(MY_POOL_ID);
    do_some_processing(frame);
    frame->id = my_frame_num++;
    framebuffer_put(frame, NEXT_POOL_ID); // the frame->status switch is
                                          // actually done here
}

like we already do?
(our current code is not that different, see for example
frame_threads.c , and vframe_reserve/vframe_push_next and their
implementation)

In a nutshell, why can't just pass away the old frame recycling it?

I mean, from the POW of a given processing state, disposing a frame can
be seen just as putting the frame into NULL (or any else) pool and
forget about it.

Of course things changes slightly for cloned frames.

Bests,

-- 
Francesco Romani // Ikitt
http://fromani.exit1.org  ::: transcode homepage
http://tcforge.berlios.de ::: transcode experimental forge

Reply via email to