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#include <glib.h>
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <string.h>
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <stdlib.h>
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h"
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_mpeg4.h"
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_mpeg4.h"
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MDEBUG
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#undef SHOW_SRC
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeWindow win = 0;
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* The parent class. The pointer will be saved
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * in this class's initialization. The pointer
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * can be used for chaining method call if needed.
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MixVideoFormatEncClass *parent_class = NULL;
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_mpeg4_finalize(GObject * obj);
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Please note that the type we pass to G_DEFINE_TYPE is MIX_TYPE_VIDEOFORMATENC
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE (MixVideoFormatEnc_MPEG4, mix_videoformatenc_mpeg4, MIX_TYPE_VIDEOFORMATENC);
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_mpeg4_init(MixVideoFormatEnc_MPEG4 * self) {
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(self);
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: public member initialization */
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: private member initialization */
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->encoded_frames = 0;
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->pic_skipped = FALSE;
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->is_intra = TRUE;
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->cur_fame = NULL;
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->ref_fame = NULL;
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->rec_fame = NULL;
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->ci_shared_surfaces = NULL;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->surfaces= NULL;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->surface_num = 0;
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent->initialized = FALSE;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_mpeg4_class_init(
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_MPEG4Class * klass) {
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* root class */
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    GObjectClass *gobject_class = (GObjectClass *) klass;
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* direct parent class */
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *video_formatenc_class =
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MIX_VIDEOFORMATENC_CLASS(klass);
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* parent class for later use */
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent_class = g_type_class_peek_parent(klass);
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* setup finializer */
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gobject_class->finalize = mix_videoformatenc_mpeg4_finalize;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* setup vmethods with base implementation */
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to override the parent's methods */
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->getcaps = mix_videofmtenc_mpeg4_getcaps;
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->initialize = mix_videofmtenc_mpeg4_initialize;
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->encode = mix_videofmtenc_mpeg4_encode;
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->flush = mix_videofmtenc_mpeg4_flush;
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->eos = mix_videofmtenc_mpeg4_eos;
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->deinitialize = mix_videofmtenc_mpeg4_deinitialize;
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->getmaxencodedbufsize = mix_videofmtenc_mpeg4_get_max_encoded_buf_size;
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_MPEG4 *
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_mpeg4_new(void) {
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_MPEG4 *ret =
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_object_new(MIX_TYPE_VIDEOFORMATENC_MPEG4, NULL);
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return ret;
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformatenc_mpeg4_finalize(GObject * obj) {
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* clean up here. */
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*MixVideoFormatEnc_MPEG4 *mix = MIX_VIDEOFORMATENC_MPEG4(obj); */
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    GObjectClass *root_class = (GObjectClass *) parent_class;
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "\n");
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Chain up parent */
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (root_class->finalize) {
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        root_class->finalize(obj);
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_MPEG4 *
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_mpeg4_ref(MixVideoFormatEnc_MPEG4 * mix) {
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return (MixVideoFormatEnc_MPEG4 *) g_object_ref(G_OBJECT(mix));
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*MPEG-4:2 vmethods implementation */
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_getcaps(MixVideoFormatEnc *mix, GString *msg) {
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: add codes for MPEG-4:2 */
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * if we do, the following is the code:
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     */
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "mix_videofmtenc_mpeg4_getcaps\n");
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->getcaps) {
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->getcaps(mix, msg);
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_initialize(MixVideoFormatEnc *mix,
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay va_display ) {
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoConfigParamsEncMPEG4 * config_params_enc_mpeg4;
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status = VA_STATUS_SUCCESS;
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VASurfaceID * surfaces;
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gint va_max_num_profiles, va_max_num_entrypoints, va_max_num_attribs;
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gint va_num_profiles,  va_num_entrypoints;
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAProfile *va_profiles = NULL;
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAEntrypoint *va_entrypoints = NULL;
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAConfigAttrib va_attrib[2];
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint index;
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*frame_mgr and input_buf_pool is reservered for future use*/
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL || config_params_enc == NULL || va_display == NULL) {
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix == NULL || config_params_enc == NULL || va_display == NULL\n");
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "begin\n");
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO additional parameter checking
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Chainup parent method. */
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->initialize) {
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = parent_class->initialize(mix, config_params_enc,
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                frame_mgr, input_buf_pool, surface_pool,
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_display);
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS)
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return ret;
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //disable it currently
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix))
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix);
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (MIX_IS_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc)) {
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            config_params_enc_mpeg4 =
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MIX_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc);
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        } else {
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "mix_videofmtenc_mpeg4_initialize:  no mpeg4 config params found\n");
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_lock(parent->objectlock);
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Start to get properities from MPEG-4:2 params\n");
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* get properties from MPEG4 params Object, which is special to MPEG4 format*/
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videoconfigparamsenc_mpeg4_get_profile_level (config_params_enc_mpeg4,
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &self->profile_and_level_indication);
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS) {
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //TODO cleanup
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to mix_videoconfigparamsenc_mpeg4_get_profile_level\n");
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videoconfigparamsenc_mpeg4_get_fixed_vti (config_params_enc_mpeg4,
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &(self->fixed_vop_time_increment));
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS) {
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //TODO cleanup
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to mix_videoconfigparamsenc_mpeg4_get_fixed_vti\n");
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videoconfigparamsenc_mpeg4_get_dlk (config_params_enc_mpeg4,
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &(self->disable_deblocking_filter_idc));
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS) {
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //TODO cleanup
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to config_params_enc_mpeg4\n");
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "======MPEG4 Encode Object properities======:\n");
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "self->profile_and_level_indication = %d\n",
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->profile_and_level_indication);
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "self->fixed_vop_time_increment = %d\n\n",
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->fixed_vop_time_increment);
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Get properities from params done\n");
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    	//display = XOpenDisplay(NULL);
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     	//va_display = vaGetDisplay (videoencobj->display);
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->va_display = va_display;
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "Get Display\n");
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Display = 0x%08x\n",
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint)va_display);
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //va_status = vaInitialize(va_display, &va_major_ver, &va_minor_ver);
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //g_print ("vaInitialize va_status = %d\n", va_status);
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* query the vender information, can ignore*/
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_vendor = vaQueryVendorString (va_display);
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Vendor = %s\n",
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_vendor);
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*get the max number for profiles/entrypoints/attribs*/
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_profiles = vaMaxNumProfiles(va_display);
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_profiles = %d\n",
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_profiles);
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_entrypoints = vaMaxNumEntrypoints(va_display);
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_entrypoints = %d\n",
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_entrypoints);
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_attribs = vaMaxNumConfigAttributes(va_display);
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_attribs = %d\n",
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_attribs);
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_profiles = g_malloc(sizeof(VAProfile)*va_max_num_profiles);
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_entrypoints = g_malloc(sizeof(VAEntrypoint)*va_max_num_entrypoints);
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_profiles == NULL || va_entrypoints ==NULL)
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "!va_profiles || !va_entrypoints\n");
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I(
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "va_profiles = 0x%08x\n", (guint)va_profiles);
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigProfiles\n");
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaQueryConfigProfiles (va_display, va_profiles, &va_num_profiles);
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaQueryConfigProfiles\n");
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigProfiles Done\n");
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*check whether profile is supported*/
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for(index= 0; index < va_num_profiles; index++) {
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if(parent->va_profile == va_profiles[index])
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(index == va_num_profiles)
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Profile not supported\n");
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigEntrypoints\n");
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*Check entry point*/
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaQueryConfigEntrypoints(va_display,
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_profile,
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_entrypoints, &va_num_entrypoints);
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaQueryConfigEntrypoints\n");
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for (index = 0; index < va_num_entrypoints; index ++) {
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_entrypoints[index] == VAEntrypointEncSlice) {
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (index == va_num_entrypoints) {
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Entrypoint not found\n");
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*free profiles and entrypoints*/
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free(va_profiles);
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (va_entrypoints);
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[0].type = VAConfigAttribRTFormat;
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[1].type = VAConfigAttribRateControl;
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaGetConfigAttributes\n");
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaGetConfigAttributes(va_display, parent->va_profile,
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint,
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &va_attrib[0], 2);
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaGetConfigAttributes\n");
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if ((va_attrib[0].value & parent->va_format) == 0) {
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Matched format not found\n");
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if ((va_attrib[1].value & parent->va_rcmode) == 0) {
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "RC mode not found\n");
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[0].value = parent->va_format; //VA_RT_FORMAT_YUV420;
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[1].value = parent->va_rcmode;
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "======VA Configuration======\n");
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "profile = %d\n",
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_profile);
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_entrypoint = %d\n",
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint);
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[0].type = %d\n",
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[0].type);
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[1].type = %d\n",
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[1].type);
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[0].value (Format) = %d\n",
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[0].value);
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[1].value (RC mode) = %d\n",
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[1].value);
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateConfig\n");
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateConfig(va_display, parent->va_profile,
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint,
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &va_attrib[0], 2, &(parent->va_config));
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaCreateConfig\n");
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*TODO: compute the surface number*/
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        int numSurfaces;
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            numSurfaces = 2;
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            numSurfaces = 8;
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parent->ci_frame_num = 0;
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surface_num = numSurfaces + parent->ci_frame_num;
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        surfaces = g_malloc(sizeof(VASurfaceID)*numSurfaces);
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (surfaces == NULL)
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed allocate surface\n");
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateSurfaces\n");
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateSurfaces(va_display, parent->picture_width,
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_height, parent->va_format,
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                numSurfaces, surfaces);
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO check vret and return fail if needed
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed vaCreateSurfaces\n");
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "We are in share buffer mode!\n");
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->ci_shared_surfaces =
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_malloc(sizeof(VASurfaceID) * parent->ci_frame_num);
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (self->ci_shared_surfaces == NULL)
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed allocate shared surface\n");
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_unlock(parent->objectlock);
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_NO_MEMORY;
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint index;
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for(index = 0; index < parent->ci_frame_num; index++) {
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I( "ci_frame_id = %lu\n",
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        parent->ci_frame_id[index]);
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_V(
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "vaCreateSurfaceFromCIFrame\n");
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_status = vaCreateSurfaceFromCIFrame(va_display,
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        (gulong) (parent->ci_frame_id[index]),
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        &self->ci_shared_surfaces[index]);
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (va_status != VA_STATUS_SUCCESS)
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to vaCreateSurfaceFromCIFrame\n");
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    g_mutex_unlock(parent->objectlock);
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "vaCreateSurfaceFromCIFrame Done\n");
508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }// if (parent->share_buf_mode)
510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surfaces = g_malloc(sizeof(VASurfaceID) * self->surface_num);
512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (self->surfaces == NULL)
514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed allocate private surface\n");
517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /*shared surfaces should be put in pool first,
524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee             * because we will get it accoring to CI index*/
525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for(index = 0; index < parent->ci_frame_num; index++)
526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->surfaces[index] = self->ci_shared_surfaces[index];
527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for(index = 0; index < numSurfaces; index++) {
530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->surfaces[index + parent->ci_frame_num] = surfaces[index];
531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "assign surface Done\n");
534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Created %d libva surfaces\n",
535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                numSurfaces + parent->ci_frame_num);
536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0  //current put this in gst
538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        images = g_malloc(sizeof(VAImage)*numSurfaces);
539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (images == NULL)
540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for (index = 0; index < numSurfaces; index++) {
546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //Derive an VAImage from an existing surface.
547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //The image buffer can then be mapped/unmapped for CPU access
548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDeriveImage(va_display, surfaces[index],
549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    &images[index]);
550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "mix_surfacepool_new\n");
554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->surfacepool = mix_surfacepool_new();
556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (surface_pool)
557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *surface_pool = parent->surfacepool;
558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //which is useful to check before encode
559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->surfacepool == NULL)
561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to mix_surfacepool_new\n");
564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix_surfacepool_initialize\n");
571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_surfacepool_initialize(parent->surfacepool,
573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->surfaces, parent->ci_frame_num + numSurfaces);
574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        switch (ret)
576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MIX_RESULT_SUCCESS:
578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MIX_RESULT_ALREADY_INIT:
580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                //TODO cleanup and/or retry
581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_free (surfaces);
582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_unlock(parent->objectlock);
583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            default:
585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //Initialize and save the VA context ID
590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateContext\n");
591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateContext(va_display, parent->va_config,
593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width, parent->picture_height,
594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VA_PROGRESSIVE, self->surfaces, parent->ci_frame_num + numSurfaces,
595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &(parent->va_context));
596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I(
598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Created libva context width %d, height %d\n",
599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width, parent->picture_height);
600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateContext\n");
605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "va_status = %d\n",
606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (guint)va_status);
607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 guint max_size = 0;
613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videofmtenc_mpeg4_get_max_encoded_buf_size (parent, &max_size);
614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to mix_videofmtenc_mpeg4_get_max_encoded_buf_size\n");
618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*Create coded buffer for output*/
625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateBuffer (va_display, parent->va_context,
626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VAEncCodedBufferType,
627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->coded_buf_size,  //
628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                1, NULL,
629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &self->coded_buf);
630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateBuffer: VAEncCodedBufferType\n");
635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC
641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        Display * display = XOpenDisplay (NULL);
642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "display = 0x%08x\n",
644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) display);
645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        win = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0,
646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width,  parent->picture_height, 0, 0,
647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                WhitePixel(display, 0));
648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XMapWindow(display, win);
649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XSelectInput(display, win, KeyPressMask | StructureNotifyMask);
650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XSync(display, False);
652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_display = 0x%08x\n",
653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) va_display);
654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */
656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->initialized = TRUE;
658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (surfaces);
661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
676bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[],
677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params) {
679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*currenly only support one input and output buffer*/
686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO: params i
687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (bufincnt != 1 || iovoutcnt != 1) {
689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "buffer count not equel to 1\n");
691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "maybe some exception occurs\n");
693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL ||bufin[0] == NULL ||  iovout[0] == NULL) {
696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "!mix || !bufin[0] ||!iovout[0]\n");
698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO: encode_params is reserved here for future usage.
702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     *      * * if we do, the following is the code:
705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * */
706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->encode) {
709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->encode(mix, bufin, bufincnt, iovout,
710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                iovoutcnt, encode_params);
711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix))
715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4 (mix);
719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "Locking\n");
721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_lock(parent->objectlock);
722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO: also we could move some encode Preparation work to here
725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix_videofmtenc_mpeg4_process_encode\n");
728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videofmtenc_mpeg4_process_encode (self,
730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                bufin[0], iovout[0]);
731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed mix_videofmtenc_mpeg4_process_encode\n");
735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "UnLocking\n");
740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
755bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_flush(MixVideoFormatEnc *mix) {
756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //MIX_RESULT ret = MIX_RESULT_SUCCESS;
758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*not chain to parent flush func*/
768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->flush) {
770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->flush(mix, msg);
771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix);
775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_lock(mix->objectlock);
777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the current source surface*/
779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->cur_fame != NULL)
780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->cur_fame);
782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->cur_fame = NULL;
783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reconstructed surface*/
786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->rec_fame != NULL)
787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->rec_fame);
789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->rec_fame = NULL;
790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reference surface*/
793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ref_fame != NULL)
794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->ref_fame);
796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ref_fame = NULL;
797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*reset the properities*/
800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->encoded_frames = 0;
801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->pic_skipped = FALSE;
802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->is_intra = TRUE;
803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_unlock(mix->objectlock);
805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
811bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_eos(MixVideoFormatEnc *mix) {
812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: add codes for MPEG-4:2 */
814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * if we do, the following is the code:
817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     */
818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "\n");
820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->eos) {
827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->eos(mix);
828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
832bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_deinitialize(MixVideoFormatEnc *mix) {
833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status;
836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent = MIX_VIDEOFORMATENC(&(mix->parent));
845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4(mix);
846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Release frames\n");
848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_lock(parent->objectlock);
850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the current source surface*/
853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->cur_fame != NULL)
854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->cur_fame);
856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->cur_fame = NULL;
857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reconstructed surface*/
861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->rec_fame != NULL)
862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->rec_fame);
864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->rec_fame = NULL;
865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reference surface*/
868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ref_fame != NULL)
869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->ref_fame);
871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ref_fame = NULL;
872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Release surfaces\n");
875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ci_shared_surfaces)
877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (self->ci_shared_surfaces);
879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ci_shared_surfaces = NULL;
880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->surfaces)
883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (self->surfaces);
885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surfaces = NULL;
886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "vaDestroyContext\n");
889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    va_status = vaDestroyContext (parent->va_display, parent->va_context);
891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (va_status != VA_STATUS_SUCCESS)
892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed vaDestroyContext\n");
895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "vaDestroyConfig\n");
900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    va_status = vaDestroyConfig (parent->va_display, parent->va_config);
902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (va_status != VA_STATUS_SUCCESS)
903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed vaDestroyConfig\n");
906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent->initialized = TRUE;
911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_unlock(parent->objectlock);
913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1
915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->deinitialize) {
916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->deinitialize(mix);
917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //Most stuff is cleaned up in parent_class->finalize()
921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
927bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_seq_params (MixVideoFormatEnc_MPEG4 *mix)
928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status;
931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAEncSequenceParameterBufferMPEG4 mpeg4_seq_param;
932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VABufferID				seq_para_buf_id;
933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL)
938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n\n");
941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix))
943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*set up the sequence params for HW*/
947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.profile_and_level_indication = mix->profile_and_level_indication;  //TODO, hard code now
948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.video_object_layer_width= parent->picture_width;
949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.video_object_layer_height= parent->picture_height;
950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.vop_time_increment_resolution =
951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			(unsigned int) (parent->frame_rate_num + parent->frame_rate_denom /2 ) / parent->frame_rate_denom;
952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.fixed_vop_time_increment= mix->fixed_vop_time_increment;
953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.bits_per_second= parent->bitrate;
954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.frame_rate =
955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			(unsigned int) (parent->frame_rate_num + parent->frame_rate_denom /2 ) / parent->frame_rate_denom;
956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.initial_qp = parent->initial_qp;
957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.min_qp = parent->min_qp;
958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_seq_param.intra_period = parent->intra_period;
959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //mpeg4_seq_param.fixed_vop_rate = 30;
962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "===mpeg4 sequence params===\n");
967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "profile_and_level_indication = %d\n",
969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint)mpeg4_seq_param.profile_and_level_indication);
970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "intra_period = %d\n",
971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.intra_period);
972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "video_object_layer_width = %d\n",
973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.video_object_layer_width);
974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "video_object_layer_height = %d\n",
975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.video_object_layer_height);
976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "vop_time_increment_resolution = %d\n",
977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.vop_time_increment_resolution);
978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "fixed_vop_rate = %d\n",
979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.fixed_vop_rate);
980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "fixed_vop_time_increment = %d\n",
981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.fixed_vop_time_increment);
982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "bitrate = %d\n",
983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.bits_per_second);
984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "frame_rate = %d\n",
985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.frame_rate);
986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "initial_qp = %d\n",
987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.initial_qp);
988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "min_qp = %d\n",
989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.min_qp);
990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "intra_period = %d\n\n",
991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_seq_param.intra_period);
992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateBuffer(parent->va_display, parent->va_context,
994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VAEncSequenceParameterBufferType,
995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                sizeof(mpeg4_seq_param),
996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                1, &mpeg4_seq_param,
997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &seq_para_buf_id);
998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateBuffer\n");
1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaRenderPicture(parent->va_display, parent->va_context,
1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &seq_para_buf_id, 1);
1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaRenderPicture\n");
1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "va_status = %d\n", va_status);
1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_picture_parameter (MixVideoFormatEnc_MPEG4 *mix)
1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status;
1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAEncPictureParameterBufferMPEG4 mpeg4_pic_param;
1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL)
1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n\n");
1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 //not needed currently
1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoConfigParamsEncMPEG4 * params_mpeg4
1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        = MIX_VIDEOCONFIGPARAMSENC_MPEG4 (config_params_enc);
1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix)) {
1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*set picture params for HW*/
1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.reference_picture = mix->ref_fame->frame_id;
1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.reconstructed_picture = mix->rec_fame->frame_id;
1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.coded_buf = mix->coded_buf;
1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.picture_width = parent->picture_width;
1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.picture_height = parent->picture_height;
1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.vop_time_increment= mix->encoded_frames;
1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mpeg4_pic_param.picture_type = mix->is_intra ? VAEncPictureTypeIntra : VAEncPictureTypePredictive;
1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "======mpeg4 picture params======\n");
1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "reference_picture = 0x%08x\n",
1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.reference_picture);
1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "reconstructed_picture = 0x%08x\n",
1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.reconstructed_picture);
1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "coded_buf = 0x%08x\n",
1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.coded_buf);
1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "picture_width = %d\n",
1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.picture_width);
1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "picture_height = %d\n",
1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.picture_height);
1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "vop_time_increment = %d\n",
1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.vop_time_increment);
1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "picture_type = %d\n\n",
1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mpeg4_pic_param.picture_type);
1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateBuffer(parent->va_display, parent->va_context,
1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VAEncPictureParameterBufferType,
1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                sizeof(mpeg4_pic_param),
1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                1,&mpeg4_pic_param,
1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &mix->pic_param_buf);
1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateBuffer\n");
1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaRenderPicture(parent->va_display, parent->va_context,
1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &mix->pic_param_buf, 1);
1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaRenderPicture\n");
1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "va_status = %d\n", va_status);
1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_send_slice_parameter (MixVideoFormatEnc_MPEG4 *mix)
1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status;
1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint slice_height;
1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint slice_index;
1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint slice_height_in_mb;
1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL)
1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n\n");
1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix))
1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_height = parent->picture_height;
1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_height += 15;
1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_height &= (~15);
1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VAEncSliceParameterBuffer slice_param;
1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_index = 0;
1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_height_in_mb = slice_height / 16;
1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_param.start_row_number = 0;
1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_param.slice_height = slice_height / 16;
1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_param.slice_flags.bits.is_intra = mix->is_intra;
1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        slice_param.slice_flags.bits.disable_deblocking_filter_idc
1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            = mix->disable_deblocking_filter_idc;
1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "======mpeg4 slice params======\n");
1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "start_row_number = %d\n",
1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (gint) slice_param.start_row_number);
1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "slice_height_in_mb = %d\n",
1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (gint) slice_param.slice_height);
1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "slice.is_intra = %d\n",
1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (gint) slice_param.slice_flags.bits.is_intra);
1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "disable_deblocking_filter_idc = %d\n\n",
1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (gint) mix->disable_deblocking_filter_idc);
1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateBuffer (parent->va_display, parent->va_context,
1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VAEncSliceParameterBufferType,
1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                sizeof(VAEncSliceParameterBuffer),
1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                1, &slice_param,
1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &mix->slice_param_buf);
1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateBuffer\n");
1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaRenderPicture(parent->va_display, parent->va_context,
1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &mix->slice_param_buf, 1);
1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaRenderPicture\n");
1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
1190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1198bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_process_encode (MixVideoFormatEnc_MPEG4 *mix,
1199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBuffer * bufin, MixIOVec * iovout)
1200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
1201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
1203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status = VA_STATUS_SUCCESS;
1204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VADisplay va_display = NULL;
1205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAContextID va_context;
1206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gulong surface = 0;
1207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint16 width, height;
1208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFrame *  tmp_fame;
1210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint8 *buf;
1211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if ((mix == NULL) || (bufin == NULL) || (iovout == NULL)) {
1213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix == NUL) || bufin == NULL || iovout == NULL\n");
1215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
1216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
1219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(mix))
1221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(&(mix->parent));
1224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_display = parent->va_display;
1226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_context = parent->va_context;
1227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        width = parent->picture_width;
1228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        height = parent->picture_height;
1229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "encoded_frames = %d\n",
1232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->encoded_frames);
1233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "is_intra = %d\n",
1234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->is_intra);
1235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "ci_frame_id = 0x%08x\n",
1236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) parent->ci_frame_id);
1237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* determine the picture type*/
1239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if ((mix->encoded_frames % parent->intra_period) == 0) {
1240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->is_intra = TRUE;
1241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        } else {
1242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->is_intra = FALSE;
1243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "is_intra_picture = %d\n",
1246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->is_intra);
1247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
1249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Get Surface from the pool\n");
1250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*current we use one surface for source data,
1252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         * one for reference and one for reconstructed*/
1253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*TODO, could be refine here*/
1254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!parent->share_buf_mode) {
1256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "We are NOT in share buffer mode\n");
1258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->ref_fame == NULL)
1260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->ref_fame);
1262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)  //#ifdef SLEEP_SURFACE not used
1263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
1266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->rec_fame == NULL)
1271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->rec_fame);
1273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
1277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (parent->need_display) {
1282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->cur_fame = NULL;
1283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->cur_fame == NULL)
1286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->cur_fame);
1288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
1292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V( "Get Surface Done\n");
1297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            VAImage src_image;
1300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *pvbuf;
1301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *dst_y;
1302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *dst_uv;
1303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            int i,j;
1304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "map source data to surface\n");
1307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface);
1309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (ret != MIX_RESULT_SUCCESS)
1310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to mix_videoframe_get_frame_id\n");
1313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "surface id = 0x%08x\n", (guint) surface);
1319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDeriveImage(va_display, surface, &src_image);
1321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //need to destroy
1322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaDeriveImage\n");
1327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            VAImage *image = &src_image;
1331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V( "vaDeriveImage Done\n");
1333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaMapBuffer (va_display, image->buf, (void **)&pvbuf);
1336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E( "Failed to vaMapBuffer\n");
1339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "vaImage information\n");
1344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->pitches[0] = %d\n", image->pitches[0]);
1346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->pitches[1] = %d\n", image->pitches[1]);
1348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->offsets[0] = %d\n", image->offsets[0]);
1350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->offsets[1] = %d\n", image->offsets[1]);
1352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->num_planes = %d\n", image->num_planes);
1354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->width = %d\n", image->width);
1356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->height = %d\n", image->height);
1358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "input buf size = %d\n", bufin->size);
1361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *inbuf = bufin->data;
1363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /*need to convert YUV420 to NV12*/
1365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            dst_y = pvbuf +image->offsets[0];
1366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for (i = 0; i < height; i ++) {
1368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                memcpy (dst_y, inbuf + i * width, width);
1369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                dst_y += image->pitches[0];
1370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            dst_uv = pvbuf + image->offsets[1];
1373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for (i = 0; i < height / 2; i ++) {
1375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                for (j = 0; j < width; j+=2) {
1376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    dst_uv [j] = inbuf [width * height + i * width / 2 + j / 2];
1377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    dst_uv [j + 1] =
1378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        inbuf [width * height * 5 / 4 + i * width / 2 + j / 2];
1379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                dst_uv += image->pitches[1];
1381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            vaUnmapBuffer(va_display, image->buf);
1384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaUnmapBuffer\n");
1388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDestroyImage(va_display, src_image.image_id);
1392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaDestroyImage\n");
1396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Map source data to surface done\n");
1401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {//if (!parent->share_buf_mode)
1405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            MixVideoFrame * frame = mix_videoframe_new();
1407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->ref_fame == NULL)
1409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 1);
1411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->ref_fame, frame);
1414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)  //#ifdef SLEEP_SURFACE not used
1415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get reference surface from pool failed\n");
1418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->rec_fame == NULL)
1423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 2);
1425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->rec_fame, frame);
1428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get recontructed surface from pool failed\n");
1433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (parent->need_display) {
1438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->cur_fame = NULL;
1439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->cur_fame == NULL)
1442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                guint ci_idx;
1444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                memcpy (&ci_idx, bufin->data, bufin->size);
1445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I(
1447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "surface_num = %d\n", mix->surface_num);
1448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I(
1449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "ci_frame_idx = %d\n", ci_idx);
1450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ci_idx > mix->surface_num - 2) {
1452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "the CI frame idx is too bigger than CI frame number\n");
1454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, ci_idx);
1459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->cur_fame, frame);
1462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get current working surface from pool failed\n");
1467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface);
1472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaBeginPicture\n");
1476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_context = 0x%08x\n",(guint)va_context);
1477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "surface = 0x%08x\n",(guint)surface);
1478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_display = 0x%08x\n",(guint)va_display);
1479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaBeginPicture(va_display, va_context, surface);
1481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaBeginPicture\n");
1484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "mix_videofmtenc_mpeg4_send_seq_params\n");
1488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (mix->encoded_frames == 0) {
1490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix_videofmtenc_mpeg4_send_seq_params (mix);
1491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (ret != MIX_RESULT_SUCCESS)
1492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed mix_videofmtenc_mpeg4_send_seq_params\n");
1495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videofmtenc_mpeg4_send_picture_parameter (mix);
1500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
1502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee           LOG_E(
1504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                   "Failed mix_videofmtenc_mpeg4_send_picture_parameter\n");
1505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee           return MIX_RESULT_FAIL;
1506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videofmtenc_mpeg4_send_slice_parameter (mix);
1509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
1510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed mix_videofmtenc_mpeg4_send_slice_parameter\n");
1513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "before vaEndPicture\n");
1517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaEndPicture (va_display, va_context);
1519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaEndPicture\n");
1522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaSyncSurface\n");
1527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaSyncSurface(va_display, surface);
1529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaSyncSurface\n");
1532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
1537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Start to get encoded data\n");
1538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*get encoded data from the VA buffer*/
1540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaMapBuffer (va_display, mix->coded_buf, (void **)&buf);
1541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaMapBuffer\n");
1544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        // first 4 bytes is the size of the buffer
1548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		memcpy (&(iovout->data_size), (void*)buf, 4);
1549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //size = (guint*) buf;
1550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (iovout->data == NULL) { //means app doesn't allocate the buffer, so _encode will allocate it.
1552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            iovout->data = g_malloc (iovout->data_size);
1554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (iovout->data == NULL) {
1555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_NO_MEMORY;
1556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memcpy (iovout->data, buf + 16, iovout->data_size);
1560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        iovout->buffer_size = iovout->data_size;
1562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I(
1564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "out size is = %d\n", iovout->data_size);
1565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaUnmapBuffer (va_display, mix->coded_buf);
1567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaUnmapBuffer\n");
1570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "get encoded data done\n");
1574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->drawable) {
1577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaPutSurface(va_display, surface, (Drawable)parent->drawable,
1578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    0,0, width, height,
1579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    0,0, width, height,
1580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    NULL,0,0);
1581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC
1584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {
1585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaPutSurface(va_display, surface, win,
1587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    0,0, width, height,
1588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    0,0, width, height,
1589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    NULL,0,0);
1590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //SHOW_SRC
1592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VASurfaceStatus status;
1595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*query the status of current surface*/
1597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaQuerySurfaceStatus(va_display, surface,  &status);
1598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
1599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed vaQuerySurfaceStatus\n");
1602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->pic_skipped = status & VASurfaceSkipped;
1605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//ret = mix_framemanager_enqueue(parent->framemgr, mix->rec_fame);
1607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee       if (parent->need_display) {
1609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_framemanager_enqueue(parent->framemgr, mix->cur_fame);
1610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
1611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
1612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
1613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed mix_framemanager_enqueue\n");
1614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
1615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*update the reference surface and reconstructed surface */
1620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!mix->pic_skipped) {
1621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            tmp_fame = mix->rec_fame;
1622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->rec_fame= mix->ref_fame;
1623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->ref_fame = tmp_fame;
1624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (mix->ref_fame != NULL)
1629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix_videoframe_unref (mix->ref_fame);
1630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->ref_fame = mix->rec_fame;
1631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (mix->cur_fame);
1633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!(parent->need_display)) {
1636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix_videoframe_unref (mix->cur_fame);
1637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->cur_fame = NULL;
1638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->encoded_frames ++;
1641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
1646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1655bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_mpeg4_get_max_encoded_buf_size (
1656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc *mix, guint * max_size)
1657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
1658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
1660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL)
1662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix == NULL\n");
1665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NULL_PTR;
1666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
1669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent = MIX_VIDEOFORMATENC(mix);
1671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_MPEG4 *self = MIX_VIDEOFORMATENC_MPEG4 (mix);
1672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_MPEG4(self)) {
1674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (self->coded_buf_size > 0) {
1676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *max_size = self->coded_buf_size;
1677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V ("Already calculate the max encoded size, get the value directly");
1678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_SUCCESS;
1679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*base on the rate control mode to calculate the defaule encoded buffer size*/
1682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (self->va_rcmode == VA_RC_NONE) {
1683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->coded_buf_size =
1684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (parent->picture_width* parent->picture_height * 400) / (16 * 16);
1685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            // set to value according to QP
1686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {
1688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->coded_buf_size = parent->bitrate/ 4;
1689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->coded_buf_size =
1692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            max (self->coded_buf_size ,
1693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->picture_width* parent->picture_height * 400) / (16 * 16));
1694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*in case got a very large user input bit rate value*/
1696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->coded_buf_size =
1697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            max(self->coded_buf_size,
1698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->picture_width * parent->picture_height * 1.5 * 8));
1699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->coded_buf_size =  (self->coded_buf_size + 15) &(~15);
1700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not MPEG4 video encode Object\n");
1705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    *max_size = self->coded_buf_size;
1709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1714