h264 encoder: implement h264 encoder
[vaapi:windyuan-gstreamer-vaapi.git] / gst-libs / gst / vaapi / gstvaapiencoder_h264_priv.h
1 /*
2  *  gstvaapiencoder_h264_priv.h -  H.264 encoder (private definitions)
3  *
4  *  Copyright (C) 2013 Intel Corporation
5  *
6  *  This library is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU Lesser General Public License
8  *  as published by the Free Software Foundation; either version 2.1
9  *  of the License, or (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  *  Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public
17  *  License along with this library; if not, write to the Free
18  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  *  Boston, MA 02110-1301 USA
20  */
21
22 #ifndef GST_VAAPI_ENCODER_H264_PRIV_H
23 #define GST_VAAPI_ENCODER_H264_PRIV_H
24
25 #include <glib.h>
26 #include <gst/vaapi/gstvaapiencoder.h>
27 #include <gst/vaapi/gstvaapiencoder_priv.h>
28
29 G_BEGIN_DECLS
30
31 #define GST_VAAPI_ENCODER_H264(encoder)  \
32         ((GstVaapiEncoderH264 *)(encoder))
33
34 #define GST_VAAPI_ENCODER_H264_CAST(encoder) \
35         ((GstVaapiEncoderH264 *)(encoder))
36
37 #define GST_VAAPI_ENCODER_H264_CLASS(klass) \
38     ((GstVaapiEncoderH264Class *)(klass))
39
40 #define GST_IS_VAAPI_ENCODER_H264_CLASS(klass) \
41     ((klass) != NULL)
42
43 #define GST_VAAPI_ENCODER_H264_GET_CLASS(obj) \
44     GST_VAAPI_ENCODER_H264_CLASS(GST_VAAPI_MINI_OBJECT_GET_CLASS(obj))
45
46 typedef struct _GstVaapiEncoderH264Class         GstVaapiEncoderH264Class;
47
48 typedef enum {
49   GST_VAAPI_ENCODER_H264_LEVEL_10 = 10,  /* QCIF format, < 380160 samples/sec */
50   GST_VAAPI_ENCODER_H264_LEVEL_11 = 11,  /* CIF format,   < 768000 samples/sec */
51   GST_VAAPI_ENCODER_H264_LEVEL_12 = 12,  /* CIF format,   < 1536000  samples/sec */
52   GST_VAAPI_ENCODER_H264_LEVEL_13 = 13,  /* CIF format,   < 3041280  samples/sec */
53   GST_VAAPI_ENCODER_H264_LEVEL_20 = 20,  /* CIF format,   < 3041280  samples/sec */
54   GST_VAAPI_ENCODER_H264_LEVEL_21 = 21,  /* HHR format,  < 5068800  samples/sec */
55   GST_VAAPI_ENCODER_H264_LEVEL_22 = 22,  /* SD/4CIF format,     < 5184000      samples/sec */
56   GST_VAAPI_ENCODER_H264_LEVEL_30 = 30,  /* SD/4CIF format,     < 10368000    samples/sec */
57   GST_VAAPI_ENCODER_H264_LEVEL_31 = 31,  /* 720pHD format,      < 27648000    samples/sec */
58   GST_VAAPI_ENCODER_H264_LEVEL_32 = 32,  /* SXGA  format,         < 55296000    samples/sec */
59   GST_VAAPI_ENCODER_H264_LEVEL_40 = 40,  /* 2Kx1K format,         < 62914560    samples/sec */
60   GST_VAAPI_ENCODER_H264_LEVEL_41 = 41,  /* 2Kx1K format,         < 62914560    samples/sec */
61   GST_VAAPI_ENCODER_H264_LEVEL_42 = 42,  /* 2Kx1K format,         < 125829120  samples/sec */
62   GST_VAAPI_ENCODER_H264_LEVEL_50 = 50,  /* 3672x1536 format,  < 150994944  samples/sec */
63   GST_VAAPI_ENCODER_H264_LEVEL_51 = 51,  /* 4096x2304 format,  < 251658240  samples/sec */
64 } GstVaapiEncoderH264Level;
65
66 #define GST_VAAPI_ENCODER_H264_DEFAULT_PROFILE      GST_VAAPI_PROFILE_H264_BASELINE
67 #define GST_VAAPI_ENCODER_H264_DEFAULT_LEVEL        GST_VAAPI_ENCODER_H264_LEVEL_31
68 #define GST_VAAPI_ENCODER_H264_DEFAULT_INIT_QP      26
69 #define GST_VAAPI_ENCODER_H264_DEFAULT_MIN_QP       1
70 #define GST_VAAPI_ENCODER_H264_DEFAULT_INTRA_PERIOD 30
71 #define GST_VAAPI_ENCODER_H264_MAX_INTRA_PERIOD     512
72 #define GST_VAAPI_ENCODER_H264_MAX_IDR_PERIOD       512
73
74 #define GST_VAAPI_ENCODER_H264_DEFAULT_SLICE_NUM    1
75
76
77 struct _GstVaapiEncoderH264 {
78     GstVaapiEncoder        parent;
79
80     /* public */
81     guint32                profile;
82     guint32                level;
83     guint32                bitrate;  /*kbps*/
84     guint32                intra_period;
85     guint32                idr_period;
86     guint32                init_qp;  /*default 24*/
87     guint32                min_qp;   /*default 1*/
88     guint32                slice_num;
89     guint32                b_frame_num;
90
91     /* private */
92     gboolean               is_avc;  /* avc or bytestream */
93     /* re-ordering */
94     GQueue                 reorder_frame_list;
95     guint                  frame_index;
96     guint                  cur_frame_num;
97     guint                  cur_present_index;
98     GstClockTime           cts_offset;
99
100     /* reference list */
101     GQueue                 ref_list;
102     guint                  max_ref_num;
103
104     /* frame, poc */
105     guint32           max_frame_num;
106     guint32           log2_max_frame_num;
107     guint32           max_pic_order_cnt;
108     guint32           log2_max_pic_order_cnt;
109     guint32           idr_num;
110
111     GstBuffer        *sps_data;
112     GstBuffer        *pps_data;
113
114 };
115
116 struct _GstVaapiEncoderH264Class {
117     /*< private >*/
118     GstVaapiEncoderClass parent_class;
119 };
120
121 G_END_DECLS
122
123 #endif /*GST_VAAPI_ENCODER_H264_PRIV_H */