diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2014-12-10 12:20:49 +0000 |
---|---|---|
committer | Vittorio Giovara <vittorio.giovara@gmail.com> | 2015-01-14 17:17:24 +0100 |
commit | e2ad0b66fa273c5c823978e8f601f2c0d9ee42f8 (patch) | |
tree | d746c75e7edf7f24faf96980c9392fcf744abe4e /libavcodec | |
parent | cf70ba37ba74089a18295b29e77dead0a3222c9e (diff) | |
download | ffmpeg-e2ad0b66fa273c5c823978e8f601f2c0d9ee42f8.tar.gz |
imgutils: create misc functions for dealing with buffers
Move the lavc/imgconvert functions and rename them as follows:
avpicture_get_size -> av_image_get_buffer_size()
avpicture_fill -> av_image_fill_arrays()
avpicture_layout -> av_image_copy_to_buffer()
The new functions have an align parameter, which allows to define the
linesize alignment assumed in the buffer (which is set or read).
The names of the functions are consistent with the lavu/samples API
(av_samples_get_buffer_size(), av_samples_fill_arrays()).
A redundant check has been dropped from av_image_fill_arrays().
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/avcodec.h | 43 | ||||
-rw-r--r-- | libavcodec/avpicture.c | 58 |
2 files changed, 13 insertions, 88 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 8a008c97c0..025f1198bf 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -4072,42 +4072,18 @@ int avpicture_alloc(AVPicture *picture, enum AVPixelFormat pix_fmt, int width, i void avpicture_free(AVPicture *picture); /** - * Fill in the AVPicture fields. - * The fields of the given AVPicture are filled in by using the 'ptr' address - * which points to the image data buffer. Depending on the specified picture - * format, one or multiple image data pointers and line sizes will be set. - * If a planar format is specified, several pointers will be set pointing to - * the different picture planes and the line sizes of the different planes - * will be stored in the lines_sizes array. - * Call with ptr == NULL to get the required size for the ptr buffer. + * Fill in the AVPicture fields, always assume a linesize alignment of 1. * - * To allocate the buffer and fill in the AVPicture fields in one call, - * use avpicture_alloc(). - * - * @param picture AVPicture whose fields are to be filled in - * @param ptr Buffer which will contain or contains the actual image data - * @param pix_fmt The format in which the picture data is stored. - * @param width the width of the image in pixels - * @param height the height of the image in pixels - * @return size of the image data in bytes + * @see av_image_fill_arrays(). */ int avpicture_fill(AVPicture *picture, uint8_t *ptr, enum AVPixelFormat pix_fmt, int width, int height); /** - * Copy pixel data from an AVPicture into a buffer. - * The data is stored compactly, without any gaps for alignment or padding - * which may be applied by avpicture_fill(). - * - * @see avpicture_get_size() + * Copy pixel data from an AVPicture into a buffer, always assume a + * linesize alignment of 1. * - * @param[in] src AVPicture containing image data - * @param[in] pix_fmt The format in which the picture data is stored. - * @param[in] width the width of the image in pixels. - * @param[in] height the height of the image in pixels. - * @param[out] dest A buffer into which picture data will be copied. - * @param[in] dest_size The size of 'dest'. - * @return The number of bytes written to dest, or a negative value (error code) on error. + * @see av_image_copy_to_buffer(). */ int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, int width, int height, @@ -4116,14 +4092,9 @@ int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, /** * Calculate the size in bytes that a picture of the given width and height * would occupy if stored in the given picture format. - * Note that this returns the size of a compact representation as generated - * by avpicture_layout(), which can be smaller than the size required for e.g. - * avpicture_fill(). + * Always assume a linesize alignment of 1. * - * @param pix_fmt the given picture format - * @param width the width of the image - * @param height the height of the image - * @return Image data size in bytes or -1 on error (e.g. too large dimensions). + * @see av_image_get_buffer_size(). */ int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); diff --git a/libavcodec/avpicture.c b/libavcodec/avpicture.c index a50bbc497f..6bde0f8445 100644 --- a/libavcodec/avpicture.c +++ b/libavcodec/avpicture.c @@ -34,68 +34,22 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr, enum AVPixelFormat pix_fmt, int width, int height) { - int ret; - - if ((ret = av_image_check_size(width, height, 0, NULL)) < 0) - return ret; - - if ((ret = av_image_fill_linesizes(picture->linesize, pix_fmt, width)) < 0) - return ret; - - return av_image_fill_pointers(picture->data, pix_fmt, - height, ptr, picture->linesize); + return av_image_fill_arrays(picture->data, picture->linesize, + ptr, pix_fmt, width, height, 1); } int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, int width, int height, unsigned char *dest, int dest_size) { - int i, j, nb_planes = 0, linesizes[4]; - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); - int size = avpicture_get_size(pix_fmt, width, height); - - if (size > dest_size || size < 0) - return AVERROR(EINVAL); - - for (i = 0; i < desc->nb_components; i++) - nb_planes = FFMAX(desc->comp[i].plane, nb_planes); - - nb_planes++; - - av_image_fill_linesizes(linesizes, pix_fmt, width); - for (i = 0; i < nb_planes; i++) { - int h, shift = (i == 1 || i == 2) ? desc->log2_chroma_h : 0; - const unsigned char *s = src->data[i]; - h = (height + (1 << shift) - 1) >> shift; - - for (j = 0; j < h; j++) { - memcpy(dest, s, linesizes[i]); - dest += linesizes[i]; - s += src->linesize[i]; - } - } - - if (desc->flags & AV_PIX_FMT_FLAG_PAL) - memcpy((unsigned char *)(((size_t)dest + 3) & ~3), - src->data[1], 256 * 4); - - return size; + return av_image_copy_to_buffer(dest, dest_size, + src->data, src->linesize, + pix_fmt, width, height, 1); } int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height) { - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); - AVPicture dummy_pict; - int ret; - - if (!desc) - return AVERROR(EINVAL); - if ((ret = av_image_check_size(width, height, 0, NULL)) < 0) - return ret; - if (desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) - // do not include palette for these pseudo-paletted formats - return width * height; - return avpicture_fill(&dummy_pict, NULL, pix_fmt, width, height); + return av_image_get_buffer_size(pix_fmt, width, height, 1); } int avpicture_alloc(AVPicture *picture, |