1 /* GStreamer H264 encoder plugin
2 * Copyright (C) 2005 Michal Benes <michal.benes@itonis.tv>
3 * Copyright (C) 2005 Josef Zlomek <josef.zlomek@itonis.tv>
4 * Copyright (C) 2008 Mark Nauwelaerts <mnauw@users.sf.net>
5 * Copyright (C) 2016 Sebastian Dröge <sebastian@centricular.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library 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 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
24 * SECTION:element-x264enc
28 * This element encodes raw video into H264 compressed data,
29 * also otherwise known as MPEG-4 AVC (Advanced Video Codec).
31 * The #GstX264Enc:pass property controls the type of encoding. In case of Constant
32 * Bitrate Encoding (actually ABR), the #GstX264Enc:bitrate will determine the quality
33 * of the encoding. This will similarly be the case if this target bitrate
34 * is to obtained in multiple (2 or 3) pass encoding.
35 * Alternatively, one may choose to perform Constant Quantizer or Quality encoding,
36 * in which case the #GstX264Enc:quantizer property controls much of the outcome, in that case #GstX264Enc:bitrate is the maximum bitrate.
38 * The H264 profile that is eventually used depends on a few settings.
39 * If #GstX264Enc:dct8x8 is enabled, then High profile is used.
40 * Otherwise, if #GstX264Enc:cabac entropy coding is enabled or #GstX264Enc:bframes
41 * are allowed, then Main Profile is in effect, and otherwise Baseline profile
42 * applies. The high profile is imposed by default,
43 * which is fine for most software players and settings,
44 * but in some cases (e.g. hardware platforms) a more restricted profile/level
45 * may be necessary. The recommended way to set a profile is to set it in the
48 * If a preset/tuning are specified then these will define the default values and
49 * the property defaults will be ignored. After this the option-string property is
50 * applied, followed by the user-set properties, fast first pass restrictions and
51 * finally the profile restrictions.
53 * > Some settings, including the default settings, may lead to quite
54 * > some latency (i.e. frame buffering) in the encoder. This may cause problems
55 * > with pipeline stalling in non-trivial pipelines, because the encoder latency
56 * > is often considerably higher than the default size of a simple queue
57 * > element. Such problems are caused by one of the queues in the other
58 * > non-x264enc streams/branches filling up and blocking upstream. They can
59 * > be fixed by relaxing the default time/size/buffer limits on the queue
60 * > elements in the non-x264 branches, or using a (single) multiqueue element
61 * > for all branches. Also see the last example below. You can also work around
62 * > this problem by setting the tune=zerolatency property, but this will affect
63 * > overall encoding quality so may not be appropriate for your use case.
67 * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc qp-min=18 ! \
68 * avimux ! filesink location=videotestsrc.avi
69 * ]| This example pipeline will encode a test video source to H264 muxed in an
70 * AVI container, while ensuring a sane minimum quantization factor to avoid
71 * some (excessive) waste. You should ideally never put H264 into an AVI
72 * container (or really anything else, for that matter) - use Matroska or
73 * MP4/QuickTime or MPEG-TS instead.
75 * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc pass=quant ! \
76 * matroskamux ! filesink location=videotestsrc.mkv
77 * ]| This example pipeline will encode a test video source to H264 using fixed
78 * quantization, and muxes it in a Matroska container.
80 * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! x264enc pass=5 quantizer=25 speed-preset=6 ! video/x-h264, profile=baseline ! \
81 * qtmux ! filesink location=videotestsrc.mov
82 * ]| This example pipeline will encode a test video source to H264 using
83 * constant quality at around Q25 using the 'medium' speed/quality preset and
84 * restricting the options used so that the output is H.264 Baseline Profile
85 * compliant and finally multiplexing the output in Quicktime mov format.
87 * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! tee name=t ! queue ! videoconvert ! autovideosink \
88 * t. ! queue ! x264enc rc-lookahead=5 ! fakesink
89 * ]| This example pipeline will encode a test video source to H264 while
90 * displaying the input material at the same time. As mentioned above,
91 * specific settings are needed in this case to avoid pipeline stalling.
92 * Depending on goals and context, other approaches are possible, e.g.
93 * tune=zerolatency might be configured, or queue sizes increased.
101 #include "gstx264enc.h"
103 #include <gst/pbutils/pbutils.h>
104 #include <gst/video/video.h>
105 #include <gst/video/gstvideometa.h>
106 #include <gst/video/gstvideopool.h>
112 GST_DEBUG_CATEGORY_STATIC (x264_enc_debug);
113 #define GST_CAT_DEFAULT x264_enc_debug
115 struct _GstX264EncVTable
120 const int *x264_bit_depth;
122 const int *x264_chroma_format;
123 void (*x264_encoder_close) (x264_t *);
124 int (*x264_encoder_delayed_frames) (x264_t *);
125 int (*x264_encoder_encode) (x264_t *, x264_nal_t ** pp_nal, int *pi_nal,
126 x264_picture_t * pic_in, x264_picture_t * pic_out);
127 int (*x264_encoder_headers) (x264_t *, x264_nal_t ** pp_nal, int *pi_nal);
128 void (*x264_encoder_intra_refresh) (x264_t *);
129 int (*x264_encoder_maximum_delayed_frames) (x264_t *);
130 x264_t *(*x264_encoder_open) (x264_param_t *);
131 int (*x264_encoder_reconfig) (x264_t *, x264_param_t *);
132 const x264_level_t (*x264_levels)[];
133 void (*x264_param_apply_fastfirstpass) (x264_param_t *);
134 int (*x264_param_apply_profile) (x264_param_t *, const char *);
135 int (*x264_param_default_preset) (x264_param_t *, const char *preset,
137 int (*x264_param_parse) (x264_param_t *, const char *name, const char *value);
140 static GstX264EncVTable default_vtable;
142 static GstX264EncVTable *vtable_8bit = NULL, *vtable_10bit = NULL;
145 #define LOAD_SYMBOL(name) G_STMT_START { \
146 if (!g_module_symbol (module, #name, (gpointer *) &vtable->name)) { \
147 GST_ERROR ("Failed to load '" #name "' from '%s'", filename); \
152 #ifdef HAVE_X264_ADDITIONAL_LIBRARIES
153 static GstX264EncVTable *
154 load_x264 (const gchar * filename)
157 GstX264EncVTable *vtable;
159 module = g_module_open (filename, G_MODULE_BIND_LOCAL);
161 GST_ERROR ("Failed to load '%s'", filename);
165 vtable = g_new0 (GstX264EncVTable, 1);
166 vtable->module = module;
168 if (!g_module_symbol (module, G_STRINGIFY (x264_encoder_open),
169 (gpointer *) & vtable->x264_encoder_open)) {
170 GST_ERROR ("Failed to load '" G_STRINGIFY (x264_encoder_open)
171 "' from '%s'. Incompatible version?", filename);
174 LOAD_SYMBOL (x264_bit_depth);
175 LOAD_SYMBOL (x264_chroma_format);
176 LOAD_SYMBOL (x264_encoder_close);
177 LOAD_SYMBOL (x264_encoder_delayed_frames);
178 LOAD_SYMBOL (x264_encoder_encode);
179 LOAD_SYMBOL (x264_encoder_headers);
180 LOAD_SYMBOL (x264_encoder_intra_refresh);
181 LOAD_SYMBOL (x264_encoder_maximum_delayed_frames);
182 LOAD_SYMBOL (x264_encoder_reconfig);
183 LOAD_SYMBOL (x264_levels);
184 LOAD_SYMBOL (x264_param_apply_fastfirstpass);
185 LOAD_SYMBOL (x264_param_apply_profile);
186 LOAD_SYMBOL (x264_param_default_preset);
187 LOAD_SYMBOL (x264_param_parse);
192 g_module_close (vtable->module);
198 unload_x264 (GstX264EncVTable * vtable)
200 if (vtable->module) {
201 g_module_close (vtable->module);
211 gst_x264_enc_add_x264_chroma_format (GstStructure * s,
212 gboolean allow_420_8, gboolean allow_420_10, gboolean allow_422,
215 GValue fmts = G_VALUE_INIT;
216 GValue fmt = G_VALUE_INIT;
217 gboolean ret = FALSE;
219 g_value_init (&fmts, GST_TYPE_LIST);
220 g_value_init (&fmt, G_TYPE_STRING);
223 gint chroma_format = *vtable_8bit->x264_chroma_format;
225 if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) {
226 g_value_set_string (&fmt, "Y444");
227 gst_value_list_append_value (&fmts, &fmt);
230 if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) {
231 g_value_set_string (&fmt, "Y42B");
232 gst_value_list_append_value (&fmts, &fmt);
235 if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_8) {
236 g_value_set_string (&fmt, "I420");
237 gst_value_list_append_value (&fmts, &fmt);
238 g_value_set_string (&fmt, "YV12");
239 gst_value_list_append_value (&fmts, &fmt);
240 g_value_set_string (&fmt, "NV12");
241 gst_value_list_append_value (&fmts, &fmt);
246 gint chroma_format = *vtable_10bit->x264_chroma_format;
248 if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) {
249 if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
250 g_value_set_string (&fmt, "Y444_10LE");
252 g_value_set_string (&fmt, "Y444_10BE");
254 gst_value_list_append_value (&fmts, &fmt);
257 if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) {
258 if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
259 g_value_set_string (&fmt, "I422_10LE");
261 g_value_set_string (&fmt, "I422_10BE");
263 gst_value_list_append_value (&fmts, &fmt);
266 if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_10) {
267 if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
268 g_value_set_string (&fmt, "I420_10LE");
270 g_value_set_string (&fmt, "I420_10BE");
272 gst_value_list_append_value (&fmts, &fmt);
276 if (gst_value_list_get_size (&fmts) != 0) {
277 gst_structure_take_value (s, "format", &fmts);
280 g_value_unset (&fmts);
283 g_value_unset (&fmt);
290 load_x264_libraries (void)
292 if (*default_vtable.x264_bit_depth == 8) {
293 vtable_8bit = &default_vtable;
294 GST_INFO ("8-bit depth supported");
295 } else if (*default_vtable.x264_bit_depth == 10) {
296 vtable_10bit = &default_vtable;
297 GST_INFO ("10-bit depth supported");
299 #ifdef HAVE_X264_ADDITIONAL_LIBRARIES
301 gchar **libraries = g_strsplit (HAVE_X264_ADDITIONAL_LIBRARIES, ":", -1);
302 gchar **p = libraries;
304 while (*p && (!vtable_8bit || !vtable_10bit)) {
305 GstX264EncVTable *vtable = load_x264 (*p);
308 if (!vtable_8bit && *vtable->x264_bit_depth == 8) {
309 GST_INFO ("8-bit depth support loaded from %s", *p);
310 vtable_8bit = vtable;
311 } else if (!vtable_10bit && *vtable->x264_bit_depth == 10) {
312 GST_INFO ("10-bit depth support loaded from %s", *p);
313 vtable_10bit = vtable;
315 unload_x264 (vtable);
321 g_strfreev (libraries);
325 if (!vtable_8bit && !vtable_10bit)
331 #else /* X264_BUILD >= 153 */
334 load_x264_libraries (void)
336 #if X264_BIT_DEPTH == 0 /* all */
337 GST_INFO ("8-bit depth and 10-bit depth supported");
338 vtable_8bit = &default_vtable;
339 vtable_10bit = &default_vtable;
340 #elif X264_BIT_DEPTH == 8
341 GST_INFO ("Only 8-bit depth supported");
342 vtable_8bit = &default_vtable;
343 #elif X264_BIT_DEPTH == 10
344 GST_INFO ("Only 10-bit depth supported");
345 vtable_10bit = &default_vtable;
347 #error "unexpected X264_BIT_DEPTH value"
350 #ifdef HAVE_X264_ADDITIONAL_LIBRARIES
351 GST_WARNING ("Ignoring configured additional libraries %s, using libx264 "
352 "version enabled for multiple bit depths",
353 HAVE_X264_ADDITIONAL_LIBRARIES);
369 ARG_MULTIPASS_CACHE_FILE,
373 ARG_VBV_BUF_CAPACITY,
405 #define ARG_THREADS_DEFAULT 0 /* 0 means 'auto' which is 1.5x number of CPU cores */
406 #define ARG_PASS_DEFAULT 0
407 #define ARG_QUANTIZER_DEFAULT 21
408 #define ARG_MULTIPASS_CACHE_FILE_DEFAULT "x264.log"
409 #define ARG_BYTE_STREAM_DEFAULT FALSE
410 #define ARG_BITRATE_DEFAULT (2 * 1024)
411 #define ARG_VBV_BUF_CAPACITY_DEFAULT 600
412 #define ARG_ME_DEFAULT X264_ME_HEX
413 #define ARG_SUBME_DEFAULT 1
414 #define ARG_ANALYSE_DEFAULT 0
415 #define ARG_DCT8x8_DEFAULT FALSE
416 #define ARG_REF_DEFAULT 3
417 #define ARG_BFRAMES_DEFAULT 0
418 #define ARG_B_ADAPT_DEFAULT TRUE
419 #define ARG_B_PYRAMID_DEFAULT FALSE
420 #define ARG_WEIGHTB_DEFAULT FALSE
421 #define ARG_SPS_ID_DEFAULT 0
422 #define ARG_AU_NALU_DEFAULT TRUE
423 #define ARG_TRELLIS_DEFAULT TRUE
424 #define ARG_KEYINT_MAX_DEFAULT 0
425 #define ARG_CABAC_DEFAULT TRUE
426 #define ARG_QP_MIN_DEFAULT 10
427 #define ARG_QP_MAX_DEFAULT 51
428 #define ARG_QP_STEP_DEFAULT 4
429 #define ARG_IP_FACTOR_DEFAULT 1.4
430 #define ARG_PB_FACTOR_DEFAULT 1.3
431 #define ARG_NR_DEFAULT 0
432 #define ARG_INTERLACED_DEFAULT FALSE
433 #define ARG_SLICED_THREADS_DEFAULT FALSE
434 #define ARG_SYNC_LOOKAHEAD_DEFAULT -1
435 #define ARG_RC_MB_TREE_DEFAULT TRUE
436 #define ARG_RC_LOOKAHEAD_DEFAULT 40
437 #define ARG_INTRA_REFRESH_DEFAULT FALSE
438 #define ARG_OPTION_STRING_DEFAULT ""
439 static GString *x264enc_defaults;
440 #define ARG_SPEED_PRESET_DEFAULT 6 /* 'medium' preset - matches x264 CLI default */
441 #define ARG_PSY_TUNE_DEFAULT 0 /* no psy tuning */
442 #define ARG_TUNE_DEFAULT 0 /* no tuning */
443 #define ARG_FRAME_PACKING_DEFAULT -1 /* automatic (none, or from input caps) */
444 #define ARG_INSERT_VUI_DEFAULT TRUE
448 GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY,
449 GST_X264_ENC_STREAM_FORMAT_AVC,
450 GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM
455 GST_X264_ENC_PASS_CBR = 0,
456 GST_X264_ENC_PASS_QUANT = 0x04,
457 GST_X264_ENC_PASS_QUAL,
458 GST_X264_ENC_PASS_PASS1 = 0x11,
459 GST_X264_ENC_PASS_PASS2,
460 GST_X264_ENC_PASS_PASS3
463 #define GST_X264_ENC_PASS_TYPE (gst_x264_enc_pass_get_type())
465 gst_x264_enc_pass_get_type (void)
467 static GType pass_type = 0;
469 static const GEnumValue pass_types[] = {
470 {GST_X264_ENC_PASS_CBR, "Constant Bitrate Encoding", "cbr"},
471 {GST_X264_ENC_PASS_QUANT, "Constant Quantizer", "quant"},
472 {GST_X264_ENC_PASS_QUAL, "Constant Quality", "qual"},
473 {GST_X264_ENC_PASS_PASS1, "VBR Encoding - Pass 1", "pass1"},
474 {GST_X264_ENC_PASS_PASS2, "VBR Encoding - Pass 2", "pass2"},
475 {GST_X264_ENC_PASS_PASS3, "VBR Encoding - Pass 3", "pass3"},
480 pass_type = g_enum_register_static ("GstX264EncPass", pass_types);
485 #define GST_X264_ENC_ME_TYPE (gst_x264_enc_me_get_type())
487 gst_x264_enc_me_get_type (void)
489 static GType me_type = 0;
490 static GEnumValue *me_types;
497 while (x264_motion_est_names[n] != NULL)
500 me_types = g_new0 (GEnumValue, n + 1);
502 for (i = 0; i < n; i++) {
503 me_types[i].value = i;
504 me_types[i].value_name = x264_motion_est_names[i];
505 me_types[i].value_nick = x264_motion_est_names[i];
508 me_type = g_enum_register_static ("GstX264EncMe", me_types);
513 #define GST_X264_ENC_ANALYSE_TYPE (gst_x264_enc_analyse_get_type())
515 gst_x264_enc_analyse_get_type (void)
517 static GType analyse_type = 0;
518 static const GFlagsValue analyse_types[] = {
519 {X264_ANALYSE_I4x4, "i4x4", "i4x4"},
520 {X264_ANALYSE_I8x8, "i8x8", "i8x8"},
521 {X264_ANALYSE_PSUB16x16, "p8x8", "p8x8"},
522 {X264_ANALYSE_PSUB8x8, "p4x4", "p4x4"},
523 {X264_ANALYSE_BSUB16x16, "b8x8", "b8x8"},
528 analyse_type = g_flags_register_static ("GstX264EncAnalyse", analyse_types);
533 #define GST_X264_ENC_SPEED_PRESET_TYPE (gst_x264_enc_speed_preset_get_type())
535 gst_x264_enc_speed_preset_get_type (void)
537 static GType speed_preset_type = 0;
538 static GEnumValue *speed_preset_types;
541 if (speed_preset_type != 0)
542 return speed_preset_type;
545 while (x264_preset_names[n] != NULL)
548 speed_preset_types = g_new0 (GEnumValue, n + 2);
550 speed_preset_types[0].value = 0;
551 speed_preset_types[0].value_name = "No preset";
552 speed_preset_types[0].value_nick = "None";
554 for (i = 1; i <= n; i++) {
555 speed_preset_types[i].value = i;
556 speed_preset_types[i].value_name = x264_preset_names[i - 1];
557 speed_preset_types[i].value_nick = x264_preset_names[i - 1];
561 g_enum_register_static ("GstX264EncPreset", speed_preset_types);
563 return speed_preset_type;
566 static const GFlagsValue tune_types[] = {
567 {0x0, "No tuning", "none"},
568 {0x1, "Still image", "stillimage"},
569 {0x2, "Fast decode", "fastdecode"},
570 {0x4, "Zero latency", "zerolatency"},
574 #define GST_X264_ENC_TUNE_TYPE (gst_x264_enc_tune_get_type())
576 gst_x264_enc_tune_get_type (void)
578 static GType tune_type = 0;
581 tune_type = g_flags_register_static ("GstX264EncTune", tune_types + 1);
588 GST_X264_ENC_TUNE_NONE,
589 GST_X264_ENC_TUNE_FILM,
590 GST_X264_ENC_TUNE_ANIMATION,
591 GST_X264_ENC_TUNE_GRAIN,
592 GST_X264_ENC_TUNE_PSNR,
593 GST_X264_ENC_TUNE_SSIM,
594 GST_X264_ENC_TUNE_LAST
597 static const GEnumValue psy_tune_types[] = {
598 {GST_X264_ENC_TUNE_NONE, "No tuning", "none"},
599 {GST_X264_ENC_TUNE_FILM, "Film", "film"},
600 {GST_X264_ENC_TUNE_ANIMATION, "Animation", "animation"},
601 {GST_X264_ENC_TUNE_GRAIN, "Grain", "grain"},
602 {GST_X264_ENC_TUNE_PSNR, "PSNR", "psnr"},
603 {GST_X264_ENC_TUNE_SSIM, "SSIM", "ssim"},
607 #define GST_X264_ENC_PSY_TUNE_TYPE (gst_x264_enc_psy_tune_get_type())
609 gst_x264_enc_psy_tune_get_type (void)
611 static GType psy_tune_type = 0;
613 if (!psy_tune_type) {
615 g_enum_register_static ("GstX264EncPsyTune", psy_tune_types);
617 return psy_tune_type;
621 gst_x264_enc_build_tunings_string (GstX264Enc * x264enc)
625 if (x264enc->tunings)
626 g_string_free (x264enc->tunings, TRUE);
628 if (x264enc->psy_tune) {
630 g_string_new (psy_tune_types[x264enc->psy_tune].value_nick);
632 x264enc->tunings = g_string_new (NULL);
635 while (tune_types[i].value_name) {
636 if (x264enc->tune & (1 << (i - 1)))
637 g_string_append_printf (x264enc->tunings, "%s%s",
638 x264enc->tunings->len ? "," : "", tune_types[i].value_nick);
642 if (x264enc->tunings->len)
643 GST_DEBUG_OBJECT (x264enc, "Constructed tunings string: %s",
644 x264enc->tunings->str);
647 #define GST_X264_ENC_FRAME_PACKING_TYPE (gst_x264_enc_frame_packing_get_type())
649 gst_x264_enc_frame_packing_get_type (void)
651 static GType fpa_type = 0;
653 static const GEnumValue fpa_types[] = {
654 {-1, "Automatic (use incoming video information)", "auto"},
655 {0, "checkerboard - Left and Right pixels alternate in a checkerboard pattern", "checkerboard"},
656 {1, "column interleaved - Alternating pixel columns represent Left and Right views", "column-interleaved"},
657 {2, "row interleaved - Alternating pixel rows represent Left and Right views", "row-interleaved"},
658 {3, "side by side - The left half of the frame contains the Left eye view, the right half the Right eye view", "side-by-side"},
659 {4, "top bottom - L is on top, R on bottom", "top-bottom"},
660 {5, "frame interleaved - Each frame contains either Left or Right view alternately", "frame-interleaved"},
665 fpa_type = g_enum_register_static ("GstX264EncFramePacking", fpa_types);
671 gst_x264_enc_mview_mode_to_frame_packing (GstVideoMultiviewMode mode)
674 case GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD:
676 case GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED:
678 case GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED:
680 case GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE:
682 case GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM:
684 case GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME:
693 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
696 GST_STATIC_CAPS ("video/x-h264, "
697 "framerate = (fraction) [0/1, MAX], "
698 "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ], "
699 "stream-format = (string) { avc, byte-stream }, "
700 "alignment = (string) au, "
701 "profile = (string) { high-4:4:4, high-4:2:2, high-10, high, main,"
702 " baseline, constrained-baseline, high-4:4:4-intra, high-4:2:2-intra,"
706 static void gst_x264_enc_finalize (GObject * object);
707 static gboolean gst_x264_enc_start (GstVideoEncoder * encoder);
708 static gboolean gst_x264_enc_stop (GstVideoEncoder * encoder);
709 static gboolean gst_x264_enc_flush (GstVideoEncoder * encoder);
711 static gboolean gst_x264_enc_init_encoder (GstX264Enc * encoder);
712 static void gst_x264_enc_close_encoder (GstX264Enc * encoder);
714 static GstFlowReturn gst_x264_enc_finish (GstVideoEncoder * encoder);
715 static GstFlowReturn gst_x264_enc_handle_frame (GstVideoEncoder * encoder,
716 GstVideoCodecFrame * frame);
717 static void gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send);
718 static GstFlowReturn gst_x264_enc_encode_frame (GstX264Enc * encoder,
719 x264_picture_t * pic_in, GstVideoCodecFrame * input_frame, int *i_nal,
721 static gboolean gst_x264_enc_set_format (GstVideoEncoder * video_enc,
722 GstVideoCodecState * state);
723 static gboolean gst_x264_enc_propose_allocation (GstVideoEncoder * encoder,
726 static void gst_x264_enc_set_property (GObject * object, guint prop_id,
727 const GValue * value, GParamSpec * pspec);
728 static void gst_x264_enc_get_property (GObject * object, guint prop_id,
729 GValue * value, GParamSpec * pspec);
730 static gboolean x264_element_init (GstPlugin * plugin);
732 typedef gboolean (*LoadPresetFunc) (GstPreset * preset, const gchar * name);
734 LoadPresetFunc parent_load_preset = NULL;
737 gst_x264_enc_load_preset (GstPreset * preset, const gchar * name)
739 GstX264Enc *enc = GST_X264_ENC (preset);
742 gst_encoder_bitrate_profile_manager_start_loading_preset
743 (enc->bitrate_manager);
744 res = parent_load_preset (preset, name);
745 gst_encoder_bitrate_profile_manager_end_loading_preset (enc->bitrate_manager,
752 gst_x264_enc_preset_interface_init (GstPresetInterface * iface)
754 parent_load_preset = iface->load_preset;
755 iface->load_preset = gst_x264_enc_load_preset;
758 #define gst_x264_enc_parent_class parent_class
759 G_DEFINE_TYPE_WITH_CODE (GstX264Enc, gst_x264_enc, GST_TYPE_VIDEO_ENCODER,
760 G_IMPLEMENT_INTERFACE (GST_TYPE_PRESET,
761 gst_x264_enc_preset_interface_init));
762 GST_ELEMENT_REGISTER_DEFINE_CUSTOM (x264enc, x264_element_init)
763 /* don't forget to free the string after use */
764 static const gchar *gst_x264_enc_build_partitions (gint analyse)
771 string = g_string_new (NULL);
772 if (analyse & X264_ANALYSE_I4x4)
773 g_string_append (string, "i4x4");
774 if (analyse & X264_ANALYSE_I8x8)
775 g_string_append (string, ",i8x8");
776 if (analyse & X264_ANALYSE_PSUB16x16)
777 g_string_append (string, ",p8x8");
778 if (analyse & X264_ANALYSE_PSUB8x8)
779 g_string_append (string, ",p4x4");
780 if (analyse & X264_ANALYSE_BSUB16x16)
781 g_string_append (string, ",b8x8");
783 return (const gchar *) g_string_free (string, FALSE);
787 check_formats (const gchar * str, gboolean * has_420_8, gboolean * has_420_10,
788 gboolean * has_422, gboolean * has_444)
790 if (g_str_has_prefix (str, "high-4:4:4"))
792 else if (g_str_has_prefix (str, "high-4:2:2"))
794 else if (g_str_has_prefix (str, "high-10"))
801 /* allowed input caps depending on whether libx264 was built for 8 or 10 bits */
803 gst_x264_enc_sink_getcaps (GstVideoEncoder * enc, GstCaps * filter)
805 GstCaps *supported_incaps;
807 GstCaps *filter_caps, *fcaps;
811 gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SINK_PAD (enc));
813 /* Allow downstream to specify width/height/framerate/PAR constraints
814 * and forward them upstream for video converters to handle
816 allowed = gst_pad_get_allowed_caps (enc->srcpad);
818 if (!allowed || gst_caps_is_empty (allowed) || gst_caps_is_any (allowed)) {
819 fcaps = supported_incaps;
823 GST_LOG_OBJECT (enc, "template caps %" GST_PTR_FORMAT, supported_incaps);
824 GST_LOG_OBJECT (enc, "allowed caps %" GST_PTR_FORMAT, allowed);
826 filter_caps = gst_caps_new_empty ();
828 for (i = 0; i < gst_caps_get_size (supported_incaps); i++) {
830 gst_structure_get_name_id (gst_caps_get_structure (supported_incaps,
833 for (j = 0; j < gst_caps_get_size (allowed); j++) {
834 const GstStructure *allowed_s = gst_caps_get_structure (allowed, j);
838 /* FIXME Find a way to reuse gst_video_encoder_proxy_getcaps so that
839 * we do not need to copy that logic */
840 s = gst_structure_new_id_empty (q_name);
841 if ((val = gst_structure_get_value (allowed_s, "width")))
842 gst_structure_set_value (s, "width", val);
843 if ((val = gst_structure_get_value (allowed_s, "height")))
844 gst_structure_set_value (s, "height", val);
845 if ((val = gst_structure_get_value (allowed_s, "framerate")))
846 gst_structure_set_value (s, "framerate", val);
847 if ((val = gst_structure_get_value (allowed_s, "pixel-aspect-ratio")))
848 gst_structure_set_value (s, "pixel-aspect-ratio", val);
849 if ((val = gst_structure_get_value (allowed_s, "colorimetry")))
850 gst_structure_set_value (s, "colorimetry", val);
851 if ((val = gst_structure_get_value (allowed_s, "chroma-site")))
852 gst_structure_set_value (s, "chroma-site", val);
854 if ((val = gst_structure_get_value (allowed_s, "profile"))) {
855 gboolean has_420_8 = FALSE;
856 gboolean has_420_10 = FALSE;
857 gboolean has_422 = FALSE;
858 gboolean has_444 = FALSE;
860 if (G_VALUE_HOLDS_STRING (val)) {
861 check_formats (g_value_get_string (val), &has_420_8, &has_420_10,
863 } else if (GST_VALUE_HOLDS_LIST (val)) {
864 for (k = 0; k < gst_value_list_get_size (val); k++) {
865 const GValue *vlist = gst_value_list_get_value (val, k);
867 if (G_VALUE_HOLDS_STRING (vlist))
868 check_formats (g_value_get_string (vlist), &has_420_8,
869 &has_420_10, &has_422, &has_444);
873 gst_x264_enc_add_x264_chroma_format (s, has_420_8, has_420_10, has_422,
877 filter_caps = gst_caps_merge_structure (filter_caps, s);
881 fcaps = gst_caps_intersect (filter_caps, supported_incaps);
882 gst_caps_unref (filter_caps);
883 gst_caps_unref (supported_incaps);
886 GST_LOG_OBJECT (enc, "intersecting with %" GST_PTR_FORMAT, filter);
887 filter_caps = gst_caps_intersect (fcaps, filter);
888 gst_caps_unref (fcaps);
893 gst_caps_replace (&allowed, NULL);
895 GST_LOG_OBJECT (enc, "proxy caps %" GST_PTR_FORMAT, fcaps);
901 gst_x264_enc_sink_query (GstVideoEncoder * enc, GstQuery * query)
903 GstPad *pad = GST_VIDEO_ENCODER_SINK_PAD (enc);
904 gboolean ret = FALSE;
906 GST_DEBUG ("Received %s query on sinkpad, %" GST_PTR_FORMAT,
907 GST_QUERY_TYPE_NAME (query), query);
909 switch (GST_QUERY_TYPE (query)) {
910 case GST_QUERY_ACCEPT_CAPS:{
911 GstCaps *acceptable, *caps;
913 acceptable = gst_pad_get_pad_template_caps (pad);
915 gst_query_parse_accept_caps (query, &caps);
917 gst_query_set_accept_caps_result (query,
918 gst_caps_is_subset (caps, acceptable));
919 gst_caps_unref (acceptable);
924 ret = GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (enc, query);
932 gst_x264_enc_class_init (GstX264EncClass * klass)
934 GObjectClass *gobject_class;
935 GstElementClass *element_class;
936 GstVideoEncoderClass *gstencoder_class;
937 const gchar *partitions = NULL;
938 GstPadTemplate *sink_templ;
939 GstCaps *supported_sinkcaps;
941 x264enc_defaults = g_string_new ("");
943 gobject_class = G_OBJECT_CLASS (klass);
944 element_class = GST_ELEMENT_CLASS (klass);
945 gstencoder_class = GST_VIDEO_ENCODER_CLASS (klass);
947 gobject_class->set_property = gst_x264_enc_set_property;
948 gobject_class->get_property = gst_x264_enc_get_property;
949 gobject_class->finalize = gst_x264_enc_finalize;
951 gstencoder_class->set_format = GST_DEBUG_FUNCPTR (gst_x264_enc_set_format);
952 gstencoder_class->handle_frame =
953 GST_DEBUG_FUNCPTR (gst_x264_enc_handle_frame);
954 gstencoder_class->start = GST_DEBUG_FUNCPTR (gst_x264_enc_start);
955 gstencoder_class->stop = GST_DEBUG_FUNCPTR (gst_x264_enc_stop);
956 gstencoder_class->flush = GST_DEBUG_FUNCPTR (gst_x264_enc_flush);
957 gstencoder_class->finish = GST_DEBUG_FUNCPTR (gst_x264_enc_finish);
958 gstencoder_class->getcaps = GST_DEBUG_FUNCPTR (gst_x264_enc_sink_getcaps);
959 gstencoder_class->propose_allocation =
960 GST_DEBUG_FUNCPTR (gst_x264_enc_propose_allocation);
961 gstencoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_x264_enc_sink_query);
963 /* options for which we don't use string equivalents */
964 g_object_class_install_property (gobject_class, ARG_PASS,
965 g_param_spec_enum ("pass", "Encoding pass/type",
966 "Encoding pass/type", GST_X264_ENC_PASS_TYPE,
967 ARG_PASS_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
968 g_object_class_install_property (gobject_class, ARG_QUANTIZER,
969 g_param_spec_uint ("quantizer", "Constant Quantizer",
970 "Constant quantizer or quality to apply",
971 0, 50, ARG_QUANTIZER_DEFAULT,
972 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
973 g_object_class_install_property (gobject_class, ARG_BITRATE,
974 g_param_spec_uint ("bitrate", "Bitrate", "Bitrate in kbit/sec", 1,
975 2000 * 1024, ARG_BITRATE_DEFAULT,
976 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
977 GST_PARAM_MUTABLE_PLAYING));
978 g_object_class_install_property (gobject_class, ARG_VBV_BUF_CAPACITY,
979 g_param_spec_uint ("vbv-buf-capacity", "VBV buffer capacity",
980 "Size of the VBV buffer in milliseconds",
981 0, 10000, ARG_VBV_BUF_CAPACITY_DEFAULT,
982 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
983 GST_PARAM_MUTABLE_PLAYING));
984 g_object_class_install_property (gobject_class, ARG_SPEED_PRESET,
985 g_param_spec_enum ("speed-preset", "Speed/quality preset",
986 "Preset name for speed/quality tradeoff options (can affect decode "
987 "compatibility - impose restrictions separately for your target decoder)",
988 GST_X264_ENC_SPEED_PRESET_TYPE, ARG_SPEED_PRESET_DEFAULT,
989 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
990 g_object_class_install_property (gobject_class, ARG_PSY_TUNE,
991 g_param_spec_enum ("psy-tune", "Psychovisual tuning preset",
992 "Preset name for psychovisual tuning options",
993 GST_X264_ENC_PSY_TUNE_TYPE, ARG_PSY_TUNE_DEFAULT,
994 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
995 g_object_class_install_property (gobject_class, ARG_TUNE,
996 g_param_spec_flags ("tune", "Content tuning preset",
997 "Preset name for non-psychovisual tuning options",
998 GST_X264_ENC_TUNE_TYPE, ARG_TUNE_DEFAULT,
999 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1000 g_object_class_install_property (gobject_class, ARG_OPTION_STRING,
1001 g_param_spec_string ("option-string", "Option string",
1002 "String of x264 options (overridden by element properties)"
1003 " in the format \"key1=value1:key2=value2\".",
1004 ARG_OPTION_STRING_DEFAULT,
1005 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1007 g_object_class_install_property (gobject_class, ARG_FRAME_PACKING,
1008 g_param_spec_enum ("frame-packing", "Frame Packing",
1009 "Set frame packing mode for Stereoscopic content",
1010 GST_X264_ENC_FRAME_PACKING_TYPE, ARG_FRAME_PACKING_DEFAULT,
1011 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1013 g_object_class_install_property (gobject_class, ARG_INSERT_VUI,
1014 g_param_spec_boolean ("insert-vui", "Insert VUI",
1015 "Insert VUI NAL in stream",
1016 ARG_INSERT_VUI_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1018 /* options for which we _do_ use string equivalents */
1019 g_object_class_install_property (gobject_class, ARG_THREADS,
1020 g_param_spec_uint ("threads", "Threads",
1021 "Number of threads used by the codec (0 for automatic)",
1022 0, G_MAXINT, ARG_THREADS_DEFAULT,
1023 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1024 /* NOTE: this first string append doesn't require the ':' delimiter but the
1026 g_string_append_printf (x264enc_defaults, "threads=%d", ARG_THREADS_DEFAULT);
1027 g_object_class_install_property (gobject_class, ARG_SLICED_THREADS,
1028 g_param_spec_boolean ("sliced-threads", "Sliced Threads",
1029 "Low latency but lower efficiency threading",
1030 ARG_SLICED_THREADS_DEFAULT,
1031 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1032 g_string_append_printf (x264enc_defaults, ":sliced-threads=%d",
1033 ARG_SLICED_THREADS_DEFAULT);
1034 g_object_class_install_property (gobject_class, ARG_SYNC_LOOKAHEAD,
1035 g_param_spec_int ("sync-lookahead", "Sync Lookahead",
1036 "Number of buffer frames for threaded lookahead (-1 for automatic)",
1037 -1, 250, ARG_SYNC_LOOKAHEAD_DEFAULT,
1038 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1039 g_string_append_printf (x264enc_defaults, ":sync-lookahead=%d",
1040 ARG_SYNC_LOOKAHEAD_DEFAULT);
1041 g_object_class_install_property (gobject_class, ARG_MULTIPASS_CACHE_FILE,
1042 g_param_spec_string ("multipass-cache-file", "Multipass Cache File",
1043 "Filename for multipass cache file",
1044 ARG_MULTIPASS_CACHE_FILE_DEFAULT,
1045 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1046 g_string_append_printf (x264enc_defaults, ":stats=%s",
1047 ARG_MULTIPASS_CACHE_FILE_DEFAULT);
1048 g_object_class_install_property (gobject_class, ARG_BYTE_STREAM,
1049 g_param_spec_boolean ("byte-stream", "Byte Stream",
1050 "Generate byte stream format of NALU", ARG_BYTE_STREAM_DEFAULT,
1051 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1052 g_string_append_printf (x264enc_defaults, ":annexb=%d",
1053 ARG_BYTE_STREAM_DEFAULT);
1054 g_object_class_install_property (gobject_class, ARG_INTRA_REFRESH,
1055 g_param_spec_boolean ("intra-refresh", "Intra Refresh",
1056 "Use Periodic Intra Refresh instead of IDR frames",
1057 ARG_INTRA_REFRESH_DEFAULT,
1058 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1059 g_string_append_printf (x264enc_defaults, ":intra-refresh=%d",
1060 ARG_INTRA_REFRESH_DEFAULT);
1061 g_object_class_install_property (gobject_class, ARG_ME,
1062 g_param_spec_enum ("me", "Motion Estimation",
1063 "Integer pixel motion estimation method", GST_X264_ENC_ME_TYPE,
1064 ARG_ME_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1065 g_string_append_printf (x264enc_defaults, ":me=%s",
1066 x264_motion_est_names[ARG_ME_DEFAULT]);
1067 g_object_class_install_property (gobject_class, ARG_SUBME,
1068 g_param_spec_uint ("subme", "Subpixel Motion Estimation",
1069 "Subpixel motion estimation and partition decision quality: 1=fast, 10=best",
1070 1, 10, ARG_SUBME_DEFAULT,
1071 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1072 g_string_append_printf (x264enc_defaults, ":subme=%d", ARG_SUBME_DEFAULT);
1073 g_object_class_install_property (gobject_class, ARG_ANALYSE,
1074 g_param_spec_flags ("analyse", "Analyse", "Partitions to consider",
1075 GST_X264_ENC_ANALYSE_TYPE, ARG_ANALYSE_DEFAULT,
1076 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1077 partitions = gst_x264_enc_build_partitions (ARG_ANALYSE_DEFAULT);
1079 g_string_append_printf (x264enc_defaults, ":partitions=%s", partitions);
1080 g_free ((gpointer) partitions);
1082 g_object_class_install_property (gobject_class, ARG_DCT8x8,
1083 g_param_spec_boolean ("dct8x8", "DCT8x8",
1084 "Adaptive spatial transform size", ARG_DCT8x8_DEFAULT,
1085 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1086 g_string_append_printf (x264enc_defaults, ":8x8dct=%d", ARG_DCT8x8_DEFAULT);
1087 g_object_class_install_property (gobject_class, ARG_REF,
1088 g_param_spec_uint ("ref", "Reference Frames",
1089 "Number of reference frames",
1090 1, 16, ARG_REF_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1091 g_string_append_printf (x264enc_defaults, ":ref=%d", ARG_REF_DEFAULT);
1092 g_object_class_install_property (gobject_class, ARG_BFRAMES,
1093 g_param_spec_uint ("bframes", "B-Frames",
1094 "Number of B-frames between I and P",
1095 0, 16, ARG_BFRAMES_DEFAULT,
1096 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1097 g_string_append_printf (x264enc_defaults, ":bframes=%d", ARG_BFRAMES_DEFAULT);
1098 g_object_class_install_property (gobject_class, ARG_B_ADAPT,
1099 g_param_spec_boolean ("b-adapt", "B-Adapt",
1100 "Automatically decide how many B-frames to use",
1101 ARG_B_ADAPT_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1102 g_string_append_printf (x264enc_defaults, ":b-adapt=%d", ARG_B_ADAPT_DEFAULT);
1103 g_object_class_install_property (gobject_class, ARG_B_PYRAMID,
1104 g_param_spec_boolean ("b-pyramid", "B-Pyramid",
1105 "Keep some B-frames as references", ARG_B_PYRAMID_DEFAULT,
1106 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1107 g_string_append_printf (x264enc_defaults, ":b-pyramid=%s",
1108 x264_b_pyramid_names[ARG_B_PYRAMID_DEFAULT]);
1109 g_object_class_install_property (gobject_class, ARG_WEIGHTB,
1110 g_param_spec_boolean ("weightb", "Weighted B-Frames",
1111 "Weighted prediction for B-frames", ARG_WEIGHTB_DEFAULT,
1112 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1113 g_string_append_printf (x264enc_defaults, ":weightb=%d", ARG_WEIGHTB_DEFAULT);
1114 g_object_class_install_property (gobject_class, ARG_SPS_ID,
1115 g_param_spec_uint ("sps-id", "SPS ID",
1116 "SPS and PPS ID number",
1117 0, 31, ARG_SPS_ID_DEFAULT,
1118 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1119 g_string_append_printf (x264enc_defaults, ":sps-id=%d", ARG_SPS_ID_DEFAULT);
1120 g_object_class_install_property (gobject_class, ARG_AU_NALU,
1121 g_param_spec_boolean ("aud", "AUD",
1122 "Use AU (Access Unit) delimiter", ARG_AU_NALU_DEFAULT,
1123 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1124 g_string_append_printf (x264enc_defaults, ":aud=%d", ARG_AU_NALU_DEFAULT);
1125 g_object_class_install_property (gobject_class, ARG_TRELLIS,
1126 g_param_spec_boolean ("trellis", "Trellis quantization",
1127 "Enable trellis searched quantization", ARG_TRELLIS_DEFAULT,
1128 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1129 g_string_append_printf (x264enc_defaults, ":trellis=%d", ARG_TRELLIS_DEFAULT);
1130 g_object_class_install_property (gobject_class, ARG_KEYINT_MAX,
1131 g_param_spec_uint ("key-int-max", "Key-frame maximal interval",
1132 "Maximal distance between two key-frames (0 for automatic)",
1133 0, G_MAXINT, ARG_KEYINT_MAX_DEFAULT,
1134 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1135 g_string_append_printf (x264enc_defaults, ":keyint=%d",
1136 ARG_KEYINT_MAX_DEFAULT);
1137 g_object_class_install_property (gobject_class, ARG_CABAC,
1138 g_param_spec_boolean ("cabac", "Use CABAC", "Enable CABAC entropy coding",
1139 ARG_CABAC_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1140 g_string_append_printf (x264enc_defaults, ":cabac=%d", ARG_CABAC_DEFAULT);
1141 g_object_class_install_property (gobject_class, ARG_QP_MIN,
1142 g_param_spec_uint ("qp-min", "Minimum Quantizer",
1143 "Minimum quantizer", 0, 63, ARG_QP_MIN_DEFAULT,
1144 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1145 g_string_append_printf (x264enc_defaults, ":qpmin=%d", ARG_QP_MIN_DEFAULT);
1146 g_object_class_install_property (gobject_class, ARG_QP_MAX,
1147 g_param_spec_uint ("qp-max", "Maximum Quantizer",
1148 "Maximum quantizer", 0, 63, ARG_QP_MAX_DEFAULT,
1149 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1150 g_string_append_printf (x264enc_defaults, ":qpmax=%d", ARG_QP_MAX_DEFAULT);
1151 g_object_class_install_property (gobject_class, ARG_QP_STEP,
1152 g_param_spec_uint ("qp-step", "Maximum Quantizer Difference",
1153 "Maximum quantizer difference between frames",
1154 0, 63, ARG_QP_STEP_DEFAULT,
1155 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1156 g_string_append_printf (x264enc_defaults, ":qpstep=%d", ARG_QP_STEP_DEFAULT);
1157 g_object_class_install_property (gobject_class, ARG_IP_FACTOR,
1158 g_param_spec_float ("ip-factor", "IP-Factor",
1159 "Quantizer factor between I- and P-frames",
1160 0, 2, ARG_IP_FACTOR_DEFAULT,
1161 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1162 g_string_append_printf (x264enc_defaults, ":ip-factor=%f",
1163 ARG_IP_FACTOR_DEFAULT);
1164 g_object_class_install_property (gobject_class, ARG_PB_FACTOR,
1165 g_param_spec_float ("pb-factor", "PB-Factor",
1166 "Quantizer factor between P- and B-frames", 0, 2,
1167 ARG_PB_FACTOR_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1168 g_string_append_printf (x264enc_defaults, ":pb-factor=%f",
1169 ARG_PB_FACTOR_DEFAULT);
1170 g_object_class_install_property (gobject_class, ARG_RC_MB_TREE,
1171 g_param_spec_boolean ("mb-tree", "Macroblock Tree",
1172 "Macroblock-Tree ratecontrol",
1173 ARG_RC_MB_TREE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1174 g_string_append_printf (x264enc_defaults, ":mbtree=%d",
1175 ARG_RC_MB_TREE_DEFAULT);
1176 g_object_class_install_property (gobject_class, ARG_RC_LOOKAHEAD,
1177 g_param_spec_int ("rc-lookahead", "Rate Control Lookahead",
1178 "Number of frames for frametype lookahead", 0, 250,
1179 ARG_RC_LOOKAHEAD_DEFAULT,
1180 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1181 g_string_append_printf (x264enc_defaults, ":rc-lookahead=%d",
1182 ARG_RC_LOOKAHEAD_DEFAULT);
1183 g_object_class_install_property (gobject_class, ARG_NR,
1184 g_param_spec_uint ("noise-reduction", "Noise Reduction",
1185 "Noise reduction strength",
1186 0, 100000, ARG_NR_DEFAULT,
1187 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1188 g_string_append_printf (x264enc_defaults, ":nr=%d", ARG_NR_DEFAULT);
1189 g_object_class_install_property (gobject_class, ARG_INTERLACED,
1190 g_param_spec_boolean ("interlaced", "Interlaced",
1191 "Interlaced material", ARG_INTERLACED_DEFAULT,
1192 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1193 g_string_append_printf (x264enc_defaults, ":interlaced=%d",
1194 ARG_INTERLACED_DEFAULT);
1196 /* append deblock parameters */
1197 g_string_append_printf (x264enc_defaults, ":deblock=0,0");
1198 /* append weighted prediction parameter */
1199 g_string_append_printf (x264enc_defaults, ":weightp=0");
1201 gst_element_class_set_static_metadata (element_class,
1202 "x264enc", "Codec/Encoder/Video", "H264 Encoder",
1203 "Josef Zlomek <josef.zlomek@itonis.tv>, "
1204 "Mark Nauwelaerts <mnauw@users.sf.net>");
1206 supported_sinkcaps = gst_caps_new_simple ("video/x-raw",
1207 "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
1208 "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
1209 "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
1211 gst_x264_enc_add_x264_chroma_format (gst_caps_get_structure
1212 (supported_sinkcaps, 0), TRUE, TRUE, TRUE, TRUE);
1214 sink_templ = gst_pad_template_new ("sink",
1215 GST_PAD_SINK, GST_PAD_ALWAYS, supported_sinkcaps);
1217 gst_caps_unref (supported_sinkcaps);
1219 gst_element_class_add_pad_template (element_class, sink_templ);
1220 gst_element_class_add_static_pad_template (element_class, &src_factory);
1222 gst_type_mark_as_plugin_api (GST_X264_ENC_ANALYSE_TYPE, 0);
1223 gst_type_mark_as_plugin_api (GST_X264_ENC_FRAME_PACKING_TYPE, 0);
1224 gst_type_mark_as_plugin_api (GST_X264_ENC_ME_TYPE, 0);
1225 gst_type_mark_as_plugin_api (GST_X264_ENC_PASS_TYPE, 0);
1226 gst_type_mark_as_plugin_api (GST_X264_ENC_PSY_TUNE_TYPE, 0);
1227 gst_type_mark_as_plugin_api (GST_X264_ENC_SPEED_PRESET_TYPE, 0);
1228 gst_type_mark_as_plugin_api (GST_X264_ENC_TUNE_TYPE, 0);
1232 G_GNUC_PRINTF (3, 0)
1236 gst_x264_enc_log_callback (gpointer private, gint level, const char *format,
1239 #ifndef GST_DISABLE_GST_DEBUG
1240 GstDebugLevel gst_level;
1241 GObject *object = (GObject *) private;
1246 gst_level = GST_LEVEL_NONE;
1248 case X264_LOG_ERROR:
1249 gst_level = GST_LEVEL_ERROR;
1251 case X264_LOG_WARNING:
1252 gst_level = GST_LEVEL_WARNING;
1255 gst_level = GST_LEVEL_INFO;
1258 /* push x264enc debug down to our lower levels to avoid some clutter */
1259 gst_level = GST_LEVEL_LOG;
1263 if (G_LIKELY (gst_level > _gst_debug_min))
1266 if (G_LIKELY (gst_level > gst_debug_category_get_threshold (GST_CAT_DEFAULT)))
1269 formatted = g_strdup_vprintf (format, args);
1270 g_strchomp (formatted);
1272 GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, gst_level, object, "%s", formatted);
1275 #endif /* GST_DISABLE_GST_DEBUG */
1278 /* initialize the new element
1279 * instantiate pads and add them to element
1281 * initialize structure
1284 gst_x264_enc_init (GstX264Enc * encoder)
1287 encoder->threads = ARG_THREADS_DEFAULT;
1288 encoder->sliced_threads = ARG_SLICED_THREADS_DEFAULT;
1289 encoder->sync_lookahead = ARG_SYNC_LOOKAHEAD_DEFAULT;
1290 encoder->pass = ARG_PASS_DEFAULT;
1291 encoder->quantizer = ARG_QUANTIZER_DEFAULT;
1292 encoder->mp_cache_file = g_strdup (ARG_MULTIPASS_CACHE_FILE_DEFAULT);
1293 encoder->byte_stream = ARG_BYTE_STREAM_DEFAULT;
1294 encoder->intra_refresh = ARG_INTRA_REFRESH_DEFAULT;
1295 encoder->vbv_buf_capacity = ARG_VBV_BUF_CAPACITY_DEFAULT;
1296 encoder->me = ARG_ME_DEFAULT;
1297 encoder->subme = ARG_SUBME_DEFAULT;
1298 encoder->analyse = ARG_ANALYSE_DEFAULT;
1299 encoder->dct8x8 = ARG_DCT8x8_DEFAULT;
1300 encoder->ref = ARG_REF_DEFAULT;
1301 encoder->bframes = ARG_BFRAMES_DEFAULT;
1302 encoder->b_adapt = ARG_B_ADAPT_DEFAULT;
1303 encoder->b_pyramid = ARG_B_PYRAMID_DEFAULT;
1304 encoder->weightb = ARG_WEIGHTB_DEFAULT;
1305 encoder->sps_id = ARG_SPS_ID_DEFAULT;
1306 encoder->au_nalu = ARG_AU_NALU_DEFAULT;
1307 encoder->trellis = ARG_TRELLIS_DEFAULT;
1308 encoder->keyint_max = ARG_KEYINT_MAX_DEFAULT;
1309 encoder->cabac = ARG_CABAC_DEFAULT;
1310 encoder->qp_min = ARG_QP_MIN_DEFAULT;
1311 encoder->qp_max = ARG_QP_MAX_DEFAULT;
1312 encoder->qp_step = ARG_QP_STEP_DEFAULT;
1313 encoder->ip_factor = ARG_IP_FACTOR_DEFAULT;
1314 encoder->pb_factor = ARG_PB_FACTOR_DEFAULT;
1315 encoder->mb_tree = ARG_RC_MB_TREE_DEFAULT;
1316 encoder->rc_lookahead = ARG_RC_LOOKAHEAD_DEFAULT;
1317 encoder->noise_reduction = ARG_NR_DEFAULT;
1318 encoder->interlaced = ARG_INTERLACED_DEFAULT;
1319 encoder->option_string = g_string_new (NULL);
1320 encoder->option_string_prop = g_string_new (ARG_OPTION_STRING_DEFAULT);
1321 encoder->speed_preset = ARG_SPEED_PRESET_DEFAULT;
1322 encoder->psy_tune = ARG_PSY_TUNE_DEFAULT;
1323 encoder->tune = ARG_TUNE_DEFAULT;
1324 encoder->frame_packing = ARG_FRAME_PACKING_DEFAULT;
1325 encoder->insert_vui = ARG_INSERT_VUI_DEFAULT;
1327 encoder->bitrate_manager =
1328 gst_encoder_bitrate_profile_manager_new (ARG_BITRATE_DEFAULT);
1333 GstVideoCodecFrame *frame;
1334 GstVideoFrame vframe;
1338 gst_x264_enc_queue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame,
1339 GstVideoInfo * info)
1341 GstVideoFrame vframe;
1344 if (!gst_video_frame_map (&vframe, info, frame->input_buffer, GST_MAP_READ))
1347 fdata = g_slice_new (FrameData);
1348 fdata->frame = gst_video_codec_frame_ref (frame);
1349 fdata->vframe = vframe;
1351 enc->pending_frames = g_list_prepend (enc->pending_frames, fdata);
1357 gst_x264_enc_dequeue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame)
1361 for (l = enc->pending_frames; l; l = l->next) {
1362 FrameData *fdata = l->data;
1364 if (fdata->frame != frame)
1367 gst_video_frame_unmap (&fdata->vframe);
1368 gst_video_codec_frame_unref (fdata->frame);
1369 g_slice_free (FrameData, fdata);
1371 enc->pending_frames = g_list_delete_link (enc->pending_frames, l);
1377 gst_x264_enc_dequeue_all_frames (GstX264Enc * enc)
1381 for (l = enc->pending_frames; l; l = l->next) {
1382 FrameData *fdata = l->data;
1384 gst_video_frame_unmap (&fdata->vframe);
1385 gst_video_codec_frame_unref (fdata->frame);
1386 g_slice_free (FrameData, fdata);
1388 g_list_free (enc->pending_frames);
1389 enc->pending_frames = NULL;
1393 gst_x264_enc_start (GstVideoEncoder * encoder)
1395 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1397 x264enc->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY;
1399 /* make sure that we have enough time for first DTS,
1400 this is probably overkill for most streams */
1401 gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000);
1407 gst_x264_enc_stop (GstVideoEncoder * encoder)
1409 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1411 gst_x264_enc_flush_frames (x264enc, FALSE);
1412 gst_x264_enc_close_encoder (x264enc);
1413 gst_x264_enc_dequeue_all_frames (x264enc);
1415 if (x264enc->input_state)
1416 gst_video_codec_state_unref (x264enc->input_state);
1417 x264enc->input_state = NULL;
1424 gst_x264_enc_flush (GstVideoEncoder * encoder)
1426 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1428 gst_x264_enc_flush_frames (x264enc, FALSE);
1429 gst_x264_enc_close_encoder (x264enc);
1430 gst_x264_enc_dequeue_all_frames (x264enc);
1432 gst_x264_enc_init_encoder (x264enc);
1438 gst_x264_enc_finalize (GObject * object)
1440 GstX264Enc *encoder = GST_X264_ENC (object);
1442 if (encoder->input_state)
1443 gst_video_codec_state_unref (encoder->input_state);
1444 encoder->input_state = NULL;
1446 #define FREE_STRING(ptr) \
1448 g_string_free (ptr, TRUE);
1450 FREE_STRING (encoder->tunings);
1451 FREE_STRING (encoder->option_string);
1452 FREE_STRING (encoder->option_string_prop);
1453 gst_encoder_bitrate_profile_manager_free (encoder->bitrate_manager);
1457 g_free (encoder->mp_cache_file);
1458 encoder->mp_cache_file = NULL;
1460 gst_x264_enc_close_encoder (encoder);
1462 G_OBJECT_CLASS (parent_class)->finalize (object);
1466 * gst_x264_enc_parse_options
1467 * @encoder: Encoder to which options are assigned
1468 * @str: Option string
1470 * Parse option string and assign to x264 parameters
1474 gst_x264_enc_parse_options (GstX264Enc * encoder, const gchar * str)
1478 gint parse_result = 0, ret = 0;
1479 gchar *options = (gchar *) str;
1481 while (*options == ':')
1484 kvpairs = g_strsplit (options, ":", 0);
1485 npairs = g_strv_length (kvpairs);
1487 for (i = 0; i < npairs; i++) {
1488 GStrv key_val = g_strsplit (kvpairs[i], "=", 2);
1491 encoder->vtable->x264_param_parse (&encoder->x264param, key_val[0],
1494 if (parse_result == X264_PARAM_BAD_NAME) {
1495 GST_ERROR_OBJECT (encoder, "Bad name for option %s=%s",
1496 key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : "");
1498 if (parse_result == X264_PARAM_BAD_VALUE) {
1499 GST_ERROR_OBJECT (encoder,
1500 "Bad value for option %s=%s (Note: a NULL value for a non-boolean triggers this)",
1501 key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : "");
1504 g_strfreev (key_val);
1510 g_strfreev (kvpairs);
1515 gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes)
1518 case GST_VIDEO_FORMAT_I420:
1519 case GST_VIDEO_FORMAT_YV12:
1522 return X264_CSP_I420;
1523 case GST_VIDEO_FORMAT_I420_10BE:
1524 case GST_VIDEO_FORMAT_I420_10LE:
1527 return X264_CSP_I420 | X264_CSP_HIGH_DEPTH;
1528 case GST_VIDEO_FORMAT_Y42B:
1531 return X264_CSP_I422;
1532 case GST_VIDEO_FORMAT_I422_10BE:
1533 case GST_VIDEO_FORMAT_I422_10LE:
1536 return X264_CSP_I422 | X264_CSP_HIGH_DEPTH;
1537 case GST_VIDEO_FORMAT_Y444:
1540 return X264_CSP_I444;
1541 case GST_VIDEO_FORMAT_Y444_10BE:
1542 case GST_VIDEO_FORMAT_Y444_10LE:
1545 return X264_CSP_I444 | X264_CSP_HIGH_DEPTH;
1546 case GST_VIDEO_FORMAT_NV12:
1549 return X264_CSP_NV12;
1551 g_return_val_if_reached (GST_VIDEO_FORMAT_UNKNOWN);
1556 * gst_x264_enc_init_encoder
1557 * @encoder: Encoder which should be initialized.
1559 * Initialize x264 encoder.
1563 gst_x264_enc_init_encoder (GstX264Enc * encoder)
1569 if (!encoder->input_state) {
1570 GST_DEBUG_OBJECT (encoder, "Have no input state yet");
1574 info = &encoder->input_state->info;
1576 /* make sure that the encoder is closed */
1577 gst_x264_enc_close_encoder (encoder);
1579 GST_OBJECT_LOCK (encoder);
1581 if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 8)
1582 encoder->vtable = vtable_8bit;
1583 else if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 10)
1584 encoder->vtable = vtable_10bit;
1586 g_assert (encoder->vtable != NULL);
1588 gst_x264_enc_build_tunings_string (encoder);
1590 /* set x264 parameters and use preset/tuning if present */
1591 GST_DEBUG_OBJECT (encoder, "Applying defaults with preset %s, tunings %s",
1592 encoder->speed_preset ? x264_preset_names[encoder->speed_preset - 1] : "",
1593 encoder->tunings && encoder->tunings->len ? encoder->tunings->str : "");
1594 encoder->vtable->x264_param_default_preset (&encoder->x264param,
1595 encoder->speed_preset ? x264_preset_names[encoder->speed_preset -
1596 1] : NULL, encoder->tunings
1597 && encoder->tunings->len ? encoder->tunings->str : NULL);
1599 /* log callback setup; part of parameters
1600 * this needs to be done again after every *param_default* () call */
1601 encoder->x264param.pf_log = gst_x264_enc_log_callback;
1602 encoder->x264param.p_log_private = encoder;
1603 encoder->x264param.i_log_level = X264_LOG_DEBUG;
1605 /* if no preset nor tuning, use property defaults */
1606 if (!encoder->speed_preset && !encoder->tunings->len) {
1607 GST_DEBUG_OBJECT (encoder, "Applying x264enc_defaults");
1608 if (x264enc_defaults->len
1609 && gst_x264_enc_parse_options (encoder,
1610 x264enc_defaults->str) == FALSE) {
1611 GST_DEBUG_OBJECT (encoder,
1612 "x264enc_defaults string contains errors. This is a bug.");
1613 goto unlock_and_return;
1616 /* When using presets we need to respect the default output format */
1617 encoder->x264param.b_aud = encoder->au_nalu;
1618 encoder->x264param.b_annexb = encoder->byte_stream;
1621 /* setup appropriate timebase for gstreamer */
1622 encoder->x264param.i_timebase_num = 1;
1623 encoder->x264param.i_timebase_den = 1000000000;
1625 /* apply option-string property */
1626 if (encoder->option_string_prop && encoder->option_string_prop->len) {
1627 GST_DEBUG_OBJECT (encoder, "Applying option-string: %s",
1628 encoder->option_string_prop->str);
1629 if (gst_x264_enc_parse_options (encoder,
1630 encoder->option_string_prop->str) == FALSE) {
1631 GST_DEBUG_OBJECT (encoder, "Your option-string contains errors.");
1632 goto unlock_and_return;
1635 /* apply user-set options */
1636 if (encoder->option_string && encoder->option_string->len) {
1637 GST_DEBUG_OBJECT (encoder, "Applying user-set options: %s",
1638 encoder->option_string->str);
1639 if (gst_x264_enc_parse_options (encoder,
1640 encoder->option_string->str) == FALSE) {
1641 GST_DEBUG_OBJECT (encoder, "Failed to parse internal option string. "
1642 "This could be due to use of an old libx264 version. Option string "
1643 "was: %s", encoder->option_string->str);
1647 /* set up encoder parameters */
1648 #if X264_BUILD >= 153
1649 encoder->x264param.i_bitdepth = GST_VIDEO_INFO_COMP_DEPTH (info, 0);
1651 encoder->x264param.i_csp =
1652 gst_x264_enc_gst_to_x264_video_format (info->finfo->format,
1653 &encoder->x264_nplanes);
1654 if (info->fps_d == 0 || info->fps_n == 0) {
1655 /* No FPS so must use VFR
1656 * This raises latency apparently see http://mewiki.project357.com/wiki/X264_Encoding_Suggestions */
1657 encoder->x264param.b_vfr_input = TRUE;
1658 if (encoder->keyint_max) { /* NB the default is 250 setup by x264 itself */
1659 encoder->x264param.i_keyint_max = encoder->keyint_max;
1662 /* FPS available so set it up */
1663 encoder->x264param.b_vfr_input = FALSE;
1664 encoder->x264param.i_fps_num = info->fps_n;
1665 encoder->x264param.i_fps_den = info->fps_d;
1666 encoder->x264param.i_keyint_max =
1667 encoder->keyint_max ? encoder->keyint_max : (10 * info->fps_n /
1670 encoder->x264param.i_width = info->width;
1671 encoder->x264param.i_height = info->height;
1672 if (info->par_d > 0) {
1673 encoder->x264param.vui.i_sar_width = info->par_n;
1674 encoder->x264param.vui.i_sar_height = info->par_d;
1677 if ((((info->height == 576) && ((info->width == 720)
1678 || (info->width == 704) || (info->width == 352)))
1679 || ((info->height == 288) && (info->width == 352)))
1680 && (info->fps_d == 1) && (info->fps_n == 25)) {
1681 encoder->x264param.vui.i_vidformat = 1; /* PAL */
1682 } else if ((((info->height == 480) && ((info->width == 720)
1683 || (info->width == 704) || (info->width == 352)))
1684 || ((info->height == 240) && (info->width == 352)))
1685 && (info->fps_d == 1001) && ((info->fps_n == 30000)
1686 || (info->fps_n == 24000))) {
1687 encoder->x264param.vui.i_vidformat = 2; /* NTSC */
1689 encoder->x264param.vui.i_vidformat = 5; /* unspecified */
1692 if (!encoder->insert_vui)
1693 goto skip_vui_parameters;
1695 encoder->x264param.vui.i_colorprim =
1696 gst_video_color_primaries_to_iso (info->colorimetry.primaries);
1698 encoder->x264param.vui.i_transfer =
1699 gst_video_transfer_function_to_iso (info->colorimetry.transfer);
1701 encoder->x264param.vui.i_colmatrix =
1702 gst_video_color_matrix_to_iso (info->colorimetry.matrix);
1704 if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) {
1705 encoder->x264param.vui.b_fullrange = 1;
1707 encoder->x264param.vui.b_fullrange = 0;
1710 switch (info->chroma_site) {
1711 case GST_VIDEO_CHROMA_SITE_MPEG2:
1712 encoder->x264param.vui.i_chroma_loc = 0;
1714 case GST_VIDEO_CHROMA_SITE_JPEG:
1715 encoder->x264param.vui.i_chroma_loc = 1;
1717 case GST_VIDEO_CHROMA_SITE_V_COSITED:
1718 encoder->x264param.vui.i_chroma_loc = 3;
1720 case GST_VIDEO_CHROMA_SITE_DV:
1721 encoder->x264param.vui.i_chroma_loc = 2;
1724 encoder->x264param.vui.i_chroma_loc = 0;
1728 skip_vui_parameters:
1730 encoder->x264param.analyse.b_psnr = 0;
1733 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
1734 encoder->input_state ? &encoder->input_state->info : NULL);
1736 /* FIXME 2.0 make configuration more sane and consistent with x264 cmdline:
1737 * + split pass property into a pass property (pass1/2/3 enum) and rc-method
1738 * + bitrate property should only be used in case of CBR method
1739 * + vbv bitrate/buffer should have separate configuration that is then
1740 * applied independently of the mode:
1741 * + either using properties (new) vbv-maxrate and (renamed) vbv-bufsize
1742 * + or dropping vbv-buf-capacity altogether and simply using option-string
1744 switch (encoder->pass) {
1745 case GST_X264_ENC_PASS_QUANT:
1746 encoder->x264param.rc.i_rc_method = X264_RC_CQP;
1747 encoder->x264param.rc.i_qp_constant = encoder->quantizer;
1749 case GST_X264_ENC_PASS_QUAL:
1750 encoder->x264param.rc.i_rc_method = X264_RC_CRF;
1751 encoder->x264param.rc.f_rf_constant = encoder->quantizer;
1752 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
1753 encoder->x264param.rc.i_vbv_buffer_size
1754 = encoder->x264param.rc.i_vbv_max_bitrate
1755 * encoder->vbv_buf_capacity / 1000;
1757 case GST_X264_ENC_PASS_CBR:
1758 case GST_X264_ENC_PASS_PASS1:
1759 case GST_X264_ENC_PASS_PASS2:
1760 case GST_X264_ENC_PASS_PASS3:
1762 encoder->x264param.rc.i_rc_method = X264_RC_ABR;
1763 encoder->x264param.rc.i_bitrate = bitrate;
1764 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
1765 encoder->x264param.rc.i_vbv_buffer_size =
1766 encoder->x264param.rc.i_vbv_max_bitrate
1767 * encoder->vbv_buf_capacity / 1000;
1768 pass = encoder->pass & 0xF;
1774 encoder->x264param.rc.b_stat_read = 0;
1775 encoder->x264param.rc.b_stat_write = 0;
1778 encoder->x264param.rc.b_stat_read = 0;
1779 encoder->x264param.rc.b_stat_write = 1;
1780 encoder->vtable->x264_param_apply_fastfirstpass (&encoder->x264param);
1781 encoder->x264param.i_frame_reference = 1;
1782 encoder->x264param.analyse.b_transform_8x8 = 0;
1783 encoder->x264param.analyse.inter = 0;
1784 encoder->x264param.analyse.i_me_method = X264_ME_DIA;
1785 encoder->x264param.analyse.i_subpel_refine =
1786 MIN (2, encoder->x264param.analyse.i_subpel_refine);
1787 encoder->x264param.analyse.i_trellis = 0;
1788 encoder->x264param.analyse.b_fast_pskip = 1;
1791 encoder->x264param.rc.b_stat_read = 1;
1792 encoder->x264param.rc.b_stat_write = 0;
1795 encoder->x264param.rc.b_stat_read = 1;
1796 encoder->x264param.rc.b_stat_write = 1;
1800 if (encoder->peer_profile) {
1801 if (encoder->vtable->x264_param_apply_profile (&encoder->x264param,
1802 encoder->peer_profile))
1803 GST_WARNING_OBJECT (encoder, "Bad downstream profile name: %s",
1804 encoder->peer_profile);
1807 /* If using an intra profile, all frames are intra frames */
1808 if (encoder->peer_intra_profile)
1809 encoder->x264param.i_keyint_max = encoder->x264param.i_keyint_min = 1;
1811 /* Enforce level limits if they were in the caps */
1812 if (encoder->peer_level_idc != -1) {
1814 const x264_level_t *peer_level = NULL;
1816 for (i = 0; (*encoder->vtable->x264_levels)[i].level_idc; i++) {
1817 if (encoder->peer_level_idc ==
1818 (*encoder->vtable->x264_levels)[i].level_idc) {
1819 int mb_width = (info->width + 15) / 16;
1820 int mb_height = (info->height + 15) / 16;
1821 int mbs = mb_width * mb_height;
1823 if ((*encoder->vtable->x264_levels)[i].frame_size < mbs ||
1824 (*encoder->vtable->x264_levels)[i].frame_size * 8 <
1826 || (*encoder->vtable->x264_levels)[i].frame_size * 8 <
1827 mb_height * mb_height) {
1828 GST_WARNING_OBJECT (encoder,
1829 "Frame size larger than level %d allows",
1830 encoder->peer_level_idc);
1834 if (info->fps_d && (*encoder->vtable->x264_levels)[i].mbps
1835 < (gint64) mbs * info->fps_n / info->fps_d) {
1836 GST_WARNING_OBJECT (encoder,
1837 "Macroblock rate higher than level %d allows",
1838 encoder->peer_level_idc);
1842 peer_level = &(*encoder->vtable->x264_levels)[i];
1848 goto unlock_and_return;
1850 encoder->x264param.i_level_idc = peer_level->level_idc;
1852 encoder->x264param.rc.i_bitrate = MIN (encoder->x264param.rc.i_bitrate,
1853 peer_level->bitrate);
1854 encoder->x264param.rc.i_vbv_max_bitrate =
1855 MIN (encoder->x264param.rc.i_vbv_max_bitrate, peer_level->bitrate);
1856 encoder->x264param.rc.i_vbv_buffer_size =
1857 MIN (encoder->x264param.rc.i_vbv_buffer_size, peer_level->cpb);
1858 encoder->x264param.analyse.i_mv_range =
1859 MIN (encoder->x264param.analyse.i_mv_range, peer_level->mv_range);
1861 if (peer_level->frame_only) {
1862 encoder->x264param.b_interlaced = FALSE;
1863 encoder->x264param.b_fake_interlaced = FALSE;
1867 if (GST_VIDEO_INFO_IS_INTERLACED (info)) {
1868 encoder->x264param.b_interlaced = TRUE;
1869 if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) {
1870 encoder->x264param.b_pic_struct = TRUE;
1872 if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
1873 GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST) {
1874 encoder->x264param.b_tff = TRUE;
1876 encoder->x264param.b_tff = FALSE;
1879 encoder->x264param.b_interlaced = FALSE;
1882 /* Set 3D frame packing */
1883 if (encoder->frame_packing != GST_VIDEO_MULTIVIEW_MODE_NONE)
1884 encoder->x264param.i_frame_packing = encoder->frame_packing;
1886 encoder->x264param.i_frame_packing =
1887 gst_x264_enc_mview_mode_to_frame_packing (GST_VIDEO_INFO_MULTIVIEW_MODE
1890 GST_DEBUG_OBJECT (encoder, "Stereo frame packing = %d",
1891 encoder->x264param.i_frame_packing);
1893 encoder->reconfig = FALSE;
1895 GST_OBJECT_UNLOCK (encoder);
1897 encoder->x264enc = encoder->vtable->x264_encoder_open (&encoder->x264param);
1898 if (!encoder->x264enc) {
1899 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE,
1900 ("Can not initialize x264 encoder."), (NULL));
1907 GST_OBJECT_UNLOCK (encoder);
1911 /* gst_x264_enc_close_encoder
1912 * @encoder: Encoder which should close.
1914 * Close x264 encoder.
1917 gst_x264_enc_close_encoder (GstX264Enc * encoder)
1919 if (encoder->x264enc != NULL) {
1920 encoder->vtable->x264_encoder_close (encoder->x264enc);
1921 encoder->x264enc = NULL;
1923 encoder->vtable = NULL;
1927 gst_x264_enc_set_profile_and_level (GstX264Enc * encoder, GstCaps * caps)
1935 const gchar *profile;
1936 GstCaps *allowed_caps;
1938 const gchar *allowed_profile;
1941 encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal);
1942 if (header_return < 0) {
1943 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."),
1944 ("x264_encoder_headers return code=%d", header_return));
1948 /* old x264 returns SEI, SPS and PPS, newer one has SEI last */
1949 if (i_nal == 3 && nal[sps_ni].i_type != 7)
1952 sps = nal[sps_ni].p_payload + 4;
1953 /* skip NAL unit type */
1956 gst_codec_utils_h264_caps_set_level_and_profile (caps, sps, 3);
1958 /* Constrained baseline is a strict subset of baseline. If downstream
1959 * wanted baseline and we produced constrained baseline, we can just
1960 * set the profile to baseline in the caps to make negotiation happy.
1961 * Same goes for baseline as subset of main profile and main as a subset
1964 s = gst_caps_get_structure (caps, 0);
1965 profile = gst_structure_get_string (s, "profile");
1967 allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder));
1969 if (allowed_caps == NULL)
1972 if (!gst_caps_can_intersect (allowed_caps, caps)) {
1973 allowed_caps = gst_caps_make_writable (allowed_caps);
1974 allowed_caps = gst_caps_truncate (allowed_caps);
1975 s2 = gst_caps_get_structure (allowed_caps, 0);
1976 gst_structure_fixate_field_string (s2, "profile", profile);
1977 allowed_profile = gst_structure_get_string (s2, "profile");
1978 if (!strcmp (allowed_profile, "high")) {
1979 if (!strcmp (profile, "constrained-baseline")
1980 || !strcmp (profile, "baseline") || !strcmp (profile, "main")) {
1981 gst_structure_set (s, "profile", G_TYPE_STRING, "high", NULL);
1982 GST_INFO_OBJECT (encoder, "downstream requested high profile, but "
1983 "encoder will now output %s profile (which is a subset), due "
1984 "to how it's been configured", profile);
1986 } else if (!strcmp (allowed_profile, "main")) {
1987 if (!strcmp (profile, "constrained-baseline")
1988 || !strcmp (profile, "baseline")) {
1989 gst_structure_set (s, "profile", G_TYPE_STRING, "main", NULL);
1990 GST_INFO_OBJECT (encoder, "downstream requested main profile, but "
1991 "encoder will now output %s profile (which is a subset), due "
1992 "to how it's been configured", profile);
1994 } else if (!strcmp (allowed_profile, "baseline")) {
1995 if (!strcmp (profile, "constrained-baseline"))
1996 gst_structure_set (s, "profile", G_TYPE_STRING, "baseline", NULL);
1999 gst_caps_unref (allowed_caps);
2007 * Returns: Buffer with the stream headers.
2010 gst_x264_enc_header_buf (GstX264Enc * encoder)
2018 guint8 *buffer, *sps;
2020 gint sei_ni = 2, sps_ni = 0, pps_ni = 1;
2022 if (G_UNLIKELY (encoder->x264enc == NULL))
2025 /* Create avcC header. */
2028 encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal);
2029 if (header_return < 0) {
2030 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."),
2031 ("x264_encoder_headers return code=%d", header_return));
2035 /* old x264 returns SEI, SPS and PPS, newer one has SEI last */
2036 if (i_nal == 3 && nal[sps_ni].i_type != 7) {
2042 /* x264 is expected to return an SEI (some identification info),
2043 * and SPS and PPS */
2044 if (i_nal != 3 || nal[sps_ni].i_type != 7 || nal[pps_ni].i_type != 8 ||
2045 nal[sps_ni].i_payload < 4 || nal[pps_ni].i_payload < 1) {
2046 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, (NULL),
2047 ("Unexpected x264 header."));
2051 GST_MEMDUMP ("SEI", nal[sei_ni].p_payload, nal[sei_ni].i_payload);
2052 GST_MEMDUMP ("SPS", nal[sps_ni].p_payload, nal[sps_ni].i_payload);
2053 GST_MEMDUMP ("PPS", nal[pps_ni].p_payload, nal[pps_ni].i_payload);
2055 /* nal payloads with emulation_prevention_three_byte, and some header data */
2056 buffer_size = (nal[sps_ni].i_payload + nal[pps_ni].i_payload) * 4 + 100;
2057 buffer = g_malloc (buffer_size);
2059 sps = nal[sps_ni].p_payload + 4;
2060 /* skip NAL unit type */
2063 buffer[0] = 1; /* AVC Decoder Configuration Record ver. 1 */
2064 buffer[1] = sps[0]; /* profile_idc */
2065 buffer[2] = sps[1]; /* profile_compability */
2066 buffer[3] = sps[2]; /* level_idc */
2067 buffer[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */
2071 buffer[i_size++] = 0xe0 | 1; /* number of SPSs */
2073 nal_size = nal[sps_ni].i_payload - 4;
2074 memcpy (buffer + i_size + 2, nal[sps_ni].p_payload + 4, nal_size);
2076 GST_WRITE_UINT16_BE (buffer + i_size, nal_size);
2077 i_size += nal_size + 2;
2079 buffer[i_size++] = 1; /* number of PPSs */
2081 nal_size = nal[pps_ni].i_payload - 4;
2082 memcpy (buffer + i_size + 2, nal[pps_ni].p_payload + 4, nal_size);
2084 GST_WRITE_UINT16_BE (buffer + i_size, nal_size);
2085 i_size += nal_size + 2;
2087 buf = gst_buffer_new_and_alloc (i_size);
2088 gst_buffer_fill (buf, 0, buffer, i_size);
2090 GST_MEMDUMP ("header", buffer, i_size);
2096 /* gst_x264_enc_set_src_caps
2097 * Returns: TRUE on success.
2100 gst_x264_enc_set_src_caps (GstX264Enc * encoder, GstCaps * caps)
2103 GstStructure *structure;
2104 GstVideoCodecState *state;
2107 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
2108 encoder->input_state ? &encoder->input_state->info : NULL);
2110 outcaps = gst_caps_new_empty_simple ("video/x-h264");
2111 structure = gst_caps_get_structure (outcaps, 0);
2113 if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY) {
2114 if (encoder->byte_stream) {
2115 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2117 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC;
2120 if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_AVC) {
2121 GstBuffer *buf = gst_x264_enc_header_buf (encoder);
2123 gst_caps_set_simple (outcaps, "codec_data", GST_TYPE_BUFFER, buf, NULL);
2124 gst_buffer_unref (buf);
2126 gst_structure_set (structure, "stream-format", G_TYPE_STRING, "avc", NULL);
2128 gst_structure_set (structure, "stream-format", G_TYPE_STRING, "byte-stream",
2131 gst_structure_set (structure, "alignment", G_TYPE_STRING, "au", NULL);
2133 if (!gst_x264_enc_set_profile_and_level (encoder, outcaps)) {
2134 gst_caps_unref (outcaps);
2138 state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder),
2139 outcaps, encoder->input_state);
2140 GST_DEBUG_OBJECT (encoder, "output caps: %" GST_PTR_FORMAT, state->caps);
2142 /* If set, local frame packing setting overrides any upstream config */
2143 switch (encoder->frame_packing) {
2145 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2146 GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD;
2149 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2150 GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED;
2153 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2154 GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED;
2157 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2158 GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE;
2161 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2162 GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM;
2165 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2166 GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME;
2172 gst_video_codec_state_unref (state);
2174 tags = gst_tag_list_new_empty ();
2175 gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "x264",
2176 GST_TAG_ENCODER_VERSION, X264_BUILD,
2177 GST_TAG_MAXIMUM_BITRATE, bitrate * 1024,
2178 GST_TAG_NOMINAL_BITRATE, bitrate * 1024, NULL);
2179 gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), tags,
2180 GST_TAG_MERGE_REPLACE);
2181 gst_tag_list_unref (tags);
2187 gst_x264_enc_set_latency (GstX264Enc * encoder)
2189 GstVideoInfo *info = &encoder->input_state->info;
2190 gint max_delayed_frames;
2191 GstClockTime latency;
2193 max_delayed_frames =
2194 encoder->vtable->x264_encoder_maximum_delayed_frames (encoder->x264enc);
2197 latency = gst_util_uint64_scale_ceil (GST_SECOND * info->fps_d,
2198 max_delayed_frames, info->fps_n);
2200 /* FIXME: Assume 25fps. This is better than reporting no latency at
2201 * all and then later failing in live pipelines
2203 latency = gst_util_uint64_scale_ceil (GST_SECOND * 1,
2204 max_delayed_frames, 25);
2207 GST_INFO_OBJECT (encoder,
2208 "Updating latency to %" GST_TIME_FORMAT " (%d frames)",
2209 GST_TIME_ARGS (latency), max_delayed_frames);
2211 gst_video_encoder_set_latency (GST_VIDEO_ENCODER (encoder), latency, latency);
2215 gst_x264_enc_set_format (GstVideoEncoder * video_enc,
2216 GstVideoCodecState * state)
2218 GstX264Enc *encoder = GST_X264_ENC (video_enc);
2219 GstVideoInfo *info = &state->info;
2220 GstCaps *template_caps;
2221 GstCaps *allowed_caps = NULL;
2223 /* If the encoder is initialized, do not reinitialize it again if not
2225 if (encoder->x264enc) {
2226 GstVideoInfo *old = &encoder->input_state->info;
2228 if (info->finfo->format == old->finfo->format
2229 && info->width == old->width && info->height == old->height
2230 && info->fps_n == old->fps_n && info->fps_d == old->fps_d
2231 && info->par_n == old->par_n && info->par_d == old->par_d) {
2232 gst_video_codec_state_unref (encoder->input_state);
2233 encoder->input_state = gst_video_codec_state_ref (state);
2237 /* clear out pending frames */
2238 gst_x264_enc_flush_frames (encoder, TRUE);
2243 if (encoder->input_state)
2244 gst_video_codec_state_unref (encoder->input_state);
2245 encoder->input_state = gst_video_codec_state_ref (state);
2247 encoder->peer_profile = NULL;
2248 encoder->peer_intra_profile = FALSE;
2249 encoder->peer_level_idc = -1;
2251 template_caps = gst_static_pad_template_get_caps (&src_factory);
2252 allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder));
2254 /* Output byte-stream if downstream has ANY caps, it's what people expect,
2255 * and it makes more sense too */
2256 if (allowed_caps == template_caps) {
2257 GST_INFO_OBJECT (encoder,
2258 "downstream has ANY caps, outputting byte-stream");
2259 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2260 g_string_append_printf (encoder->option_string, ":annexb=1");
2261 gst_caps_unref (allowed_caps);
2262 } else if (allowed_caps) {
2264 const gchar *profile;
2266 const gchar *stream_format;
2268 if (gst_caps_is_empty (allowed_caps)) {
2269 gst_caps_unref (allowed_caps);
2270 gst_caps_unref (template_caps);
2274 allowed_caps = gst_caps_make_writable (allowed_caps);
2275 allowed_caps = gst_caps_fixate (allowed_caps);
2276 s = gst_caps_get_structure (allowed_caps, 0);
2278 profile = gst_structure_get_string (s, "profile");
2280 /* FIXME - if libx264 ever adds support for FMO, ASO or redundant slices
2281 * make sure constrained profile has a separate case which disables
2283 if (g_str_has_suffix (profile, "-intra")) {
2284 encoder->peer_intra_profile = TRUE;
2286 if (!strcmp (profile, "constrained-baseline") ||
2287 !strcmp (profile, "baseline")) {
2288 encoder->peer_profile = "baseline";
2289 } else if (g_str_has_prefix (profile, "high-10")) {
2290 encoder->peer_profile = "high10";
2291 } else if (g_str_has_prefix (profile, "high-4:2:2")) {
2292 encoder->peer_profile = "high422";
2293 } else if (g_str_has_prefix (profile, "high-4:4:4")) {
2294 encoder->peer_profile = "high444";
2295 } else if (g_str_has_prefix (profile, "high")) {
2296 encoder->peer_profile = "high";
2297 } else if (!strcmp (profile, "main")) {
2298 encoder->peer_profile = "main";
2300 g_assert_not_reached ();
2304 level = gst_structure_get_string (s, "level");
2306 encoder->peer_level_idc = gst_codec_utils_h264_get_level_idc (level);
2309 stream_format = gst_structure_get_string (s, "stream-format");
2310 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY;
2311 if (stream_format) {
2312 if (!strcmp (stream_format, "avc")) {
2313 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC;
2314 g_string_append_printf (encoder->option_string, ":annexb=0");
2315 } else if (!strcmp (stream_format, "byte-stream")) {
2316 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2317 g_string_append_printf (encoder->option_string, ":annexb=1");
2319 /* means we have both in caps and _FROM_PROPERTY should be the option */
2323 gst_caps_unref (allowed_caps);
2326 gst_caps_unref (template_caps);
2328 if (!gst_x264_enc_init_encoder (encoder))
2331 if (!gst_x264_enc_set_src_caps (encoder, state->caps)) {
2332 gst_x264_enc_close_encoder (encoder);
2336 gst_x264_enc_set_latency (encoder);
2341 static GstFlowReturn
2342 gst_x264_enc_finish (GstVideoEncoder * encoder)
2344 gst_x264_enc_flush_frames (GST_X264_ENC (encoder), TRUE);
2349 gst_x264_enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query)
2351 GstX264Enc *self = GST_X264_ENC (encoder);
2355 gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
2357 if (!self->input_state)
2360 if (self->vtable == NULL)
2363 info = &self->input_state->info;
2365 self->vtable->x264_encoder_maximum_delayed_frames (self->x264enc) + 1;
2367 gst_query_add_allocation_pool (query, NULL, info->size, num_buffers, 0);
2369 return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (encoder,
2374 gst_x264_enc_add_cc (GstBuffer * buffer, x264_picture_t * pic_in)
2376 GstVideoCaptionMeta *cc_meta;
2377 gpointer iter = NULL;
2380 (GstVideoCaptionMeta *) gst_buffer_iterate_meta_filtered (buffer,
2381 &iter, GST_VIDEO_CAPTION_META_API_TYPE))) {
2382 guint i = pic_in->extra_sei.num_payloads;
2384 if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW)
2387 pic_in->extra_sei.num_payloads += 1;
2389 if (!pic_in->extra_sei.payloads)
2390 pic_in->extra_sei.payloads = g_new0 (x264_sei_payload_t, 1);
2392 pic_in->extra_sei.payloads =
2393 g_renew (x264_sei_payload_t, pic_in->extra_sei.payloads,
2394 pic_in->extra_sei.num_payloads);
2396 pic_in->extra_sei.sei_free = g_free;
2398 pic_in->extra_sei.payloads[i].payload_size = cc_meta->size + 11;
2399 pic_in->extra_sei.payloads[i].payload =
2400 g_malloc0 (pic_in->extra_sei.payloads[i].payload_size);
2401 pic_in->extra_sei.payloads[i].payload_type = 4; /* Registered user data */
2402 memcpy (pic_in->extra_sei.payloads[i].payload + 10, cc_meta->data,
2404 pic_in->extra_sei.payloads[i].payload[0] = 181; /* 8-bits itu_t_t35_country_code */
2405 pic_in->extra_sei.payloads[i].payload[1] = 0; /* 16-bits itu_t_t35_provider_code */
2406 pic_in->extra_sei.payloads[i].payload[2] = 49;
2407 pic_in->extra_sei.payloads[i].payload[3] = 'G'; /* 32-bits ATSC_user_identifier */
2408 pic_in->extra_sei.payloads[i].payload[4] = 'A';
2409 pic_in->extra_sei.payloads[i].payload[5] = '9';
2410 pic_in->extra_sei.payloads[i].payload[6] = '4';
2411 pic_in->extra_sei.payloads[i].payload[7] = 3; /* 8-bits ATSC1_data_user_data_type_code */
2413 * 1 bit process_em_data_flag (0)
2414 * 1 bit process_cc_data_flag (1)
2415 * 1 bit additional_data_flag (0)
2418 pic_in->extra_sei.payloads[i].payload[8] =
2419 ((cc_meta->size / 3) & 0x1f) | 0x40;
2420 pic_in->extra_sei.payloads[i].payload[9] = 255; /* 8 bits em_data, unused */
2421 pic_in->extra_sei.payloads[i].payload[cc_meta->size + 10] = 255; /* 8 marker bits */
2426 * this function does the actual processing
2428 static GstFlowReturn
2429 gst_x264_enc_handle_frame (GstVideoEncoder * video_enc,
2430 GstVideoCodecFrame * frame)
2432 GstX264Enc *encoder = GST_X264_ENC (video_enc);
2433 GstVideoInfo *info = &encoder->input_state->info;
2435 x264_picture_t pic_in;
2438 gint nplanes = encoder->x264_nplanes;
2440 if (G_UNLIKELY (encoder->x264enc == NULL))
2443 /* create x264_picture_t from the buffer */
2444 /* mostly taken from mplayer (file ve_x264.c) */
2446 /* set up input picture */
2447 memset (&pic_in, 0, sizeof (pic_in));
2449 fdata = gst_x264_enc_queue_frame (encoder, frame, info);
2453 pic_in.img.i_csp = encoder->x264param.i_csp;
2454 pic_in.img.i_plane = nplanes;
2455 for (i = 0; i < nplanes; i++) {
2456 pic_in.img.plane[i] = GST_VIDEO_FRAME_COMP_DATA (&fdata->vframe, i);
2457 pic_in.img.i_stride[i] = GST_VIDEO_FRAME_COMP_STRIDE (&fdata->vframe, i);
2460 pic_in.i_type = X264_TYPE_AUTO;
2461 pic_in.i_pts = frame->pts;
2462 pic_in.opaque = GINT_TO_POINTER (frame->system_frame_number);
2464 if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) {
2465 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_INTERLACED) == 0) {
2466 pic_in.i_pic_struct = PIC_STRUCT_PROGRESSIVE;
2467 } else if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_RFF) != 0) {
2468 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) {
2469 pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM_TOP;
2471 pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP_BOTTOM;
2474 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) {
2475 pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM;
2477 pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP;
2482 gst_x264_enc_add_cc (frame->input_buffer, &pic_in);
2484 ret = gst_x264_enc_encode_frame (encoder, &pic_in, frame, &i_nal, TRUE);
2486 /* input buffer is released later on */
2492 GST_WARNING_OBJECT (encoder, "Got buffer before set_caps was called");
2493 return GST_FLOW_NOT_NEGOTIATED;
2497 GST_ERROR_OBJECT (encoder, "Failed to map frame");
2498 return GST_FLOW_ERROR;
2502 static GstFlowReturn
2503 gst_x264_enc_encode_frame (GstX264Enc * encoder, x264_picture_t * pic_in,
2504 GstVideoCodecFrame * input_frame, int *i_nal, gboolean send)
2506 GstVideoCodecFrame *frame = NULL;
2507 GstBuffer *out_buf = NULL;
2508 x264_picture_t pic_out;
2512 GstFlowReturn ret = GST_FLOW_OK;
2514 gboolean update_latency = FALSE;
2516 if (G_UNLIKELY (encoder->x264enc == NULL)) {
2518 gst_video_codec_frame_unref (input_frame);
2519 return GST_FLOW_NOT_NEGOTIATED;
2522 GST_OBJECT_LOCK (encoder);
2523 if (encoder->reconfig) {
2524 encoder->reconfig = FALSE;
2525 if (encoder->vtable->x264_encoder_reconfig (encoder->x264enc,
2526 &encoder->x264param) < 0)
2527 GST_WARNING_OBJECT (encoder, "Could not reconfigure");
2528 update_latency = TRUE;
2531 if (pic_in && input_frame) {
2532 if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (input_frame)) {
2533 GST_INFO_OBJECT (encoder, "Forcing key frame");
2534 if (encoder->intra_refresh)
2535 encoder->vtable->x264_encoder_intra_refresh (encoder->x264enc);
2537 pic_in->i_type = X264_TYPE_IDR;
2540 GST_OBJECT_UNLOCK (encoder);
2542 if (G_UNLIKELY (update_latency))
2543 gst_x264_enc_set_latency (encoder);
2545 encoder_return = encoder->vtable->x264_encoder_encode (encoder->x264enc,
2546 &nal, i_nal, pic_in, &pic_out);
2548 if (encoder_return < 0) {
2549 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 frame failed."),
2550 ("x264_encoder_encode return code=%d", encoder_return));
2551 ret = GST_FLOW_ERROR;
2552 /* Make sure we finish this frame */
2553 frame = input_frame;
2557 /* Input frame is now queued */
2559 gst_video_codec_frame_unref (input_frame);
2566 i_size = encoder_return;
2567 data = nal[0].p_payload;
2569 frame = gst_video_encoder_get_frame (GST_VIDEO_ENCODER (encoder),
2570 GPOINTER_TO_INT (pic_out.opaque));
2571 g_assert (frame || !send);
2573 if (!send || !frame) {
2578 out_buf = gst_buffer_new_allocate (NULL, i_size, NULL);
2579 gst_buffer_fill (out_buf, 0, data, i_size);
2580 frame->output_buffer = out_buf;
2582 GST_LOG_OBJECT (encoder,
2583 "output: dts %" G_GINT64_FORMAT " pts %" G_GINT64_FORMAT,
2584 (gint64) pic_out.i_dts, (gint64) pic_out.i_pts);
2586 /* we want to know if x264 is messing around with this */
2587 g_assert (frame->pts == pic_out.i_pts);
2589 frame->dts = pic_out.i_dts;
2590 frame->pts = pic_out.i_pts;
2592 if (pic_out.b_keyframe) {
2593 GST_DEBUG_OBJECT (encoder, "Output keyframe");
2594 GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
2599 gst_x264_enc_dequeue_frame (encoder, frame);
2600 ret = gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (encoder), frame);
2607 gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send)
2609 GstFlowReturn flow_ret;
2612 /* first send the remaining frames */
2613 if (encoder->x264enc)
2615 flow_ret = gst_x264_enc_encode_frame (encoder, NULL, NULL, &i_nal, send);
2616 } while (flow_ret == GST_FLOW_OK
2617 && encoder->vtable->x264_encoder_delayed_frames (encoder->x264enc) > 0);
2621 gst_x264_enc_reconfig (GstX264Enc * encoder)
2625 if (!encoder->vtable)
2629 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
2630 encoder->input_state ? &encoder->input_state->info : NULL);
2631 switch (encoder->pass) {
2632 case GST_X264_ENC_PASS_QUAL:
2633 encoder->x264param.rc.f_rf_constant = encoder->quantizer;
2634 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
2635 encoder->x264param.rc.i_vbv_buffer_size
2636 = encoder->x264param.rc.i_vbv_max_bitrate
2637 * encoder->vbv_buf_capacity / 1000;
2639 case GST_X264_ENC_PASS_CBR:
2640 case GST_X264_ENC_PASS_PASS1:
2641 case GST_X264_ENC_PASS_PASS2:
2642 case GST_X264_ENC_PASS_PASS3:
2644 encoder->x264param.rc.i_bitrate = bitrate;
2645 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
2646 encoder->x264param.rc.i_vbv_buffer_size
2647 = encoder->x264param.rc.i_vbv_max_bitrate
2648 * encoder->vbv_buf_capacity / 1000;
2652 encoder->reconfig = TRUE;
2656 gst_x264_enc_set_property (GObject * object, guint prop_id,
2657 const GValue * value, GParamSpec * pspec)
2659 GstX264Enc *encoder;
2662 const gchar *partitions = NULL;
2664 encoder = GST_X264_ENC (object);
2666 GST_OBJECT_LOCK (encoder);
2667 /* state at least matters for sps, bytestream, pass,
2668 * and so by extension ... */
2670 state = GST_STATE (encoder);
2671 if ((state != GST_STATE_READY && state != GST_STATE_NULL) &&
2672 !(pspec->flags & GST_PARAM_MUTABLE_PLAYING))
2677 encoder->pass = g_value_get_enum (value);
2680 encoder->quantizer = g_value_get_uint (value);
2681 gst_x264_enc_reconfig (encoder);
2684 gst_encoder_bitrate_profile_manager_set_bitrate (encoder->bitrate_manager,
2685 g_value_get_uint (value));
2686 gst_x264_enc_reconfig (encoder);
2688 case ARG_VBV_BUF_CAPACITY:
2689 encoder->vbv_buf_capacity = g_value_get_uint (value);
2690 gst_x264_enc_reconfig (encoder);
2692 case ARG_SPEED_PRESET:
2693 encoder->speed_preset = g_value_get_enum (value);
2696 encoder->psy_tune = g_value_get_enum (value);
2699 encoder->tune = g_value_get_flags (value);
2701 case ARG_OPTION_STRING:
2702 g_string_assign (encoder->option_string_prop, g_value_get_string (value));
2705 encoder->threads = g_value_get_uint (value);
2706 g_string_append_printf (encoder->option_string, ":threads=%d",
2709 case ARG_SLICED_THREADS:
2710 encoder->sliced_threads = g_value_get_boolean (value);
2711 g_string_append_printf (encoder->option_string, ":sliced-threads=%d",
2712 encoder->sliced_threads);
2714 case ARG_SYNC_LOOKAHEAD:
2715 encoder->sync_lookahead = g_value_get_int (value);
2716 g_string_append_printf (encoder->option_string, ":sync-lookahead=%d",
2717 encoder->sync_lookahead);
2719 case ARG_MULTIPASS_CACHE_FILE:
2720 g_free (encoder->mp_cache_file);
2721 encoder->mp_cache_file = g_value_dup_string (value);
2722 g_string_append_printf (encoder->option_string, ":stats=%s",
2723 encoder->mp_cache_file);
2725 case ARG_BYTE_STREAM:
2726 encoder->byte_stream = g_value_get_boolean (value);
2727 g_string_append_printf (encoder->option_string, ":annexb=%d",
2728 encoder->byte_stream);
2730 case ARG_INTRA_REFRESH:
2731 encoder->intra_refresh = g_value_get_boolean (value);
2732 g_string_append_printf (encoder->option_string, ":intra-refresh=%d",
2733 encoder->intra_refresh);
2736 encoder->me = g_value_get_enum (value);
2737 g_string_append_printf (encoder->option_string, ":me=%s",
2738 x264_motion_est_names[encoder->me]);
2741 encoder->subme = g_value_get_uint (value);
2742 g_string_append_printf (encoder->option_string, ":subme=%d",
2746 encoder->analyse = g_value_get_flags (value);
2747 partitions = gst_x264_enc_build_partitions (encoder->analyse);
2749 g_string_append_printf (encoder->option_string, ":partitions=%s",
2751 g_free ((gpointer) partitions);
2755 encoder->dct8x8 = g_value_get_boolean (value);
2756 g_string_append_printf (encoder->option_string, ":8x8dct=%d",
2760 encoder->ref = g_value_get_uint (value);
2761 g_string_append_printf (encoder->option_string, ":ref=%d", encoder->ref);
2764 encoder->bframes = g_value_get_uint (value);
2765 g_string_append_printf (encoder->option_string, ":bframes=%d",
2769 encoder->b_adapt = g_value_get_boolean (value);
2770 g_string_append_printf (encoder->option_string, ":b-adapt=%d",
2774 encoder->b_pyramid = g_value_get_boolean (value);
2775 g_string_append_printf (encoder->option_string, ":b-pyramid=%s",
2776 x264_b_pyramid_names[encoder->b_pyramid]);
2779 encoder->weightb = g_value_get_boolean (value);
2780 g_string_append_printf (encoder->option_string, ":weightb=%d",
2784 encoder->sps_id = g_value_get_uint (value);
2785 g_string_append_printf (encoder->option_string, ":sps-id=%d",
2789 encoder->au_nalu = g_value_get_boolean (value);
2790 g_string_append_printf (encoder->option_string, ":aud=%d",
2794 encoder->trellis = g_value_get_boolean (value);
2795 g_string_append_printf (encoder->option_string, ":trellis=%d",
2798 case ARG_KEYINT_MAX:
2799 encoder->keyint_max = g_value_get_uint (value);
2800 g_string_append_printf (encoder->option_string, ":keyint=%d",
2801 encoder->keyint_max);
2804 encoder->cabac = g_value_get_boolean (value);
2805 g_string_append_printf (encoder->option_string, ":cabac=%d",
2809 encoder->qp_min = g_value_get_uint (value);
2810 g_string_append_printf (encoder->option_string, ":qpmin=%d",
2814 encoder->qp_max = g_value_get_uint (value);
2815 g_string_append_printf (encoder->option_string, ":qpmax=%d",
2819 encoder->qp_step = g_value_get_uint (value);
2820 g_string_append_printf (encoder->option_string, ":qpstep=%d",
2824 encoder->ip_factor = g_value_get_float (value);
2825 g_string_append_printf (encoder->option_string, ":ip-factor=%f",
2826 encoder->ip_factor);
2829 encoder->pb_factor = g_value_get_float (value);
2830 g_string_append_printf (encoder->option_string, ":pb-factor=%f",
2831 encoder->pb_factor);
2833 case ARG_RC_MB_TREE:
2834 encoder->mb_tree = g_value_get_boolean (value);
2835 g_string_append_printf (encoder->option_string, ":mbtree=%d",
2838 case ARG_RC_LOOKAHEAD:
2839 encoder->rc_lookahead = g_value_get_int (value);
2840 g_string_append_printf (encoder->option_string, ":rc-lookahead=%d",
2841 encoder->rc_lookahead);
2844 encoder->noise_reduction = g_value_get_uint (value);
2845 g_string_append_printf (encoder->option_string, ":nr=%d",
2846 encoder->noise_reduction);
2848 case ARG_INTERLACED:
2849 encoder->interlaced = g_value_get_boolean (value);
2851 case ARG_FRAME_PACKING:
2852 encoder->frame_packing = g_value_get_enum (value);
2854 case ARG_INSERT_VUI:
2855 encoder->insert_vui = g_value_get_boolean (value);
2858 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2861 GST_OBJECT_UNLOCK (encoder);
2867 GST_WARNING_OBJECT (encoder, "setting property in wrong state");
2868 GST_OBJECT_UNLOCK (encoder);
2873 gst_x264_enc_get_property (GObject * object, guint prop_id,
2874 GValue * value, GParamSpec * pspec)
2876 GstX264Enc *encoder;
2878 encoder = GST_X264_ENC (object);
2880 GST_OBJECT_LOCK (encoder);
2883 g_value_set_uint (value, encoder->threads);
2885 case ARG_SLICED_THREADS:
2886 g_value_set_boolean (value, encoder->sliced_threads);
2888 case ARG_SYNC_LOOKAHEAD:
2889 g_value_set_int (value, encoder->sync_lookahead);
2892 g_value_set_enum (value, encoder->pass);
2895 g_value_set_uint (value, encoder->quantizer);
2897 case ARG_MULTIPASS_CACHE_FILE:
2898 g_value_set_string (value, encoder->mp_cache_file);
2900 case ARG_BYTE_STREAM:
2901 g_value_set_boolean (value, encoder->byte_stream);
2904 g_value_set_uint (value,
2905 gst_encoder_bitrate_profile_manager_get_bitrate
2906 (encoder->bitrate_manager, NULL));
2908 case ARG_INTRA_REFRESH:
2909 g_value_set_boolean (value, encoder->intra_refresh);
2911 case ARG_VBV_BUF_CAPACITY:
2912 g_value_set_uint (value, encoder->vbv_buf_capacity);
2915 g_value_set_enum (value, encoder->me);
2918 g_value_set_uint (value, encoder->subme);
2921 g_value_set_flags (value, encoder->analyse);
2924 g_value_set_boolean (value, encoder->dct8x8);
2927 g_value_set_uint (value, encoder->ref);
2930 g_value_set_uint (value, encoder->bframes);
2933 g_value_set_boolean (value, encoder->b_adapt);
2936 g_value_set_boolean (value, encoder->b_pyramid);
2939 g_value_set_boolean (value, encoder->weightb);
2942 g_value_set_uint (value, encoder->sps_id);
2945 g_value_set_boolean (value, encoder->au_nalu);
2948 g_value_set_boolean (value, encoder->trellis);
2950 case ARG_KEYINT_MAX:
2951 g_value_set_uint (value, encoder->keyint_max);
2954 g_value_set_uint (value, encoder->qp_min);
2957 g_value_set_uint (value, encoder->qp_max);
2960 g_value_set_uint (value, encoder->qp_step);
2963 g_value_set_boolean (value, encoder->cabac);
2966 g_value_set_float (value, encoder->ip_factor);
2969 g_value_set_float (value, encoder->pb_factor);
2971 case ARG_RC_MB_TREE:
2972 g_value_set_boolean (value, encoder->mb_tree);
2974 case ARG_RC_LOOKAHEAD:
2975 g_value_set_int (value, encoder->rc_lookahead);
2978 g_value_set_uint (value, encoder->noise_reduction);
2980 case ARG_INTERLACED:
2981 g_value_set_boolean (value, encoder->interlaced);
2983 case ARG_SPEED_PRESET:
2984 g_value_set_enum (value, encoder->speed_preset);
2987 g_value_set_enum (value, encoder->psy_tune);
2990 g_value_set_flags (value, encoder->tune);
2992 case ARG_OPTION_STRING:
2993 g_value_set_string (value, encoder->option_string_prop->str);
2995 case ARG_FRAME_PACKING:
2996 g_value_set_enum (value, encoder->frame_packing);
2998 case ARG_INSERT_VUI:
2999 g_value_set_boolean (value, encoder->insert_vui);
3002 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3005 GST_OBJECT_UNLOCK (encoder);
3009 x264_element_init (GstPlugin * plugin)
3011 GST_DEBUG_CATEGORY_INIT (x264_enc_debug, "x264enc", 0,
3012 "h264 encoding element");
3014 GST_INFO ("linked against x264 build: %u", X264_BUILD);
3016 /* Initialize the static GstX264EncVTable which is overridden in load_x264()
3017 * if needed. We can't initialize statically because these values are not
3018 * constant on Windows. */
3019 default_vtable.module = NULL;
3020 #if X264_BUILD < 153
3021 default_vtable.x264_bit_depth = &x264_bit_depth;
3023 default_vtable.x264_chroma_format = &x264_chroma_format;
3024 default_vtable.x264_encoder_close = x264_encoder_close;
3025 default_vtable.x264_encoder_delayed_frames = x264_encoder_delayed_frames;
3026 default_vtable.x264_encoder_encode = x264_encoder_encode;
3027 default_vtable.x264_encoder_headers = x264_encoder_headers;
3028 default_vtable.x264_encoder_intra_refresh = x264_encoder_intra_refresh;
3029 default_vtable.x264_encoder_maximum_delayed_frames =
3030 x264_encoder_maximum_delayed_frames;
3031 default_vtable.x264_encoder_open = x264_encoder_open;
3032 default_vtable.x264_encoder_reconfig = x264_encoder_reconfig;
3033 default_vtable.x264_levels = &x264_levels;
3034 default_vtable.x264_param_apply_fastfirstpass =
3035 x264_param_apply_fastfirstpass;
3036 default_vtable.x264_param_apply_profile = x264_param_apply_profile;
3037 default_vtable.x264_param_default_preset = x264_param_default_preset;
3038 default_vtable.x264_param_parse = x264_param_parse;
3040 if (!load_x264_libraries ())
3043 return gst_element_register (plugin, "x264enc",
3044 GST_RANK_PRIMARY, GST_TYPE_X264_ENC);
3048 plugin_init (GstPlugin * plugin)
3050 return GST_ELEMENT_REGISTER (x264enc, plugin);
3053 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
3056 "libx264-based H264 plugins",
3057 plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)