Mercurial > libavcodec.hg
comparison imgconvert.c @ 11598:0124d6beb415 libavcodec
Make ff_fill_linesize() use the information stored in
av_pix_fmt_descriptors.
Allow simplification and a more generic implementation.
author | stefano |
---|---|
date | Sun, 11 Apr 2010 14:09:05 +0000 |
parents | fec27e2a7570 |
children | 02ad6bf427dc |
comparison
equal
deleted
inserted
replaced
11597:fce0ed54244c | 11598:0124d6beb415 |
---|---|
490 return 0; | 490 return 0; |
491 } | 491 } |
492 | 492 |
493 int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width) | 493 int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width) |
494 { | 494 { |
495 int w2; | 495 int i; |
496 const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt]; | 496 const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt]; |
497 int max_plane_step [4]; | |
498 int max_plane_step_comp[4]; | |
497 | 499 |
498 memset(picture->linesize, 0, sizeof(picture->linesize)); | 500 memset(picture->linesize, 0, sizeof(picture->linesize)); |
499 | 501 |
500 switch(pix_fmt) { | 502 if (desc->flags & PIX_FMT_HWACCEL) |
501 case PIX_FMT_YUV420P: | |
502 case PIX_FMT_YUV422P: | |
503 case PIX_FMT_YUV444P: | |
504 case PIX_FMT_YUV410P: | |
505 case PIX_FMT_YUV411P: | |
506 case PIX_FMT_YUV440P: | |
507 case PIX_FMT_YUVJ420P: | |
508 case PIX_FMT_YUVJ422P: | |
509 case PIX_FMT_YUVJ444P: | |
510 case PIX_FMT_YUVJ440P: | |
511 w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; | |
512 picture->linesize[0] = width; | |
513 picture->linesize[1] = w2; | |
514 picture->linesize[2] = w2; | |
515 break; | |
516 case PIX_FMT_YUV420P16LE: | |
517 case PIX_FMT_YUV422P16LE: | |
518 case PIX_FMT_YUV444P16LE: | |
519 case PIX_FMT_YUV420P16BE: | |
520 case PIX_FMT_YUV422P16BE: | |
521 case PIX_FMT_YUV444P16BE: | |
522 w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; | |
523 picture->linesize[0] = 2*width; | |
524 picture->linesize[1] = 2*w2; | |
525 picture->linesize[2] = 2*w2; | |
526 break; | |
527 case PIX_FMT_YUVA420P: | |
528 w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; | |
529 picture->linesize[0] = width; | |
530 picture->linesize[1] = w2; | |
531 picture->linesize[2] = w2; | |
532 picture->linesize[3] = width; | |
533 break; | |
534 case PIX_FMT_NV12: | |
535 case PIX_FMT_NV21: | |
536 w2 = (width + (1 << desc->log2_chroma_w) - 1) >> desc->log2_chroma_w; | |
537 picture->linesize[0] = width; | |
538 picture->linesize[1] = 2 * w2; | |
539 break; | |
540 case PIX_FMT_RGB24: | |
541 case PIX_FMT_BGR24: | |
542 picture->linesize[0] = width * 3; | |
543 break; | |
544 case PIX_FMT_ARGB: | |
545 case PIX_FMT_ABGR: | |
546 case PIX_FMT_RGBA: | |
547 case PIX_FMT_BGRA: | |
548 picture->linesize[0] = width * 4; | |
549 break; | |
550 case PIX_FMT_RGB48BE: | |
551 case PIX_FMT_RGB48LE: | |
552 picture->linesize[0] = width * 6; | |
553 break; | |
554 case PIX_FMT_GRAY16BE: | |
555 case PIX_FMT_GRAY16LE: | |
556 case PIX_FMT_BGR444BE: | |
557 case PIX_FMT_BGR444LE: | |
558 case PIX_FMT_BGR555BE: | |
559 case PIX_FMT_BGR555LE: | |
560 case PIX_FMT_BGR565BE: | |
561 case PIX_FMT_BGR565LE: | |
562 case PIX_FMT_RGB444BE: | |
563 case PIX_FMT_RGB444LE: | |
564 case PIX_FMT_RGB555BE: | |
565 case PIX_FMT_RGB555LE: | |
566 case PIX_FMT_RGB565BE: | |
567 case PIX_FMT_RGB565LE: | |
568 case PIX_FMT_YUYV422: | |
569 picture->linesize[0] = width * 2; | |
570 break; | |
571 case PIX_FMT_UYVY422: | |
572 picture->linesize[0] = width * 2; | |
573 break; | |
574 case PIX_FMT_UYYVYY411: | |
575 picture->linesize[0] = width + width/2; | |
576 break; | |
577 case PIX_FMT_RGB4: | |
578 case PIX_FMT_BGR4: | |
579 picture->linesize[0] = width / 2; | |
580 break; | |
581 case PIX_FMT_MONOWHITE: | |
582 case PIX_FMT_MONOBLACK: | |
583 picture->linesize[0] = (width + 7) >> 3; | |
584 break; | |
585 case PIX_FMT_PAL8: | |
586 case PIX_FMT_RGB8: | |
587 case PIX_FMT_BGR8: | |
588 case PIX_FMT_RGB4_BYTE: | |
589 case PIX_FMT_BGR4_BYTE: | |
590 case PIX_FMT_GRAY8: | |
591 picture->linesize[0] = width; | |
592 break; | |
593 default: | |
594 return -1; | 503 return -1; |
595 } | 504 |
505 if (desc->flags & PIX_FMT_BITSTREAM) { | |
506 picture->linesize[0] = (width * (desc->comp[0].step_minus1+1) + 7) >> 3; | |
507 return 0; | |
508 } | |
509 | |
510 memset(max_plane_step , 0, sizeof(max_plane_step )); | |
511 memset(max_plane_step_comp, 0, sizeof(max_plane_step_comp)); | |
512 for (i = 0; i < 4; i++) { | |
513 const AVComponentDescriptor *comp = &(desc->comp[i]); | |
514 if ((comp->step_minus1+1) > max_plane_step[comp->plane]) { | |
515 max_plane_step [comp->plane] = comp->step_minus1+1; | |
516 max_plane_step_comp[comp->plane] = i; | |
517 } | |
518 } | |
519 | |
520 for (i = 0; i < 4; i++) { | |
521 int s = (max_plane_step_comp[i] == 1 || max_plane_step_comp[i] == 2) ? desc->log2_chroma_w : 0; | |
522 picture->linesize[i] = max_plane_step[i] * (((width + (1 << s) - 1)) >> s); | |
523 } | |
524 | |
596 return 0; | 525 return 0; |
597 } | 526 } |
598 | 527 |
599 int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, enum PixelFormat pix_fmt, | 528 int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, enum PixelFormat pix_fmt, |
600 int height) | 529 int height) |