summaryrefslogtreecommitdiff
path: root/ext/x264/gstx264enc.h
blob: e1a091fcf5f337db3606d8de08ff31f27aad31ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* GStreamer H264 encoder plugin
 * Copyright (C) 2005 Michal Benes <michal.benes@itonis.tv>
 * Copyright (C) 2005 Josef Zlomek <josef.zlomek@itonis.tv>
 * Copyright (C) 2016 Sebastian Dröge <sebastian@centricular.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_X264_ENC_H__
#define __GST_X264_ENC_H__

#include <gst/gst.h>
#include <gst/video/video.h>
#include <gst/video/gstvideoencoder.h>
#include "gstencoderbitrateprofilemanager.h"

#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif

/* The x264.h header says this isn't needed with MinGW, but sometimes the
 * compiler is unable to correctly do the pointer indirection for us, which
 * leads to a segfault when you try to dereference any const values provided
 * by x264.dll. See: https://bugzilla.gnome.org/show_bug.cgi?id=779249 */
#if defined(_WIN32) && !defined(X264_API_IMPORTS)
# define X264_API_IMPORTS
#endif
#include <x264.h>

G_BEGIN_DECLS

#define GST_TYPE_X264_ENC \
  (gst_x264_enc_get_type())
#define GST_X264_ENC(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_X264_ENC,GstX264Enc))
#define GST_X264_ENC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_X264_ENC,GstX264EncClass))
#define GST_IS_X264_ENC(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_X264_ENC))
#define GST_IS_X264_ENC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_X264_ENC))

typedef struct _GstX264Enc GstX264Enc;
typedef struct _GstX264EncClass GstX264EncClass;
typedef struct _GstX264EncVTable GstX264EncVTable;

struct _GstX264Enc
{
  GstVideoEncoder element;

  /*< private >*/
  GstX264EncVTable *vtable;
  x264_t *x264enc;
  x264_param_t x264param;
  gint current_byte_stream;

  /* List of frame/buffer mapping structs for
   * pending frames */
  GList *pending_frames;

  /* properties */
  guint threads;
  gboolean sliced_threads;
  gint sync_lookahead;
  gint pass;
  guint quantizer;
  gchar *mp_cache_file;
  gboolean byte_stream;
  guint bitrate;
  gboolean intra_refresh;
  gint me;
  guint subme;
  guint analyse;
  gboolean dct8x8;
  guint ref;
  guint bframes;
  gboolean b_adapt;
  gboolean b_pyramid;
  gboolean weightb;
  guint sps_id;
  gboolean au_nalu;
  gboolean trellis;
  guint vbv_buf_capacity;
  guint keyint_max;
  gboolean cabac;
  gfloat ip_factor;
  gfloat pb_factor;
  guint qp_min;
  guint qp_max;
  guint qp_step;
  gboolean mb_tree;
  gint rc_lookahead;
  guint noise_reduction;
  gboolean interlaced;
  gint speed_preset;
  gint psy_tune;
  guint tune;
  GString *tunings;
  GString *option_string_prop; /* option-string property */
  GString *option_string; /* used by set prop */
  gint frame_packing;
  gboolean insert_vui;

  /* input description */
  GstVideoCodecState *input_state;

  /* configuration changed  while playing */
  gboolean reconfig;

  /* from the downstream caps */
  const gchar *peer_profile;
  gboolean peer_intra_profile;
  gint peer_level_idc;

  /* cached values to set x264_picture_t */
  gint x264_nplanes;

  GstEncoderBitrateProfileManager *bitrate_manager;
};

struct _GstX264EncClass
{
  GstVideoEncoderClass parent_class;
};

GType gst_x264_enc_get_type (void);

G_END_DECLS

#endif /* __GST_X264_ENC_H__ */