#include "libavutil/colorspace.h"
#include "libavutil/pixdesc.h"
#include "libavcore/imgutils.h"
+#include "libavcore/internal.h"
#if HAVE_MMX && HAVE_YASM
#include "x86/dsputil_mmx.h"
const char *avcodec_get_pix_fmt_name(enum PixelFormat pix_fmt)
{
- if (pix_fmt < 0 || pix_fmt >= PIX_FMT_NB)
+ if ((unsigned)pix_fmt >= PIX_FMT_NB)
return NULL;
else
return av_pix_fmt_descriptors[pix_fmt].name;
{
return av_get_pix_fmt(name);
}
-#endif
void avcodec_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
{
- /* print header */
- if (pix_fmt < 0)
- snprintf (buf, buf_size,
- "name " " nb_channels" " depth" " is_alpha"
- );
- else{
- PixFmtInfo info= pix_fmt_info[pix_fmt];
-
- char is_alpha_char= info.is_alpha ? 'y' : 'n';
-
- snprintf (buf, buf_size,
- "%-11s %5d %9d %6c",
- av_pix_fmt_descriptors[pix_fmt].name,
- info.nb_channels,
- info.depth,
- is_alpha_char
- );
- }
+ av_get_pix_fmt_string(buf, buf_size, pix_fmt);
}
+#endif
int ff_is_hwaccel_pix_fmt(enum PixelFormat pix_fmt)
{
return av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_HWACCEL;
}
+#if LIBAVCODEC_VERSION_MAJOR < 53
int ff_set_systematic_pal(uint32_t pal[256], enum PixelFormat pix_fmt){
- int i;
-
- for(i=0; i<256; i++){
- int r,g,b;
-
- switch(pix_fmt) {
- case PIX_FMT_RGB8:
- r= (i>>5 )*36;
- g= ((i>>2)&7)*36;
- b= (i&3 )*85;
- break;
- case PIX_FMT_BGR8:
- b= (i>>6 )*85;
- g= ((i>>3)&7)*36;
- r= (i&7 )*36;
- break;
- case PIX_FMT_RGB4_BYTE:
- r= (i>>3 )*255;
- g= ((i>>1)&3)*85;
- b= (i&1 )*255;
- break;
- case PIX_FMT_BGR4_BYTE:
- b= (i>>3 )*255;
- g= ((i>>1)&3)*85;
- r= (i&1 )*255;
- break;
- case PIX_FMT_GRAY8:
- r=b=g= i;
- break;
- default:
- return -1;
- }
- pal[i] = b + (g<<8) + (r<<16);
- }
-
- return 0;
+ return ff_set_systematic_pal2(pal, pix_fmt);
}
-#if LIBAVCODEC_VERSION_MAJOR < 53
int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width)
{
return av_image_fill_linesizes(picture->linesize, pix_fmt, width);
int avpicture_fill(AVPicture *picture, uint8_t *ptr,
enum PixelFormat pix_fmt, int width, int height)
{
+ int ret;
- if(av_image_check_size(width, height, 0, NULL))
- return -1;
+ if ((ret = av_image_check_size(width, height, 0, NULL)) < 0)
+ return ret;
- if (av_image_fill_linesizes(picture->linesize, pix_fmt, width))
- return -1;
+ 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);
}
int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, int height,
unsigned char *dest, int dest_size)
{
- const PixFmtInfo* pf = &pix_fmt_info[pix_fmt];
+ int i, j, nb_planes = 0, linesizes[4];
const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
- int i, j, w, ow, h, oh, data_planes;
- const unsigned char* s;
int size = avpicture_get_size(pix_fmt, width, height);
if (size > dest_size || size < 0)
- return -1;
+ return AVERROR(EINVAL);
- if (pf->pixel_type == FF_PIXEL_PACKED || pf->pixel_type == FF_PIXEL_PALETTE) {
- if (pix_fmt == PIX_FMT_YUYV422 ||
- pix_fmt == PIX_FMT_UYVY422 ||
- pix_fmt == PIX_FMT_BGR565BE ||
- pix_fmt == PIX_FMT_BGR565LE ||
- pix_fmt == PIX_FMT_BGR555BE ||
- pix_fmt == PIX_FMT_BGR555LE ||
- pix_fmt == PIX_FMT_BGR444BE ||
- pix_fmt == PIX_FMT_BGR444LE ||
- pix_fmt == PIX_FMT_RGB565BE ||
- pix_fmt == PIX_FMT_RGB565LE ||
- pix_fmt == PIX_FMT_RGB555BE ||
- pix_fmt == PIX_FMT_RGB555LE ||
- pix_fmt == PIX_FMT_RGB444BE ||
- pix_fmt == PIX_FMT_RGB444LE)
- w = width * 2;
- else if (pix_fmt == PIX_FMT_UYYVYY411)
- w = width + width/2;
- else if (pix_fmt == PIX_FMT_PAL8)
- w = width;
- else
- w = width * (pf->depth * pf->nb_channels / 8);
-
- data_planes = 1;
- h = height;
- } else {
- data_planes = pf->nb_channels;
- w = (width*pf->depth + 7)/8;
- h = height;
- }
+ for (i = 0; i < desc->nb_components; i++)
+ nb_planes = FFMAX(desc->comp[i].plane, nb_planes);
+ nb_planes++;
- ow = w;
- oh = h;
+ 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 (i=0; i<data_planes; i++) {
- if (i == 1) {
- w = (- ((-width) >> desc->log2_chroma_w) * pf->depth + 7) / 8;
- h = -((-height) >> desc->log2_chroma_h);
- if (pix_fmt == PIX_FMT_NV12 || pix_fmt == PIX_FMT_NV21)
- w <<= 1;
- } else if (i == 3) {
- w = ow;
- h = oh;
- }
- s = src->data[i];
- for(j=0; j<h; j++) {
- memcpy(dest, s, w);
- dest += w;
+ for (j = 0; j < h; j++) {
+ memcpy(dest, s, linesizes[i]);
+ dest += linesizes[i];
s += src->linesize[i];
}
}
- if (pf->pixel_type == FF_PIXEL_PALETTE)
+ if (desc->flags & PIX_FMT_PAL)
memcpy((unsigned char *)(((size_t)dest + 3) & ~3), src->data[1], 256 * 4);
return size;
{
return av_image_get_linesize(pix_fmt, width, plane);
}
-#endif
void av_picture_data_copy(uint8_t *dst_data[4], int dst_linesize[4],
uint8_t *src_data[4], int src_linesize[4],
enum PixelFormat pix_fmt, int width, int height)
{
- int i;
- const PixFmtInfo *pf = &pix_fmt_info[pix_fmt];
- const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
-
- switch(pf->pixel_type) {
- case FF_PIXEL_PACKED:
- case FF_PIXEL_PLANAR:
- for(i = 0; i < pf->nb_channels; i++) {
- int h;
- int bwidth = av_image_get_linesize(pix_fmt, width, i);
- h = height;
- if (i == 1 || i == 2) {
- h= -((-height)>>desc->log2_chroma_h);
- }
- av_image_copy_plane(dst_data[i], dst_linesize[i],
- src_data[i], src_linesize[i],
- bwidth, h);
- }
- break;
- case FF_PIXEL_PALETTE:
- av_image_copy_plane(dst_data[0], dst_linesize[0],
- src_data[0], src_linesize[0],
- width, height);
- /* copy the palette */
- memcpy(dst_data[1], src_data[1], 4*256);
- break;
- }
+ av_image_copy(dst_data, dst_linesize, src_data, src_linesize,
+ pix_fmt, width, height);
}
+#endif
void av_picture_copy(AVPicture *dst, const AVPicture *src,
enum PixelFormat pix_fmt, int width, int height)
{
- av_picture_data_copy(dst->data, dst->linesize, src->data,
- src->linesize, pix_fmt, width, height);
+ av_image_copy(dst->data, dst->linesize, src->data,
+ src->linesize, pix_fmt, width, height);
}
/* 2x2 -> 1x1 */
int avpicture_alloc(AVPicture *picture,
enum PixelFormat pix_fmt, int width, int height)
{
- int size;
- void *ptr;
-
- size = avpicture_fill(picture, NULL, pix_fmt, width, height);
- if(size<0)
- goto fail;
- ptr = av_malloc(size);
- if (!ptr)
- goto fail;
- avpicture_fill(picture, ptr, pix_fmt, width, height);
- if(picture->data[1] && !picture->data[2])
- ff_set_systematic_pal((uint32_t*)picture->data[1], pix_fmt);
+ 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;
- fail:
- memset(picture, 0, sizeof(AVPicture));
- return -1;
}
void avpicture_free(AVPicture *picture)
int i;
if (pix_fmt != PIX_FMT_YUV420P &&
+ pix_fmt != PIX_FMT_YUVJ420P &&
pix_fmt != PIX_FMT_YUV422P &&
+ pix_fmt != PIX_FMT_YUVJ422P &&
pix_fmt != PIX_FMT_YUV444P &&
pix_fmt != PIX_FMT_YUV411P &&
pix_fmt != PIX_FMT_GRAY8)
for(i=0;i<3;i++) {
if (i == 1) {
switch(pix_fmt) {
+ case PIX_FMT_YUVJ420P:
case PIX_FMT_YUV420P:
width >>= 1;
height >>= 1;
break;
case PIX_FMT_YUV422P:
+ case PIX_FMT_YUVJ422P:
width >>= 1;
break;
case PIX_FMT_YUV411P: