Would you mind explaining the layout of an AVFrame and how it works with the
stride (linesize?).

I would like to do a simple and fast memcpy for performance reasons. Since
I'm rendering on the gpu I can do these layout calculations there instead of
the cpu.

Regards

On Mon, Nov 1, 2010 at 8:40 AM, Tomas Härdin <[email protected]>wrote:

> On Sat, 2010-10-30 at 22:59 +0200, Robert Nagy wrote:
> > I have a decoded AVFrame which I want to copy using memcpy to user
> allocated
> > memory. However, if I don't use swscale it becomes weird, even though
> both
> > dest and src pixel formats and sizes are the same.
> >
> > What is sws_scale doing that I am not aware of?
> >
> > e.g.
> > double param;
> >                 if(!sws_context_)
> >        sws_context_.reset(sws_getContext(width, height, PIX_FMT_BGRA,
> width,
> > height, PIX_FMT_BGRA, SWS_BILINEAR, nullptr, nullptr, &param),
> > sws_freeContext);
> >   #ifdef FRAME_DIRECT_COPY
> >
> > memcpy(frame->data(), decoded_frame->data[0], width*height*4); // This
> > should be the same as below? but it's not.
>
> You can't just memcpy() - you need to take the strides into account.
>
> >
> > #else
> >
> >                // This works just fine
> > AVFrame av_frame;
> > avcodec_get_frame_defaults(&av_frame);
> > avpicture_fill(reinterpret_cast<AVPicture*>(&av_frame), frame->data(),
> > PIX_FMT_BGRA, width, height);
> > sws_scale(sws_context_.get(), decoded_frame->data,
> decoded_frame->linesize,
> > 0, height, av_frame.data, av_frame.linesize);
>
> Just use av_picture_copy() and change av_frame to be an AVPicture.
>
> The reason it works with avpicture_fill() is because it sets up the
> AVPicture in a "tightly packet" manner, meaning each stride is equal to
> width*bytes_per_pixel.
>
> Finally, you can also use avpicture_layout() if you just need to data
> packed into that flat buffer and don't need an AVPicture/AVFrame.
>
> /Tomas
>
> _______________________________________________
> libav-user mailing list
> [email protected]
> https://lists.mplayerhq.hu/mailman/listinfo/libav-user
>
>
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to