Merge pull request #2021 from jpark37/yuva-format

Add support for YUV alpha formats
This commit is contained in:
Jim
2019-08-11 20:38:17 -07:00
committed by GitHub
9 changed files with 371 additions and 11 deletions

View File

@@ -85,6 +85,7 @@ void video_frame_init(struct video_frame *frame, enum video_format format,
case VIDEO_FORMAT_RGBA:
case VIDEO_FORMAT_BGRA:
case VIDEO_FORMAT_BGRX:
case VIDEO_FORMAT_AYUV:
size = width * height * 4;
ALIGN_SIZE(size, alignment);
frame->data[0] = bmalloc(size);
@@ -125,6 +126,72 @@ void video_frame_init(struct video_frame *frame, enum video_format format,
frame->linesize[1] = width / 2;
frame->linesize[2] = width / 2;
break;
case VIDEO_FORMAT_I40A:
size = width * height;
ALIGN_SIZE(size, alignment);
offsets[0] = size;
size += (width / 2) * (height / 2);
ALIGN_SIZE(size, alignment);
offsets[1] = size;
size += (width / 2) * (height / 2);
ALIGN_SIZE(size, alignment);
offsets[2] = size;
size += width * height;
ALIGN_SIZE(size, alignment);
frame->data[0] = bmalloc(size);
frame->data[1] = (uint8_t *)frame->data[0] + offsets[0];
frame->data[2] = (uint8_t *)frame->data[0] + offsets[1];
frame->data[3] = (uint8_t *)frame->data[0] + offsets[2];
frame->linesize[0] = width;
frame->linesize[1] = width / 2;
frame->linesize[2] = width / 2;
frame->linesize[3] = width;
break;
case VIDEO_FORMAT_I42A:
size = width * height;
ALIGN_SIZE(size, alignment);
offsets[0] = size;
size += (width / 2) * height;
ALIGN_SIZE(size, alignment);
offsets[1] = size;
size += (width / 2) * height;
ALIGN_SIZE(size, alignment);
offsets[2] = size;
size += width * height;
ALIGN_SIZE(size, alignment);
frame->data[0] = bmalloc(size);
frame->data[1] = (uint8_t *)frame->data[0] + offsets[0];
frame->data[2] = (uint8_t *)frame->data[0] + offsets[1];
frame->data[3] = (uint8_t *)frame->data[0] + offsets[2];
frame->linesize[0] = width;
frame->linesize[1] = width / 2;
frame->linesize[2] = width / 2;
frame->linesize[3] = width;
break;
case VIDEO_FORMAT_YUVA:
size = width * height;
ALIGN_SIZE(size, alignment);
offsets[0] = size;
size += width * height;
ALIGN_SIZE(size, alignment);
offsets[1] = size;
size += width * height;
ALIGN_SIZE(size, alignment);
offsets[2] = size;
size += width * height;
ALIGN_SIZE(size, alignment);
frame->data[0] = bmalloc(size);
frame->data[1] = (uint8_t *)frame->data[0] + offsets[0];
frame->data[2] = (uint8_t *)frame->data[0] + offsets[1];
frame->data[3] = (uint8_t *)frame->data[0] + offsets[2];
frame->linesize[0] = width;
frame->linesize[1] = width;
frame->linesize[2] = width;
frame->linesize[3] = width;
break;
}
}
@@ -154,6 +221,7 @@ void video_frame_copy(struct video_frame *dst, const struct video_frame *src,
case VIDEO_FORMAT_BGRA:
case VIDEO_FORMAT_BGRX:
case VIDEO_FORMAT_BGR3:
case VIDEO_FORMAT_AYUV:
memcpy(dst->data[0], src->data[0], src->linesize[0] * cy);
break;
@@ -163,5 +231,20 @@ void video_frame_copy(struct video_frame *dst, const struct video_frame *src,
memcpy(dst->data[1], src->data[1], src->linesize[1] * cy);
memcpy(dst->data[2], src->data[2], src->linesize[2] * cy);
break;
case VIDEO_FORMAT_I40A:
memcpy(dst->data[0], src->data[0], src->linesize[0] * cy);
memcpy(dst->data[1], src->data[1], src->linesize[1] * cy / 2);
memcpy(dst->data[2], src->data[2], src->linesize[2] * cy / 2);
memcpy(dst->data[3], src->data[3], src->linesize[3] * cy);
break;
case VIDEO_FORMAT_I42A:
case VIDEO_FORMAT_YUVA:
memcpy(dst->data[0], src->data[0], src->linesize[0] * cy);
memcpy(dst->data[1], src->data[1], src->linesize[1] * cy);
memcpy(dst->data[2], src->data[2], src->linesize[2] * cy);
memcpy(dst->data[3], src->data[3], src->linesize[3] * cy);
break;
}
}

View File

@@ -56,6 +56,18 @@ enum video_format {
/* planar 4:2:2 */
VIDEO_FORMAT_I422,
/* planar 4:2:0 with alpha */
VIDEO_FORMAT_I40A,
/* planar 4:2:2 with alpha */
VIDEO_FORMAT_I42A,
/* planar 4:4:4 with alpha */
VIDEO_FORMAT_YUVA,
/* packed 4:4:4 with alpha */
VIDEO_FORMAT_AYUV,
};
enum video_colorspace {
@@ -100,6 +112,10 @@ static inline bool format_is_yuv(enum video_format format)
case VIDEO_FORMAT_YUY2:
case VIDEO_FORMAT_UYVY:
case VIDEO_FORMAT_I444:
case VIDEO_FORMAT_I40A:
case VIDEO_FORMAT_I42A:
case VIDEO_FORMAT_YUVA:
case VIDEO_FORMAT_AYUV:
return true;
case VIDEO_FORMAT_NONE:
case VIDEO_FORMAT_RGBA:
@@ -140,6 +156,14 @@ static inline const char *get_video_format_name(enum video_format format)
return "Y800";
case VIDEO_FORMAT_BGR3:
return "BGR3";
case VIDEO_FORMAT_I40A:
return "I40A";
case VIDEO_FORMAT_I42A:
return "I42A";
case VIDEO_FORMAT_YUVA:
return "YUVA";
case VIDEO_FORMAT_AYUV:
return "AYUV";
case VIDEO_FORMAT_NONE:;
}

View File

@@ -55,6 +55,12 @@ get_ffmpeg_video_format(enum video_format format)
return AV_PIX_FMT_BGR24;
case VIDEO_FORMAT_I422:
return AV_PIX_FMT_YUV422P;
case VIDEO_FORMAT_I40A:
return AV_PIX_FMT_YUVA420P;
case VIDEO_FORMAT_I42A:
return AV_PIX_FMT_YUVA422P;
case VIDEO_FORMAT_YUVA:
return AV_PIX_FMT_YUVA444P;
}
return AV_PIX_FMT_NONE;