Split avpicture_fill() in two functions. This will be
useful for libavfilter and to simplify avcodec_default_get_buffer(). Originally committed as revision 11942 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
27af15dc5c
commit
cc9853d38f
@ -426,17 +426,14 @@ void avcodec_pix_fmt_string (char *buf, int buf_size, int pix_fmt)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
int avpicture_fill(AVPicture *picture, uint8_t *ptr,
|
int ff_fill_linesize(AVPicture *picture, int pix_fmt, int width)
|
||||||
int pix_fmt, int width, int height)
|
|
||||||
{
|
{
|
||||||
int size, w2, h2, size2;
|
int w2;
|
||||||
const PixFmtInfo *pinfo;
|
const PixFmtInfo *pinfo;
|
||||||
|
|
||||||
if(avcodec_check_dimensions(NULL, width, height))
|
memset(picture->linesize, 0, sizeof(picture->linesize));
|
||||||
goto fail;
|
|
||||||
|
|
||||||
pinfo = &pix_fmt_info[pix_fmt];
|
pinfo = &pix_fmt_info[pix_fmt];
|
||||||
size = width * height;
|
|
||||||
switch(pix_fmt) {
|
switch(pix_fmt) {
|
||||||
case PIX_FMT_YUV420P:
|
case PIX_FMT_YUV420P:
|
||||||
case PIX_FMT_YUV422P:
|
case PIX_FMT_YUV422P:
|
||||||
@ -449,62 +446,33 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
|
|||||||
case PIX_FMT_YUVJ444P:
|
case PIX_FMT_YUVJ444P:
|
||||||
case PIX_FMT_YUVJ440P:
|
case PIX_FMT_YUVJ440P:
|
||||||
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
||||||
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
|
||||||
size2 = w2 * h2;
|
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = picture->data[0] + size;
|
|
||||||
picture->data[2] = picture->data[1] + size2;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width;
|
picture->linesize[0] = width;
|
||||||
picture->linesize[1] = w2;
|
picture->linesize[1] = w2;
|
||||||
picture->linesize[2] = w2;
|
picture->linesize[2] = w2;
|
||||||
picture->linesize[3] = 0;
|
break;
|
||||||
return size + 2 * size2;
|
|
||||||
case PIX_FMT_YUVA420P:
|
case PIX_FMT_YUVA420P:
|
||||||
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
||||||
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
|
||||||
size2 = w2 * h2;
|
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = picture->data[0] + size;
|
|
||||||
picture->data[2] = picture->data[1] + size2;
|
|
||||||
picture->data[3] = picture->data[1] + size2 + size2;
|
|
||||||
picture->linesize[0] = width;
|
picture->linesize[0] = width;
|
||||||
picture->linesize[1] = w2;
|
picture->linesize[1] = w2;
|
||||||
picture->linesize[2] = w2;
|
picture->linesize[2] = w2;
|
||||||
picture->linesize[3] = width;
|
picture->linesize[3] = width;
|
||||||
return 2 * size + 2 * size2;
|
break;
|
||||||
case PIX_FMT_NV12:
|
case PIX_FMT_NV12:
|
||||||
case PIX_FMT_NV21:
|
case PIX_FMT_NV21:
|
||||||
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
|
||||||
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
|
||||||
size2 = w2 * h2 * 2;
|
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = picture->data[0] + size;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width;
|
picture->linesize[0] = width;
|
||||||
picture->linesize[1] = w2;
|
picture->linesize[1] = w2;
|
||||||
picture->linesize[2] = 0;
|
break;
|
||||||
picture->linesize[3] = 0;
|
|
||||||
return size + 2 * size2;
|
|
||||||
case PIX_FMT_RGB24:
|
case PIX_FMT_RGB24:
|
||||||
case PIX_FMT_BGR24:
|
case PIX_FMT_BGR24:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width * 3;
|
picture->linesize[0] = width * 3;
|
||||||
return size * 3;
|
break;
|
||||||
case PIX_FMT_RGB32:
|
case PIX_FMT_RGB32:
|
||||||
case PIX_FMT_BGR32:
|
case PIX_FMT_BGR32:
|
||||||
case PIX_FMT_RGB32_1:
|
case PIX_FMT_RGB32_1:
|
||||||
case PIX_FMT_BGR32_1:
|
case PIX_FMT_BGR32_1:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width * 4;
|
picture->linesize[0] = width * 4;
|
||||||
return size * 4;
|
break;
|
||||||
case PIX_FMT_GRAY16BE:
|
case PIX_FMT_GRAY16BE:
|
||||||
case PIX_FMT_GRAY16LE:
|
case PIX_FMT_GRAY16LE:
|
||||||
case PIX_FMT_BGR555:
|
case PIX_FMT_BGR555:
|
||||||
@ -512,64 +480,119 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
|
|||||||
case PIX_FMT_RGB555:
|
case PIX_FMT_RGB555:
|
||||||
case PIX_FMT_RGB565:
|
case PIX_FMT_RGB565:
|
||||||
case PIX_FMT_YUYV422:
|
case PIX_FMT_YUYV422:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width * 2;
|
picture->linesize[0] = width * 2;
|
||||||
return size * 2;
|
break;
|
||||||
case PIX_FMT_UYVY422:
|
case PIX_FMT_UYVY422:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width * 2;
|
picture->linesize[0] = width * 2;
|
||||||
return size * 2;
|
break;
|
||||||
case PIX_FMT_UYYVYY411:
|
case PIX_FMT_UYYVYY411:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width + width/2;
|
picture->linesize[0] = width + width/2;
|
||||||
return size + size/2;
|
break;
|
||||||
case PIX_FMT_RGB8:
|
case PIX_FMT_RGB8:
|
||||||
case PIX_FMT_BGR8:
|
case PIX_FMT_BGR8:
|
||||||
case PIX_FMT_RGB4_BYTE:
|
case PIX_FMT_RGB4_BYTE:
|
||||||
case PIX_FMT_BGR4_BYTE:
|
case PIX_FMT_BGR4_BYTE:
|
||||||
case PIX_FMT_GRAY8:
|
case PIX_FMT_GRAY8:
|
||||||
picture->data[0] = ptr;
|
|
||||||
picture->data[1] = NULL;
|
|
||||||
picture->data[2] = NULL;
|
|
||||||
picture->data[3] = NULL;
|
|
||||||
picture->linesize[0] = width;
|
picture->linesize[0] = width;
|
||||||
return size;
|
break;
|
||||||
case PIX_FMT_RGB4:
|
case PIX_FMT_RGB4:
|
||||||
case PIX_FMT_BGR4:
|
case PIX_FMT_BGR4:
|
||||||
|
picture->linesize[0] = width / 2;
|
||||||
|
break;
|
||||||
|
case PIX_FMT_MONOWHITE:
|
||||||
|
case PIX_FMT_MONOBLACK:
|
||||||
|
picture->linesize[0] = (width + 7) >> 3;
|
||||||
|
break;
|
||||||
|
case PIX_FMT_PAL8:
|
||||||
|
picture->linesize[0] = width;
|
||||||
|
picture->linesize[1] = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, int pix_fmt,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
int size, h2, size2;
|
||||||
|
const PixFmtInfo *pinfo;
|
||||||
|
|
||||||
|
pinfo = &pix_fmt_info[pix_fmt];
|
||||||
|
size = picture->linesize[0] * height;
|
||||||
|
switch(pix_fmt) {
|
||||||
|
case PIX_FMT_YUV420P:
|
||||||
|
case PIX_FMT_YUV422P:
|
||||||
|
case PIX_FMT_YUV444P:
|
||||||
|
case PIX_FMT_YUV410P:
|
||||||
|
case PIX_FMT_YUV411P:
|
||||||
|
case PIX_FMT_YUV440P:
|
||||||
|
case PIX_FMT_YUVJ420P:
|
||||||
|
case PIX_FMT_YUVJ422P:
|
||||||
|
case PIX_FMT_YUVJ444P:
|
||||||
|
case PIX_FMT_YUVJ440P:
|
||||||
|
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
||||||
|
size2 = picture->linesize[1] * h2;
|
||||||
picture->data[0] = ptr;
|
picture->data[0] = ptr;
|
||||||
picture->data[1] = NULL;
|
picture->data[1] = picture->data[0] + size;
|
||||||
|
picture->data[2] = picture->data[1] + size2;
|
||||||
|
picture->data[3] = NULL;
|
||||||
|
return size + 2 * size2;
|
||||||
|
case PIX_FMT_YUVA420P:
|
||||||
|
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
||||||
|
size2 = picture->linesize[1] * h2;
|
||||||
|
picture->data[0] = ptr;
|
||||||
|
picture->data[1] = picture->data[0] + size;
|
||||||
|
picture->data[2] = picture->data[1] + size2;
|
||||||
|
picture->data[3] = picture->data[1] + size2 + size2;
|
||||||
|
return 2 * size + 2 * size2;
|
||||||
|
case PIX_FMT_NV12:
|
||||||
|
case PIX_FMT_NV21:
|
||||||
|
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
|
||||||
|
size2 = picture->linesize[1] * h2 * 2;
|
||||||
|
picture->data[0] = ptr;
|
||||||
|
picture->data[1] = picture->data[0] + size;
|
||||||
picture->data[2] = NULL;
|
picture->data[2] = NULL;
|
||||||
picture->data[3] = NULL;
|
picture->data[3] = NULL;
|
||||||
picture->linesize[0] = width / 2;
|
return size + 2 * size2;
|
||||||
return size / 2;
|
case PIX_FMT_RGB24:
|
||||||
|
case PIX_FMT_BGR24:
|
||||||
|
case PIX_FMT_RGB32:
|
||||||
|
case PIX_FMT_BGR32:
|
||||||
|
case PIX_FMT_RGB32_1:
|
||||||
|
case PIX_FMT_BGR32_1:
|
||||||
|
case PIX_FMT_GRAY16BE:
|
||||||
|
case PIX_FMT_GRAY16LE:
|
||||||
|
case PIX_FMT_BGR555:
|
||||||
|
case PIX_FMT_BGR565:
|
||||||
|
case PIX_FMT_RGB555:
|
||||||
|
case PIX_FMT_RGB565:
|
||||||
|
case PIX_FMT_YUYV422:
|
||||||
|
case PIX_FMT_UYVY422:
|
||||||
|
case PIX_FMT_UYYVYY411:
|
||||||
|
case PIX_FMT_RGB8:
|
||||||
|
case PIX_FMT_BGR8:
|
||||||
|
case PIX_FMT_RGB4_BYTE:
|
||||||
|
case PIX_FMT_BGR4_BYTE:
|
||||||
|
case PIX_FMT_GRAY8:
|
||||||
|
case PIX_FMT_RGB4:
|
||||||
|
case PIX_FMT_BGR4:
|
||||||
case PIX_FMT_MONOWHITE:
|
case PIX_FMT_MONOWHITE:
|
||||||
case PIX_FMT_MONOBLACK:
|
case PIX_FMT_MONOBLACK:
|
||||||
picture->data[0] = ptr;
|
picture->data[0] = ptr;
|
||||||
picture->data[1] = NULL;
|
picture->data[1] = NULL;
|
||||||
picture->data[2] = NULL;
|
picture->data[2] = NULL;
|
||||||
picture->data[3] = NULL;
|
picture->data[3] = NULL;
|
||||||
picture->linesize[0] = (width + 7) >> 3;
|
return size;
|
||||||
return picture->linesize[0] * height;
|
|
||||||
case PIX_FMT_PAL8:
|
case PIX_FMT_PAL8:
|
||||||
size2 = (size + 3) & ~3;
|
size2 = (size + 3) & ~3;
|
||||||
picture->data[0] = ptr;
|
picture->data[0] = ptr;
|
||||||
picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
|
picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
|
||||||
picture->data[2] = NULL;
|
picture->data[2] = NULL;
|
||||||
picture->data[3] = NULL;
|
picture->data[3] = NULL;
|
||||||
picture->linesize[0] = width;
|
|
||||||
picture->linesize[1] = 4;
|
|
||||||
return size2 + 256 * 4;
|
return size2 + 256 * 4;
|
||||||
default:
|
default:
|
||||||
fail:
|
|
||||||
picture->data[0] = NULL;
|
picture->data[0] = NULL;
|
||||||
picture->data[1] = NULL;
|
picture->data[1] = NULL;
|
||||||
picture->data[2] = NULL;
|
picture->data[2] = NULL;
|
||||||
@ -578,6 +601,19 @@ fail:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int avpicture_fill(AVPicture *picture, uint8_t *ptr,
|
||||||
|
int pix_fmt, int width, int height)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(avcodec_check_dimensions(NULL, width, height))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (avpicture_fill_linesize(picture, pix_fmt, width))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return avpicture_fill_pointer(picture, ptr, pix_fmt, height);
|
||||||
|
}
|
||||||
|
|
||||||
int avpicture_layout(const AVPicture* src, int pix_fmt, int width, int height,
|
int avpicture_layout(const AVPicture* src, int pix_fmt, int width, int height,
|
||||||
unsigned char *dest, int dest_size)
|
unsigned char *dest, int dest_size)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user