#include "internal.h"
#include "yuv4mpeg.h"
-#define Y4M_LINE_MAX 256
-
-static int yuv4_generate_header(AVFormatContext *s, char* buf)
+static int yuv4_write_header(AVFormatContext *s)
{
AVStream *st;
+ AVIOContext *pb = s->pb;
int width, height;
- int raten, rated, aspectn, aspectd, n;
+ int raten, rated, aspectn, aspectd, ret;
char inter;
const char *colorspace = "";
+ const char *colorrange = "";
int field_order;
st = s->streams[0];
if (aspectn == 0 && aspectd == 1)
aspectd = 0; // 0:0 means unknown
-#if FF_API_LAVF_AVCTX
- FF_DISABLE_DEPRECATION_WARNINGS
- if (field_order != st->codec->field_order && st->codec->field_order != AV_FIELD_UNKNOWN)
- field_order = st->codec->field_order;
- FF_ENABLE_DEPRECATION_WARNINGS
-#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) {
case AV_FIELD_TB:
case AV_PIX_FMT_YUV411P:
colorspace = " C411 XYSCSS=411";
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:
switch (st->codecpar->chroma_location) {
case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break;
break;
}
- /* 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",
- Y4M_MAGIC, width, height, raten, rated, inter,
- aspectn, aspectd, colorspace);
+ ret = avio_printf(pb, Y4M_MAGIC " W%d H%d F%d:%d I%c A%d:%d%s%s\n",
+ width, height, raten, rated, inter,
+ aspectn, aspectd, colorspace, colorrange);
+ if (ret < 0) {
+ av_log(s, AV_LOG_ERROR,
+ "Error. YUV4MPEG stream header write failed.\n");
+ return ret;
+ }
- return n;
+ return 0;
}
+
static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
{
AVStream *st = s->streams[pkt->stream_index];
AVIOContext *pb = s->pb;
- AVFrame *frame;
- int* first_pkt = s->priv_data;
+ const AVFrame *frame = (const AVFrame *)pkt->data;
int width, height, h_chroma_shift, v_chroma_shift;
int i;
- char buf2[Y4M_LINE_MAX + 1];
- uint8_t *ptr, *ptr1, *ptr2;
-
- frame = (AVFrame *)pkt->data;
-
- /* for the first packet we have to output the header as well */
- if (*first_pkt) {
- *first_pkt = 0;
- if (yuv4_generate_header(s, buf2) < 0) {
- av_log(s, AV_LOG_ERROR,
- "Error. YUV4MPEG stream header write failed.\n");
- return AVERROR(EIO);
- } else {
- avio_write(pb, buf2, strlen(buf2));
- }
- }
+ const uint8_t *ptr, *ptr1, *ptr2;
/* construct frame header */
- avio_printf(s->pb, "%s\n", Y4M_FRAME_MAGIC);
+ avio_printf(s->pb, Y4M_FRAME_MAGIC "\n");
width = st->codecpar->width;
height = st->codecpar->height;
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUV422P:
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;
case AV_PIX_FMT_GRAY9:
case AV_PIX_FMT_GRAY10:
return 0;
}
-static int yuv4_write_header(AVFormatContext *s)
+static int yuv4_init(AVFormatContext *s)
{
- int *first_pkt = s->priv_data;
-
if (s->nb_streams != 1)
return AVERROR(EIO);
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUV422P:
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;
case AV_PIX_FMT_GRAY9:
case AV_PIX_FMT_GRAY10:
return AVERROR(EIO);
}
- *first_pkt = 1;
return 0;
}
.name = "yuv4mpegpipe",
.long_name = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"),
.extensions = "y4m",
- .priv_data_size = sizeof(int),
.audio_codec = AV_CODEC_ID_NONE,
.video_codec = AV_CODEC_ID_WRAPPED_AVFRAME,
+ .init = yuv4_init,
.write_header = yuv4_write_header,
.write_packet = yuv4_write_packet,
};