diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 938b5acfd6..e937c4b9fa 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -16,6 +16,7 @@ HEADERS = avcodec.h \ OBJS = allcodecs.o \ audioconvert.o \ avpacket.o \ + avpicture.o \ bitstream.o \ bitstream_filter.o \ codec_desc.o \ diff --git a/libavcodec/avpicture.c b/libavcodec/avpicture.c new file mode 100644 index 0000000000..a6f89ef884 --- /dev/null +++ b/libavcodec/avpicture.c @@ -0,0 +1,78 @@ +/* + * AVPicture management routines + * Copyright (c) 2001, 2002, 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * AVPicture management routines + */ + +#include "avcodec.h" +#include "internal.h" +#include "libavutil/common.h" +#include "libavutil/pixdesc.h" +#include "libavutil/imgutils.h" +#include "libavutil/colorspace.h" + +int avpicture_fill(AVPicture *picture, const uint8_t *ptr, + enum AVPixelFormat pix_fmt, int width, int height) +{ + 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) +{ + return av_image_copy_to_buffer(dest, dest_size, + (const uint8_t * const*)src->data, src->linesize, + pix_fmt, width, height, 1); +} + +int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height) +{ + return av_image_get_buffer_size(pix_fmt, width, height, 1); +} + +int avpicture_alloc(AVPicture *picture, + enum AVPixelFormat pix_fmt, int width, int height) +{ + int ret = av_image_alloc(picture->data, picture->linesize, + width, height, pix_fmt, 1); + if (ret < 0) { + memset(picture, 0, sizeof(AVPicture)); + return ret; + } + + return 0; +} + +void avpicture_free(AVPicture *picture) +{ + av_free(picture->data[0]); +} + +void av_picture_copy(AVPicture *dst, const AVPicture *src, + enum AVPixelFormat pix_fmt, int width, int height) +{ + av_image_copy(dst->data, dst->linesize, (const uint8_t **)src->data, + src->linesize, pix_fmt, width, height); +} + diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c index 39c49bddde..2ba4a6ae09 100644 --- a/libavcodec/imgconvert.c +++ b/libavcodec/imgconvert.c @@ -433,26 +433,6 @@ void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift = desc->log2_chroma_h; } -int avpicture_fill(AVPicture *picture, const uint8_t *ptr, - enum AVPixelFormat pix_fmt, int width, int height) -{ - 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) -{ - return av_image_copy_to_buffer(dest, dest_size, - (const uint8_t * const*)src->data, src->linesize, - pix_fmt, width, height, 1); -} - -int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height) -{ - return av_image_get_buffer_size(pix_fmt, width, height, 1); -} - static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); @@ -635,13 +615,6 @@ enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(enum AVPixelFormat *pix_fmt return best; } -void av_picture_copy(AVPicture *dst, const AVPicture *src, - enum AVPixelFormat pix_fmt, int width, int height) -{ - av_image_copy(dst->data, dst->linesize, (const uint8_t **)src->data, - src->linesize, pix_fmt, width, height); -} - /* 2x2 -> 1x1 */ void ff_shrink22(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, @@ -728,25 +701,6 @@ void ff_shrink88(uint8_t *dst, int dst_wrap, } } - -int avpicture_alloc(AVPicture *picture, - enum AVPixelFormat pix_fmt, int width, int height) -{ - int ret; - - if ((ret = av_image_alloc(picture->data, picture->linesize, width, height, pix_fmt, 1)) < 0) { - memset(picture, 0, sizeof(AVPicture)); - return ret; - } - - return 0; -} - -void avpicture_free(AVPicture *picture) -{ - av_free(picture->data[0]); -} - /* return true if yuv planar */ static inline int is_yuv_planar(enum AVPixelFormat fmt) { diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c index 23ab17aa28..aefd09d1ea 100644 --- a/libavfilter/drawutils.c +++ b/libavfilter/drawutils.c @@ -141,7 +141,7 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) if (!desc->name) return AVERROR(EINVAL); - if (desc->flags & ~(PIX_FMT_PLANAR | PIX_FMT_RGB | PIX_FMT_PSEUDOPAL)) + if (desc->flags & ~(PIX_FMT_PLANAR | PIX_FMT_RGB | PIX_FMT_PSEUDOPAL | PIX_FMT_ALPHA)) return AVERROR(ENOSYS); for (i = 0; i < desc->nb_components; i++) { c = &desc->comp[i]; diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index bbe64bee7a..e5e3fa8551 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c @@ -436,7 +436,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 0, 3, 4, 0, 7 }, /* B */ { 0, 3, 1, 0, 7 }, /* A */ }, - .flags = PIX_FMT_RGB, + .flags = PIX_FMT_RGB | PIX_FMT_ALPHA, }, [AV_PIX_FMT_RGBA] = { .name = "rgba", @@ -449,7 +449,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 0, 3, 3, 0, 7 }, /* B */ { 0, 3, 4, 0, 7 }, /* A */ }, - .flags = PIX_FMT_RGB, + .flags = PIX_FMT_RGB | PIX_FMT_ALPHA, }, [AV_PIX_FMT_ABGR] = { .name = "abgr", @@ -462,7 +462,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 0, 3, 2, 0, 7 }, /* B */ { 0, 3, 1, 0, 7 }, /* A */ }, - .flags = PIX_FMT_RGB, + .flags = PIX_FMT_RGB | PIX_FMT_ALPHA, }, [AV_PIX_FMT_BGRA] = { .name = "bgra", @@ -525,7 +525,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 0, 3, 1, 0, 7 }, /* B */ { 0, 3, 4, 0, 7 }, /* A */ }, - .flags = PIX_FMT_RGB, + .flags = PIX_FMT_RGB | PIX_FMT_ALPHA, }, [AV_PIX_FMT_GRAY16BE] = { .name = "gray16be", @@ -581,7 +581,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 0, 1, 0, 7 }, /* V */ { 3, 0, 1, 0, 7 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P] = { .name = "yuva422p", @@ -594,7 +594,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 0, 1, 0, 7 }, /* V */ { 3, 0, 1, 0, 7 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P] = { .name = "yuva444p", @@ -607,7 +607,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 0, 1, 0, 7 }, /* V */ { 3, 0, 1, 0, 7 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA420P9BE] = { .name = "yuva420p9be", @@ -633,7 +633,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 8 }, /* V */ { 3, 1, 1, 0, 8 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P9BE] = { .name = "yuva422p9be", @@ -646,7 +646,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 8 }, /* V */ { 3, 1, 1, 0, 8 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P9LE] = { .name = "yuva422p9le", @@ -659,7 +659,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 8 }, /* V */ { 3, 1, 1, 0, 8 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P9BE] = { .name = "yuva444p9be", @@ -672,7 +672,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 8 }, /* V */ { 3, 1, 1, 0, 8 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P9LE] = { .name = "yuva444p9le", @@ -685,7 +685,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 8 }, /* V */ { 3, 1, 1, 0, 8 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA420P10BE] = { .name = "yuva420p10be", @@ -698,7 +698,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 9 }, /* V */ { 3, 1, 1, 0, 9 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA420P10LE] = { .name = "yuva420p10le", @@ -711,7 +711,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P10BE] = { .name = "yuva422p10be", @@ -724,7 +724,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P10LE] = { .name = "yuva422p10le", @@ -737,7 +737,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P10BE] = { .name = "yuva444p10be", @@ -750,7 +750,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P10LE] = { .name = "yuva444p10le", @@ -763,7 +763,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA420P16BE] = { .name = "yuva420p16be", @@ -776,7 +776,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA420P16LE] = { .name = "yuva420p16le", @@ -789,7 +789,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P16BE] = { .name = "yuva422p16be", @@ -802,7 +802,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA422P16LE] = { .name = "yuva422p16le", @@ -815,7 +815,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P16BE] = { .name = "yuva444p16be", @@ -828,7 +828,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_BE | PIX_FMT_PLANAR, + .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_YUVA444P16LE] = { .name = "yuva444p16le", @@ -841,7 +841,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 2, 1, 1, 0, 15 }, /* V */ { 3, 1, 1, 0, 15 }, /* A */ }, - .flags = PIX_FMT_PLANAR, + .flags = PIX_FMT_PLANAR | PIX_FMT_ALPHA, }, [AV_PIX_FMT_VDPAU_H264] = { .name = "vdpau_h264", @@ -1520,6 +1520,7 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { { 0, 1, 1, 0, 7 }, /* Y */ { 0, 1, 2, 0, 7 }, /* A */ }, + .flags = PIX_FMT_ALPHA, }, [AV_PIX_FMT_GBRP] = { .name = "gbrp", diff --git a/libavutil/pixdesc.h b/libavutil/pixdesc.h index dca56a71aa..59fd1fff25 100644 --- a/libavutil/pixdesc.h +++ b/libavutil/pixdesc.h @@ -99,6 +99,9 @@ typedef struct AVPixFmtDescriptor{ */ #define PIX_FMT_PSEUDOPAL 64 +#define PIX_FMT_ALPHA 128 ///< The pixel format has an alpha channel + + #if FF_API_PIX_FMT_DESC /** * The array of all the pixel format descriptors.