Skip to content

Commit

Permalink
utvideoenc: align mangled buffer starts.
Browse files Browse the repository at this point in the history
This is essential for fast SIMD accesses.
The same should be done with the predict output.

Reviewed-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
michaelni committed Aug 22, 2012

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent d79c87a commit 729b2d0
Showing 2 changed files with 11 additions and 8 deletions.
1 change: 1 addition & 0 deletions libavcodec/utvideo.h
Original file line number Diff line number Diff line change
@@ -75,6 +75,7 @@ typedef struct UtvideoContext {
int interlaced;
int frame_pred;

int slice_stride;
uint8_t *slice_bits, *slice_buffer[4];
int slice_bits_size;
} UtvideoContext;
18 changes: 10 additions & 8 deletions libavcodec/utvideoenc.c
Original file line number Diff line number Diff line change
@@ -145,7 +145,8 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx)
}

for (i = 0; i < c->planes; i++) {
c->slice_buffer[i] = av_malloc(avctx->width * (avctx->height + 1) +
c->slice_stride = FFALIGN(avctx->width, 32);
c->slice_buffer[i] = av_malloc(c->slice_stride * (avctx->height + 2) +
FF_INPUT_BUFFER_PADDING_SIZE);
if (!c->slice_buffer[i]) {
av_log(avctx, AV_LOG_ERROR, "Cannot allocate temporary buffer 1.\n");
@@ -196,11 +197,11 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx)
return 0;
}

static void mangle_rgb_planes(uint8_t *dst[4], uint8_t *src, int step,
int stride, int width, int height)
static void mangle_rgb_planes(uint8_t *dst[4], int dst_stride, uint8_t *src,
int step, int stride, int width, int height)
{
int i, j;
int k = width;
int k = 2 * dst_stride;
unsigned g;

for (j = 0; j < height; j++) {
@@ -224,6 +225,7 @@ static void mangle_rgb_planes(uint8_t *dst[4], uint8_t *src, int step,
k++;
}
}
k += dst_stride - width;
src += stride;
}
}
@@ -547,16 +549,16 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt,

/* In case of RGB, mangle the planes to Ut Video's format */
if (avctx->pix_fmt == PIX_FMT_RGBA || avctx->pix_fmt == PIX_FMT_RGB24)
mangle_rgb_planes(c->slice_buffer, pic->data[0], c->planes,
pic->linesize[0], width, height);
mangle_rgb_planes(c->slice_buffer, c->slice_stride, pic->data[0],
c->planes, pic->linesize[0], width, height);

/* Deal with the planes */
switch (avctx->pix_fmt) {
case PIX_FMT_RGB24:
case PIX_FMT_RGBA:
for (i = 0; i < c->planes; i++) {
ret = encode_plane(avctx, c->slice_buffer[i] + width,
c->slice_buffer[i], width,
ret = encode_plane(avctx, c->slice_buffer[i] + 2 * c->slice_stride,
c->slice_buffer[i], c->slice_stride,
width, height, &pb);

if (ret) {

0 comments on commit 729b2d0

Please sign in to comment.