c5da350e89ea3cc02baac655dc1086b841883b17
[platform/upstream/gstreamer-vaapi.git] / gst-libs / gst / vaapi / gstvaapiencoder_mpeg2_priv.h
1 /*
2  *  gstvaapiencoder_mpeg2_priv.h - MPEG-2 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_MPEG2_PRIV_H
23 #define GST_VAAPI_ENCODER_MPEG2_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_MPEG2(encoder)  \
32         ((GstVaapiEncoderMpeg2 *)(encoder))
33 #define GST_VAAPI_ENCODER_MPEG2_CAST(encoder) \
34         ((GstVaapiEncoderMpeg2 *)(encoder))
35 #define GST_VAAPI_ENCODER_MPEG2_CLASS(klass) \
36     ((GstVaapiEncoderMpeg2Class *)(klass))
37 #define GST_IS_VAAPI_ENCODER_MPEG2_CLASS(klass) \
38     ((klass) != NULL)
39 #define GST_VAAPI_ENCODER_MPEG2_GET_CLASS(obj) \
40     GST_VAAPI_ENCODER_MPEG2_CLASS(GST_VAAPI_MINI_OBJECT_GET_CLASS(obj))
41
42 typedef struct _GstVaapiEncoderMpeg2Class GstVaapiEncoderMpeg2Class;
43
44 typedef enum
45 {
46   GST_ENCODER_MPEG2_PROFILE_SIMPLE,
47   GST_ENCODER_MPEG2_PROFILE_MAIN,
48 } GstEncoderMpeg2Level;
49
50 typedef enum
51 {
52   GST_VAAPI_ENCODER_MPEG2_LEVEL_LOW,
53   GST_VAAPI_ENCODER_MPEG2_LEVEL_MAIN,
54   GST_VAAPI_ENCODER_MPEG2_LEVEL_HIGH
55 } GstVaapiEncoderMpeg2Level;
56
57 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_PROFILE      GST_ENCODER_MPEG2_PROFILE_MAIN
58 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_LEVEL        GST_VAAPI_ENCODER_MPEG2_LEVEL_HIGH
59 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_RATE_CONTROL GST_VAAPI_RATECONTROL_CQP
60
61 #define GST_VAAPI_ENCODER_MPEG2_MIN_CQP                 2
62 #define GST_VAAPI_ENCODER_MPEG2_MAX_CQP                 62
63 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_CQP             8
64
65 #define GST_VAAPI_ENCODER_MPEG2_MAX_GOP_SIZE            512
66 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_GOP_SIZE        30
67
68 #define GST_VAAPI_ENCODER_MPEG2_MAX_MAX_BFRAMES         16
69 #define GST_VAAPI_ENCODER_MPEG2_DEFAULT_MAX_BFRAMES     2
70
71 #define GST_VAAPI_ENCODER_MPEG2_MAX_BITRATE             100*1024
72
73 #define START_CODE_PICUTRE      0x00000100
74 #define START_CODE_SLICE        0x00000101
75 #define START_CODE_USER         0x000001B2
76 #define START_CODE_SEQ          0x000001B3
77 #define START_CODE_EXT          0x000001B5
78 #define START_CODE_GOP          0x000001B8
79
80 #define CHROMA_FORMAT_RESERVED  0
81 #define CHROMA_FORMAT_420       1
82 #define CHROMA_FORMAT_422       2
83 #define CHROMA_FORMAT_444       3
84
85 struct _GstVaapiEncoderMpeg2
86 {
87   GstVaapiEncoder parent;
88
89   /* public */
90   guint32 profile;
91   guint32 level;
92   guint32 bitrate;              /*kbps */
93   guint32 cqp;
94   guint32 intra_period;
95   guint32 ip_period;
96
97   /* re-ordering */
98   GQueue b_frames;
99   gboolean dump_frames;
100   gboolean new_gop;
101
102   /* reference list */
103   GstVaapiSurfaceProxy *forward;
104   GstVaapiSurfaceProxy *backward;
105   guint32 frame_num;            /* same value picture header, but it's not mod by 1024 */
106 };
107
108 struct _GstVaapiEncoderMpeg2Class
109 {
110   /*< private > */
111   GstVaapiEncoderClass parent_class;
112 };
113
114 G_END_DECLS
115
116 #endif /* GST_VAAPI_ENCODER_MPEG2_PRIV_H */