1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee INTEL CONFIDENTIAL
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Copyright 2009 Intel Corporation All Rights Reserved.
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include <glib.h>
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h"
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat.h"
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIXUNREF(obj, unref) if(obj) { unref(obj); obj = NULL; }
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_getcaps_default(MixVideoFormat *mix,
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		GString *msg);
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_initialize_default(MixVideoFormat *mix,
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsDec * config_params,
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MixFrameManager * frame_mgr,
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBufferPool * input_buf_pool,
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixSurfacePool ** surface_pool,
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VADisplay vadisplay);
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix_videofmt_decode_default(MixVideoFormat *mix,
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBuffer * bufin[], gint bufincnt,
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MixVideoDecodeParams * decode_params);
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_flush_default(MixVideoFormat *mix);
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_eos_default(MixVideoFormat *mix);
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_deinitialize_default(MixVideoFormat *mix);
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic GObjectClass *parent_class = NULL;
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_finalize(GObject * obj);
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE (MixVideoFormat, mix_videoformat, G_TYPE_OBJECT);
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_init(MixVideoFormat * self) {
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* public member initialization */
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* These are all public because MixVideoFormat objects are completely internal to MixVideo,
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		no need for private members  */
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->initialized = FALSE;
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->framemgr = NULL;
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->surfacepool = NULL;
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->inputbufpool = NULL;
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->inputbufqueue = NULL;
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_display = NULL;
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_context = VA_INVALID_ID;
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_config = VA_INVALID_ID;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_surfaces = NULL;
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->va_num_surfaces = 0;
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->mime_type = NULL;
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->frame_rate_num = 0;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->frame_rate_denom = 0;
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->picture_width = 0;
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->picture_height = 0;
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->parse_in_progress = FALSE;
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->current_timestamp = 0;
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_class_init(MixVideoFormatClass * klass) {
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	GObjectClass *gobject_class = (GObjectClass *) klass;
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* parent class for later use */
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	parent_class = g_type_class_peek_parent(klass);
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gobject_class->finalize = mix_videoformat_finalize;
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* setup vmethods with base implementation */
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->getcaps = mix_videofmt_getcaps_default;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->initialize = mix_videofmt_initialize_default;
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->decode = mix_videofmt_decode_default;
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->flush = mix_videofmt_flush_default;
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->eos = mix_videofmt_eos_default;
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	klass->deinitialize = mix_videofmt_deinitialize_default;
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormat *
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformat_new(void) {
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormat *ret = g_object_new(MIX_TYPE_VIDEOFORMAT, NULL);
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformat_finalize(GObject * obj) {
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* clean up here. */
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	VAStatus va_status;
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormat *mix = MIX_VIDEOFORMAT(obj);
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixInputBufferEntry *buf_entry = NULL;
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(mix->objectlock) {
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_free(mix->objectlock);
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->objectlock = NULL;
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->mime_type)
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->mime_type->str)
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_string_free(mix->mime_type, TRUE);
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		else
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_string_free(mix->mime_type, FALSE);
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//MiVideo object calls the _deinitialize() for frame manager
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(mix->framemgr, mix_framemanager_unref);
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->surfacepool)
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	  mix_surfacepool_deinitialize(mix->surfacepool);
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	  MIXUNREF(mix->surfacepool, mix_surfacepool_unref);
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//libVA cleanup (vaTerminate is called from MixVideo object)
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->va_display) {
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->va_context != VA_INVALID_ID)
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			va_status = vaDestroyConfig(mix->va_display, mix->va_config);
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (va_status != VA_STATUS_SUCCESS) {
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_W( "Failed vaDestroyConfig\n");
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix->va_config = VA_INVALID_ID;
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->va_context != VA_INVALID_ID)
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			va_status = vaDestroyContext(mix->va_display, mix->va_context);
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (va_status != VA_STATUS_SUCCESS) {
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				LOG_W( "Failed vaDestroyContext\n");
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix->va_context = VA_INVALID_ID;
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->va_surfaces)
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			va_status = vaDestroySurfaces(mix->va_display, mix->va_surfaces, mix->va_num_surfaces);
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (va_status != VA_STATUS_SUCCESS) {
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				LOG_W( "Failed vaDestroySurfaces\n");
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_free(mix->va_surfaces);
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix->va_surfaces = NULL;
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix->va_num_surfaces = 0;
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//Deinit input buffer queue
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	while (!g_queue_is_empty(mix->inputbufqueue))
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		buf_entry = g_queue_pop_head(mix->inputbufqueue);
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix_buffer_unref(buf_entry->buf);
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_free(buf_entry);
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_queue_free(mix->inputbufqueue);
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//MixBuffer pool is deallocated in MixVideo object
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->inputbufpool = NULL;
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Chain up parent */
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (parent_class->finalize) {
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		parent_class->finalize(obj);
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormat *
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformat_ref(MixVideoFormat * mix) {
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return (MixVideoFormat *) g_object_ref(G_OBJECT(mix));
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_getcaps_default(MixVideoFormat *mix,
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		GString *msg) {
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_print("mix_videofmt_getcaps_default\n");
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_initialize_default(MixVideoFormat *mix,
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsDec * config_params,
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MixFrameManager * frame_mgr,
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBufferPool * input_buf_pool,
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixSurfacePool ** surface_pool,
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                VADisplay va_display) {
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V(	"Begin\n");
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_RESULT res = MIX_RESULT_SUCCESS;
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixInputBufferEntry *buf_entry = NULL;
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix || !config_params || !frame_mgr || !input_buf_pool || !surface_pool || !va_display)
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "NUll pointer passed in\n");
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return (MIX_RESULT_NULL_PTR);
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// Create object lock
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// Note that g_thread_init() has already been called by mix_video_init()
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->objectlock)  //If already exists, then deallocate old one (we are being re-initialized)
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_free(mix->objectlock);
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->objectlock = NULL;
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->objectlock = g_mutex_new();
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix->objectlock) {
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "!mix->objectlock\n");
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return (MIX_RESULT_NO_MEMORY);
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_mutex_lock(mix->objectlock);
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//Clean up any previous framemgr
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIXUNREF(mix->framemgr, mix_framemanager_unref);
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->framemgr = frame_mgr;
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_framemanager_ref(mix->framemgr);
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->va_display = va_display;
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->mime_type)  //Clean up any previous mime_type
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->mime_type->str)
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_string_free(mix->mime_type, TRUE);
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		else
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_string_free(mix->mime_type, FALSE);
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gchar *mime_tmp = NULL;
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	res = mix_videoconfigparamsdec_get_mime_type(config_params, &mime_tmp);
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mime_tmp)
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix->mime_type = g_string_new(mime_tmp);
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_free(mime_tmp);
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (!mix->mime_type) //new failed
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			res = MIX_RESULT_NO_MEMORY;
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			LOG_E( "Could not duplicate mime_type\n");
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			goto cleanup;
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}  //else there is no mime_type; leave as NULL
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	res = mix_videoconfigparamsdec_get_frame_rate(config_params, &(mix->frame_rate_num), &(mix->frame_rate_denom));
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (res != MIX_RESULT_SUCCESS)
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Error getting frame_rate\n");
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	res = mix_videoconfigparamsdec_get_picture_res(config_params, &(mix->picture_width), &(mix->picture_height));
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (res != MIX_RESULT_SUCCESS)
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Error getting picture_res\n");
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (mix->inputbufqueue)
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		//Deinit previous input buffer queue
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		while (!g_queue_is_empty(mix->inputbufqueue))
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			buf_entry = g_queue_pop_head(mix->inputbufqueue);
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix_buffer_unref(buf_entry->buf);
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_free(buf_entry);
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_queue_free(mix->inputbufqueue);
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//MixBuffer pool is cleaned up in MixVideo object
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->inputbufpool = NULL;
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->inputbufpool = input_buf_pool;
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix->inputbufqueue = g_queue_new();
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (!mix->inputbufqueue)  //New failed
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	{
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		res = MIX_RESULT_NO_MEMORY;
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		LOG_E( "Could not duplicate mime_type\n");
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		goto cleanup;
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// surface pool, VA context/config and parser handle are initialized by
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// derived classes
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	cleanup:
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (res != MIX_RESULT_SUCCESS) {
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MIXUNREF(mix->framemgr, mix_framemanager_unref);
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->mime_type)
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (mix->mime_type->str)
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				g_string_free(mix->mime_type, TRUE);
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			else
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				g_string_free(mix->mime_type, FALSE);
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix->mime_type = NULL;
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->objectlock)
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_mutex_unlock(mix->objectlock);
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                g_mutex_free(mix->objectlock);
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                mix->objectlock = NULL;
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix->frame_rate_num = 0;
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix->frame_rate_denom = 1;
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix->picture_width = 0;
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix->picture_height = 0;
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	} else {
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//Normal unlock
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix->objectlock)
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			g_mutex_unlock(mix->objectlock);
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_V( "End\n");
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return res;
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_decode_default(MixVideoFormat *mix,
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBuffer * bufin[], gint bufincnt,
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MixVideoDecodeParams * decode_params) {
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_flush_default(MixVideoFormat *mix) {
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_eos_default(MixVideoFormat *mix) {
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_deinitialize_default(MixVideoFormat *mix) {
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//All teardown is being done in _finalize()
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* mixvideoformat class methods implementation */
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_getcaps(MixVideoFormat *mix, GString *msg) {
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_print("mix_videofmt_getcaps\n");
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->getcaps) {
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->getcaps(mix, msg);
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_NOTIMPL;
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_initialize(MixVideoFormat *mix,
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixVideoConfigParamsDec * config_params,
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                MixFrameManager * frame_mgr,
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBufferPool * input_buf_pool,
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixSurfacePool ** surface_pool,
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		VADisplay va_display) {
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->initialize) {
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->initialize(mix, config_params, frame_mgr,
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					input_buf_pool, surface_pool, va_display);
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_FAIL;
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_decode(MixVideoFormat *mix, MixBuffer * bufin[],
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                gint bufincnt, MixVideoDecodeParams * decode_params) {
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->decode) {
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->decode(mix, bufin, bufincnt, decode_params);
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_FAIL;
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_flush(MixVideoFormat *mix) {
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->flush) {
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->flush(mix);
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_FAIL;
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_eos(MixVideoFormat *mix) {
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->eos) {
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->eos(mix);
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_FAIL;
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_deinitialize(MixVideoFormat *mix) {
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix);
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (klass->deinitialize) {
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		return klass->deinitialize(mix);
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_FAIL;
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
402