You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	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:
		| @@ -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) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user