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)