[FFmpeg-devel] [PATCH 1/3] lavd/xv: speed up yuv420p write packet
Stefano Sabatini
stefasab at gmail.com
Thu Nov 14 12:15:47 CET 2013
On date Wednesday 2013-11-13 23:40:45 +0100, Lukasz Marek encoded:
> xv_write_packet do operations like multiplication that are not required.
> Small optimizations allows to make function up to 10% faster.
>
> Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
> ---
> libavdevice/xv.c | 31 +++++++++++++++++--------------
> 1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/libavdevice/xv.c b/libavdevice/xv.c
> index 50d72a5..fdc96c9 100644
> --- a/libavdevice/xv.c
> +++ b/libavdevice/xv.c
> @@ -141,6 +141,17 @@ static int xv_write_header(AVFormatContext *s)
> return 0;
> }
>
> +static av_always_inline void xv_copy_line(int h, const char *src, char *dst,
> + int src_linesize, int dst_linesize)
> +{
> + int y, len = FFMIN(src_linesize, dst_linesize);
> + for (y = 0; y < h; ++y) {
> + memcpy(dst, src, len);
> + src += src_linesize;
> + dst += dst_linesize;
> + }
> +}
av_image_copy_plane()?
> +
> static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
> {
> XVContext *xv = s->priv_data;
> @@ -148,22 +159,14 @@ static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
> XWindowAttributes window_attrs;
> AVPicture pict;
> AVCodecContext *ctx = s->streams[0]->codec;
> - int y, h;
> -
> - h = img->height / 2;
>
> avpicture_fill(&pict, pkt->data, ctx->pix_fmt, ctx->width, ctx->height);
> - for (y = 0; y < img->height; y++) {
> - memcpy(&img->data[img->offsets[0] + (y * img->pitches[0])],
> - &pict.data[0][y * pict.linesize[0]], img->pitches[0]);
> - }
> -
> - for (y = 0; y < h; ++y) {
> - memcpy(&img->data[img->offsets[1] + (y * img->pitches[1])],
> - &pict.data[1][y * pict.linesize[1]], img->pitches[1]);
> - memcpy(&img->data[img->offsets[2] + (y * img->pitches[2])],
> - &pict.data[2][y * pict.linesize[2]], img->pitches[2]);
> - }
> + xv_copy_line(img->height, pict.data[0], &img->data[img->offsets[0]],
> + pict.linesize[0], img->pitches[0]);
> + xv_copy_line(img->height / 2, pict.data[1], &img->data[img->offsets[1]],
> + pict.linesize[1], img->pitches[1]);
> + xv_copy_line(img->height / 2, pict.data[2], &img->data[img->offsets[2]],
> + pict.linesize[2], img->pitches[2]);
av_image_copy()?
--
FFmpeg = Fierce and Forgiving MultiPurpose Enlightening Gnome
More information about the ffmpeg-devel
mailing list