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 "mixvideolog.h"
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc.h"
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#define MDEBUG
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_getcaps_default(MixVideoFormatEnc *mix,
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        GString *msg);
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_initialize_default(MixVideoFormatEnc *mix,
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay vadisplay);
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videofmtenc_encode_default(MixVideoFormatEnc *mix, MixBuffer * bufin[],
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params);
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_flush_default(MixVideoFormatEnc *mix);
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_eos_default(MixVideoFormatEnc *mix);
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_deinitialize_default(MixVideoFormatEnc *mix);
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_get_max_coded_buffer_size_default(
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatEnc *mix, guint *max_size);
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic GObjectClass *parent_class = NULL;
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_finalize(GObject * obj);
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE (MixVideoFormatEnc, mix_videoformatenc, G_TYPE_OBJECT);
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_init(MixVideoFormatEnc * self) {
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: public member initialization */
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: private member initialization */
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->objectlock = g_mutex_new();
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->initialized = FALSE;
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->framemgr = NULL;
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->surfacepool = NULL;
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->inputbufpool = NULL;
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->inputbufqueue = NULL;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_display = NULL;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_context = 0;
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_config = 0;
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->mime_type = NULL;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->frame_rate_num= 0;
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->frame_rate_denom = 1;
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->picture_width = 0;
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->picture_height = 0;
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->initial_qp = 0;
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->min_qp = 0;
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->intra_period = 0;
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->bitrate = 0;
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->share_buf_mode = FALSE;
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->ci_frame_id = NULL;
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->ci_frame_num = 0;
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee       self->drawable = 0x0;
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee       self->need_display = TRUE;
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      self->va_rcmode = VA_RC_NONE;
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      self->va_format = VA_RT_FORMAT_YUV420;
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      self->va_entrypoint = VAEntrypointEncSlice;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      self->va_profile = VAProfileH264Baseline;
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//add more properties here
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformatenc_class_init(MixVideoFormatEncClass * klass) {
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	GObjectClass *gobject_class = (GObjectClass *) klass;
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* parent class for later use */
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	parent_class = g_type_class_peek_parent(klass);
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gobject_class->finalize = mix_videoformatenc_finalize;
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* setup vmethods with base implementation */
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->getcaps = mix_videofmtenc_getcaps_default;
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->initialize = mix_videofmtenc_initialize_default;
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->encode = mix_videofmtenc_encode_default;
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->flush = mix_videofmtenc_flush_default;
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->eos = mix_videofmtenc_eos_default;
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->deinitialize = mix_videofmtenc_deinitialize_default;
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->getmaxencodedbufsize = mix_videofmtenc_get_max_coded_buffer_size_default;
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc *
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_new(void) {
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatEnc *ret = g_object_new(MIX_TYPE_VIDEOFORMATENC, NULL);
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformatenc_finalize(GObject * obj) {
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* clean up here. */
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (obj == NULL) {
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E( "obj == NULL\n");
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return;
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEnc *mix = MIX_VIDEOFORMATENC(obj);
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "\n");
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(mix->objectlock) {
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_free(mix->objectlock);
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->objectlock = NULL;
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//MiVideo object calls the _deinitialize() for frame manager
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->framemgr)
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	  mix_framemanager_unref(mix->framemgr);
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	  mix->framemgr = NULL;
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->mime_type)
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (mix->mime_type->str)
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_string_free(mix->mime_type, TRUE);
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        else
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            g_string_free(mix->mime_type, FALSE);
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->ci_frame_id)
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_free (mix->ci_frame_id);
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->surfacepool)
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_surfacepool_deinitialize(mix->surfacepool);
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix_surfacepool_unref(mix->surfacepool);
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        mix->surfacepool = NULL;
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: cleanup here */
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Chain up parent */
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (parent_class->finalize) {
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		parent_class->finalize(obj);
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormatEnc *
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformatenc_ref(MixVideoFormatEnc * mix) {
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return (MixVideoFormatEnc *) g_object_ref(G_OBJECT(mix));
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_getcaps_default(MixVideoFormatEnc *mix,
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        GString *msg) {
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_initialize_default(MixVideoFormatEnc *mix,
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay va_display) {
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (mix == NULL ||config_params_enc == NULL) {
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "!mix || config_params_enc == NULL\n");
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_NULL_PTR;
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MIX_RESULT ret = MIX_RESULT_SUCCESS;
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//TODO check return values of getter fns for config_params
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(mix->objectlock);
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->framemgr = frame_mgr;
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_framemanager_ref(mix->framemgr);
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->va_display = va_display;
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V(
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            "Start to get properities from parent params\n");
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /* get properties from param (parent) Object*/
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_bit_rate (config_params_enc,
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->bitrate));
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_bps\n");
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_frame_rate (config_params_enc,
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->frame_rate_num), &(mix->frame_rate_denom));
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_frame_rate\n");
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_init_qp (config_params_enc,
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->initial_qp));
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_init_qp\n");
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_min_qp (config_params_enc,
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->min_qp));
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_min_qp\n");
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_intra_period (config_params_enc,
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->intra_period));
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_intra_period\n");
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_picture_res (config_params_enc,
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->picture_width), &(mix->picture_height));
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_picture_res\n");
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_share_buf_mode (config_params_enc,
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->share_buf_mode));
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_share_buf_mode\n");
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_ci_frame_info (config_params_enc,
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->ci_frame_id),  &(mix->ci_frame_num));
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_ci_frame_info\n");
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_drawable (config_params_enc,
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->drawable));
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_drawable\n");
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_need_display (config_params_enc,
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->need_display));
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_drawable\n");
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_rate_control (config_params_enc,
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->va_rcmode));
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_rc_mode\n");
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_raw_format (config_params_enc,
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            &(mix->va_format));
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_format\n");
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ret = mix_videoconfigparamsenc_get_profile (config_params_enc,
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            (MixProfile *) &(mix->va_profile));
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (ret != MIX_RESULT_SUCCESS) {
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        //TODO cleanup
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        LOG_E(
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                "Failed to mix_videoconfigparamsenc_get_profile\n");
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        g_mutex_unlock(mix->objectlock);
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return MIX_RESULT_FAIL;
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V(
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            "======Video Encode Parent Object properities======:\n");
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->bitrate = %d\n",
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->bitrate);
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->frame_rate = %d\n",
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->frame_rate_denom / mix->frame_rate_denom);
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->initial_qp = %d\n",
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->initial_qp);
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->min_qp = %d\n",
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->min_qp);
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->intra_period = %d\n",
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->intra_period);
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->picture_width = %d\n",
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->picture_width);
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->picture_height = %d\n",
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->picture_height);
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->share_buf_mode = %d\n",
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->share_buf_mode);
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->ci_frame_id = 0x%08x\n",
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->ci_frame_id);
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->ci_frame_num = %d\n",
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->ci_frame_num);
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->drawable = 0x%08x\n",
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->drawable);
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->need_display = %d\n",
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->need_display);
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->va_format = %d\n",
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->va_format);
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->va_profile = %d\n",
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->va_profile);
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_I( "mix->va_rcmode = %d\n\n",
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            mix->va_rcmode);
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    g_mutex_unlock(mix->objectlock);
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "end\n");
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_encode_default (MixVideoFormatEnc *mix, MixBuffer * bufin[],
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params) {
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_flush_default(MixVideoFormatEnc *mix) {
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_SUCCESS;
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_eos_default(MixVideoFormatEnc *mix) {
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_deinitialize_default(MixVideoFormatEnc *mix) {
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//TODO decide whether to put any of the teardown from _finalize() here
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmtenc_get_max_coded_buffer_size_default(
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatEnc *mix, guint *max_size) {
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* mixvideoformatenc class methods implementation */
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_getcaps(MixVideoFormatEnc *mix, GString *msg) {
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    LOG_V( "Begin\n");
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->getcaps) {
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->getcaps(mix, msg);
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_NOTIMPL;
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_initialize(MixVideoFormatEnc *mix,
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoConfigParamsEnc * config_params_enc,
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixFrameManager * frame_mgr,
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixBufferPool * input_buf_pool,
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixSurfacePool ** surface_pool,
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        VADisplay va_display) {
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    /*frame_mgr and input_buf_pool is reserved for future use*/
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->initialize) {
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->initialize(mix, config_params_enc, frame_mgr,
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                input_buf_pool, surface_pool, va_display);
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_encode(MixVideoFormatEnc *mix, MixBuffer * bufin[],
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoEncodeParams * encode_params) {
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->encode) {
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->encode(mix, bufin, bufincnt, iovout, iovoutcnt, encode_params);
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_flush(MixVideoFormatEnc *mix) {
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->flush) {
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->flush(mix);
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_eos(MixVideoFormatEnc *mix) {
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->eos) {
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->eos(mix);
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_deinitialize(MixVideoFormatEnc *mix) {
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->deinitialize) {
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->deinitialize(mix);
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmtenc_get_max_coded_buffer_size(MixVideoFormatEnc *mix, guint * max_size) {
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    MixVideoFormatEncClass *klass = MIX_VIDEOFORMATENC_GET_CLASS(mix);
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if (klass->encode) {
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        return klass->getmaxencodedbufsize(mix, max_size);
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return MIX_RESULT_FAIL;
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
503