Commit 606214eb authored by ramiro's avatar ramiro

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.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20610 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent cbf62e8e
...@@ -689,7 +689,7 @@ int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width) ...@@ -689,7 +689,7 @@ int ff_fill_linesize(AVPicture *picture, enum PixelFormat pix_fmt, int width)
case PIX_FMT_NV21: case PIX_FMT_NV21:
w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift; w2 = (width + (1 << pinfo->x_chroma_shift) - 1) >> pinfo->x_chroma_shift;
picture->linesize[0] = width; picture->linesize[0] = width;
picture->linesize[1] = w2; picture->linesize[1] = 2 * w2;
break; break;
case PIX_FMT_RGB24: case PIX_FMT_RGB24:
case PIX_FMT_BGR24: case PIX_FMT_BGR24:
...@@ -789,12 +789,12 @@ int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, enum PixelFormat pix_fmt, ...@@ -789,12 +789,12 @@ int ff_fill_pointer(AVPicture *picture, uint8_t *ptr, enum PixelFormat pix_fmt,
case PIX_FMT_NV12: case PIX_FMT_NV12:
case PIX_FMT_NV21: case PIX_FMT_NV21:
h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift; h2 = (height + (1 << pinfo->y_chroma_shift) - 1) >> pinfo->y_chroma_shift;
size2 = picture->linesize[1] * h2 * 2; size2 = picture->linesize[1] * h2;
picture->data[0] = ptr; picture->data[0] = ptr;
picture->data[1] = picture->data[0] + size; picture->data[1] = picture->data[0] + size;
picture->data[2] = NULL; picture->data[2] = NULL;
picture->data[3] = NULL; picture->data[3] = NULL;
return size + 2 * size2; return size + size2;
case PIX_FMT_RGB24: case PIX_FMT_RGB24:
case PIX_FMT_BGR24: case PIX_FMT_BGR24:
case PIX_FMT_ARGB: case PIX_FMT_ARGB:
...@@ -904,6 +904,8 @@ int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, ...@@ -904,6 +904,8 @@ int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width,
if (i == 1) { if (i == 1) {
w = ((width >> pf->x_chroma_shift) * pf->depth + 7) / 8; w = ((width >> pf->x_chroma_shift) * pf->depth + 7) / 8;
h = height >> pf->y_chroma_shift; h = height >> pf->y_chroma_shift;
if (pix_fmt == PIX_FMT_NV12 || pix_fmt == PIX_FMT_NV21)
w <<= 1;
} else if (i == 3) { } else if (i == 3) {
w = ow; w = ow;
h = oh; h = oh;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment