comparison imgconvert.c @ 10569:7a8b35405591 libavcodec

Fix nv12/nv21 handling. linesize for plane 1 should account for both chroma planes instead of just doubling the height while computing plane sizes. Also adjust avpicture_layout() to copy the correct amount of data for plane 1.
author ramiro
date Wed, 25 Nov 2009 17:14:48 +0000
parents 759ad4f2f7fe
children a21b640dba50
comparison
equal deleted inserted replaced
10568:aacf5f712ba7 10569:7a8b35405591
687 break; 687 break;
688 case PIX_FMT_NV12: 688 case PIX_FMT_NV12:
689 case PIX_FMT_NV21: 689 case PIX_FMT_NV21:
690 w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; 690 w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
691 picture->linesize[0] = width; 691 picture->linesize[0] = width;
692 picture->linesize[1] = w2; 692 picture->linesize[1] = 2 * w2;
693 break; 693 break;
694 case PIX_FMT_RGB24: 694 case PIX_FMT_RGB24:
695 case PIX_FMT_BGR24: 695 case PIX_FMT_BGR24:
696 picture->linesize[0] = width * 3; 696 picture->linesize[0] = width * 3;
697 break; 697 break;
787 picture->data[3] = picture->data[1] + size2 + size2; 787 picture->data[3] = picture->data[1] + size2 + size2;
788 return 2 * size + 2 * size2; 788 return 2 * size + 2 * size2;
789 case PIX_FMT_NV12: 789 case PIX_FMT_NV12:
790 case PIX_FMT_NV21: 790 case PIX_FMT_NV21:
791 h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; 791 h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
792 size2 = picture->linesize[1] * h2 * 2; 792 size2 = picture->linesize[1] * h2;
793 picture->data[0] = ptr; 793 picture->data[0] = ptr;
794 picture->data[1] = picture->data[0] + size; 794 picture->data[1] = picture->data[0] + size;
795 picture->data[2] = NULL; 795 picture->data[2] = NULL;
796 picture->data[3] = NULL; 796 picture->data[3] = NULL;
797 return size + 2 * size2; 797 return size + size2;
798 case PIX_FMT_RGB24: 798 case PIX_FMT_RGB24:
799 case PIX_FMT_BGR24: 799 case PIX_FMT_BGR24:
800 case PIX_FMT_ARGB: 800 case PIX_FMT_ARGB:
801 case PIX_FMT_ABGR: 801 case PIX_FMT_ABGR:
802 case PIX_FMT_RGBA: 802 case PIX_FMT_RGBA:
902 902
903 for (i=0; i<data_planes; i++) { 903 for (i=0; i<data_planes; i++) {
904 if (i == 1) { 904 if (i == 1) {
905 w = ((width >> pf->x_chroma_shift) * pf->depth + 7) / 8; 905 w = ((width >> pf->x_chroma_shift) * pf->depth + 7) / 8;
906 h = height >> pf->y_chroma_shift; 906 h = height >> pf->y_chroma_shift;
907 if (pix_fmt == PIX_FMT_NV12 || pix_fmt == PIX_FMT_NV21)
908 w <<= 1;
907 } else if (i == 3) { 909 } else if (i == 3) {
908 w = ow; 910 w = ow;
909 h = oh; 911 h = oh;
910 } 912 }
911 s = src->data[i]; 913 s = src->data[i];