Mercurial > libavcodec.hg
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]; |