1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee INTEL CONFIDENTIAL
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Copyright 2009 Intel Corporation All Rights Reserved.
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef __MIX_VIDEOFORMATENC_H264_H__
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define __MIX_VIDEOFORMATENC_H264_H__
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc.h"
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoframe_private.h"
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEO_ENC_H264_SURFACE_NUM       20
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define min(X,Y) (((X) < (Y)) ? (X) : (Y))
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define max(X,Y) (((X) > (Y)) ? (X) : (Y))
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Type macros.
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_TYPE_VIDEOFORMATENC_H264                  (mix_videoformatenc_h264_get_type ())
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEOFORMATENC_H264(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIX_TYPE_VIDEOFORMATENC_H264, MixVideoFormatEnc_H264))
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_IS_VIDEOFORMATENC_H264(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIX_TYPE_VIDEOFORMATENC_H264))
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEOFORMATENC_H264_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MIX_TYPE_VIDEOFORMATENC_H264, MixVideoFormatEnc_H264Class))
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_IS_VIDEOFORMATENC_H264_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), MIX_TYPE_VIDEOFORMATENC_H264))
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEOFORMATENC_H264_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), MIX_TYPE_VIDEOFORMATENC_H264, MixVideoFormatEnc_H264Class))
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct _MixVideoFormatEnc_H264 MixVideoFormatEnc_H264;
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leetypedef struct _MixVideoFormatEnc_H264Class MixVideoFormatEnc_H264Class;
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestruct _MixVideoFormatEnc_H264 {
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*< public > */
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc parent;
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VABufferID      coded_buf;
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VABufferID      seq_param_buf;
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VABufferID      pic_param_buf;
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VABufferID      slice_param_buf;
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VASurfaceID *   ci_shared_surfaces;
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VASurfaceID *   surfaces;
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint           surface_num;
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFrame  *cur_fame;	//current input frame to be encoded;
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFrame  *ref_fame;  //reference frame
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFrame  *rec_fame;	//reconstructed frame;
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint basic_unit_size;  //for rate control
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint disable_deblocking_filter_idc;
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixDelimiterType delimiter_type;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint slice_num;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint va_rcmode;
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint       encoded_frames;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gboolean    pic_skipped;
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gboolean    is_intra;
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint       coded_buf_size;
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*< public > */
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * MixVideoFormatEnc_H264Class:
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * MI-X Video object class
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestruct _MixVideoFormatEnc_H264Class {
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*< public > */
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatEncClass parent_class;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* class members */
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*< public > */
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee};
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_videoformatenc_h264_get_type:
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: type
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Get the type of object.
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeGType mix_videoformatenc_h264_get_type(void);
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_videoformatenc_h264_new:
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: A newly allocated instance of #MixVideoFormatEnc_H264
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Use this method to create new instance of #MixVideoFormatEnc_H264
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_H264 *mix_videoformatenc_h264_new(void);
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_videoformatenc_h264_ref:
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @mix: object to add reference
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: the MixVideoFormatEnc_H264 instance where reference count has been increased.
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Add reference count.
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_H264 *mix_videoformatenc_h264_ref(MixVideoFormatEnc_H264 * mix);
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_videoformatenc_h264_unref:
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @obj: object to unref.
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Decrement reference count of the object.
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define mix_videoformatenc_h264_unref(obj) g_object_unref (G_OBJECT(obj))
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Class Methods */
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* H.264 vmethods */
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_getcaps(MixVideoFormatEnc *mix, GString *msg);
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_initialize(MixVideoFormatEnc *mix,
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay va_display);
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[],
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params);
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_flush(MixVideoFormatEnc *mix);
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_eos(MixVideoFormatEnc *mix);
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_deinitialize(MixVideoFormatEnc *mix);
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_get_max_encoded_buf_size (MixVideoFormatEnc *mix, guint * max_size);
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Local Methods */
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_process_encode (MixVideoFormatEnc_H264 *mix, MixBuffer * bufin,
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixIOVec * iovout);
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_h264_AnnexB_to_length_prefixed (
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        guint8 * bufin, guint bufin_len, guint8* bufout, guint *bufout_len);
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* __MIX_VIDEOFORMATENC_H264_H__ */
138