1/*
2 INTEL CONFIDENTIAL
3 Copyright 2009 Intel Corporation All Rights Reserved.
4 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.
5
6 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.
7 */
8
9/**
10 * SECTION:mixvideoinitparams
11 * @short_description: VideoInit parameters
12 *
13 * A data object which stores videoinit specific parameters.
14 */
15
16#include "mixvideoinitparams.h"
17
18#define SAFE_FREE(p) if(p) { g_free(p); p = NULL; }
19
20static GType _mix_videoinitparams_type = 0;
21static MixParamsClass *parent_class = NULL;
22
23#define _do_init { _mix_videoinitparams_type = g_define_type_id; }
24
25gboolean mix_videoinitparams_copy(MixParams * target, const MixParams * src);
26MixParams *mix_videoinitparams_dup(const MixParams * obj);
27gboolean mix_videoinitparams_equal(MixParams * first, MixParams * second);
28static void mix_videoinitparams_finalize(MixParams * obj);
29
30G_DEFINE_TYPE_WITH_CODE (MixVideoInitParams, mix_videoinitparams,
31		MIX_TYPE_PARAMS, _do_init);
32
33static void mix_videoinitparams_init(MixVideoInitParams * self) {
34
35	/* Initialize member varibles */
36	self->display = NULL;
37	self->reserved1 = NULL;
38	self->reserved2 = NULL;
39	self->reserved3 = NULL;
40	self->reserved4 = NULL;
41}
42
43static void mix_videoinitparams_class_init(MixVideoInitParamsClass * klass) {
44	MixParamsClass *mixparams_class = MIX_PARAMS_CLASS(klass);
45
46	/* setup static parent class */
47	parent_class = (MixParamsClass *) g_type_class_peek_parent(klass);
48
49	mixparams_class->finalize = mix_videoinitparams_finalize;
50	mixparams_class->copy = (MixParamsCopyFunction) mix_videoinitparams_copy;
51	mixparams_class->dup = (MixParamsDupFunction) mix_videoinitparams_dup;
52	mixparams_class->equal = (MixParamsEqualFunction) mix_videoinitparams_equal;
53}
54
55MixVideoInitParams *
56mix_videoinitparams_new(void) {
57	MixVideoInitParams *ret = (MixVideoInitParams *) g_type_create_instance(
58			MIX_TYPE_VIDEOINITPARAMS);
59
60	return ret;
61}
62
63void mix_videoinitparams_finalize(MixParams * obj) {
64	/* clean up here. */
65
66	MixVideoInitParams *self = MIX_VIDEOINITPARAMS(obj);
67
68	/* unref display */
69	if (self->display) {
70		mix_display_unref(self->display);
71		self->display = NULL;
72	}
73
74	/* Chain up parent */
75	if (parent_class->finalize) {
76		parent_class->finalize(obj);
77	}
78}
79
80MixVideoInitParams *
81mix_videoinitparams_ref(MixVideoInitParams * mix) {
82	return (MixVideoInitParams *) mix_params_ref(MIX_PARAMS(mix));
83}
84
85/**
86 * mix_videoinitparams_dup:
87 * @obj: a #MixVideoInitParams object
88 * @returns: a newly allocated duplicate of the object.
89 *
90 * Copy duplicate of the object.
91 */
92MixParams *
93mix_videoinitparams_dup(const MixParams * obj) {
94	MixParams *ret = NULL;
95	if (MIX_IS_VIDEOINITPARAMS(obj)) {
96		MixVideoInitParams *duplicate = mix_videoinitparams_new();
97		if (mix_videoinitparams_copy(MIX_PARAMS(duplicate), MIX_PARAMS(obj))) {
98			ret = MIX_PARAMS(duplicate);
99		} else {
100			mix_videoinitparams_unref(duplicate);
101		}
102	}
103	return ret;
104}
105
106/**
107 * mix_videoinitparams_copy:
108 * @target: copy to target
109 * @src: copy from src
110 * @returns: boolean indicates if copy is successful.
111 *
112 * Copy instance data from @src to @target.
113 */
114gboolean mix_videoinitparams_copy(MixParams * target, const MixParams * src) {
115	MixVideoInitParams *this_target, *this_src;
116	if (MIX_IS_VIDEOINITPARAMS(target) && MIX_IS_VIDEOINITPARAMS(src)) {
117		/* Cast the base object to this child object */
118		this_target = MIX_VIDEOINITPARAMS(target);
119		this_src = MIX_VIDEOINITPARAMS(src);
120		/* Copy properties from source to target. */
121
122		/* duplicate display */
123
124		this_target->display = mix_display_dup(this_src->display);
125
126		/* Now chainup base class */
127		if (parent_class->copy) {
128			return parent_class->copy(MIX_PARAMS_CAST(target), MIX_PARAMS_CAST(
129					src));
130		} else {
131			return TRUE;
132		}
133	}
134	return FALSE;
135}
136
137/**
138 * mix_videoinitparams_equal:
139 * @first: first object to compare
140 * @second: seond object to compare
141 * @returns: boolean indicates if instance are equal.
142 *
143 * Copy instance data from @src to @target.
144 */
145gboolean mix_videoinitparams_equal(MixParams * first, MixParams * second) {
146	gboolean ret = FALSE;
147	MixVideoInitParams *this_first, *this_second;
148	this_first = MIX_VIDEOINITPARAMS(first);
149	this_second = MIX_VIDEOINITPARAMS(second);
150	if (MIX_IS_VIDEOINITPARAMS(first) && MIX_IS_VIDEOINITPARAMS(second)) {
151		// Compare member variables
152		if (!this_first->display && !this_second->display) {
153			ret = TRUE;
154		} else if (this_first->display && this_second->display) {
155
156			/* compare MixDisplay */
157			ret = mix_display_equal(this_first->display, this_second->display);
158		}
159
160		if (ret == FALSE) {
161			return FALSE;
162		}
163		// members within this scope equal. chaining up.
164		MixParamsClass *klass = MIX_PARAMS_CLASS(parent_class);
165		if (klass->equal)
166			ret = parent_class->equal(first, second);
167		else
168			ret = TRUE;
169	}
170	return ret;
171}
172
173#define MIX_VIDEOINITPARAMS_SETTER_CHECK_INPUT(obj) \
174	if(!obj) return MIX_RESULT_NULL_PTR; \
175	if(!MIX_IS_VIDEOINITPARAMS(obj)) return MIX_RESULT_FAIL; \
176
177#define MIX_VIDEOINITPARAMS_GETTER_CHECK_INPUT(obj, prop) \
178	if(!obj || !prop) return MIX_RESULT_NULL_PTR; \
179	if(!MIX_IS_VIDEOINITPARAMS(obj)) return MIX_RESULT_FAIL; \
180
181MIX_RESULT mix_videoinitparams_set_display(MixVideoInitParams * obj,
182		MixDisplay * display) {
183	MIX_VIDEOINITPARAMS_SETTER_CHECK_INPUT (obj);
184
185	if(obj->display) {
186		mix_display_unref(obj->display);
187	}
188	obj->display = NULL;
189
190	if(display) {
191	/*	obj->display = mix_display_dup(display);
192		if(!obj->display) {
193			return MIX_RESULT_NO_MEMORY;
194		}*/
195
196		obj->display = mix_display_ref(display);
197	}
198
199	return MIX_RESULT_SUCCESS;
200}
201
202/*
203 Caller is responsible to use g_free to free the memory
204 */
205MIX_RESULT mix_videoinitparams_get_display(MixVideoInitParams * obj,
206		MixDisplay ** display) {
207	MIX_VIDEOINITPARAMS_GETTER_CHECK_INPUT (obj, display);
208
209	*display = NULL;
210	if(obj->display) {
211	/*	*display = mix_display_dup(obj->display);
212		if(!*display) {
213			return MIX_RESULT_NO_MEMORY;
214		}*/
215		*display = mix_display_ref(obj->display);
216	}
217
218	return MIX_RESULT_SUCCESS;
219}
220