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_preview.h"
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_preview.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_preview_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_Preview, mix_videoformatenc_preview, MIX_TYPE_VIDEOFORMATENC);
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_preview_init(MixVideoFormatEnc_Preview * 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_preview_class_init(
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_PreviewClass * 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_preview_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_preview_getcaps;
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->initialize = mix_videofmtenc_preview_initialize;
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->encode = mix_videofmtenc_preview_encode;
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->flush = mix_videofmtenc_preview_flush;
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->eos = mix_videofmtenc_preview_eos;
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    video_formatenc_class->deinitialize = mix_videofmtenc_preview_deinitialize;
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_Preview *
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_preview_new(void) {
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_Preview *ret =
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_object_new(MIX_TYPE_VIDEOFORMATENC_PREVIEW, NULL);
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return ret;
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformatenc_preview_finalize(GObject * obj) {
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* clean up here. */
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*MixVideoFormatEnc_Preview *mix = MIX_VIDEOFORMATENC_PREVIEW(obj); */
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    GObjectClass *root_class = (GObjectClass *) parent_class;
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "\n");
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Chain up parent */
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (root_class->finalize) {
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        root_class->finalize(obj);
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc_Preview *
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_preview_ref(MixVideoFormatEnc_Preview * mix) {
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return (MixVideoFormatEnc_Preview *) g_object_ref(G_OBJECT(mix));
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*Preview vmethods implementation */
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_getcaps(MixVideoFormatEnc *mix, GString *msg) {
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: add codes for Preview format */
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * if we do, the following is the code:
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     */
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "mix_videofmtenc_preview_getcaps\n");
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->getcaps) {
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->getcaps(mix, msg);
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_initialize(MixVideoFormatEnc *mix,
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay va_display ) {
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoConfigParamsEncPreview * config_params_enc_preview;
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status = VA_STATUS_SUCCESS;
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VASurfaceID * surfaces;
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gint va_max_num_profiles, va_max_num_entrypoints, va_max_num_attribs;
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gint va_num_profiles,  va_num_entrypoints;
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAProfile *va_profiles = NULL;
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAEntrypoint *va_entrypoints = NULL;
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAConfigAttrib va_attrib[2];
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint index;
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*frame_mgr and input_buf_pool is reservered for future use*/
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL || config_params_enc == NULL || va_display == NULL) {
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix == NULL || config_params_enc == NULL || va_display == NULL\n");
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "begin\n");
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO additional parameter checking
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* Chainup parent method. */
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->initialize) {
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = parent_class->initialize(mix, config_params_enc,
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                frame_mgr, input_buf_pool, surface_pool,
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_display);
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS)
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return ret;
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif //disable it currently
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix))
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix);
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (MIX_IS_VIDEOCONFIGPARAMSENC_PREVIEW (config_params_enc)) {
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            config_params_enc_preview =
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MIX_VIDEOCONFIGPARAMSENC_PREVIEW (config_params_enc);
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        } else {
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "mix_videofmtenc_preview_initialize:  no preview config params found\n");
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_lock(parent->objectlock);
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Get properities from params done\n");
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    	//display = XOpenDisplay(NULL);
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     	//va_display = vaGetDisplay (videoencobj->display);
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->va_display = va_display;
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "Get Display\n");
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Display = 0x%08x\n",
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint)va_display);
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //va_status = vaInitialize(va_display, &va_major_ver, &va_minor_ver);
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //g_print ("vaInitialize va_status = %d\n", va_status);
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* query the vender information, can ignore*/
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_vendor = vaQueryVendorString (va_display);
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Vendor = %s\n",
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_vendor);
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*get the max number for profiles/entrypoints/attribs*/
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_profiles = vaMaxNumProfiles(va_display);
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_profiles = %d\n",
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_profiles);
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_entrypoints = vaMaxNumEntrypoints(va_display);
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_entrypoints = %d\n",
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_entrypoints);
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_max_num_attribs = vaMaxNumConfigAttributes(va_display);
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_max_num_attribs = %d\n",
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_max_num_attribs);
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_profiles = g_malloc(sizeof(VAProfile)*va_max_num_profiles);
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_entrypoints = g_malloc(sizeof(VAEntrypoint)*va_max_num_entrypoints);
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_profiles == NULL || va_entrypoints ==NULL)
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "!va_profiles || !va_entrypoints\n");
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I(
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "va_profiles = 0x%08x\n", (guint)va_profiles);
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigProfiles\n");
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaQueryConfigProfiles (va_display, va_profiles, &va_num_profiles);
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaQueryConfigProfiles\n");
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigProfiles Done\n");
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*check whether profile is supported*/
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for(index= 0; index < va_num_profiles; index++) {
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if(parent->va_profile == va_profiles[index])
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(index == va_num_profiles)
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Profile not supported\n");
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaQueryConfigEntrypoints\n");
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*Check entry point*/
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaQueryConfigEntrypoints(va_display,
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_profile,
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_entrypoints, &va_num_entrypoints);
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaQueryConfigEntrypoints\n");
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for (index = 0; index < va_num_entrypoints; index ++) {
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_entrypoints[index] == VAEntrypointEncSlice) {
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (index == va_num_entrypoints) {
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Entrypoint not found\n");
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free(va_profiles);
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (va_entrypoints);
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*free profiles and entrypoints*/
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free(va_profiles);
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (va_entrypoints);
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[0].type = VAConfigAttribRTFormat;
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[1].type = VAConfigAttribRateControl;
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaGetConfigAttributes\n");
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaGetConfigAttributes(va_display, parent->va_profile,
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint,
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &va_attrib[0], 2);
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to call vaGetConfigAttributes\n");
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if ((va_attrib[0].value & parent->va_format) == 0) {
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Matched format not found\n");
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if ((va_attrib[1].value & parent->va_rcmode) == 0) {
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "RC mode not found\n");
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;  //Todo, add error handling here
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[0].value = parent->va_format; //VA_RT_FORMAT_YUV420;
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_attrib[1].value = parent->va_rcmode;
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "======VA Configuration======\n");
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "profile = %d\n",
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_profile);
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_entrypoint = %d\n",
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint);
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[0].type = %d\n",
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[0].type);
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[1].type = %d\n",
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[1].type);
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[0].value (Format) = %d\n",
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[0].value);
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_attrib[1].value (RC mode) = %d\n",
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_attrib[1].value);
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateConfig\n");
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateConfig(va_display, parent->va_profile,
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->va_entrypoint,
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &va_attrib[0], 2, &(parent->va_config));
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "Failed vaCreateConfig\n");
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*TODO: compute the surface number*/
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        int numSurfaces;
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            numSurfaces = 2;
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            numSurfaces = 8;
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            parent->ci_frame_num = 0;
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surface_num = numSurfaces + parent->ci_frame_num;
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        surfaces = g_malloc(sizeof(VASurfaceID)*numSurfaces);
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (surfaces == NULL)
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed allocate surface\n");
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateSurfaces\n");
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateSurfaces(va_display, parent->picture_width,
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_height, parent->va_format,
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                numSurfaces, surfaces);
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO check vret and return fail if needed
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed vaCreateSurfaces\n");
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "We are in share buffer mode!\n");
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->ci_shared_surfaces =
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_malloc(sizeof(VASurfaceID) * parent->ci_frame_num);
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (self->ci_shared_surfaces == NULL)
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed allocate shared surface\n");
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_unlock(parent->objectlock);
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_NO_MEMORY;
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint index;
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for(index = 0; index < parent->ci_frame_num; index++) {
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I( "ci_frame_id = %lu\n",
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        parent->ci_frame_id[index]);
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_V(
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "vaCreateSurfaceFromCIFrame\n");
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                va_status = vaCreateSurfaceFromCIFrame(va_display,
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        (gulong) (parent->ci_frame_id[index]),
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        &self->ci_shared_surfaces[index]);
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (va_status != VA_STATUS_SUCCESS)
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to vaCreateSurfaceFromCIFrame\n");
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    g_mutex_unlock(parent->objectlock);
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "vaCreateSurfaceFromCIFrame Done\n");
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }// if (parent->share_buf_mode)
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surfaces = g_malloc(sizeof(VASurfaceID) * self->surface_num);
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (self->surfaces == NULL)
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed allocate private surface\n");
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->share_buf_mode) {
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /*shared surfaces should be put in pool first,
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee             * because we will get it accoring to CI index*/
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for(index = 0; index < parent->ci_frame_num; index++)
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->surfaces[index] = self->ci_shared_surfaces[index];
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for(index = 0; index < numSurfaces; index++) {
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            self->surfaces[index + parent->ci_frame_num] = surfaces[index];
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "assign surface Done\n");
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "Created %d libva surfaces\n",
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                numSurfaces + parent->ci_frame_num);
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0  //current put this in gst
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        images = g_malloc(sizeof(VAImage)*numSurfaces);
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (images == NULL)
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        for (index = 0; index < numSurfaces; index++) {
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //Derive an VAImage from an existing surface.
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //The image buffer can then be mapped/unmapped for CPU access
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDeriveImage(va_display, surfaces[index],
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    &images[index]);
503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "mix_surfacepool_new\n");
507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->surfacepool = mix_surfacepool_new();
509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (surface_pool)
510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *surface_pool = parent->surfacepool;
511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //which is useful to check before encode
512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->surfacepool == NULL)
514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to mix_surfacepool_new\n");
517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix_surfacepool_initialize\n");
524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_surfacepool_initialize(parent->surfacepool,
526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->surfaces, parent->ci_frame_num + numSurfaces);
527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        switch (ret)
529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MIX_RESULT_SUCCESS:
531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            case MIX_RESULT_ALREADY_INIT:
533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                //TODO cleanup and/or retry
534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_free (surfaces);
535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_unlock(parent->objectlock);
536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            default:
538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                break;
539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //Initialize and save the VA context ID
543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaCreateContext\n");
544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateContext(va_display, parent->va_config,
546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width, parent->picture_height,
547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                0, self->surfaces, parent->ci_frame_num + numSurfaces,
548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &(parent->va_context));
549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I(
551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Created libva context width %d, height %d\n",
552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width, parent->picture_height);
553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateContext\n");
558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I( "va_status = %d\n",
559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (guint)va_status);
560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->coded_buf_size = 4;
566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*Create coded buffer for output*/
568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_status = vaCreateBuffer (va_display, parent->va_context,
569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VAEncCodedBufferType,
570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                self->coded_buf_size,  //
571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                1, NULL,
572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                &self->coded_buf);
573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (va_status != VA_STATUS_SUCCESS)
575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed to vaCreateBuffer: VAEncCodedBufferType\n");
578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_free (surfaces);
579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_mutex_unlock(parent->objectlock);
580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef SHOW_SRC
584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        Display * display = XOpenDisplay (NULL);
585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "display = 0x%08x\n",
587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) display);
588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        win = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0,
589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                parent->picture_width,  parent->picture_height, 0, 0,
590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                WhitePixel(display, 0));
591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XMapWindow(display, win);
592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XSelectInput(display, win, KeyPressMask | StructureNotifyMask);
593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        XSync(display, False);
595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_display = 0x%08x\n",
596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) va_display);
597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif /* SHOW_SRC */
599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent->initialized = TRUE;
601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (surfaces);
604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not Preview video encode Object\n");
610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
619bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[],
620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params) {
622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*currenly only support one input and output buffer*/
629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO: params i
630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (bufincnt != 1 || iovoutcnt != 1) {
632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "buffer count not equel to 1\n");
634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "maybe some exception occurs\n");
636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL ||bufin[0] == NULL ||  iovout[0] == NULL) {
639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "!mix || !bufin[0] ||!iovout[0]\n");
641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //TODO: encode_params is reserved here for future usage.
645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     *      * * if we do, the following is the code:
648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * */
649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->encode) {
652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->encode(mix, bufin, bufincnt, iovout,
653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                iovoutcnt, encode_params);
654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix))
658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        parent = MIX_VIDEOFORMATENC(&(mix->parent));
661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW (mix);
662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "Locking\n");
664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_lock(parent->objectlock);
665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO: also we could move some encode Preparation work to here
668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix_videofmtenc_preview_process_encode\n");
671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ret = mix_videofmtenc_preview_process_encode (self,
673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                bufin[0], iovout[0]);
674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (ret != MIX_RESULT_SUCCESS)
675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E(
677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Failed mix_videofmtenc_preview_process_encode\n");
678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_FAIL;
679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "UnLocking\n");
683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not Preview video encode Object\n");
690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
698bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_flush(MixVideoFormatEnc *mix) {
699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //MIX_RESULT ret = MIX_RESULT_SUCCESS;
701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*not chain to parent flush func*/
711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->flush) {
713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->flush(mix, msg);
714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix);
718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_lock(mix->objectlock);
720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the current source surface*/
723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->cur_fame != NULL)
724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->cur_fame);
726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->cur_fame = NULL;
727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reconstructed surface*/
731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->rec_fame != NULL)
732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->rec_fame);
734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->rec_fame = NULL;
735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reference surface*/
738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ref_fame != NULL)
739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->ref_fame);
741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ref_fame = NULL;
742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*reset the properities*/
745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->encoded_frames = 0;
746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->pic_skipped = FALSE;
747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    self->is_intra = TRUE;
748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_unlock(mix->objectlock);
750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
756bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_eos(MixVideoFormatEnc *mix) {
757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: add codes for preview */
759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* TODO: decide if we need to chainup parent method.
761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     * if we do, the following is the code:
762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee     */
763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "\n");
765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->eos) {
772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->eos(mix);
773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
777bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_deinitialize(MixVideoFormatEnc *mix) {
778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *parent = NULL;
780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status;
781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL) {
785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "mix == NULL\n");
786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent = MIX_VIDEOFORMATENC(&(mix->parent));
790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc_Preview *self = MIX_VIDEOFORMATENC_PREVIEW(mix);
791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Release frames\n");
793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_lock(parent->objectlock);
795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the current source surface*/
798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->cur_fame != NULL)
799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->cur_fame);
801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->cur_fame = NULL;
802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reconstructed surface*/
806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->rec_fame != NULL)
807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->rec_fame);
809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->rec_fame = NULL;
810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*unref the reference surface*/
813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ref_fame != NULL)
814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_videoframe_unref (self->ref_fame);
816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ref_fame = NULL;
817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Release surfaces\n");
820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->ci_shared_surfaces)
822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (self->ci_shared_surfaces);
824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->ci_shared_surfaces = NULL;
825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (self->surfaces)
828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (self->surfaces);
830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        self->surfaces = NULL;
831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "vaDestroyContext\n");
834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    va_status = vaDestroyContext (parent->va_display, parent->va_context);
836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (va_status != VA_STATUS_SUCCESS)
837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed vaDestroyContext\n");
840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "vaDestroyConfig\n");
845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    va_status = vaDestroyConfig (parent->va_display, parent->va_config);
847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (va_status != VA_STATUS_SUCCESS)
848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed vaDestroyConfig\n");
851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(parent->objectlock);
852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    parent->initialized = TRUE;
856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_unlock(parent->objectlock);
858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1
860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (parent_class->deinitialize) {
861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return parent_class->deinitialize(mix);
862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //Most stuff is cleaned up in parent_class->finalize()
866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
873bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_preview_process_encode (MixVideoFormatEnc_Preview *mix,
874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBuffer * bufin, MixIOVec * iovout)
875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAStatus va_status = VA_STATUS_SUCCESS;
879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VADisplay va_display = NULL;
880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    VAContextID va_context;
881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    gulong surface = 0;
882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    guint16 width, height;
883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //MixVideoFrame *  tmp_fame;
885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //guint8 *buf;
886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if ((mix == NULL) || (bufin == NULL) || (iovout == NULL)) {
888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "mix == NUL) || bufin == NULL || iovout == NULL\n");
890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (MIX_IS_VIDEOFORMATENC_PREVIEW(mix))
896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc *parent = MIX_VIDEOFORMATENC(&(mix->parent));
899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_display = parent->va_display;
901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        va_context = parent->va_context;
902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        width = parent->picture_width;
903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        height = parent->picture_height;
904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "encoded_frames = %d\n",
907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->encoded_frames);
908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "is_intra = %d\n",
909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->is_intra);
910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "ci_frame_id = 0x%08x\n",
911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                (guint) parent->ci_frame_id);
912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V(
914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Get Surface from the pool\n");
915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*current we use one surface for source data,
917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         * one for reference and one for reconstructed*/
918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /*TODO, could be refine here*/
919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!parent->share_buf_mode) {
921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "We are NOT in share buffer mode\n");
923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->ref_fame == NULL)
925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->ref_fame);
927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)  //#ifdef SLEEP_SURFACE not used
928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->rec_fame == NULL)
936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->rec_fame);
938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (parent->need_display) {
947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->cur_fame = NULL;
948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->cur_fame == NULL)
951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get(parent->surfacepool, &mix->cur_fame);
953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "Failed to mix_surfacepool_get\n");
957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V( "Get Surface Done\n");
962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            VAImage src_image;
965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *pvbuf;
966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *dst_y;
967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *dst_uv;
968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            int i,j;
969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "map source data to surface\n");
972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface);
974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (ret != MIX_RESULT_SUCCESS)
975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to mix_videoframe_get_frame_id\n");
978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "surface id = 0x%08x\n", (guint) surface);
984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDeriveImage(va_display, surface, &src_image);
986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //need to destroy
987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaDeriveImage\n");
992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            VAImage *image = &src_image;
996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V( "vaDeriveImage Done\n");
998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaMapBuffer (va_display, image->buf, (void **)&pvbuf);
1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E( "Failed to vaMapBuffer\n");
1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "vaImage information\n");
1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->pitches[0] = %d\n", image->pitches[0]);
1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->pitches[1] = %d\n", image->pitches[1]);
1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->offsets[0] = %d\n", image->offsets[0]);
1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->offsets[1] = %d\n", image->offsets[1]);
1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->num_planes = %d\n", image->num_planes);
1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->width = %d\n", image->width);
1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "image->height = %d\n", image->height);
1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_I(
1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "input buf size = %d\n", bufin->size);
1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            guint8 *inbuf = bufin->data;
1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            /*need to convert YUV420 to NV12*/
1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            dst_y = pvbuf +image->offsets[0];
1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for (i = 0; i < height; i ++) {
1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                memcpy (dst_y, inbuf + i * width, width);
1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                dst_y += image->pitches[0];
1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            dst_uv = pvbuf + image->offsets[1];
1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            for (i = 0; i < height / 2; i ++) {
1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                for (j = 0; j < width; j+=2) {
1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    dst_uv [j] = inbuf [width * height + i * width / 2 + j / 2];
1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    dst_uv [j + 1] =
1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        inbuf [width * height * 5 / 4 + i * width / 2 + j / 2];
1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                dst_uv += image->pitches[1];
1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            vaUnmapBuffer(va_display, image->buf);
1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaUnmapBuffer\n");
1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            va_status = vaDestroyImage(va_display, src_image.image_id);
1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (va_status != VA_STATUS_SUCCESS)
1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed to vaDestroyImage\n");
1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_V(
1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    "Map source data to surface done\n");
1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else {//if (!parent->share_buf_mode)
1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            MixVideoFrame * frame = mix_videoframe_new();
1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->ref_fame == NULL)
1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 1);
1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->ref_fame, frame);
1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)  //#ifdef SLEEP_SURFACE not used
1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get reference surface from pool failed\n");
1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->rec_fame == NULL)
1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, mix->surface_num - 2);
1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->rec_fame, frame);
1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get recontructed surface from pool failed\n");
1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            //mix_videoframe_unref (mix->cur_fame);
1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (parent->need_display) {
1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->cur_fame = NULL;
1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (mix->cur_fame == NULL)
1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                guint ci_idx;
1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                memcpy (&ci_idx, bufin->data, bufin->size);
1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I(
1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "surface_num = %d\n", mix->surface_num);
1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_I(
1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "ci_frame_idx = %d\n", ci_idx);
1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ci_idx > mix->surface_num - 2) {
1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "the CI frame idx is too bigger than CI frame number\n");
1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_videoframe_set_ci_frame_idx (frame, ci_idx);
1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                ret = mix_surfacepool_get_frame_with_ci_frameidx
1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    (parent->surfacepool, &mix->cur_fame, frame);
1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                if (ret != MIX_RESULT_SUCCESS)
1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                {
1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    LOG_E(
1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                            "get current working surface from pool failed\n");
1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                    return MIX_RESULT_FAIL;
1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                }
1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = mix_videoframe_get_frame_id(mix->cur_fame, &surface);
1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_V( "vaBeginPicture\n");
1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_context = 0x%08x\n",(guint)va_context);
1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "surface = 0x%08x\n",(guint)surface);
1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_I( "va_display = 0x%08x\n",(guint)va_display);
1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        iovout->data_size = 4;
1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        iovout->data = g_malloc (iovout->data_size);
1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (iovout->data == NULL) {
1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            return MIX_RESULT_NO_MEMORY;
1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        memset (iovout->data, 0, iovout->data_size);
1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        iovout->buffer_size = iovout->data_size;
1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (parent->need_display) {
1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = mix_framemanager_enqueue(parent->framemgr, mix->cur_fame);
1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if (ret != MIX_RESULT_SUCCESS)
1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                LOG_E(
1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        "Failed mix_framemanager_enqueue\n");
1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                return MIX_RESULT_FAIL;
1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!(parent->need_display)) {
1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix_videoframe_unref (mix->cur_fame);
1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->cur_fame = NULL;
1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->encoded_frames ++;
1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "not Preview video encode Object\n");
1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1188