Split avpicture_fill() in two functions. This will be
authorVitor Sessak <vitor1001@gmail.com>
Fri, 15 Feb 2008 18:01:07 +0000 (18:01 +0000)
committerVitor Sessak <vitor1001@gmail.com>
Fri, 15 Feb 2008 18:01:07 +0000 (18:01 +0000)
useful for libavfilter and to simplify
avcodec_default_get_buffer().

Originally committed as revision 11942 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/imgconvert.c

index 14d4791..04bcc27 100644 (file)
@@ -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 pix_fmt, int width, int height)
+int ff_fill_linesize(AVPicture *picture, int pix_fmt, int width)
 {
-    int size, w2, h2, size2;
+    int w2;
     const PixFmtInfo *pinfo;
 
-    if(avcodec_check_dimensions(NULL, width, height))
-        goto fail;
+    memset(picture->linesize, 0, sizeof(picture->linesize));
 
     pinfo = &pix_fmt_info[pix_fmt];
-    size = width * height;
     switch(pix_fmt) {
     case PIX_FMT_YUV420P:
     case PIX_FMT_YUV422P:
@@ -449,62 +446,33 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
     case PIX_FMT_YUVJ444P:
     case PIX_FMT_YUVJ440P:
         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[1] = w2;
         picture->linesize[2] = w2;
-        picture->linesize[3] = 0;
-        return size + 2 * size2;
+        break;
     case PIX_FMT_YUVA420P:
         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[1] = w2;
         picture->linesize[2] = w2;
         picture->linesize[3] = width;
-        return 2 * size + 2 * size2;
+        break;
     case PIX_FMT_NV12:
     case PIX_FMT_NV21:
         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[1] = w2;
-        picture->linesize[2] = 0;
-        picture->linesize[3] = 0;
-        return size + 2 * size2;
+        break;
     case PIX_FMT_RGB24:
     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;
-        return size * 3;
+        break;
     case PIX_FMT_RGB32:
     case PIX_FMT_BGR32:
     case PIX_FMT_RGB32_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;
-        return size * 4;
+        break;
     case PIX_FMT_GRAY16BE:
     case PIX_FMT_GRAY16LE:
     case PIX_FMT_BGR555:
@@ -512,64 +480,119 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
     case PIX_FMT_RGB555:
     case PIX_FMT_RGB565:
     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;
-        return size * 2;
+        break;
     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;
-        return size * 2;
+        break;
     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;
-        return size + size/2;
+        break;
     case PIX_FMT_RGB8:
     case PIX_FMT_BGR8:
     case PIX_FMT_RGB4_BYTE:
     case PIX_FMT_BGR4_BYTE:
     case PIX_FMT_GRAY8:
-        picture->data[0] = ptr;
-        picture->data[1] = NULL;
-        picture->data[2] = NULL;
-        picture->data[3] = NULL;
         picture->linesize[0] = width;
-        return size;
+        break;
     case PIX_FMT_RGB4:
     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[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[3] = NULL;
-        picture->linesize[0] = width / 2;
-        return size / 2;
+        return size + 2 * size2;
+    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_MONOBLACK:
         picture->data[0] = ptr;
         picture->data[1] = NULL;
         picture->data[2] = NULL;
         picture->data[3] = NULL;
-        picture->linesize[0] = (width + 7) >> 3;
-        return picture->linesize[0] * height;
+        return size;
     case PIX_FMT_PAL8:
         size2 = (size + 3) & ~3;
         picture->data[0] = ptr;
         picture->data[1] = ptr + size2; /* palette is stored here as 256 32 bit words */
         picture->data[2] = NULL;
         picture->data[3] = NULL;
-        picture->linesize[0] = width;
-        picture->linesize[1] = 4;
         return size2 + 256 * 4;
     default:
-fail:
         picture->data[0] = NULL;
         picture->data[1] = 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,
                      unsigned char *dest, int dest_size)
 {