FFmpeg
Loading...
Searching...
No Matches
yuv4mpegenc.c
Go to the documentation of this file.
1/*
2 * YUV4MPEG muxer
3 * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "libavutil/frame.h"
23#include "libavutil/pixdesc.h"
24#include "avformat.h"
25#include "internal.h"
26#include "mux.h"
27#include "yuv4mpeg.h"
28
30{
31 AVStream *st;
32 AVIOContext *pb = s->pb;
33 int width, height;
34 int raten, rated, aspectn, aspectd, ret;
35 char inter;
36 const char *colorspace = "";
37 const char *colorrange = "";
38 int field_order;
39
40 st = s->streams[0];
41 width = st->codecpar->width;
42 height = st->codecpar->height;
43 field_order = st->codecpar->field_order;
44
45 // TODO: should be avg_frame_rate
46 av_reduce(&raten, &rated, st->time_base.den,
47 st->time_base.num, (1UL << 31) - 1);
48
49 aspectn = st->sample_aspect_ratio.num;
50 aspectd = st->sample_aspect_ratio.den;
51
52 if (aspectn == 0 && aspectd == 1)
53 aspectd = 0; // 0:0 means unknown
54
55 switch(st->codecpar->color_range) {
57 colorrange = " XCOLORRANGE=LIMITED";
58 break;
60 colorrange = " XCOLORRANGE=FULL";
61 break;
62 default:
63 break;
64 }
65
66 switch (field_order) {
67 case AV_FIELD_TB:
68 case AV_FIELD_TT: inter = 't'; break;
69 case AV_FIELD_BT:
70 case AV_FIELD_BB: inter = 'b'; break;
71 default: inter = 'p'; break;
72 }
73
74 switch (st->codecpar->format) {
76 colorspace = " Cmono";
77 break;
79 colorspace = " Cmono9";
80 break;
82 colorspace = " Cmono10";
83 break;
85 colorspace = " Cmono12";
86 break;
88 colorspace = " Cmono16";
89 break;
91 colorspace = " C411 XYSCSS=411";
92 break;
94 colorspace = " C420jpeg XYSCSS=420JPEG";
95 colorrange = " XCOLORRANGE=FULL";
96 break;
98 colorspace = " C422 XYSCSS=422";
99 colorrange = " XCOLORRANGE=FULL";
100 break;
102 colorspace = " C444 XYSCSS=444";
103 colorrange = " XCOLORRANGE=FULL";
104 break;
106 switch (st->codecpar->chroma_location) {
107 case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break;
108 case AVCHROMA_LOC_LEFT: colorspace = " C420mpeg2 XYSCSS=420MPEG2"; break;
109 default: colorspace = " C420jpeg XYSCSS=420JPEG"; break;
110 }
111 break;
113 colorspace = " C422 XYSCSS=422";
114 break;
116 colorspace = " C444 XYSCSS=444";
117 break;
119 colorspace = " C444alpha XYSCSS=444";
120 break;
122 colorspace = " C420p9 XYSCSS=420P9";
123 break;
125 colorspace = " C422p9 XYSCSS=422P9";
126 break;
128 colorspace = " C444p9 XYSCSS=444P9";
129 break;
131 colorspace = " C420p10 XYSCSS=420P10";
132 break;
134 colorspace = " C422p10 XYSCSS=422P10";
135 break;
137 colorspace = " C444p10 XYSCSS=444P10";
138 break;
140 colorspace = " C420p12 XYSCSS=420P12";
141 break;
143 colorspace = " C422p12 XYSCSS=422P12";
144 break;
146 colorspace = " C444p12 XYSCSS=444P12";
147 break;
149 colorspace = " C420p14 XYSCSS=420P14";
150 break;
152 colorspace = " C422p14 XYSCSS=422P14";
153 break;
155 colorspace = " C444p14 XYSCSS=444P14";
156 break;
158 colorspace = " C420p16 XYSCSS=420P16";
159 break;
161 colorspace = " C422p16 XYSCSS=422P16";
162 break;
164 colorspace = " C444p16 XYSCSS=444P16";
165 break;
166 }
167
168 ret = avio_printf(pb, Y4M_MAGIC " W%d H%d F%d:%d I%c A%d:%d%s%s\n",
169 width, height, raten, rated, inter,
170 aspectn, aspectd, colorspace, colorrange);
171 if (ret < 0) {
173 "Error. YUV4MPEG stream header write failed.\n");
174 return ret;
175 }
176
177 return 0;
178}
179
180
182{
183 AVStream *st = s->streams[pkt->stream_index];
184 AVIOContext *pb = s->pb;
185 const AVFrame *frame = (const AVFrame *)pkt->data;
186 int width, height;
188
189 /* construct frame header */
190
191 avio_printf(s->pb, Y4M_FRAME_MAGIC "\n");
192
194 avio_write(pb, pkt->data, pkt->size);
195 return 0;
196 }
197
198 width = st->codecpar->width;
199 height = st->codecpar->height;
200 if (frame->width != width || frame->height != height)
201 return AVERROR(EINVAL);
202
204
205 /* The following code presumes all planes to be non-interleaved. */
206 for (int k = 0; k < desc->nb_components; k++) {
207 int plane_height = height, plane_width = width;
208 const uint8_t *ptr = frame->data[k];
209
210 if (desc->nb_components >= 3 && (k == 1 || k == 2)) { /* chroma? */
211 plane_width = AV_CEIL_RSHIFT(plane_width, desc->log2_chroma_w);
212 plane_height = AV_CEIL_RSHIFT(plane_height, desc->log2_chroma_h);
213 }
214 plane_width *= desc->comp[k].step;
215
216 for (int i = 0; i < plane_height; i++) {
217 avio_write(pb, ptr, plane_width);
218 ptr += frame->linesize[k];
219 }
220 }
221
222 return 0;
223}
224
226{
227 if (s->streams[0]->codecpar->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME &&
228 s->streams[0]->codecpar->codec_id != AV_CODEC_ID_RAWVIDEO) {
229 av_log(s, AV_LOG_ERROR, "ERROR: Codec not supported.\n");
230 return AVERROR_INVALIDDATA;
231 }
232
233 switch (s->streams[0]->codecpar->format) {
235 av_log(s, AV_LOG_WARNING, "Warning: generating rarely used 4:1:1 YUV "
236 "stream, some mjpegtools might not work.\n");
237 break;
238 case AV_PIX_FMT_GRAY8:
242 // TODO: remove YUVJ pixel formats when they are completely removed from the codebase.
246 break;
247 case AV_PIX_FMT_GRAY9:
267 if (s->strict_std_compliance >= FF_COMPLIANCE_NORMAL) {
268 av_log(s, AV_LOG_ERROR, "'%s' is not an official yuv4mpegpipe pixel format. "
269 "Use '-strict -1' to encode to this pixel format.\n",
270 av_get_pix_fmt_name(s->streams[0]->codecpar->format));
271 return AVERROR(EINVAL);
272 }
273 av_log(s, AV_LOG_WARNING, "Warning: generating non standard YUV stream. "
274 "Mjpegtools will not work.\n");
275 break;
276 default:
277 av_log(s, AV_LOG_ERROR, "ERROR: yuv4mpeg can only handle "
278 "yuv444p, yuv422p, yuv420p, yuv411p and gray8 pixel formats. "
279 "And using 'strict -1' also yuv444p9, yuv422p9, yuv420p9, "
280 "yuv444p10, yuv422p10, yuv420p10, "
281 "yuv444p12, yuv422p12, yuv420p12, "
282 "yuv444p14, yuv422p14, yuv420p14, "
283 "yuv444p16, yuv422p16, yuv420p16, "
284 "yuva444p, "
285 "gray9, gray10, gray12 "
286 "and gray16 pixel formats. "
287 "Use -pix_fmt to select one.\n");
288 return AVERROR_INVALIDDATA;
289 }
290
291 return 0;
292}
293
295 .p.name = "yuv4mpegpipe",
296 .p.long_name = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"),
297 .p.extensions = "y4m",
298 .p.audio_codec = AV_CODEC_ID_NONE,
299 .p.video_codec = AV_CODEC_ID_WRAPPED_AVFRAME,
300 .p.subtitle_codec = AV_CODEC_ID_NONE,
301 .init = yuv4_init,
302 .write_header = yuv4_write_header,
303 .write_packet = yuv4_write_packet,
304 .flags_internal = FF_OFMT_FLAG_MAX_ONE_OF_EACH,
305};
const FFOutputFormat ff_yuv4mpegpipe_muxer
Main libavformat public API header.
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition aviobuf.c:206
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define FF_COMPLIANCE_NORMAL
Definition defs.h:60
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition defs.h:214
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition defs.h:215
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition defs.h:217
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition defs.h:216
static AVPacket * pkt
static AVFrame * frame
reference-counted frame API
@ AV_CODEC_ID_RAWVIDEO
Definition codec_id.h:63
@ AV_CODEC_ID_WRAPPED_AVFRAME
Passthrough codec, AVFrames wrapped in AVPacket.
Definition codec_id.h:621
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
const char * desc
Definition libsvtav1.c:83
#define FF_OFMT_FLAG_MAX_ONE_OF_EACH
If this flag is set, it indicates that for each codec type whose corresponding default codec (i....
Definition mux.h:50
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition pixdesc.c:3380
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:556
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV444P9
Definition pixfmt.h:544
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_GRAY9
Definition pixfmt.h:524
#define AV_PIX_FMT_YUV422P9
Definition pixfmt.h:543
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_GRAY12
Definition pixfmt.h:526
#define AV_PIX_FMT_YUV420P9
Definition pixfmt.h:542
#define AV_PIX_FMT_YUV420P14
Definition pixfmt.h:553
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
Definition pixfmt.h:86
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
Definition pixfmt.h:87
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
#define AV_PIX_FMT_YUV422P14
Definition pixfmt.h:554
#define AV_PIX_FMT_GRAY10
Definition pixfmt.h:525
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:557
#define AV_PIX_FMT_GRAY16
Definition pixfmt.h:528
#define AV_PIX_FMT_YUV444P14
Definition pixfmt.h:555
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
enum AVFieldOrder field_order
The order of the fields in interlaced video.
Definition codec_par.h:182
int height
The height of the video frame in pixels.
Definition codec_par.h:150
int width
The width of the video frame in pixels.
Definition codec_par.h:143
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
enum AVChromaLocation chroma_location
Definition codec_par.h:193
enum AVColorRange color_range
Additional colorspace characteristics.
Definition codec_par.h:189
Format I/O context.
Definition avformat.h:1333
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
Bytestream IO Context.
Definition avio.h:160
This structure stores compressed data.
Definition packet.h:580
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition avformat.h:844
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avformat.h:805
#define av_log(a,...)
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
#define Y4M_FRAME_MAGIC
Definition yuv4mpeg.h:25
#define Y4M_MAGIC
Definition yuv4mpeg.h:24
static int yuv4_write_header(AVFormatContext *s)
Definition yuv4mpegenc.c:29
static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt)
static int yuv4_init(AVFormatContext *s)