Logo Search packages:      
Sourcecode: ffmpeg version File versions  Download package

int sws_scale ( struct SwsContext *  context,
uint8_t *  srcSlice[],
int  srcStride[],
int  srcSliceY,
int  srcSliceH,
uint8_t *  dst[],
int  dstStride[] 
)

Scales the image slice in srcSlice and puts the resulting scaled slice in the image in dst. A slice is a sequence of consecutive rows in an image.

Parameters:
context the scaling context previously created with sws_getContext()
srcSlice the array containing the pointers to the planes of the source slice
srcStride the array containing the strides for each plane of the source image
srcSliceY the position in the source image of the slice to process, that is the number (counted starting from zero) in the image of the first row of the slice
srcSliceH the height of the source slice, that is the number of rows in the slice
dst the array containing the pointers to the planes of the destination image
dstStride the array containing the strides for each plane of the destination image
Returns:
the height of the output slice

Definition at line 605 of file imgresample.c.

Referenced by sws_scale_ordered().

{
    AVPicture src_pict, dst_pict;
    int i, res = 0;
    AVPicture picture_format_temp;
    AVPicture picture_resample_temp, *formatted_picture, *resampled_picture;
    uint8_t *buf1 = NULL, *buf2 = NULL;
    enum PixelFormat current_pix_fmt;

    for (i = 0; i < 4; i++) {
        src_pict.data[i] = src[i];
        src_pict.linesize[i] = srcStride[i];
        dst_pict.data[i] = dst[i];
        dst_pict.linesize[i] = dstStride[i];
    }
    if ((ctx->resampling_ctx->iwidth != ctx->resampling_ctx->owidth) ||
        (ctx->resampling_ctx->iheight != ctx->resampling_ctx->oheight)) {
        /* We have to rescale the picture, but only YUV420P rescaling is supported... */

        if (ctx->src_pix_fmt != PIX_FMT_YUV420P) {
            int size;

            /* create temporary picture for rescaling input*/
            size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight);
            buf1 = av_malloc(size);
            if (!buf1) {
                res = -1;
                goto the_end;
            }
            formatted_picture = &picture_format_temp;
            avpicture_fill((AVPicture*)formatted_picture, buf1,
                           PIX_FMT_YUV420P, ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight);

            if (img_convert((AVPicture*)formatted_picture, PIX_FMT_YUV420P,
                            &src_pict, ctx->src_pix_fmt,
                            ctx->resampling_ctx->iwidth, ctx->resampling_ctx->iheight) < 0) {

                av_log(ctx, AV_LOG_ERROR, "pixel format conversion not handled\n");
                res = -1;
                goto the_end;
            }
        } else {
            formatted_picture = &src_pict;
        }

        if (ctx->dst_pix_fmt != PIX_FMT_YUV420P) {
            int size;

            /* create temporary picture for rescaling output*/
            size = avpicture_get_size(PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);
            buf2 = av_malloc(size);
            if (!buf2) {
                res = -1;
                goto the_end;
            }
            resampled_picture = &picture_resample_temp;
            avpicture_fill((AVPicture*)resampled_picture, buf2,
                           PIX_FMT_YUV420P, ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);

        } else {
            resampled_picture = &dst_pict;
        }

        /* ...and finally rescale!!! */
        img_resample(ctx->resampling_ctx, resampled_picture, formatted_picture);
        current_pix_fmt = PIX_FMT_YUV420P;
    } else {
        resampled_picture = &src_pict;
        current_pix_fmt = ctx->src_pix_fmt;
    }

    if (current_pix_fmt != ctx->dst_pix_fmt) {
        if (img_convert(&dst_pict, ctx->dst_pix_fmt,
                        resampled_picture, current_pix_fmt,
                        ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight) < 0) {

            av_log(ctx, AV_LOG_ERROR, "pixel format conversion not handled\n");

            res = -1;
            goto the_end;
        }
    } else if (resampled_picture != &dst_pict) {
        av_picture_copy(&dst_pict, resampled_picture, current_pix_fmt,
                        ctx->resampling_ctx->owidth, ctx->resampling_ctx->oheight);
    }

the_end:
    av_free(buf1);
    av_free(buf2);
    return res;
}


Generated by  Doxygen 1.6.0   Back to index