# HG changeset patch # User glantau # Date 997556671 0 # Node ID 6064342168f4360fa6714284271233f81546f052 # Parent 764f2eaf711e2915414184fb1d8280bcf907d66a picture utils diff -r 764f2eaf711e -r 6064342168f4 utils.c --- a/utils.c Sat Aug 11 19:04:08 2001 +0000 +++ b/utils.c Sat Aug 11 19:04:31 2001 +0000 @@ -174,6 +174,15 @@ return NULL; } +const char *pix_fmt_str[] = { + "yuv420p", + "yuv422", + "rgb24", + "bgr24", + "yuv422p", + "yuv444p", +}; + void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { const char *codec_name; @@ -208,6 +217,11 @@ snprintf(buf, buf_size, "Video: %s%s", codec_name, enc->flags & CODEC_FLAG_HQ ? " (hq)" : ""); + if (enc->codec_id == CODEC_ID_RAWVIDEO) { + snprintf(buf + strlen(buf), buf_size - strlen(buf), + ", %s", + pix_fmt_str[enc->pix_fmt]); + } if (enc->width) { snprintf(buf + strlen(buf), buf_size - strlen(buf), ", %dx%d, %0.2f fps", @@ -235,6 +249,89 @@ } } +/* Picture field are filled with 'ptr' addresses */ +void avpicture_fill(AVPicture *picture, UINT8 *ptr, + int pix_fmt, int width, int height) +{ + int size; + + size = width * height; + switch(pix_fmt) { + case PIX_FMT_YUV420P: + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size / 4; + picture->linesize[0] = width; + picture->linesize[1] = width / 2; + picture->linesize[2] = width / 2; + break; + case PIX_FMT_YUV422P: + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size / 2; + picture->linesize[0] = width; + picture->linesize[1] = width / 2; + picture->linesize[2] = width / 2; + break; + case PIX_FMT_YUV444P: + picture->data[0] = ptr; + picture->data[1] = picture->data[0] + size; + picture->data[2] = picture->data[1] + size; + picture->linesize[0] = width; + picture->linesize[1] = width; + picture->linesize[2] = width; + break; + case PIX_FMT_RGB24: + case PIX_FMT_BGR24: + picture->data[0] = ptr; + picture->data[1] = NULL; + picture->data[2] = NULL; + picture->linesize[0] = width * 3; + break; + case PIX_FMT_YUV422: + picture->data[0] = ptr; + picture->data[1] = NULL; + picture->data[2] = NULL; + picture->linesize[0] = width * 2; + break; + default: + picture->data[0] = NULL; + picture->data[1] = NULL; + picture->data[2] = NULL; + break; + } +} + +int avpicture_get_size(int pix_fmt, int width, int height) +{ + int size; + + size = width * height; + switch(pix_fmt) { + case PIX_FMT_YUV420P: + size = (size * 3) / 2; + break; + case PIX_FMT_YUV422P: + size = (size * 2); + break; + case PIX_FMT_YUV444P: + size = (size * 3); + break; + case PIX_FMT_RGB24: + case PIX_FMT_BGR24: + size = (size * 3); + break; + case PIX_FMT_YUV422: + size = (size * 2); + break; + default: + size = -1; + break; + } + return size; +} + + /* must be called before any other functions */ void avcodec_init(void) {