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/**
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * SECTION:mixbuffer
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @short_description: VideoConfig parameters
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * A data object which stores videoconfig specific parameters.
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h"
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixbuffer.h"
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixbuffer_private.h"
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define SAFE_FREE(p) if(p) { g_free(p); p = NULL; }
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic GType _mix_buffer_type = 0;
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MixParamsClass *parent_class = NULL;
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define _do_init { _mix_buffer_type = g_define_type_id; }
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_buffer_copy(MixParams * target, const MixParams * src);
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixParams *mix_buffer_dup(const MixParams * obj);
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_buffer_equal(MixParams * first, MixParams * second);
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_buffer_finalize(MixParams * obj);
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE_WITH_CODE (MixBuffer, mix_buffer, MIX_TYPE_PARAMS,
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		_do_init);
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_buffer_init(MixBuffer * self) {
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* initialize properties here */
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixBufferPrivate *priv = MIX_BUFFER_GET_PRIVATE(self);
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->reserved = priv;
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->pool = NULL;
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->data = NULL;
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->size = 0;
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->token = 0;
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	self->callback = NULL;
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_buffer_class_init(MixBufferClass * klass) {
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixParamsClass *mixparams_class = MIX_PARAMS_CLASS(klass);
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* setup static parent class */
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	parent_class = (MixParamsClass *) g_type_class_peek_parent(klass);
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mixparams_class->finalize = mix_buffer_finalize;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mixparams_class->copy = (MixParamsCopyFunction) mix_buffer_copy;
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mixparams_class->dup = (MixParamsDupFunction) mix_buffer_dup;
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mixparams_class->equal = (MixParamsEqualFunction) mix_buffer_equal;
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Register and allocate the space the private structure for this object */
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	g_type_class_add_private(mixparams_class, sizeof(MixBufferPrivate));
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixBuffer *
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_buffer_new(void) {
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixBuffer *ret = (MixBuffer *) g_type_create_instance(MIX_TYPE_BUFFER);
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_buffer_finalize(MixParams * obj) {
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* clean up here. */
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* MixBuffer *self = MIX_BUFFER(obj); */
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* Chain up parent */
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (parent_class->finalize) {
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		parent_class->finalize(obj);
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixBuffer *
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_buffer_ref(MixBuffer * mix) {
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return (MixBuffer *) mix_params_ref(MIX_PARAMS(mix));
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_buffer_dup:
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @obj: a #MixBuffer object
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: a newly allocated duplicate of the object.
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy duplicate of the object.
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixParams *
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_buffer_dup(const MixParams * obj) {
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixParams *ret = NULL;
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (MIX_IS_BUFFER(obj)) {
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBuffer *duplicate = mix_buffer_new();
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (mix_buffer_copy(MIX_PARAMS(duplicate), MIX_PARAMS(obj))) {
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			ret = MIX_PARAMS(duplicate);
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			mix_buffer_unref(duplicate);
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_buffer_copy:
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @target: copy to target
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @src: copy from src
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: boolean indicates if copy is successful.
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy instance data from @src to @target.
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_buffer_copy(MixParams * target, const MixParams * src) {
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixBuffer *this_target, *this_src;
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (MIX_IS_BUFFER(target) && MIX_IS_BUFFER(src)) {
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		// Cast the base object to this child object
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_target = MIX_BUFFER(target);
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_src = MIX_BUFFER(src);
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		// Duplicate string
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_target->data = this_src->data;
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_target->size = this_src->size;
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_target->token = this_src->token;
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_target->callback = this_src->callback;
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		// Now chainup base class
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (parent_class->copy) {
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			return parent_class->copy(MIX_PARAMS_CAST(target), MIX_PARAMS_CAST(
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					src));
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		} else {
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			return TRUE;
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return FALSE;
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/**
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * mix_buffer_:
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @first: first object to compare
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @second: seond object to compare
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * @returns: boolean indicates if instance are equal.
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Copy instance data from @src to @target.
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.leegboolean mix_buffer_equal(MixParams * first, MixParams * second) {
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	gboolean ret = FALSE;
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixBuffer *this_first, *this_second;
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (MIX_IS_BUFFER(first) && MIX_IS_BUFFER(second)) {
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		// Deep compare
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		// Cast the base object to this child object
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_first = MIX_BUFFER(first);
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		this_second = MIX_BUFFER(second);
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (this_first->data == this_second->data && this_first->size
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				== this_second->size && this_first->token == this_second->token
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				&& this_first->callback == this_second->callback) {
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			// members within this scope equal. chaining up.
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class);
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if (klass->equal)
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = klass->equal(first, second);
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			else
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = TRUE;
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIX_BUFFER_SETTER_CHECK_INPUT(obj) \
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!obj) return MIX_RESULT_NULL_PTR; \
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if(!MIX_IS_BUFFER(obj)) return MIX_RESULT_FAIL; \
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_buffer_set_data(MixBuffer * obj, guchar *data, guint size,
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		gulong token, MixBufferCallback callback) {
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_BUFFER_SETTER_CHECK_INPUT (obj);
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	obj->data = data;
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	obj->size = size;
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	obj->token = token;
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	obj->callback = callback;
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_buffer_set_pool(MixBuffer *obj, MixBufferPool *pool) {
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MIX_BUFFER_SETTER_CHECK_INPUT (obj);
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	MixBufferPrivate *priv = (MixBufferPrivate *) obj->reserved;
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	priv->pool = pool;
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return MIX_RESULT_SUCCESS;
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_buffer_unref(MixBuffer * obj) {
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// Unref through base class
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	mix_params_unref(MIX_PARAMS(obj));
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	LOG_I( "refcount = %d\n", MIX_PARAMS(
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			obj)->refcount);
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	// Check if we have reduced to 1, in which case we add ourselves to free pool
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	if (MIX_PARAMS(obj)->refcount == 1) {
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		MixBufferPrivate *priv = (MixBufferPrivate *) obj->reserved;
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		g_return_if_fail(priv->pool != NULL);
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if (obj->callback) {
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			obj->callback(obj->token, obj->data);
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		mix_bufferpool_put(priv->pool, obj);
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	}
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
221