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 H.264 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 "x264 H.264 Encoder", "Codec/Encoder/Video",
1203 "libx264-based H.264 video encoder",
1204 "Josef Zlomek <josef.zlomek@itonis.tv>, "
1205 "Mark Nauwelaerts <mnauw@users.sf.net>");
1207 supported_sinkcaps = gst_caps_new_simple ("video/x-raw",
1208 "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
1209 "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
1210 "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
1212 gst_x264_enc_add_x264_chroma_format (gst_caps_get_structure
1213 (supported_sinkcaps, 0), TRUE, TRUE, TRUE, TRUE);
1215 sink_templ = gst_pad_template_new ("sink",
1216 GST_PAD_SINK, GST_PAD_ALWAYS, supported_sinkcaps);
1218 gst_caps_unref (supported_sinkcaps);
1220 gst_element_class_add_pad_template (element_class, sink_templ);
1221 gst_element_class_add_static_pad_template (element_class, &src_factory);
1223 gst_type_mark_as_plugin_api (GST_X264_ENC_ANALYSE_TYPE, 0);
1224 gst_type_mark_as_plugin_api (GST_X264_ENC_FRAME_PACKING_TYPE, 0);
1225 gst_type_mark_as_plugin_api (GST_X264_ENC_ME_TYPE, 0);
1226 gst_type_mark_as_plugin_api (GST_X264_ENC_PASS_TYPE, 0);
1227 gst_type_mark_as_plugin_api (GST_X264_ENC_PSY_TUNE_TYPE, 0);
1228 gst_type_mark_as_plugin_api (GST_X264_ENC_SPEED_PRESET_TYPE, 0);
1229 gst_type_mark_as_plugin_api (GST_X264_ENC_TUNE_TYPE, 0);
1233 G_GNUC_PRINTF (3, 0)
1237 gst_x264_enc_log_callback (gpointer private, gint level, const char *format,
1240 #ifndef GST_DISABLE_GST_DEBUG
1241 GstDebugLevel gst_level;
1242 GObject *object = (GObject *) private;
1247 gst_level = GST_LEVEL_NONE;
1249 case X264_LOG_ERROR:
1250 gst_level = GST_LEVEL_ERROR;
1252 case X264_LOG_WARNING:
1253 gst_level = GST_LEVEL_WARNING;
1256 gst_level = GST_LEVEL_INFO;
1259 /* push x264enc debug down to our lower levels to avoid some clutter */
1260 gst_level = GST_LEVEL_LOG;
1264 if (G_LIKELY (gst_level > _gst_debug_min))
1267 if (G_LIKELY (gst_level > gst_debug_category_get_threshold (GST_CAT_DEFAULT)))
1270 formatted = g_strdup_vprintf (format, args);
1271 g_strchomp (formatted);
1273 GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, gst_level, object, "%s", formatted);
1276 #endif /* GST_DISABLE_GST_DEBUG */
1279 /* initialize the new element
1280 * instantiate pads and add them to element
1282 * initialize structure
1285 gst_x264_enc_init (GstX264Enc * encoder)
1288 encoder->threads = ARG_THREADS_DEFAULT;
1289 encoder->sliced_threads = ARG_SLICED_THREADS_DEFAULT;
1290 encoder->sync_lookahead = ARG_SYNC_LOOKAHEAD_DEFAULT;
1291 encoder->pass = ARG_PASS_DEFAULT;
1292 encoder->quantizer = ARG_QUANTIZER_DEFAULT;
1293 encoder->mp_cache_file = g_strdup (ARG_MULTIPASS_CACHE_FILE_DEFAULT);
1294 encoder->byte_stream = ARG_BYTE_STREAM_DEFAULT;
1295 encoder->intra_refresh = ARG_INTRA_REFRESH_DEFAULT;
1296 encoder->vbv_buf_capacity = ARG_VBV_BUF_CAPACITY_DEFAULT;
1297 encoder->me = ARG_ME_DEFAULT;
1298 encoder->subme = ARG_SUBME_DEFAULT;
1299 encoder->analyse = ARG_ANALYSE_DEFAULT;
1300 encoder->dct8x8 = ARG_DCT8x8_DEFAULT;
1301 encoder->ref = ARG_REF_DEFAULT;
1302 encoder->bframes = ARG_BFRAMES_DEFAULT;
1303 encoder->b_adapt = ARG_B_ADAPT_DEFAULT;
1304 encoder->b_pyramid = ARG_B_PYRAMID_DEFAULT;
1305 encoder->weightb = ARG_WEIGHTB_DEFAULT;
1306 encoder->sps_id = ARG_SPS_ID_DEFAULT;
1307 encoder->au_nalu = ARG_AU_NALU_DEFAULT;
1308 encoder->trellis = ARG_TRELLIS_DEFAULT;
1309 encoder->keyint_max = ARG_KEYINT_MAX_DEFAULT;
1310 encoder->cabac = ARG_CABAC_DEFAULT;
1311 encoder->qp_min = ARG_QP_MIN_DEFAULT;
1312 encoder->qp_max = ARG_QP_MAX_DEFAULT;
1313 encoder->qp_step = ARG_QP_STEP_DEFAULT;
1314 encoder->ip_factor = ARG_IP_FACTOR_DEFAULT;
1315 encoder->pb_factor = ARG_PB_FACTOR_DEFAULT;
1316 encoder->mb_tree = ARG_RC_MB_TREE_DEFAULT;
1317 encoder->rc_lookahead = ARG_RC_LOOKAHEAD_DEFAULT;
1318 encoder->noise_reduction = ARG_NR_DEFAULT;
1319 encoder->interlaced = ARG_INTERLACED_DEFAULT;
1320 encoder->option_string = g_string_new (NULL);
1321 encoder->option_string_prop = g_string_new (ARG_OPTION_STRING_DEFAULT);
1322 encoder->speed_preset = ARG_SPEED_PRESET_DEFAULT;
1323 encoder->psy_tune = ARG_PSY_TUNE_DEFAULT;
1324 encoder->tune = ARG_TUNE_DEFAULT;
1325 encoder->frame_packing = ARG_FRAME_PACKING_DEFAULT;
1326 encoder->insert_vui = ARG_INSERT_VUI_DEFAULT;
1328 encoder->bitrate_manager =
1329 gst_encoder_bitrate_profile_manager_new (ARG_BITRATE_DEFAULT);
1334 GstVideoCodecFrame *frame;
1335 GstVideoFrame vframe;
1339 gst_x264_enc_queue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame,
1340 GstVideoInfo * info)
1342 GstVideoFrame vframe;
1345 if (!gst_video_frame_map (&vframe, info, frame->input_buffer, GST_MAP_READ))
1348 fdata = g_slice_new (FrameData);
1349 fdata->frame = gst_video_codec_frame_ref (frame);
1350 fdata->vframe = vframe;
1352 enc->pending_frames = g_list_prepend (enc->pending_frames, fdata);
1358 gst_x264_enc_dequeue_frame (GstX264Enc * enc, GstVideoCodecFrame * frame)
1362 for (l = enc->pending_frames; l; l = l->next) {
1363 FrameData *fdata = l->data;
1365 if (fdata->frame != frame)
1368 gst_video_frame_unmap (&fdata->vframe);
1369 gst_video_codec_frame_unref (fdata->frame);
1370 g_slice_free (FrameData, fdata);
1372 enc->pending_frames = g_list_delete_link (enc->pending_frames, l);
1378 gst_x264_enc_dequeue_all_frames (GstX264Enc * enc)
1382 for (l = enc->pending_frames; l; l = l->next) {
1383 FrameData *fdata = l->data;
1385 gst_video_frame_unmap (&fdata->vframe);
1386 gst_video_codec_frame_unref (fdata->frame);
1387 g_slice_free (FrameData, fdata);
1389 g_list_free (enc->pending_frames);
1390 enc->pending_frames = NULL;
1394 gst_x264_enc_start (GstVideoEncoder * encoder)
1396 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1398 x264enc->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY;
1400 /* make sure that we have enough time for first DTS,
1401 this is probably overkill for most streams */
1402 gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000);
1408 gst_x264_enc_stop (GstVideoEncoder * encoder)
1410 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1412 gst_x264_enc_flush_frames (x264enc, FALSE);
1413 gst_x264_enc_close_encoder (x264enc);
1414 gst_x264_enc_dequeue_all_frames (x264enc);
1416 if (x264enc->input_state)
1417 gst_video_codec_state_unref (x264enc->input_state);
1418 x264enc->input_state = NULL;
1425 gst_x264_enc_flush (GstVideoEncoder * encoder)
1427 GstX264Enc *x264enc = GST_X264_ENC (encoder);
1429 gst_x264_enc_flush_frames (x264enc, FALSE);
1430 gst_x264_enc_close_encoder (x264enc);
1431 gst_x264_enc_dequeue_all_frames (x264enc);
1433 gst_x264_enc_init_encoder (x264enc);
1439 gst_x264_enc_finalize (GObject * object)
1441 GstX264Enc *encoder = GST_X264_ENC (object);
1443 if (encoder->input_state)
1444 gst_video_codec_state_unref (encoder->input_state);
1445 encoder->input_state = NULL;
1447 #define FREE_STRING(ptr) \
1449 g_string_free (ptr, TRUE);
1451 FREE_STRING (encoder->tunings);
1452 FREE_STRING (encoder->option_string);
1453 FREE_STRING (encoder->option_string_prop);
1454 gst_encoder_bitrate_profile_manager_free (encoder->bitrate_manager);
1458 g_free (encoder->mp_cache_file);
1459 encoder->mp_cache_file = NULL;
1461 gst_x264_enc_close_encoder (encoder);
1463 G_OBJECT_CLASS (parent_class)->finalize (object);
1467 * gst_x264_enc_parse_options
1468 * @encoder: Encoder to which options are assigned
1469 * @str: Option string
1471 * Parse option string and assign to x264 parameters
1475 gst_x264_enc_parse_options (GstX264Enc * encoder, const gchar * str)
1479 gint parse_result = 0, ret = 0;
1480 gchar *options = (gchar *) str;
1482 while (*options == ':')
1485 kvpairs = g_strsplit (options, ":", 0);
1486 npairs = g_strv_length (kvpairs);
1488 for (i = 0; i < npairs; i++) {
1489 GStrv key_val = g_strsplit (kvpairs[i], "=", 2);
1492 encoder->vtable->x264_param_parse (&encoder->x264param, key_val[0],
1495 if (parse_result == X264_PARAM_BAD_NAME) {
1496 GST_ERROR_OBJECT (encoder, "Bad name for option %s=%s",
1497 key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : "");
1499 if (parse_result == X264_PARAM_BAD_VALUE) {
1500 GST_ERROR_OBJECT (encoder,
1501 "Bad value for option %s=%s (Note: a NULL value for a non-boolean triggers this)",
1502 key_val[0] ? key_val[0] : "", key_val[1] ? key_val[1] : "");
1505 g_strfreev (key_val);
1511 g_strfreev (kvpairs);
1516 gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes)
1519 case GST_VIDEO_FORMAT_I420:
1520 case GST_VIDEO_FORMAT_YV12:
1523 return X264_CSP_I420;
1524 case GST_VIDEO_FORMAT_I420_10BE:
1525 case GST_VIDEO_FORMAT_I420_10LE:
1528 return X264_CSP_I420 | X264_CSP_HIGH_DEPTH;
1529 case GST_VIDEO_FORMAT_Y42B:
1532 return X264_CSP_I422;
1533 case GST_VIDEO_FORMAT_I422_10BE:
1534 case GST_VIDEO_FORMAT_I422_10LE:
1537 return X264_CSP_I422 | X264_CSP_HIGH_DEPTH;
1538 case GST_VIDEO_FORMAT_Y444:
1541 return X264_CSP_I444;
1542 case GST_VIDEO_FORMAT_Y444_10BE:
1543 case GST_VIDEO_FORMAT_Y444_10LE:
1546 return X264_CSP_I444 | X264_CSP_HIGH_DEPTH;
1547 case GST_VIDEO_FORMAT_NV12:
1550 return X264_CSP_NV12;
1552 g_return_val_if_reached (GST_VIDEO_FORMAT_UNKNOWN);
1557 * gst_x264_enc_init_encoder
1558 * @encoder: Encoder which should be initialized.
1560 * Initialize x264 encoder.
1564 gst_x264_enc_init_encoder (GstX264Enc * encoder)
1570 if (!encoder->input_state) {
1571 GST_DEBUG_OBJECT (encoder, "Have no input state yet");
1575 info = &encoder->input_state->info;
1577 /* make sure that the encoder is closed */
1578 gst_x264_enc_close_encoder (encoder);
1580 GST_OBJECT_LOCK (encoder);
1582 if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 8)
1583 encoder->vtable = vtable_8bit;
1584 else if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 10)
1585 encoder->vtable = vtable_10bit;
1587 g_assert (encoder->vtable != NULL);
1589 gst_x264_enc_build_tunings_string (encoder);
1591 /* set x264 parameters and use preset/tuning if present */
1592 GST_DEBUG_OBJECT (encoder, "Applying defaults with preset %s, tunings %s",
1593 encoder->speed_preset ? x264_preset_names[encoder->speed_preset - 1] : "",
1594 encoder->tunings && encoder->tunings->len ? encoder->tunings->str : "");
1595 encoder->vtable->x264_param_default_preset (&encoder->x264param,
1596 encoder->speed_preset ? x264_preset_names[encoder->speed_preset -
1597 1] : NULL, encoder->tunings
1598 && encoder->tunings->len ? encoder->tunings->str : NULL);
1600 /* log callback setup; part of parameters
1601 * this needs to be done again after every *param_default* () call */
1602 encoder->x264param.pf_log = gst_x264_enc_log_callback;
1603 encoder->x264param.p_log_private = encoder;
1604 encoder->x264param.i_log_level = X264_LOG_DEBUG;
1606 /* if no preset nor tuning, use property defaults */
1607 if (!encoder->speed_preset && !encoder->tunings->len) {
1608 GST_DEBUG_OBJECT (encoder, "Applying x264enc_defaults");
1609 if (x264enc_defaults->len
1610 && gst_x264_enc_parse_options (encoder,
1611 x264enc_defaults->str) == FALSE) {
1612 GST_DEBUG_OBJECT (encoder,
1613 "x264enc_defaults string contains errors. This is a bug.");
1614 goto unlock_and_return;
1617 /* When using presets we need to respect the default output format */
1618 encoder->x264param.b_aud = encoder->au_nalu;
1619 encoder->x264param.b_annexb = encoder->byte_stream;
1622 /* setup appropriate timebase for gstreamer */
1623 encoder->x264param.i_timebase_num = 1;
1624 encoder->x264param.i_timebase_den = 1000000000;
1626 /* apply option-string property */
1627 if (encoder->option_string_prop && encoder->option_string_prop->len) {
1628 GST_DEBUG_OBJECT (encoder, "Applying option-string: %s",
1629 encoder->option_string_prop->str);
1630 if (gst_x264_enc_parse_options (encoder,
1631 encoder->option_string_prop->str) == FALSE) {
1632 GST_DEBUG_OBJECT (encoder, "Your option-string contains errors.");
1633 goto unlock_and_return;
1636 /* apply user-set options */
1637 if (encoder->option_string && encoder->option_string->len) {
1638 GST_DEBUG_OBJECT (encoder, "Applying user-set options: %s",
1639 encoder->option_string->str);
1640 if (gst_x264_enc_parse_options (encoder,
1641 encoder->option_string->str) == FALSE) {
1642 GST_DEBUG_OBJECT (encoder, "Failed to parse internal option string. "
1643 "This could be due to use of an old libx264 version. Option string "
1644 "was: %s", encoder->option_string->str);
1648 /* set up encoder parameters */
1649 #if X264_BUILD >= 153
1650 encoder->x264param.i_bitdepth = GST_VIDEO_INFO_COMP_DEPTH (info, 0);
1652 encoder->x264param.i_csp =
1653 gst_x264_enc_gst_to_x264_video_format (info->finfo->format,
1654 &encoder->x264_nplanes);
1655 if (info->fps_d == 0 || info->fps_n == 0) {
1656 /* No FPS so must use VFR
1657 * This raises latency apparently see http://mewiki.project357.com/wiki/X264_Encoding_Suggestions */
1658 encoder->x264param.b_vfr_input = TRUE;
1659 if (encoder->keyint_max) { /* NB the default is 250 setup by x264 itself */
1660 encoder->x264param.i_keyint_max = encoder->keyint_max;
1663 /* FPS available so set it up */
1664 encoder->x264param.b_vfr_input = FALSE;
1665 encoder->x264param.i_fps_num = info->fps_n;
1666 encoder->x264param.i_fps_den = info->fps_d;
1667 encoder->x264param.i_keyint_max =
1668 encoder->keyint_max ? encoder->keyint_max : (10 * info->fps_n /
1671 encoder->x264param.i_width = info->width;
1672 encoder->x264param.i_height = info->height;
1673 if (info->par_d > 0) {
1674 encoder->x264param.vui.i_sar_width = info->par_n;
1675 encoder->x264param.vui.i_sar_height = info->par_d;
1678 if ((((info->height == 576) && ((info->width == 720)
1679 || (info->width == 704) || (info->width == 352)))
1680 || ((info->height == 288) && (info->width == 352)))
1681 && (info->fps_d == 1) && (info->fps_n == 25)) {
1682 encoder->x264param.vui.i_vidformat = 1; /* PAL */
1683 } else if ((((info->height == 480) && ((info->width == 720)
1684 || (info->width == 704) || (info->width == 352)))
1685 || ((info->height == 240) && (info->width == 352)))
1686 && (info->fps_d == 1001) && ((info->fps_n == 30000)
1687 || (info->fps_n == 24000))) {
1688 encoder->x264param.vui.i_vidformat = 2; /* NTSC */
1690 encoder->x264param.vui.i_vidformat = 5; /* unspecified */
1693 if (!encoder->insert_vui)
1694 goto skip_vui_parameters;
1696 encoder->x264param.vui.i_colorprim =
1697 gst_video_color_primaries_to_iso (info->colorimetry.primaries);
1699 encoder->x264param.vui.i_transfer =
1700 gst_video_transfer_function_to_iso (info->colorimetry.transfer);
1702 encoder->x264param.vui.i_colmatrix =
1703 gst_video_color_matrix_to_iso (info->colorimetry.matrix);
1705 if (info->colorimetry.range == GST_VIDEO_COLOR_RANGE_0_255) {
1706 encoder->x264param.vui.b_fullrange = 1;
1708 encoder->x264param.vui.b_fullrange = 0;
1711 switch (info->chroma_site) {
1712 case GST_VIDEO_CHROMA_SITE_MPEG2:
1713 encoder->x264param.vui.i_chroma_loc = 0;
1715 case GST_VIDEO_CHROMA_SITE_JPEG:
1716 encoder->x264param.vui.i_chroma_loc = 1;
1718 case GST_VIDEO_CHROMA_SITE_V_COSITED:
1719 encoder->x264param.vui.i_chroma_loc = 3;
1721 case GST_VIDEO_CHROMA_SITE_DV:
1722 encoder->x264param.vui.i_chroma_loc = 2;
1725 encoder->x264param.vui.i_chroma_loc = 0;
1729 skip_vui_parameters:
1731 encoder->x264param.analyse.b_psnr = 0;
1734 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
1735 encoder->input_state ? &encoder->input_state->info : NULL);
1737 /* FIXME 2.0 make configuration more sane and consistent with x264 cmdline:
1738 * + split pass property into a pass property (pass1/2/3 enum) and rc-method
1739 * + bitrate property should only be used in case of CBR method
1740 * + vbv bitrate/buffer should have separate configuration that is then
1741 * applied independently of the mode:
1742 * + either using properties (new) vbv-maxrate and (renamed) vbv-bufsize
1743 * + or dropping vbv-buf-capacity altogether and simply using option-string
1745 switch (encoder->pass) {
1746 case GST_X264_ENC_PASS_QUANT:
1747 encoder->x264param.rc.i_rc_method = X264_RC_CQP;
1748 encoder->x264param.rc.i_qp_constant = encoder->quantizer;
1750 case GST_X264_ENC_PASS_QUAL:
1751 encoder->x264param.rc.i_rc_method = X264_RC_CRF;
1752 encoder->x264param.rc.f_rf_constant = encoder->quantizer;
1753 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
1754 encoder->x264param.rc.i_vbv_buffer_size
1755 = encoder->x264param.rc.i_vbv_max_bitrate
1756 * encoder->vbv_buf_capacity / 1000;
1758 case GST_X264_ENC_PASS_CBR:
1759 case GST_X264_ENC_PASS_PASS1:
1760 case GST_X264_ENC_PASS_PASS2:
1761 case GST_X264_ENC_PASS_PASS3:
1763 encoder->x264param.rc.i_rc_method = X264_RC_ABR;
1764 encoder->x264param.rc.i_bitrate = bitrate;
1765 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
1766 encoder->x264param.rc.i_vbv_buffer_size =
1767 encoder->x264param.rc.i_vbv_max_bitrate
1768 * encoder->vbv_buf_capacity / 1000;
1769 pass = encoder->pass & 0xF;
1775 encoder->x264param.rc.b_stat_read = 0;
1776 encoder->x264param.rc.b_stat_write = 0;
1779 encoder->x264param.rc.b_stat_read = 0;
1780 encoder->x264param.rc.b_stat_write = 1;
1781 encoder->vtable->x264_param_apply_fastfirstpass (&encoder->x264param);
1782 encoder->x264param.i_frame_reference = 1;
1783 encoder->x264param.analyse.b_transform_8x8 = 0;
1784 encoder->x264param.analyse.inter = 0;
1785 encoder->x264param.analyse.i_me_method = X264_ME_DIA;
1786 encoder->x264param.analyse.i_subpel_refine =
1787 MIN (2, encoder->x264param.analyse.i_subpel_refine);
1788 encoder->x264param.analyse.i_trellis = 0;
1789 encoder->x264param.analyse.b_fast_pskip = 1;
1792 encoder->x264param.rc.b_stat_read = 1;
1793 encoder->x264param.rc.b_stat_write = 0;
1796 encoder->x264param.rc.b_stat_read = 1;
1797 encoder->x264param.rc.b_stat_write = 1;
1801 if (encoder->peer_profile) {
1802 if (encoder->vtable->x264_param_apply_profile (&encoder->x264param,
1803 encoder->peer_profile))
1804 GST_WARNING_OBJECT (encoder, "Bad downstream profile name: %s",
1805 encoder->peer_profile);
1808 /* If using an intra profile, all frames are intra frames */
1809 if (encoder->peer_intra_profile)
1810 encoder->x264param.i_keyint_max = encoder->x264param.i_keyint_min = 1;
1812 /* Enforce level limits if they were in the caps */
1813 if (encoder->peer_level_idc != -1) {
1815 const x264_level_t *peer_level = NULL;
1817 for (i = 0; (*encoder->vtable->x264_levels)[i].level_idc; i++) {
1818 if (encoder->peer_level_idc ==
1819 (*encoder->vtable->x264_levels)[i].level_idc) {
1820 int mb_width = (info->width + 15) / 16;
1821 int mb_height = (info->height + 15) / 16;
1822 int mbs = mb_width * mb_height;
1824 if ((*encoder->vtable->x264_levels)[i].frame_size < mbs ||
1825 (*encoder->vtable->x264_levels)[i].frame_size * 8 <
1827 || (*encoder->vtable->x264_levels)[i].frame_size * 8 <
1828 mb_height * mb_height) {
1829 GST_WARNING_OBJECT (encoder,
1830 "Frame size larger than level %d allows",
1831 encoder->peer_level_idc);
1835 if (info->fps_d && (*encoder->vtable->x264_levels)[i].mbps
1836 < (gint64) mbs * info->fps_n / info->fps_d) {
1837 GST_WARNING_OBJECT (encoder,
1838 "Macroblock rate higher than level %d allows",
1839 encoder->peer_level_idc);
1843 peer_level = &(*encoder->vtable->x264_levels)[i];
1849 goto unlock_and_return;
1851 encoder->x264param.i_level_idc = peer_level->level_idc;
1853 encoder->x264param.rc.i_bitrate = MIN (encoder->x264param.rc.i_bitrate,
1854 peer_level->bitrate);
1855 encoder->x264param.rc.i_vbv_max_bitrate =
1856 MIN (encoder->x264param.rc.i_vbv_max_bitrate, peer_level->bitrate);
1857 encoder->x264param.rc.i_vbv_buffer_size =
1858 MIN (encoder->x264param.rc.i_vbv_buffer_size, peer_level->cpb);
1859 encoder->x264param.analyse.i_mv_range =
1860 MIN (encoder->x264param.analyse.i_mv_range, peer_level->mv_range);
1862 if (peer_level->frame_only) {
1863 encoder->x264param.b_interlaced = FALSE;
1864 encoder->x264param.b_fake_interlaced = FALSE;
1868 if (GST_VIDEO_INFO_IS_INTERLACED (info)) {
1869 encoder->x264param.b_interlaced = TRUE;
1870 if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) {
1871 encoder->x264param.b_pic_struct = TRUE;
1873 if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
1874 GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST) {
1875 encoder->x264param.b_tff = TRUE;
1877 encoder->x264param.b_tff = FALSE;
1880 encoder->x264param.b_interlaced = FALSE;
1883 /* Set 3D frame packing */
1884 if (encoder->frame_packing != GST_VIDEO_MULTIVIEW_MODE_NONE)
1885 encoder->x264param.i_frame_packing = encoder->frame_packing;
1887 encoder->x264param.i_frame_packing =
1888 gst_x264_enc_mview_mode_to_frame_packing (GST_VIDEO_INFO_MULTIVIEW_MODE
1891 GST_DEBUG_OBJECT (encoder, "Stereo frame packing = %d",
1892 encoder->x264param.i_frame_packing);
1894 encoder->reconfig = FALSE;
1896 GST_OBJECT_UNLOCK (encoder);
1898 encoder->x264enc = encoder->vtable->x264_encoder_open (&encoder->x264param);
1899 if (!encoder->x264enc) {
1900 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE,
1901 ("Can not initialize x264 encoder."), (NULL));
1908 GST_OBJECT_UNLOCK (encoder);
1912 /* gst_x264_enc_close_encoder
1913 * @encoder: Encoder which should close.
1915 * Close x264 encoder.
1918 gst_x264_enc_close_encoder (GstX264Enc * encoder)
1920 if (encoder->x264enc != NULL) {
1921 encoder->vtable->x264_encoder_close (encoder->x264enc);
1922 encoder->x264enc = NULL;
1924 encoder->vtable = NULL;
1928 gst_x264_enc_set_profile_and_level (GstX264Enc * encoder, GstCaps * caps)
1936 const gchar *profile;
1937 GstCaps *allowed_caps;
1939 const gchar *allowed_profile;
1942 encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal);
1943 if (header_return < 0) {
1944 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."),
1945 ("x264_encoder_headers return code=%d", header_return));
1949 /* old x264 returns SEI, SPS and PPS, newer one has SEI last */
1950 if (i_nal == 3 && nal[sps_ni].i_type != 7)
1953 sps = nal[sps_ni].p_payload + 4;
1954 /* skip NAL unit type */
1957 gst_codec_utils_h264_caps_set_level_and_profile (caps, sps, 3);
1959 /* Constrained baseline is a strict subset of baseline. If downstream
1960 * wanted baseline and we produced constrained baseline, we can just
1961 * set the profile to baseline in the caps to make negotiation happy.
1962 * Same goes for baseline as subset of main profile and main as a subset
1965 s = gst_caps_get_structure (caps, 0);
1966 profile = gst_structure_get_string (s, "profile");
1968 allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder));
1970 if (allowed_caps == NULL)
1973 if (!gst_caps_can_intersect (allowed_caps, caps)) {
1974 allowed_caps = gst_caps_make_writable (allowed_caps);
1975 allowed_caps = gst_caps_truncate (allowed_caps);
1976 s2 = gst_caps_get_structure (allowed_caps, 0);
1977 gst_structure_fixate_field_string (s2, "profile", profile);
1978 allowed_profile = gst_structure_get_string (s2, "profile");
1979 if (!strcmp (allowed_profile, "high")) {
1980 if (!strcmp (profile, "constrained-baseline")
1981 || !strcmp (profile, "baseline") || !strcmp (profile, "main")) {
1982 gst_structure_set (s, "profile", G_TYPE_STRING, "high", NULL);
1983 GST_INFO_OBJECT (encoder, "downstream requested high profile, but "
1984 "encoder will now output %s profile (which is a subset), due "
1985 "to how it's been configured", profile);
1987 } else if (!strcmp (allowed_profile, "main")) {
1988 if (!strcmp (profile, "constrained-baseline")
1989 || !strcmp (profile, "baseline")) {
1990 gst_structure_set (s, "profile", G_TYPE_STRING, "main", NULL);
1991 GST_INFO_OBJECT (encoder, "downstream requested main profile, but "
1992 "encoder will now output %s profile (which is a subset), due "
1993 "to how it's been configured", profile);
1995 } else if (!strcmp (allowed_profile, "baseline")) {
1996 if (!strcmp (profile, "constrained-baseline"))
1997 gst_structure_set (s, "profile", G_TYPE_STRING, "baseline", NULL);
2000 gst_caps_unref (allowed_caps);
2008 * Returns: Buffer with the stream headers.
2011 gst_x264_enc_header_buf (GstX264Enc * encoder)
2019 guint8 *buffer, *sps;
2021 gint sei_ni = 2, sps_ni = 0, pps_ni = 1;
2023 if (G_UNLIKELY (encoder->x264enc == NULL))
2026 /* Create avcC header. */
2029 encoder->vtable->x264_encoder_headers (encoder->x264enc, &nal, &i_nal);
2030 if (header_return < 0) {
2031 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 header failed."),
2032 ("x264_encoder_headers return code=%d", header_return));
2036 /* old x264 returns SEI, SPS and PPS, newer one has SEI last */
2037 if (i_nal == 3 && nal[sps_ni].i_type != 7) {
2043 /* x264 is expected to return an SEI (some identification info),
2044 * and SPS and PPS */
2045 if (i_nal != 3 || nal[sps_ni].i_type != 7 || nal[pps_ni].i_type != 8 ||
2046 nal[sps_ni].i_payload < 4 || nal[pps_ni].i_payload < 1) {
2047 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, (NULL),
2048 ("Unexpected x264 header."));
2052 GST_MEMDUMP ("SEI", nal[sei_ni].p_payload, nal[sei_ni].i_payload);
2053 GST_MEMDUMP ("SPS", nal[sps_ni].p_payload, nal[sps_ni].i_payload);
2054 GST_MEMDUMP ("PPS", nal[pps_ni].p_payload, nal[pps_ni].i_payload);
2056 /* nal payloads with emulation_prevention_three_byte, and some header data */
2057 buffer_size = (nal[sps_ni].i_payload + nal[pps_ni].i_payload) * 4 + 100;
2058 buffer = g_malloc (buffer_size);
2060 sps = nal[sps_ni].p_payload + 4;
2061 /* skip NAL unit type */
2064 buffer[0] = 1; /* AVC Decoder Configuration Record ver. 1 */
2065 buffer[1] = sps[0]; /* profile_idc */
2066 buffer[2] = sps[1]; /* profile_compability */
2067 buffer[3] = sps[2]; /* level_idc */
2068 buffer[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */
2072 buffer[i_size++] = 0xe0 | 1; /* number of SPSs */
2074 nal_size = nal[sps_ni].i_payload - 4;
2075 memcpy (buffer + i_size + 2, nal[sps_ni].p_payload + 4, nal_size);
2077 GST_WRITE_UINT16_BE (buffer + i_size, nal_size);
2078 i_size += nal_size + 2;
2080 buffer[i_size++] = 1; /* number of PPSs */
2082 nal_size = nal[pps_ni].i_payload - 4;
2083 memcpy (buffer + i_size + 2, nal[pps_ni].p_payload + 4, nal_size);
2085 GST_WRITE_UINT16_BE (buffer + i_size, nal_size);
2086 i_size += nal_size + 2;
2088 buf = gst_buffer_new_and_alloc (i_size);
2089 gst_buffer_fill (buf, 0, buffer, i_size);
2091 GST_MEMDUMP ("header", buffer, i_size);
2097 /* gst_x264_enc_set_src_caps
2098 * Returns: TRUE on success.
2101 gst_x264_enc_set_src_caps (GstX264Enc * encoder, GstCaps * caps)
2104 GstStructure *structure;
2105 GstVideoCodecState *state;
2108 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
2109 encoder->input_state ? &encoder->input_state->info : NULL);
2111 outcaps = gst_caps_new_empty_simple ("video/x-h264");
2112 structure = gst_caps_get_structure (outcaps, 0);
2114 if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY) {
2115 if (encoder->byte_stream) {
2116 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2118 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC;
2121 if (encoder->current_byte_stream == GST_X264_ENC_STREAM_FORMAT_AVC) {
2122 GstBuffer *buf = gst_x264_enc_header_buf (encoder);
2124 gst_caps_set_simple (outcaps, "codec_data", GST_TYPE_BUFFER, buf, NULL);
2125 gst_buffer_unref (buf);
2127 gst_structure_set (structure, "stream-format", G_TYPE_STRING, "avc", NULL);
2129 gst_structure_set (structure, "stream-format", G_TYPE_STRING, "byte-stream",
2132 gst_structure_set (structure, "alignment", G_TYPE_STRING, "au", NULL);
2134 if (!gst_x264_enc_set_profile_and_level (encoder, outcaps)) {
2135 gst_caps_unref (outcaps);
2139 state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (encoder),
2140 outcaps, encoder->input_state);
2141 GST_DEBUG_OBJECT (encoder, "output caps: %" GST_PTR_FORMAT, state->caps);
2143 /* If set, local frame packing setting overrides any upstream config */
2144 switch (encoder->frame_packing) {
2146 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2147 GST_VIDEO_MULTIVIEW_MODE_CHECKERBOARD;
2150 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2151 GST_VIDEO_MULTIVIEW_MODE_COLUMN_INTERLEAVED;
2154 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2155 GST_VIDEO_MULTIVIEW_MODE_ROW_INTERLEAVED;
2158 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2159 GST_VIDEO_MULTIVIEW_MODE_SIDE_BY_SIDE;
2162 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2163 GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM;
2166 GST_VIDEO_INFO_MULTIVIEW_MODE (&state->info) =
2167 GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME;
2173 gst_video_codec_state_unref (state);
2175 tags = gst_tag_list_new_empty ();
2176 gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, "x264",
2177 GST_TAG_ENCODER_VERSION, X264_BUILD,
2178 GST_TAG_MAXIMUM_BITRATE, bitrate * 1024,
2179 GST_TAG_NOMINAL_BITRATE, bitrate * 1024, NULL);
2180 gst_video_encoder_merge_tags (GST_VIDEO_ENCODER (encoder), tags,
2181 GST_TAG_MERGE_REPLACE);
2182 gst_tag_list_unref (tags);
2188 gst_x264_enc_set_latency (GstX264Enc * encoder)
2190 GstVideoInfo *info = &encoder->input_state->info;
2191 gint max_delayed_frames;
2192 GstClockTime latency;
2194 max_delayed_frames =
2195 encoder->vtable->x264_encoder_maximum_delayed_frames (encoder->x264enc);
2198 latency = gst_util_uint64_scale_ceil (GST_SECOND * info->fps_d,
2199 max_delayed_frames, info->fps_n);
2201 /* FIXME: Assume 25fps. This is better than reporting no latency at
2202 * all and then later failing in live pipelines
2204 latency = gst_util_uint64_scale_ceil (GST_SECOND * 1,
2205 max_delayed_frames, 25);
2208 GST_INFO_OBJECT (encoder,
2209 "Updating latency to %" GST_TIME_FORMAT " (%d frames)",
2210 GST_TIME_ARGS (latency), max_delayed_frames);
2212 gst_video_encoder_set_latency (GST_VIDEO_ENCODER (encoder), latency, latency);
2216 gst_x264_enc_set_format (GstVideoEncoder * video_enc,
2217 GstVideoCodecState * state)
2219 GstX264Enc *encoder = GST_X264_ENC (video_enc);
2220 GstVideoInfo *info = &state->info;
2221 GstCaps *template_caps;
2222 GstCaps *allowed_caps = NULL;
2224 /* If the encoder is initialized, do not reinitialize it again if not
2226 if (encoder->x264enc) {
2227 GstVideoInfo *old = &encoder->input_state->info;
2229 if (info->finfo->format == old->finfo->format
2230 && info->width == old->width && info->height == old->height
2231 && info->fps_n == old->fps_n && info->fps_d == old->fps_d
2232 && info->par_n == old->par_n && info->par_d == old->par_d) {
2233 gst_video_codec_state_unref (encoder->input_state);
2234 encoder->input_state = gst_video_codec_state_ref (state);
2238 /* clear out pending frames */
2239 gst_x264_enc_flush_frames (encoder, TRUE);
2244 if (encoder->input_state)
2245 gst_video_codec_state_unref (encoder->input_state);
2246 encoder->input_state = gst_video_codec_state_ref (state);
2248 encoder->peer_profile = NULL;
2249 encoder->peer_intra_profile = FALSE;
2250 encoder->peer_level_idc = -1;
2252 template_caps = gst_static_pad_template_get_caps (&src_factory);
2253 allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder));
2255 /* Output byte-stream if downstream has ANY caps, it's what people expect,
2256 * and it makes more sense too */
2257 if (allowed_caps == template_caps) {
2258 GST_INFO_OBJECT (encoder,
2259 "downstream has ANY caps, outputting byte-stream");
2260 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2261 g_string_append_printf (encoder->option_string, ":annexb=1");
2262 gst_caps_unref (allowed_caps);
2263 } else if (allowed_caps) {
2265 const gchar *profile;
2267 const gchar *stream_format;
2269 if (gst_caps_is_empty (allowed_caps)) {
2270 gst_caps_unref (allowed_caps);
2271 gst_caps_unref (template_caps);
2275 allowed_caps = gst_caps_make_writable (allowed_caps);
2276 allowed_caps = gst_caps_fixate (allowed_caps);
2277 s = gst_caps_get_structure (allowed_caps, 0);
2279 profile = gst_structure_get_string (s, "profile");
2281 /* FIXME - if libx264 ever adds support for FMO, ASO or redundant slices
2282 * make sure constrained profile has a separate case which disables
2284 if (g_str_has_suffix (profile, "-intra")) {
2285 encoder->peer_intra_profile = TRUE;
2287 if (!strcmp (profile, "constrained-baseline") ||
2288 !strcmp (profile, "baseline")) {
2289 encoder->peer_profile = "baseline";
2290 } else if (g_str_has_prefix (profile, "high-10")) {
2291 encoder->peer_profile = "high10";
2292 } else if (g_str_has_prefix (profile, "high-4:2:2")) {
2293 encoder->peer_profile = "high422";
2294 } else if (g_str_has_prefix (profile, "high-4:4:4")) {
2295 encoder->peer_profile = "high444";
2296 } else if (g_str_has_prefix (profile, "high")) {
2297 encoder->peer_profile = "high";
2298 } else if (!strcmp (profile, "main")) {
2299 encoder->peer_profile = "main";
2301 g_assert_not_reached ();
2305 level = gst_structure_get_string (s, "level");
2307 encoder->peer_level_idc = gst_codec_utils_h264_get_level_idc (level);
2310 stream_format = gst_structure_get_string (s, "stream-format");
2311 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_FROM_PROPERTY;
2312 if (stream_format) {
2313 if (!strcmp (stream_format, "avc")) {
2314 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_AVC;
2315 g_string_append_printf (encoder->option_string, ":annexb=0");
2316 } else if (!strcmp (stream_format, "byte-stream")) {
2317 encoder->current_byte_stream = GST_X264_ENC_STREAM_FORMAT_BYTE_STREAM;
2318 g_string_append_printf (encoder->option_string, ":annexb=1");
2320 /* means we have both in caps and _FROM_PROPERTY should be the option */
2324 gst_caps_unref (allowed_caps);
2327 gst_caps_unref (template_caps);
2329 if (!gst_x264_enc_init_encoder (encoder))
2332 if (!gst_x264_enc_set_src_caps (encoder, state->caps)) {
2333 gst_x264_enc_close_encoder (encoder);
2337 gst_x264_enc_set_latency (encoder);
2342 static GstFlowReturn
2343 gst_x264_enc_finish (GstVideoEncoder * encoder)
2345 gst_x264_enc_flush_frames (GST_X264_ENC (encoder), TRUE);
2350 gst_x264_enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query)
2352 GstX264Enc *self = GST_X264_ENC (encoder);
2356 gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
2358 if (!self->input_state)
2361 if (self->vtable == NULL)
2364 info = &self->input_state->info;
2366 self->vtable->x264_encoder_maximum_delayed_frames (self->x264enc) + 1;
2368 gst_query_add_allocation_pool (query, NULL, info->size, num_buffers, 0);
2370 return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (encoder,
2375 gst_x264_enc_add_cc (GstBuffer * buffer, x264_picture_t * pic_in)
2377 GstVideoCaptionMeta *cc_meta;
2378 gpointer iter = NULL;
2381 (GstVideoCaptionMeta *) gst_buffer_iterate_meta_filtered (buffer,
2382 &iter, GST_VIDEO_CAPTION_META_API_TYPE))) {
2383 guint i = pic_in->extra_sei.num_payloads;
2385 if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW)
2388 pic_in->extra_sei.num_payloads += 1;
2390 if (!pic_in->extra_sei.payloads)
2391 pic_in->extra_sei.payloads = g_new0 (x264_sei_payload_t, 1);
2393 pic_in->extra_sei.payloads =
2394 g_renew (x264_sei_payload_t, pic_in->extra_sei.payloads,
2395 pic_in->extra_sei.num_payloads);
2397 pic_in->extra_sei.sei_free = g_free;
2399 pic_in->extra_sei.payloads[i].payload_size = cc_meta->size + 11;
2400 pic_in->extra_sei.payloads[i].payload =
2401 g_malloc0 (pic_in->extra_sei.payloads[i].payload_size);
2402 pic_in->extra_sei.payloads[i].payload_type = 4; /* Registered user data */
2403 memcpy (pic_in->extra_sei.payloads[i].payload + 10, cc_meta->data,
2405 pic_in->extra_sei.payloads[i].payload[0] = 181; /* 8-bits itu_t_t35_country_code */
2406 pic_in->extra_sei.payloads[i].payload[1] = 0; /* 16-bits itu_t_t35_provider_code */
2407 pic_in->extra_sei.payloads[i].payload[2] = 49;
2408 pic_in->extra_sei.payloads[i].payload[3] = 'G'; /* 32-bits ATSC_user_identifier */
2409 pic_in->extra_sei.payloads[i].payload[4] = 'A';
2410 pic_in->extra_sei.payloads[i].payload[5] = '9';
2411 pic_in->extra_sei.payloads[i].payload[6] = '4';
2412 pic_in->extra_sei.payloads[i].payload[7] = 3; /* 8-bits ATSC1_data_user_data_type_code */
2414 * 1 bit process_em_data_flag (0)
2415 * 1 bit process_cc_data_flag (1)
2416 * 1 bit additional_data_flag (0)
2419 pic_in->extra_sei.payloads[i].payload[8] =
2420 ((cc_meta->size / 3) & 0x1f) | 0x40;
2421 pic_in->extra_sei.payloads[i].payload[9] = 255; /* 8 bits em_data, unused */
2422 pic_in->extra_sei.payloads[i].payload[cc_meta->size + 10] = 255; /* 8 marker bits */
2427 * this function does the actual processing
2429 static GstFlowReturn
2430 gst_x264_enc_handle_frame (GstVideoEncoder * video_enc,
2431 GstVideoCodecFrame * frame)
2433 GstX264Enc *encoder = GST_X264_ENC (video_enc);
2434 GstVideoInfo *info = &encoder->input_state->info;
2436 x264_picture_t pic_in;
2439 gint nplanes = encoder->x264_nplanes;
2441 if (G_UNLIKELY (encoder->x264enc == NULL))
2444 /* create x264_picture_t from the buffer */
2445 /* mostly taken from mplayer (file ve_x264.c) */
2447 /* set up input picture */
2448 memset (&pic_in, 0, sizeof (pic_in));
2450 fdata = gst_x264_enc_queue_frame (encoder, frame, info);
2454 pic_in.img.i_csp = encoder->x264param.i_csp;
2455 pic_in.img.i_plane = nplanes;
2456 for (i = 0; i < nplanes; i++) {
2457 pic_in.img.plane[i] = GST_VIDEO_FRAME_COMP_DATA (&fdata->vframe, i);
2458 pic_in.img.i_stride[i] = GST_VIDEO_FRAME_COMP_STRIDE (&fdata->vframe, i);
2461 pic_in.i_type = X264_TYPE_AUTO;
2462 pic_in.i_pts = frame->pts;
2463 pic_in.opaque = GINT_TO_POINTER (frame->system_frame_number);
2465 if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED) {
2466 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_INTERLACED) == 0) {
2467 pic_in.i_pic_struct = PIC_STRUCT_PROGRESSIVE;
2468 } else if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_RFF) != 0) {
2469 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) {
2470 pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM_TOP;
2472 pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP_BOTTOM;
2475 if ((fdata->vframe.flags & GST_VIDEO_FRAME_FLAG_TFF) != 0) {
2476 pic_in.i_pic_struct = PIC_STRUCT_TOP_BOTTOM;
2478 pic_in.i_pic_struct = PIC_STRUCT_BOTTOM_TOP;
2483 gst_x264_enc_add_cc (frame->input_buffer, &pic_in);
2485 ret = gst_x264_enc_encode_frame (encoder, &pic_in, frame, &i_nal, TRUE);
2487 /* input buffer is released later on */
2493 GST_WARNING_OBJECT (encoder, "Got buffer before set_caps was called");
2494 return GST_FLOW_NOT_NEGOTIATED;
2498 GST_ERROR_OBJECT (encoder, "Failed to map frame");
2499 return GST_FLOW_ERROR;
2503 static GstFlowReturn
2504 gst_x264_enc_encode_frame (GstX264Enc * encoder, x264_picture_t * pic_in,
2505 GstVideoCodecFrame * input_frame, int *i_nal, gboolean send)
2507 GstVideoCodecFrame *frame = NULL;
2508 GstBuffer *out_buf = NULL;
2509 x264_picture_t pic_out;
2513 GstFlowReturn ret = GST_FLOW_OK;
2515 gboolean update_latency = FALSE;
2517 if (G_UNLIKELY (encoder->x264enc == NULL)) {
2519 gst_video_codec_frame_unref (input_frame);
2520 return GST_FLOW_NOT_NEGOTIATED;
2523 GST_OBJECT_LOCK (encoder);
2524 if (encoder->reconfig) {
2525 encoder->reconfig = FALSE;
2526 if (encoder->vtable->x264_encoder_reconfig (encoder->x264enc,
2527 &encoder->x264param) < 0)
2528 GST_WARNING_OBJECT (encoder, "Could not reconfigure");
2529 update_latency = TRUE;
2532 if (pic_in && input_frame) {
2533 if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (input_frame)) {
2534 GST_INFO_OBJECT (encoder, "Forcing key frame");
2535 if (encoder->intra_refresh)
2536 encoder->vtable->x264_encoder_intra_refresh (encoder->x264enc);
2538 pic_in->i_type = X264_TYPE_IDR;
2541 GST_OBJECT_UNLOCK (encoder);
2543 if (G_UNLIKELY (update_latency))
2544 gst_x264_enc_set_latency (encoder);
2546 encoder_return = encoder->vtable->x264_encoder_encode (encoder->x264enc,
2547 &nal, i_nal, pic_in, &pic_out);
2549 if (encoder_return < 0) {
2550 GST_ELEMENT_ERROR (encoder, STREAM, ENCODE, ("Encode x264 frame failed."),
2551 ("x264_encoder_encode return code=%d", encoder_return));
2552 ret = GST_FLOW_ERROR;
2553 /* Make sure we finish this frame */
2554 frame = input_frame;
2558 /* Input frame is now queued */
2560 gst_video_codec_frame_unref (input_frame);
2567 i_size = encoder_return;
2568 data = nal[0].p_payload;
2570 frame = gst_video_encoder_get_frame (GST_VIDEO_ENCODER (encoder),
2571 GPOINTER_TO_INT (pic_out.opaque));
2572 g_assert (frame || !send);
2574 if (!send || !frame) {
2579 out_buf = gst_buffer_new_allocate (NULL, i_size, NULL);
2580 gst_buffer_fill (out_buf, 0, data, i_size);
2581 frame->output_buffer = out_buf;
2583 GST_LOG_OBJECT (encoder,
2584 "output: dts %" G_GINT64_FORMAT " pts %" G_GINT64_FORMAT,
2585 (gint64) pic_out.i_dts, (gint64) pic_out.i_pts);
2587 /* we want to know if x264 is messing around with this */
2588 g_assert (frame->pts == pic_out.i_pts);
2590 frame->dts = pic_out.i_dts;
2591 frame->pts = pic_out.i_pts;
2593 if (pic_out.b_keyframe) {
2594 GST_DEBUG_OBJECT (encoder, "Output keyframe");
2595 GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
2600 gst_x264_enc_dequeue_frame (encoder, frame);
2601 ret = gst_video_encoder_finish_frame (GST_VIDEO_ENCODER (encoder), frame);
2608 gst_x264_enc_flush_frames (GstX264Enc * encoder, gboolean send)
2610 GstFlowReturn flow_ret;
2613 /* first send the remaining frames */
2614 if (encoder->x264enc)
2616 flow_ret = gst_x264_enc_encode_frame (encoder, NULL, NULL, &i_nal, send);
2617 } while (flow_ret == GST_FLOW_OK
2618 && encoder->vtable->x264_encoder_delayed_frames (encoder->x264enc) > 0);
2622 gst_x264_enc_reconfig (GstX264Enc * encoder)
2626 if (!encoder->vtable)
2630 gst_encoder_bitrate_profile_manager_get_bitrate (encoder->bitrate_manager,
2631 encoder->input_state ? &encoder->input_state->info : NULL);
2632 switch (encoder->pass) {
2633 case GST_X264_ENC_PASS_QUAL:
2634 encoder->x264param.rc.f_rf_constant = encoder->quantizer;
2635 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
2636 encoder->x264param.rc.i_vbv_buffer_size
2637 = encoder->x264param.rc.i_vbv_max_bitrate
2638 * encoder->vbv_buf_capacity / 1000;
2640 case GST_X264_ENC_PASS_CBR:
2641 case GST_X264_ENC_PASS_PASS1:
2642 case GST_X264_ENC_PASS_PASS2:
2643 case GST_X264_ENC_PASS_PASS3:
2645 encoder->x264param.rc.i_bitrate = bitrate;
2646 encoder->x264param.rc.i_vbv_max_bitrate = bitrate;
2647 encoder->x264param.rc.i_vbv_buffer_size
2648 = encoder->x264param.rc.i_vbv_max_bitrate
2649 * encoder->vbv_buf_capacity / 1000;
2653 encoder->reconfig = TRUE;
2657 gst_x264_enc_set_property (GObject * object, guint prop_id,
2658 const GValue * value, GParamSpec * pspec)
2660 GstX264Enc *encoder;
2663 const gchar *partitions = NULL;
2665 encoder = GST_X264_ENC (object);
2667 GST_OBJECT_LOCK (encoder);
2668 /* state at least matters for sps, bytestream, pass,
2669 * and so by extension ... */
2671 state = GST_STATE (encoder);
2672 if ((state != GST_STATE_READY && state != GST_STATE_NULL) &&
2673 !(pspec->flags & GST_PARAM_MUTABLE_PLAYING))
2678 encoder->pass = g_value_get_enum (value);
2681 encoder->quantizer = g_value_get_uint (value);
2682 gst_x264_enc_reconfig (encoder);
2685 gst_encoder_bitrate_profile_manager_set_bitrate (encoder->bitrate_manager,
2686 g_value_get_uint (value));
2687 gst_x264_enc_reconfig (encoder);
2689 case ARG_VBV_BUF_CAPACITY:
2690 encoder->vbv_buf_capacity = g_value_get_uint (value);
2691 gst_x264_enc_reconfig (encoder);
2693 case ARG_SPEED_PRESET:
2694 encoder->speed_preset = g_value_get_enum (value);
2697 encoder->psy_tune = g_value_get_enum (value);
2700 encoder->tune = g_value_get_flags (value);
2702 case ARG_OPTION_STRING:
2703 g_string_assign (encoder->option_string_prop, g_value_get_string (value));
2706 encoder->threads = g_value_get_uint (value);
2707 g_string_append_printf (encoder->option_string, ":threads=%d",
2710 case ARG_SLICED_THREADS:
2711 encoder->sliced_threads = g_value_get_boolean (value);
2712 g_string_append_printf (encoder->option_string, ":sliced-threads=%d",
2713 encoder->sliced_threads);
2715 case ARG_SYNC_LOOKAHEAD:
2716 encoder->sync_lookahead = g_value_get_int (value);
2717 g_string_append_printf (encoder->option_string, ":sync-lookahead=%d",
2718 encoder->sync_lookahead);
2720 case ARG_MULTIPASS_CACHE_FILE:
2721 g_free (encoder->mp_cache_file);
2722 encoder->mp_cache_file = g_value_dup_string (value);
2723 g_string_append_printf (encoder->option_string, ":stats=%s",
2724 encoder->mp_cache_file);
2726 case ARG_BYTE_STREAM:
2727 encoder->byte_stream = g_value_get_boolean (value);
2728 g_string_append_printf (encoder->option_string, ":annexb=%d",
2729 encoder->byte_stream);
2731 case ARG_INTRA_REFRESH:
2732 encoder->intra_refresh = g_value_get_boolean (value);
2733 g_string_append_printf (encoder->option_string, ":intra-refresh=%d",
2734 encoder->intra_refresh);
2737 encoder->me = g_value_get_enum (value);
2738 g_string_append_printf (encoder->option_string, ":me=%s",
2739 x264_motion_est_names[encoder->me]);
2742 encoder->subme = g_value_get_uint (value);
2743 g_string_append_printf (encoder->option_string, ":subme=%d",
2747 encoder->analyse = g_value_get_flags (value);
2748 partitions = gst_x264_enc_build_partitions (encoder->analyse);
2750 g_string_append_printf (encoder->option_string, ":partitions=%s",
2752 g_free ((gpointer) partitions);
2756 encoder->dct8x8 = g_value_get_boolean (value);
2757 g_string_append_printf (encoder->option_string, ":8x8dct=%d",
2761 encoder->ref = g_value_get_uint (value);
2762 g_string_append_printf (encoder->option_string, ":ref=%d", encoder->ref);
2765 encoder->bframes = g_value_get_uint (value);
2766 g_string_append_printf (encoder->option_string, ":bframes=%d",
2770 encoder->b_adapt = g_value_get_boolean (value);
2771 g_string_append_printf (encoder->option_string, ":b-adapt=%d",
2775 encoder->b_pyramid = g_value_get_boolean (value);
2776 g_string_append_printf (encoder->option_string, ":b-pyramid=%s",
2777 x264_b_pyramid_names[encoder->b_pyramid]);
2780 encoder->weightb = g_value_get_boolean (value);
2781 g_string_append_printf (encoder->option_string, ":weightb=%d",
2785 encoder->sps_id = g_value_get_uint (value);
2786 g_string_append_printf (encoder->option_string, ":sps-id=%d",
2790 encoder->au_nalu = g_value_get_boolean (value);
2791 g_string_append_printf (encoder->option_string, ":aud=%d",
2795 encoder->trellis = g_value_get_boolean (value);
2796 g_string_append_printf (encoder->option_string, ":trellis=%d",
2799 case ARG_KEYINT_MAX:
2800 encoder->keyint_max = g_value_get_uint (value);
2801 g_string_append_printf (encoder->option_string, ":keyint=%d",
2802 encoder->keyint_max);
2805 encoder->cabac = g_value_get_boolean (value);
2806 g_string_append_printf (encoder->option_string, ":cabac=%d",
2810 encoder->qp_min = g_value_get_uint (value);
2811 g_string_append_printf (encoder->option_string, ":qpmin=%d",
2815 encoder->qp_max = g_value_get_uint (value);
2816 g_string_append_printf (encoder->option_string, ":qpmax=%d",
2820 encoder->qp_step = g_value_get_uint (value);
2821 g_string_append_printf (encoder->option_string, ":qpstep=%d",
2825 encoder->ip_factor = g_value_get_float (value);
2826 g_string_append_printf (encoder->option_string, ":ip-factor=%f",
2827 encoder->ip_factor);
2830 encoder->pb_factor = g_value_get_float (value);
2831 g_string_append_printf (encoder->option_string, ":pb-factor=%f",
2832 encoder->pb_factor);
2834 case ARG_RC_MB_TREE:
2835 encoder->mb_tree = g_value_get_boolean (value);
2836 g_string_append_printf (encoder->option_string, ":mbtree=%d",
2839 case ARG_RC_LOOKAHEAD:
2840 encoder->rc_lookahead = g_value_get_int (value);
2841 g_string_append_printf (encoder->option_string, ":rc-lookahead=%d",
2842 encoder->rc_lookahead);
2845 encoder->noise_reduction = g_value_get_uint (value);
2846 g_string_append_printf (encoder->option_string, ":nr=%d",
2847 encoder->noise_reduction);
2849 case ARG_INTERLACED:
2850 encoder->interlaced = g_value_get_boolean (value);
2852 case ARG_FRAME_PACKING:
2853 encoder->frame_packing = g_value_get_enum (value);
2855 case ARG_INSERT_VUI:
2856 encoder->insert_vui = g_value_get_boolean (value);
2859 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
2862 GST_OBJECT_UNLOCK (encoder);
2868 GST_WARNING_OBJECT (encoder, "setting property in wrong state");
2869 GST_OBJECT_UNLOCK (encoder);
2874 gst_x264_enc_get_property (GObject * object, guint prop_id,
2875 GValue * value, GParamSpec * pspec)
2877 GstX264Enc *encoder;
2879 encoder = GST_X264_ENC (object);
2881 GST_OBJECT_LOCK (encoder);
2884 g_value_set_uint (value, encoder->threads);
2886 case ARG_SLICED_THREADS:
2887 g_value_set_boolean (value, encoder->sliced_threads);
2889 case ARG_SYNC_LOOKAHEAD:
2890 g_value_set_int (value, encoder->sync_lookahead);
2893 g_value_set_enum (value, encoder->pass);
2896 g_value_set_uint (value, encoder->quantizer);
2898 case ARG_MULTIPASS_CACHE_FILE:
2899 g_value_set_string (value, encoder->mp_cache_file);
2901 case ARG_BYTE_STREAM:
2902 g_value_set_boolean (value, encoder->byte_stream);
2905 g_value_set_uint (value,
2906 gst_encoder_bitrate_profile_manager_get_bitrate
2907 (encoder->bitrate_manager, NULL));
2909 case ARG_INTRA_REFRESH:
2910 g_value_set_boolean (value, encoder->intra_refresh);
2912 case ARG_VBV_BUF_CAPACITY:
2913 g_value_set_uint (value, encoder->vbv_buf_capacity);
2916 g_value_set_enum (value, encoder->me);
2919 g_value_set_uint (value, encoder->subme);
2922 g_value_set_flags (value, encoder->analyse);
2925 g_value_set_boolean (value, encoder->dct8x8);
2928 g_value_set_uint (value, encoder->ref);
2931 g_value_set_uint (value, encoder->bframes);
2934 g_value_set_boolean (value, encoder->b_adapt);
2937 g_value_set_boolean (value, encoder->b_pyramid);
2940 g_value_set_boolean (value, encoder->weightb);
2943 g_value_set_uint (value, encoder->sps_id);
2946 g_value_set_boolean (value, encoder->au_nalu);
2949 g_value_set_boolean (value, encoder->trellis);
2951 case ARG_KEYINT_MAX:
2952 g_value_set_uint (value, encoder->keyint_max);
2955 g_value_set_uint (value, encoder->qp_min);
2958 g_value_set_uint (value, encoder->qp_max);
2961 g_value_set_uint (value, encoder->qp_step);
2964 g_value_set_boolean (value, encoder->cabac);
2967 g_value_set_float (value, encoder->ip_factor);
2970 g_value_set_float (value, encoder->pb_factor);
2972 case ARG_RC_MB_TREE:
2973 g_value_set_boolean (value, encoder->mb_tree);
2975 case ARG_RC_LOOKAHEAD:
2976 g_value_set_int (value, encoder->rc_lookahead);
2979 g_value_set_uint (value, encoder->noise_reduction);
2981 case ARG_INTERLACED:
2982 g_value_set_boolean (value, encoder->interlaced);
2984 case ARG_SPEED_PRESET:
2985 g_value_set_enum (value, encoder->speed_preset);
2988 g_value_set_enum (value, encoder->psy_tune);
2991 g_value_set_flags (value, encoder->tune);
2993 case ARG_OPTION_STRING:
2994 g_value_set_string (value, encoder->option_string_prop->str);
2996 case ARG_FRAME_PACKING:
2997 g_value_set_enum (value, encoder->frame_packing);
2999 case ARG_INSERT_VUI:
3000 g_value_set_boolean (value, encoder->insert_vui);
3003 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3006 GST_OBJECT_UNLOCK (encoder);
3010 x264_element_init (GstPlugin * plugin)
3012 GST_DEBUG_CATEGORY_INIT (x264_enc_debug, "x264enc", 0,
3013 "h264 encoding element");
3015 GST_INFO ("linked against x264 build: %u", X264_BUILD);
3017 /* Initialize the static GstX264EncVTable which is overridden in load_x264()
3018 * if needed. We can't initialize statically because these values are not
3019 * constant on Windows. */
3020 default_vtable.module = NULL;
3021 #if X264_BUILD < 153
3022 default_vtable.x264_bit_depth = &x264_bit_depth;
3024 default_vtable.x264_chroma_format = &x264_chroma_format;
3025 default_vtable.x264_encoder_close = x264_encoder_close;
3026 default_vtable.x264_encoder_delayed_frames = x264_encoder_delayed_frames;
3027 default_vtable.x264_encoder_encode = x264_encoder_encode;
3028 default_vtable.x264_encoder_headers = x264_encoder_headers;
3029 default_vtable.x264_encoder_intra_refresh = x264_encoder_intra_refresh;
3030 default_vtable.x264_encoder_maximum_delayed_frames =
3031 x264_encoder_maximum_delayed_frames;
3032 default_vtable.x264_encoder_open = x264_encoder_open;
3033 default_vtable.x264_encoder_reconfig = x264_encoder_reconfig;
3034 default_vtable.x264_levels = &x264_levels;
3035 default_vtable.x264_param_apply_fastfirstpass =
3036 x264_param_apply_fastfirstpass;
3037 default_vtable.x264_param_apply_profile = x264_param_apply_profile;
3038 default_vtable.x264_param_default_preset = x264_param_default_preset;
3039 default_vtable.x264_param_parse = x264_param_parse;
3041 if (!load_x264_libraries ())
3044 return gst_element_register (plugin, "x264enc",
3045 GST_RANK_PRIMARY, GST_TYPE_X264_ENC);
3049 plugin_init (GstPlugin * plugin)
3051 return GST_ELEMENT_REGISTER (x264enc, plugin);
3054 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
3057 "libx264-based H.264 encoder plugin",
3058 plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)