libavformat/yuv4mpeg: Add color range support for Y4M Add color_range support in Y4M.
Set pixel format and color_range for YUVJ pixel formats. Also set color_range based on AVFormatContext. Signed-off-by: Wang Cao <wangcao@google.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
committed by
Michael Niedermayer
parent
27662ed681
commit
5a99e00023
@@ -41,6 +41,7 @@ static int yuv4_read_header(AVFormatContext *s)
|
|||||||
enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE, alt_pix_fmt = AV_PIX_FMT_NONE;
|
enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE, alt_pix_fmt = AV_PIX_FMT_NONE;
|
||||||
enum AVChromaLocation chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED;
|
enum AVChromaLocation chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED;
|
||||||
enum AVFieldOrder field_order = AV_FIELD_UNKNOWN;
|
enum AVFieldOrder field_order = AV_FIELD_UNKNOWN;
|
||||||
|
enum AVColorRange color_range = AVCOL_RANGE_UNSPECIFIED;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
|
|
||||||
for (i = 0; i < MAX_YUV4_HEADER; i++) {
|
for (i = 0; i < MAX_YUV4_HEADER; i++) {
|
||||||
@@ -220,6 +221,12 @@ static int yuv4_read_header(AVFormatContext *s)
|
|||||||
alt_pix_fmt = AV_PIX_FMT_YUV422P;
|
alt_pix_fmt = AV_PIX_FMT_YUV422P;
|
||||||
else if (strncmp("444", tokstart, 3) == 0)
|
else if (strncmp("444", tokstart, 3) == 0)
|
||||||
alt_pix_fmt = AV_PIX_FMT_YUV444P;
|
alt_pix_fmt = AV_PIX_FMT_YUV444P;
|
||||||
|
} else if (strncmp("COLORRANGE=", tokstart, 11) == 0) {
|
||||||
|
tokstart += 11;
|
||||||
|
if (strncmp("FULL",tokstart, 4) == 0)
|
||||||
|
color_range = AVCOL_RANGE_JPEG;
|
||||||
|
else if (strncmp("LIMITED", tokstart, 7) == 0)
|
||||||
|
color_range = AVCOL_RANGE_MPEG;
|
||||||
}
|
}
|
||||||
while (tokstart < header_end && *tokstart != 0x20)
|
while (tokstart < header_end && *tokstart != 0x20)
|
||||||
tokstart++;
|
tokstart++;
|
||||||
@@ -263,6 +270,7 @@ static int yuv4_read_header(AVFormatContext *s)
|
|||||||
st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
|
st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO;
|
||||||
st->sample_aspect_ratio = (AVRational){ aspectn, aspectd };
|
st->sample_aspect_ratio = (AVRational){ aspectn, aspectd };
|
||||||
st->codecpar->chroma_location = chroma_sample_location;
|
st->codecpar->chroma_location = chroma_sample_location;
|
||||||
|
st->codecpar->color_range = color_range;
|
||||||
st->codecpar->field_order = field_order;
|
st->codecpar->field_order = field_order;
|
||||||
s->packet_size = av_image_get_buffer_size(st->codecpar->format, width, height, 1) + Y4M_FRAME_MAGIC_LEN;
|
s->packet_size = av_image_get_buffer_size(st->codecpar->format, width, height, 1) + Y4M_FRAME_MAGIC_LEN;
|
||||||
if ((int) s->packet_size < 0)
|
if ((int) s->packet_size < 0)
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf)
|
|||||||
int raten, rated, aspectn, aspectd, n;
|
int raten, rated, aspectn, aspectd, n;
|
||||||
char inter;
|
char inter;
|
||||||
const char *colorspace = "";
|
const char *colorspace = "";
|
||||||
|
const char *colorrange = "";
|
||||||
int field_order;
|
int field_order;
|
||||||
|
|
||||||
st = s->streams[0];
|
st = s->streams[0];
|
||||||
@@ -57,6 +58,17 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf)
|
|||||||
FF_ENABLE_DEPRECATION_WARNINGS
|
FF_ENABLE_DEPRECATION_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
switch(st->codecpar->color_range) {
|
||||||
|
case AVCOL_RANGE_MPEG:
|
||||||
|
colorrange = " XCOLORRANGE=LIMITED";
|
||||||
|
break;
|
||||||
|
case AVCOL_RANGE_JPEG:
|
||||||
|
colorrange = " XCOLORRANGE=FULL";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
switch (field_order) {
|
switch (field_order) {
|
||||||
case AV_FIELD_TB:
|
case AV_FIELD_TB:
|
||||||
case AV_FIELD_TT: inter = 't'; break;
|
case AV_FIELD_TT: inter = 't'; break;
|
||||||
@@ -84,6 +96,18 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf)
|
|||||||
case AV_PIX_FMT_YUV411P:
|
case AV_PIX_FMT_YUV411P:
|
||||||
colorspace = " C411 XYSCSS=411";
|
colorspace = " C411 XYSCSS=411";
|
||||||
break;
|
break;
|
||||||
|
case AV_PIX_FMT_YUVJ420P:
|
||||||
|
colorspace = " C420jpeg XYSCSS=420JPEG";
|
||||||
|
colorrange = " XCOLORRANGE=FULL";
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUVJ422P:
|
||||||
|
colorspace = " C422 XYSCSS=422";
|
||||||
|
colorrange = " XCOLORRANGE=FULL";
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUVJ444P:
|
||||||
|
colorspace = " C444 XYSCSS=444";
|
||||||
|
colorrange = " XCOLORRANGE=FULL";
|
||||||
|
break;
|
||||||
case AV_PIX_FMT_YUV420P:
|
case AV_PIX_FMT_YUV420P:
|
||||||
switch (st->codecpar->chroma_location) {
|
switch (st->codecpar->chroma_location) {
|
||||||
case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break;
|
case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break;
|
||||||
@@ -145,13 +169,14 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* construct stream header, if this is the first frame */
|
/* construct stream header, if this is the first frame */
|
||||||
n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s\n",
|
n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s%s\n",
|
||||||
Y4M_MAGIC, width, height, raten, rated, inter,
|
Y4M_MAGIC, width, height, raten, rated, inter,
|
||||||
aspectn, aspectd, colorspace);
|
aspectn, aspectd, colorspace, colorrange);
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
|
static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||||
{
|
{
|
||||||
AVStream *st = s->streams[pkt->stream_index];
|
AVStream *st = s->streams[pkt->stream_index];
|
||||||
@@ -192,6 +217,10 @@ static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
case AV_PIX_FMT_YUV420P:
|
case AV_PIX_FMT_YUV420P:
|
||||||
case AV_PIX_FMT_YUV422P:
|
case AV_PIX_FMT_YUV422P:
|
||||||
case AV_PIX_FMT_YUV444P:
|
case AV_PIX_FMT_YUV444P:
|
||||||
|
// TODO: remove YUVJ pixel formats when they are completely removed from the codebase.
|
||||||
|
case AV_PIX_FMT_YUVJ420P:
|
||||||
|
case AV_PIX_FMT_YUVJ422P:
|
||||||
|
case AV_PIX_FMT_YUVJ444P:
|
||||||
break;
|
break;
|
||||||
case AV_PIX_FMT_GRAY9:
|
case AV_PIX_FMT_GRAY9:
|
||||||
case AV_PIX_FMT_GRAY10:
|
case AV_PIX_FMT_GRAY10:
|
||||||
@@ -271,6 +300,10 @@ static int yuv4_write_header(AVFormatContext *s)
|
|||||||
case AV_PIX_FMT_YUV420P:
|
case AV_PIX_FMT_YUV420P:
|
||||||
case AV_PIX_FMT_YUV422P:
|
case AV_PIX_FMT_YUV422P:
|
||||||
case AV_PIX_FMT_YUV444P:
|
case AV_PIX_FMT_YUV444P:
|
||||||
|
// TODO: remove YUVJ pixel formats when they are completely removed from the codebase.
|
||||||
|
case AV_PIX_FMT_YUVJ420P:
|
||||||
|
case AV_PIX_FMT_YUVJ422P:
|
||||||
|
case AV_PIX_FMT_YUVJ444P:
|
||||||
break;
|
break;
|
||||||
case AV_PIX_FMT_GRAY9:
|
case AV_PIX_FMT_GRAY9:
|
||||||
case AV_PIX_FMT_GRAY10:
|
case AV_PIX_FMT_GRAY10:
|
||||||
|
|||||||
Reference in New Issue
Block a user