1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee INTEL CONFIDENTIAL
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Copyright 2009 Intel Corporation All Rights Reserved.
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <va/va.h>             /* libVA */
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <X11/Xlib.h>
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <va/va_x11.h>
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h"
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixdisplayx11.h"
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoframe.h"
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixframemanager.h"
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideorenderparams.h"
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideorenderparams_internal.h"
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat.h"
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_vc1.h"
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_h264.h"
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat_mp42.h"
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_vc1.h"
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_h264.h"
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsdec_mp42.h"
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc.h"
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_h264.h"
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_mpeg4.h"
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformatenc_preview.h"
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_h264.h"
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_mpeg4.h"
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoconfigparamsenc_preview.h"
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideo.h"
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideo_private.h"
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define USE_OPAQUE_POINTER
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef USE_OPAQUE_POINTER
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEO_PRIVATE(mix) (MixVideoPrivate *)(mix->context)
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_VIDEO_PRIVATE(mix) MIX_VIDEO_GET_PRIVATE(mix)
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_INIT(mix, priv) \
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix) { \
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR; \
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} \
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEO(mix)) { \
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Not MixVideo\n"); \
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM; \
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} \
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv = MIX_VIDEO_PRIVATE(mix); \
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->initialized) { \
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Not initialized\n"); \
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NOT_INIT; \
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_INIT_CONFIG(mix, priv) \
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT(mix, priv); \
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->configured) { \
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Not configured\n"); \
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NOT_CONFIGURED; \
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * default implementation of virtual methods
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version_default(MixVideo * mix, guint * major,
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		guint * minor);
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize_default(MixVideo * mix, MixCodecMode mode,
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoInitParams * init_params, MixDrmParams * drm_init_params);
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize_default(MixVideo * mix);
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_default(MixVideo * mix,
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams * config_params, MixDrmParams * drm_config_params);
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config_default(MixVideo * mix,
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams ** config_params);
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode_default(MixVideo * mix, MixBuffer * bufin[],
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		gint bufincnt, MixVideoDecodeParams * decode_params);
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame_default(MixVideo * mix, MixVideoFrame ** frame);
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame_default(MixVideo * mix,
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFrame * frame);
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render_default(MixVideo * mix,
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoRenderParams * render_params, MixVideoFrame *frame);
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode_default(MixVideo * mix, MixBuffer * bufin[],
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoEncodeParams * encode_params);
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush_default(MixVideo * mix);
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos_default(MixVideo * mix);
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state_default(MixVideo * mix, MixState * state);
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer_default(MixVideo * mix, MixBuffer ** buf);
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer_default(MixVideo * mix, MixBuffer * buf);
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size_default (MixVideo * mix, guint *max_size);
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_finalize(GObject * obj);
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_decode(MixVideo * mix,
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsDec * config_params_dec,
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixDrmParams * drm_config_params);
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_encode(MixVideo * mix,
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsEnc * config_params_enc,
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixDrmParams * drm_config_params);
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE( MixVideo, mix_video, G_TYPE_OBJECT);
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_init(MixVideo * self) {
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = MIX_VIDEO_GET_PRIVATE(self);
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef USE_OPAQUE_POINTER
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->context = priv;
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->context = NULL;
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* private structure initialization */
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_video_private_initialize(priv);
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_video_class_init(MixVideoClass * klass) {
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	GObjectClass *gobject_class = (GObjectClass *) klass;
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gobject_class->finalize = mix_video_finalize;
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Register and allocate the space the private structure for this object */
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_type_class_add_private(gobject_class, sizeof(MixVideoPrivate));
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_version_func = mix_video_get_version_default;
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->initialize_func = mix_video_initialize_default;
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->deinitialize_func = mix_video_deinitialize_default;
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->configure_func = mix_video_configure_default;
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_config_func = mix_video_get_config_default;
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->decode_func = mix_video_decode_default;
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_frame_func = mix_video_get_frame_default;
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->release_frame_func = mix_video_release_frame_default;
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->render_func = mix_video_render_default;
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->encode_func = mix_video_encode_default;
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->flush_func = mix_video_flush_default;
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->eos_func = mix_video_eos_default;
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_state_func = mix_video_get_state_default;
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_mix_buffer_func = mix_video_get_mixbuffer_default;
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->release_mix_buffer_func = mix_video_release_mixbuffer_default;
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->get_max_coded_buffer_size_func = mix_video_get_max_coded_buffer_size_default;
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideo *mix_video_new(void) {
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideo *ret = g_object_new(MIX_TYPE_VIDEO, NULL);
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_finalize(GObject * obj) {
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* clean up here. */
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideo *mix = MIX_VIDEO(obj);
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_video_deinitialize(mix);
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideo *
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_video_ref(MixVideo * mix) {
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return (MixVideo *) g_object_ref(G_OBJECT(mix));
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* private methods */
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIXUNREF(obj, unref) if(obj) { unref(obj); obj = NULL; }
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_private_initialize(MixVideoPrivate* priv) {
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->objlock = NULL;
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->initialized = FALSE;
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->configured = FALSE;
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* libVA */
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->va_display = NULL;
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->va_major_version = -1;
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->va_major_version = -1;
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* mix objects */
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->frame_manager = NULL;
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->video_format = NULL;
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->video_format_enc = NULL; //for encoding
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->surface_pool = NULL;
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->buffer_pool = NULL;
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->codec_mode = MIX_CODEC_MODE_DECODE;
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->init_params = NULL;
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->drm_params = NULL;
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->config_params = NULL;
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_video_private_cleanup(MixVideoPrivate* priv) {
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	VAStatus va_status;
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv) {
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return;
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->video_format_enc) {
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix_videofmtenc_deinitialize(priv->video_format_enc);
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->frame_manager, mix_framemanager_unref)
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->video_format, mix_videoformat_unref)
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->video_format_enc, mix_videoformatenc_unref)
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//for encoding
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->buffer_pool, mix_bufferpool_unref)
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->surface_pool, mix_surfacepool_unref)
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*	MIXUNREF(priv->init_params, mix_videoinitparams_unref) */
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->drm_params, mix_drmparams_unref)
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->config_params, mix_videoconfigparams_unref)
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* terminate libVA */
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->va_display) {
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		va_status = vaTerminate(priv->va_display);
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_V( "vaTerminate\n");
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (va_status != VA_STATUS_SUCCESS) {
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_W( "Failed vaTerminate\n");
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			priv->va_display = NULL;
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(priv->init_params, mix_videoinitparams_unref)
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->va_major_version = -1;
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->va_major_version = -1;
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->objlock) {
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_mutex_free(priv->objlock);
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->objlock = NULL;
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->codec_mode = MIX_CODEC_MODE_DECODE;
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->initialized = FALSE;
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->configured = FALSE;
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* The following methods are defined in MI-X API */
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version_default(MixVideo * mix, guint * major,
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		guint * minor) {
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix || !major || !minor) {
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEO(mix)) {
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	*major = MIXVIDEO_CURRENT - MIXVIDEO_AGE;
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	*minor = MIXVIDEO_AGE;
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize_default(MixVideo * mix, MixCodecMode mode,
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoInitParams * init_params, MixDrmParams * drm_init_params) {
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixDisplay *mix_display = NULL;
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix || !init_params) {
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!mix || !init_params\n");
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mode >= MIX_CODEC_MODE_LAST) {
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("mode >= MIX_CODEC_MODE_LAST\n");
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0  //we have encoding support
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: We need to support encoding in the future */
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mode == MIX_CODEC_MODE_ENCODE) {
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("mode == MIX_CODEC_MODE_ENCODE\n");
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NOTIMPL;
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEO(mix)) {
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!MIX_IS_VIDEO(mix)\n");
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEOINITPARAMS(init_params)) {
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("!MIX_IS_VIDEOINITPARAMS(init_params\n");
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv = MIX_VIDEO_PRIVATE(mix);
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->initialized) {
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_W( "priv->initialized\n");
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_ALREADY_INIT;
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * Init thread before any threads/sync object are used.
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * TODO: If thread is not supported, what we do?
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 */
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!g_thread_supported()) {
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_W("!g_thread_supported()\n");
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_thread_init(NULL);
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* create object lock */
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->objlock = g_mutex_new();
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->objlock) {
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!priv->objlock\n");
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* clone mode */
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->codec_mode = mode;
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ref init_params */
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->init_params = (MixVideoInitParams *) mix_params_ref(MIX_PARAMS(
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			init_params));
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->init_params) {
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!priv->init_params\n");
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* NOTE: we don't do anything with drm_init_params */
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* libVA initialization */
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		VAStatus va_status;
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		Display *display = NULL;
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_videoinitparams_get_display(priv->init_params, &mix_display);
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (ret != MIX_RESULT_SUCCESS) {
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Failed to get display 1\n");
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (MIX_IS_DISPLAYX11(mix_display)) {
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			MixDisplayX11 *mix_displayx11 = MIX_DISPLAYX11(mix_display);
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = mix_displayx11_get_display(mix_displayx11, &display);
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (ret != MIX_RESULT_SUCCESS) {
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				LOG_E("Failed to get display 2\n");
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* TODO: add support to other MixDisplay type. For now, just return error!*/
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("It is not display x11\n");
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_FAIL;
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Now, we can initialize libVA */
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->va_display = vaGetDisplay(display);
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Oops! Fail to get VADisplay */
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!priv->va_display) {
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_FAIL;
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Fail to get VADisplay\n");
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Initialize libVA */
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		va_status = vaInitialize(priv->va_display, &priv->va_major_version,
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				&priv->va_minor_version);
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Oops! Fail to initialize libVA */
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (va_status != VA_STATUS_SUCCESS) {
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_FAIL;
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Fail to initialize libVA\n");
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: check the version numbers of libVA */
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->initialized = TRUE;
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_SUCCESS;
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix_video_private_cleanup(priv);
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(mix_display, mix_display_unref);
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize_default(MixVideo * mix) {
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT(mix, priv);
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_video_private_cleanup(priv);
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_decode(MixVideo * mix,
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsDec * config_params_dec, MixDrmParams * drm_config_params) {
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoConfigParamsDec *priv_config_params_dec = NULL;
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gchar *mime_type = NULL;
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint fps_n, fps_d;
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint bufpoolsize = 0;
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixFrameOrderMode frame_order_mode = MIX_FRAMEORDER_MODE_DISPLAYORDER;
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT(mix, priv);
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!config_params_dec) {
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!config_params_dec\n");
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEOCONFIGPARAMSDEC(config_params_dec)) {
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Not a MixVideoConfigParamsDec\n");
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * MixVideo has already been configured, it should be
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * re-configured.
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 *
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * TODO: Allow MixVideo re-configuration
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 */
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->configured) {
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_SUCCESS;
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_W( "Already configured\n");
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Make a copy of config_params */
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->config_params = (MixVideoConfigParams *) mix_params_dup(MIX_PARAMS(
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			config_params_dec));
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->config_params) {
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Fail to duplicate config_params\n");
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv_config_params_dec = (MixVideoConfigParamsDec *)priv->config_params;
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Get fps, frame order mode and mime type from config_params */
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsdec_get_mime_type(priv_config_params_dec, &mime_type);
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get mime type\n");
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_I( "mime : %s\n", mime_type);
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef MIX_LOG_ENABLE
503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (g_strcmp0(mime_type, "video/x-wmv") == 0) {
504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_I( "mime : video/x-wmv\n");
506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (MIX_IS_VIDEOCONFIGPARAMSDEC_VC1(priv_config_params_dec)) {
507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_I( "VC1 config_param\n");
508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Not VC1 config_param\n");
510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsdec_get_frame_order_mode(priv_config_params_dec,
515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&frame_order_mode);
516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to frame order mode\n");
518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsdec_get_frame_rate(priv_config_params_dec, &fps_n,
522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&fps_d);
523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get frame rate\n");
525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!fps_n) {
529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_FAIL;
530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "fps_n is 0\n");
531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsdec_get_buffer_pool_size(priv_config_params_dec,
535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&bufpoolsize);
536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get buffer pool size\n");
538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* create frame manager */
542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->frame_manager = mix_framemanager_new();
543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->frame_manager) {
544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to create frame manager\n");
546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* initialize frame manager */
550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (g_strcmp0(mime_type, "video/x-wmv") == 0 || g_strcmp0(mime_type,
552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			"video/mpeg") == 0 || g_strcmp0(mime_type, "video/x-divx") == 0) {
553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_framemanager_initialize(priv->frame_manager,
554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				frame_order_mode, fps_n, fps_d, FALSE);
555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_framemanager_initialize(priv->frame_manager,
557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				frame_order_mode, fps_n, fps_d, TRUE);
558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to initialize frame manager\n");
562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* create buffer pool */
566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->buffer_pool = mix_bufferpool_new();
567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->buffer_pool) {
568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to create buffer pool\n");
570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_bufferpool_initialize(priv->buffer_pool, bufpoolsize);
574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to initialize buffer pool\n");
576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Finally, we can create MixVideoFormat */
580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* What type of MixVideoFormat we need create? */
581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (g_strcmp0(mime_type, "video/x-wmv") == 0
583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&& MIX_IS_VIDEOCONFIGPARAMSDEC_VC1(priv_config_params_dec)) {
584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFormat_VC1 *video_format = mix_videoformat_vc1_new();
586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!video_format) {
587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_NO_MEMORY;
588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Failed to create VC-1 video format\n");
589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: work specific to VC-1 */
593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format = MIX_VIDEOFORMAT(video_format);
595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else if (g_strcmp0(mime_type, "video/x-h264") == 0
597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&& MIX_IS_VIDEOCONFIGPARAMSDEC_H264(priv_config_params_dec)) {
598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFormat_H264 *video_format = mix_videoformat_h264_new();
600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!video_format) {
601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_NO_MEMORY;
602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Failed to create H.264 video format\n");
603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: work specific to H.264 */
607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format = MIX_VIDEOFORMAT(video_format);
609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else if (g_strcmp0(mime_type, "video/mpeg") == 0 || g_strcmp0(mime_type,
611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			"video/x-divx") == 0) {
612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		guint version = 0;
614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Is this mpeg4:2 ? */
616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (g_strcmp0(mime_type, "video/mpeg") == 0) {
617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/*
619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			 *  we don't support mpeg other than mpeg verion 4
620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			 */
621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (!MIX_IS_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec)) {
622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = MIX_RESULT_NOT_SUPPORTED;
623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* what is the mpeg version ? */
627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = mix_videoconfigparamsdec_mp42_get_mpegversion(
628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					MIX_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec), &version);
629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (ret != MIX_RESULT_SUCCESS) {
630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				LOG_E("Failed to get mpeg version\n");
631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* if it is not MPEG4 */
635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (version != 4) {
636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = MIX_RESULT_NOT_SUPPORTED;
637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* config_param shall be MixVideoConfigParamsDecMP42 */
643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (!MIX_IS_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec)) {
644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = MIX_RESULT_NOT_SUPPORTED;
645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* what is the divx version ? */
649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = mix_videoconfigparamsdec_mp42_get_divxversion(
650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					MIX_VIDEOCONFIGPARAMSDEC_MP42(priv_config_params_dec), &version);
651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (ret != MIX_RESULT_SUCCESS) {
652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				LOG_E("Failed to get divx version\n");
653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* if it is not divx 4 or 5 */
657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (version != 4 && version != 5) {
658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = MIX_RESULT_NOT_SUPPORTED;
659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				goto cleanup;
660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFormat_MP42 *video_format = mix_videoformat_mp42_new();
664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!video_format) {
665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_NO_MEMORY;
666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("Failed to create MPEG-4:2 video format\n");
667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: work specific to MPEG-4:2 */
671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format = MIX_VIDEOFORMAT(video_format);
672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* Oops! A format we don't know */
676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_FAIL;
678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Unknown format, we can't handle it\n");
679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* initialize MixVideoFormat */
683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videofmt_initialize(priv->video_format, priv_config_params_dec,
684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			priv->frame_manager, priv->buffer_pool, &priv->surface_pool,
685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			priv->va_display);
686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed initialize video format\n");
689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_surfacepool_ref(priv->surface_pool);
693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* decide MixVideoFormat from mime_type*/
695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->configured = TRUE;
697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = MIX_RESULT_SUCCESS;
698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->config_params, mix_videoconfigparams_unref);
703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->frame_manager, mix_framemanager_unref);
704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->buffer_pool, mix_bufferpool_unref);
705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->video_format, mix_videoformat_unref);
706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mime_type) {
709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_free(mime_type);
710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
720bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_encode(MixVideo * mix,
721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsEnc * config_params_enc,
722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixDrmParams * drm_config_params) {
723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoConfigParamsEnc *priv_config_params_enc = NULL;
727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gchar *mime_type = NULL;
730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixEncodeTargetFormat encode_format = MIX_ENCODE_TARGET_FORMAT_H264;
731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint bufpoolsize = 0;
732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixFrameOrderMode frame_order_mode = MIX_FRAMEORDER_MODE_DECODEORDER;
734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT(mix, priv);
739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!config_params_enc) {
741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("!config_params_enc\n");
742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEOCONFIGPARAMSENC(config_params_enc)) {
745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Not a MixVideoConfigParams\n");
746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*
753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * MixVideo has already been configured, it should be
754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * re-configured.
755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 *
756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * TODO: Allow MixVideo re-configuration
757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 */
758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->configured) {
759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_SUCCESS;
760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Already configured\n");
761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Make a copy of config_params */
765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->config_params = (MixVideoConfigParams *) mix_params_dup(
766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			MIX_PARAMS(config_params_enc));
767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->config_params) {
768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Fail to duplicate config_params\n");
770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv_config_params_enc = (MixVideoConfigParamsEnc *)priv->config_params;
774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Get fps, frame order mode and mime type from config_params */
776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsenc_get_mime_type(priv_config_params_enc,
777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&mime_type);
778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get mime type\n");
780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_I( "mime : %s\n", mime_type);
784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsenc_get_encode_format(priv_config_params_enc,
786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&encode_format);
787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get target format\n");
789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_I( "encode_format : %d\n",
793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			encode_format);
794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoconfigparamsenc_get_buffer_pool_size(
796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			priv_config_params_enc, &bufpoolsize);
797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get buffer pool size\n");
799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* create frame manager */
803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->frame_manager = mix_framemanager_new();
804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->frame_manager) {
805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to create frame manager\n");
807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* initialize frame manager */
811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* frame rate can be any value for encoding. */
812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_framemanager_initialize(priv->frame_manager, frame_order_mode,
813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			1, 1, FALSE);
814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to initialize frame manager\n");
817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* create buffer pool */
821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->buffer_pool = mix_bufferpool_new();
822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!priv->buffer_pool) {
823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to create buffer pool\n");
825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_bufferpool_initialize(priv->buffer_pool, bufpoolsize);
829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to initialize buffer pool\n");
831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Finally, we can create MixVideoFormatEnc */
835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* What type of MixVideoFormatEnc we need create? */
836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (encode_format == MIX_ENCODE_TARGET_FORMAT_H264
838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&& MIX_IS_VIDEOCONFIGPARAMSENC_H264(priv_config_params_enc)) {
839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFormatEnc_H264 *video_format_enc =
841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				mix_videoformatenc_h264_new();
842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!video_format_enc) {
843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_RESULT_NO_MEMORY;
844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E("mix_video_configure_encode: Failed to create h264 video enc format\n");
845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: work specific to h264 encode */
849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc);
851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else if (encode_format == MIX_ENCODE_TARGET_FORMAT_MPEG4
854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            && MIX_IS_VIDEOCONFIGPARAMSENC_MPEG4(priv_config_params_enc)) {
855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_MPEG4 *video_format_enc = mix_videoformatenc_mpeg4_new();
857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!video_format_enc) {
858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = MIX_RESULT_NO_MEMORY;
859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E("mix_video_configure_encode: Failed to create mpeg-4:2 video format\n");
860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            goto cleanup;
861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* TODO: work specific to mpeg4 */
864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc);
866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else if (encode_format == MIX_ENCODE_TARGET_FORMAT_PREVIEW
869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            && MIX_IS_VIDEOCONFIGPARAMSENC_PREVIEW(priv_config_params_enc)) {
870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        MixVideoFormatEnc_Preview *video_format_enc = mix_videoformatenc_preview_new();
872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if (!video_format_enc) {
873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ret = MIX_RESULT_NO_MEMORY;
874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            LOG_E( "mix_video_configure_encode: Failed to create preview video format\n");
875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            goto cleanup;
876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		priv->video_format_enc = MIX_VIDEOFORMATENC(video_format_enc);
879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	else {
882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/*unsupported format */
884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NOT_SUPPORTED;
885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Unknown format, we can't handle it\n");
886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* initialize MixVideoEncFormat */
890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videofmtenc_initialize(priv->video_format_enc,
891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            priv_config_params_enc, priv->frame_manager, NULL, &priv->surface_pool,
892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            priv->va_display);
893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed initialize video format\n");
896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_surfacepool_ref(priv->surface_pool);
900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->configured = TRUE;
902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = MIX_RESULT_SUCCESS;
903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->frame_manager, mix_framemanager_unref);
908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->config_params, mix_videoconfigparams_unref);
909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->buffer_pool, mix_bufferpool_unref);
910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(priv->video_format_enc, mix_videoformatenc_unref);
911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mime_type) {
914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_free(mime_type);
915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
925bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure_default(MixVideo * mix,
926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams * config_params,
927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixDrmParams * drm_config_params) {
928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT(mix, priv);
935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!config_params) {
936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("!config_params\n");
937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*Decoder mode or Encoder mode*/
941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->codec_mode == MIX_CODEC_MODE_DECODE && MIX_IS_VIDEOCONFIGPARAMSDEC(config_params)) {
942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_video_configure_decode(mix, (MixVideoConfigParamsDec*)config_params, NULL);
943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE && MIX_IS_VIDEOCONFIGPARAMSENC(config_params)) {
944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_video_configure_encode(mix, (MixVideoConfigParamsEnc*)config_params, NULL);
945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Codec mode not supported\n");
947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "end\n");
950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
954bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config_default(MixVideo * mix,
955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams ** config_params) {
956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!config_params) {
963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!config_params\n");
964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	*config_params = MIX_VIDEOCONFIGPARAMS(mix_params_dup(MIX_PARAMS(priv->config_params)));
971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!*config_params) {
972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_NO_MEMORY;
973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to duplicate MixVideoConfigParams\n");
974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
988bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode_default(MixVideo * mix, MixBuffer * bufin[],
989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		gint bufincnt, MixVideoDecodeParams * decode_params) {
990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!bufin || !bufincnt || !decode_params) {
998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!bufin || !bufincnt || !decode_params\n");
999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//First check that we have surfaces available for decode
1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_surfacepool_check_available(priv->surface_pool);
1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret == MIX_RESULT_POOLEMPTY) {
1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_I( "Out of surface\n");
1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_OUTOFSURFACES;
1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videofmt_decode(priv->video_format, bufin, bufincnt, decode_params);
1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame_default(MixVideo * mix, MixVideoFrame ** frame) {
1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!frame) {
1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!frame\n");
1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V("Calling frame manager dequeue\n");
1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_framemanager_dequeue(priv->frame_manager, frame);
1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame_default(MixVideo * mix,
1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoFrame * frame) {
1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!frame) {
1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!frame\n");
1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*
1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * We don't need lock here. MixVideoFrame has lock to
1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * protect itself.
1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 */
1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_I("Releasing reference frame %x\n", (guint) frame);
1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_videoframe_unref(frame);
1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = MIX_RESULT_SUCCESS;
1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render_default(MixVideo * mix,
1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoRenderParams * render_params, MixVideoFrame *frame) {
1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixDisplay *mix_display = NULL;
1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixDisplayX11 *mix_display_x11 = NULL;
1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	Display *display = NULL;
1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	Drawable drawable = 0;
1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixRect src_rect, dst_rect;
1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	VARectangle *va_cliprects = NULL;
1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint number_of_cliprects = 0;
1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* VASurfaceID va_surface_id; */
1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gulong va_surface_id;
1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	VAStatus va_status;
1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!render_params || !frame) {
1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!render_params || !frame\n");
1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Is this render param valid? */
1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEORENDERPARAMS(render_params)) {
1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Not MixVideoRenderParams\n");
1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*
1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * We don't need lock here. priv->va_display may be the only variable
1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * seems need to be protected. But, priv->va_display is initialized
1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * when mixvideo object is initialized, and it keeps
1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 * the same value thoughout the life of mixvideo.
1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 */
1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* get MixDisplay prop from render param */
1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videorenderparams_get_display(render_params, &mix_display);
1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get mix_display\n");
1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Is this MixDisplayX11 ? */
1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: we shall also support MixDisplay other than MixDisplayX11 */
1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_DISPLAYX11(mix_display)) {
1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_INVALID_PARAM;
1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Not MixDisplayX11\n");
1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* cast MixDisplay to MixDisplayX11 */
1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_display_x11 = MIX_DISPLAYX11(mix_display);
1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Get Drawable */
1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_displayx11_get_drawable(mix_display_x11, &drawable);
1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Failed to get drawable\n");
1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Get Display */
1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_displayx11_get_display(mix_display_x11, &display);
1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Failed to get display\n");
1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* get src_rect */
1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videorenderparams_get_src_rect(render_params, &src_rect);
1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get SOURCE src_rect\n");
1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* get dst_rect */
1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videorenderparams_get_dest_rect(render_params, &dst_rect);
1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Failed to get dst_rect\n");
1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* get va_cliprects */
1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videorenderparams_get_cliprects_internal(render_params,
1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&va_cliprects, &number_of_cliprects);
1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get va_cliprects\n");
1188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* get surface id from frame */
1192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videoframe_get_frame_id(frame, &va_surface_id);
1193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (ret != MIX_RESULT_SUCCESS) {
1194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed to get va_surface_id\n");
1195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint64 timestamp = 0;
1198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_videoframe_get_timestamp(frame, &timestamp);
1199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Displaying surface ID %d, timestamp %"G_GINT64_FORMAT"\n", (int)va_surface_id, timestamp);
1200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	guint32 frame_structure = 0;
1202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_videoframe_get_frame_structure(frame, &frame_structure);
1203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: the last param of vaPutSurface is de-interlacing flags,
1204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 what is value shall be*/
1205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	va_status = vaPutSurface(priv->va_display, (VASurfaceID) va_surface_id,
1206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			drawable, src_rect.x, src_rect.y, src_rect.width, src_rect.height,
1207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			dst_rect.x, dst_rect.y, dst_rect.width, dst_rect.height,
1208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			va_cliprects, number_of_cliprects, frame_structure);
1209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (va_status != VA_STATUS_SUCCESS) {
1211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = MIX_RESULT_FAIL;
1212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Failed vaPutSurface() : va_status = %d\n", va_status);
1213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
1214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* TODO: Is this only for X11? */
1217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	XSync(display, FALSE);
1218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = MIX_RESULT_SUCCESS;
1220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
1222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(mix_display, mix_display_unref)
1224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/*	MIXUNREF(render_params, mix_videorenderparams_unref)*/
1225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
1227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
1230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1237bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode_default(MixVideo * mix, MixBuffer * bufin[],
1238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		gint bufincnt, MixIOVec * iovout[], gint iovoutcnt,
1239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoEncodeParams * encode_params) {
1240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!bufin || !bufincnt) { //we won't check encode_params here, it's just a placeholder
1248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!bufin || !bufincnt\n");
1249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videofmtenc_encode(priv->video_format_enc, bufin, bufincnt,
1255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			iovout, iovoutcnt, encode_params);
1256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1263bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush_default(MixVideo * mix) {
1264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->codec_mode == MIX_CODEC_MODE_DECODE && priv->video_format != NULL) {
1276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_videofmt_flush(priv->video_format);
1277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_framemanager_flush(priv->frame_manager);
1279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE
1280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&& priv->video_format_enc != NULL) {
1281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/*No framemanager for encoder now*/
1282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_videofmtenc_flush(priv->video_format_enc);
1283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
1284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_mutex_unlock(priv->objlock);
1285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Invalid video_format/video_format_enc Pointer\n");
1286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1298bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos_default(MixVideo * mix) {
1299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (priv->codec_mode == MIX_CODEC_MODE_DECODE && priv->video_format != NULL) {
1311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_videofmt_eos(priv->video_format);
1312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* frame manager will set EOS flag to be TRUE */
1314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_framemanager_eos(priv->frame_manager);
1315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else if (priv->codec_mode == MIX_CODEC_MODE_ENCODE
1316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			&& priv->video_format_enc != NULL) {
1317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/*No framemanager now*/
1318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = mix_videofmtenc_eos(priv->video_format_enc);
1319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
1320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_mutex_unlock(priv->objlock);
1321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E("Invalid video_format/video_format_enc Pointer\n");
1322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1333bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state_default(MixVideo * mix, MixState * state) {
1334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!state) {
1342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!state\n");
1343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	*state = MIX_STATE_CONFIGURED;
1347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
1351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1353bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer_default(MixVideo * mix, MixBuffer ** buf) {
1354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!buf) {
1363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!buf\n");
1364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
1365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_bufferpool_get(priv->buffer_pool, buf);
1371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End ret = 0x%x\n", ret);
1376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1381bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer_default(MixVideo * mix, MixBuffer * buf) {
1382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT ret = MIX_RESULT_FAIL;
1384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!buf) {
1391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!buf\n");
1392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM;
1393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- begin lock --------------------- */
1396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_buffer_unref(buf);
1399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* ---------------------- end lock --------------------- */
1401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1408bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size_default (MixVideo * mix, guint *max_size)
1409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
1410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      MIX_RESULT ret = MIX_RESULT_FAIL;
1411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoPrivate *priv = NULL;
1412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "Begin\n");
1414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix || !max_size) /* TODO: add other parameter NULL checking */
1416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
1417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!mix || !bufsize\n");
1418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR;
1419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_INIT_CONFIG(mix, priv);
1422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(priv->objlock);
1424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ret = mix_videofmtenc_get_max_coded_buffer_size(priv->video_format_enc, max_size);
1426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_unlock(priv->objlock);
1428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
1430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
1431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
1434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * API functions
1435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
1436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define CHECK_AND_GET_MIX_CLASS(mix, klass) \
1438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix) { \
1439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_NULL_PTR; \
1440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} \
1441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!MIX_IS_VIDEO(mix)) { \
1442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Not MixVideo\n"); \
1443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return MIX_RESULT_INVALID_PARAM; \
1444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} \
1445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass = MIX_VIDEO_GET_CLASS(mix);
1446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1448bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_version(MixVideo * mix, guint * major, guint * minor) {
1449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_version_func) {
1454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_version_func(mix, major, minor);
1455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1460bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_initialize(MixVideo * mix, MixCodecMode mode,
1461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoInitParams * init_params, MixDrmParams * drm_init_params) {
1462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->initialize_func) {
1467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->initialize_func(mix, mode, init_params, drm_init_params);
1468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1473bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_deinitialize(MixVideo * mix) {
1474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->deinitialize_func) {
1479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->deinitialize_func(mix);
1480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1484bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_configure(MixVideo * mix,
1485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams * config_params,
1486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixDrmParams * drm_config_params) {
1487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->configure_func) {
1492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->configure_func(mix, config_params, drm_config_params);
1493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1497bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_config(MixVideo * mix,
1498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParams ** config_params_dec) {
1499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_config_func) {
1504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_config_func(mix, config_params_dec);
1505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1510bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_decode(MixVideo * mix, MixBuffer * bufin[], gint bufincnt,
1511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoDecodeParams * decode_params) {
1512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->decode_func) {
1517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->decode_func(mix, bufin, bufincnt,
1518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				decode_params);
1519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1524bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_frame(MixVideo * mix, MixVideoFrame ** frame) {
1525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_frame_func) {
1530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_frame_func(mix, frame);
1531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1536bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_frame(MixVideo * mix, MixVideoFrame * frame) {
1537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->release_frame_func) {
1542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->release_frame_func(mix, frame);
1543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1547bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_render(MixVideo * mix,
1548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoRenderParams * render_params, MixVideoFrame *frame) {
1549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->render_func) {
1554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->render_func(mix, render_params, frame);
1555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1560bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_encode(MixVideo * mix, MixBuffer * bufin[], gint bufincnt,
1561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixIOVec * iovout[], gint iovoutcnt,
1562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoEncodeParams * encode_params) {
1563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->encode_func) {
1568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->encode_func(mix, bufin, bufincnt, iovout, iovoutcnt,
1569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				encode_params);
1570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1575bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_flush(MixVideo * mix) {
1576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->flush_func) {
1581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->flush_func(mix);
1582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1586bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_eos(MixVideo * mix) {
1587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->eos_func) {
1592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->eos_func(mix);
1593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1597bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_state(MixVideo * mix, MixState * state) {
1598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_state_func) {
1603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_state_func(mix, state);
1604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1608bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_mixbuffer(MixVideo * mix, MixBuffer ** buf) {
1609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_mix_buffer_func) {
1614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_mix_buffer_func(mix, buf);
1615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1619bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_release_mixbuffer(MixVideo * mix, MixBuffer * buf) {
1620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = NULL;
1622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	CHECK_AND_GET_MIX_CLASS(mix, klass);
1623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->release_mix_buffer_func) {
1625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->release_mix_buffer_func(mix, buf);
1626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1630bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_video_get_max_coded_buffer_size(MixVideo * mix, guint *bufsize) {
1631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoClass *klass = MIX_VIDEO_GET_CLASS(mix);
1633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
1634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->get_max_coded_buffer_size_func) {
1635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->get_max_coded_buffer_size_func(mix, bufsize);
1636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
1637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
1638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
1639