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:mixvideoconfigparams
11 * @short_description: VideoConfig parameters
12 *
13 * A data object which stores videoconfig specific parameters.
14 */
15
16 #include <string.h>
17 #include "mixvideolog.h"
18 #include "mixvideoconfigparamsdec.h"
19
20 static GType _mix_videoconfigparamsdec_type = 0;
21 static MixVideoConfigParamsClass *parent_class = NULL;
22
23 #define _do_init { _mix_videoconfigparamsdec_type = g_define_type_id; }
24
25 gboolean mix_videoconfigparamsdec_copy(MixParams * target, const MixParams * src);
26 MixParams *mix_videoconfigparamsdec_dup(const MixParams * obj);
27 gboolean mix_videoconfigparamsdec_equal(MixParams * first, MixParams * second);
28 static void mix_videoconfigparamsdec_finalize(MixParams * obj);
29
30 G_DEFINE_TYPE_WITH_CODE (MixVideoConfigParamsDec, mix_videoconfigparamsdec,
31 MIX_TYPE_VIDEOCONFIGPARAMS, _do_init);
32
mix_videoconfigparamsdec_init(MixVideoConfigParamsDec * self)33 static void mix_videoconfigparamsdec_init(MixVideoConfigParamsDec * self) {
34
35 /* initialize properties here */
36
37 self->frame_order_mode = MIX_FRAMEORDER_MODE_DISPLAYORDER;
38 memset(&self->header, 0, sizeof(self->header));
39
40 self->mime_type = NULL;
41
42 self->frame_rate_num = 0;
43 self->frame_rate_denom = 0;
44
45 self->picture_width = 0;
46 self->picture_height = 0;
47
48 self->raw_format = 0;
49 self->rate_control = 0;
50 self->mixbuffer_pool_size = 0;
51 self->extra_surface_allocation = 0;
52
53 /* TODO: initialize other properties */
54 self->reserved1 = NULL;
55 self->reserved2 = NULL;
56 self->reserved3 = NULL;
57 self->reserved4 = NULL;
58 }
59
mix_videoconfigparamsdec_class_init(MixVideoConfigParamsDecClass * klass)60 static void mix_videoconfigparamsdec_class_init(MixVideoConfigParamsDecClass * klass) {
61 MixParamsClass *mixparams_class = MIX_PARAMS_CLASS(klass);
62
63 /* setup static parent class */
64 parent_class = (MixVideoConfigParamsClass *) g_type_class_peek_parent(klass);
65
66 mixparams_class->finalize = mix_videoconfigparamsdec_finalize;
67 mixparams_class->copy = (MixParamsCopyFunction) mix_videoconfigparamsdec_copy;
68 mixparams_class->dup = (MixParamsDupFunction) mix_videoconfigparamsdec_dup;
69 mixparams_class->equal
70 = (MixParamsEqualFunction) mix_videoconfigparamsdec_equal;
71 }
72
73 MixVideoConfigParamsDec *
mix_videoconfigparamsdec_new(void)74 mix_videoconfigparamsdec_new(void) {
75 MixVideoConfigParamsDec *ret =
76 (MixVideoConfigParamsDec *) g_type_create_instance(
77 MIX_TYPE_VIDEOCONFIGPARAMSDEC);
78
79 return ret;
80 }
81
mix_videoconfigparamsdec_finalize(MixParams * obj)82 void mix_videoconfigparamsdec_finalize(MixParams * obj) {
83
84 /* clean up here. */
85 MixVideoConfigParamsDec *self = MIX_VIDEOCONFIGPARAMSDEC(obj);
86 MixParamsClass *root_class = MIX_PARAMS_CLASS(parent_class);
87
88
89 /* free header */
90 if (self->header.data) {
91 g_free(self->header.data);
92 memset(&self->header, 0, sizeof(self->header));
93 }
94
95 /* free mime_type */
96 if (self->mime_type->str)
97 g_string_free(self->mime_type, TRUE);
98 else
99 g_string_free(self->mime_type, FALSE);
100
101 /* Chain up parent */
102 if (root_class->finalize) {
103 root_class->finalize(obj);
104 }
105 }
106
107 MixVideoConfigParamsDec *
mix_videoconfigparamsdec_ref(MixVideoConfigParamsDec * mix)108 mix_videoconfigparamsdec_ref(MixVideoConfigParamsDec * mix) {
109 return (MixVideoConfigParamsDec *) mix_params_ref(MIX_PARAMS(mix));
110 }
111
112 /**
113 * mix_videoconfigparamsdec_dup:
114 * @obj: a #MixVideoConfigParamsDec object
115 * @returns: a newly allocated duplicate of the object.
116 *
117 * Copy duplicate of the object.
118 */
119 MixParams *
mix_videoconfigparamsdec_dup(const MixParams * obj)120 mix_videoconfigparamsdec_dup(const MixParams * obj) {
121 MixParams *ret = NULL;
122
123 if (MIX_IS_VIDEOCONFIGPARAMSDEC(obj)) {
124 MixVideoConfigParamsDec *duplicate = mix_videoconfigparamsdec_new();
125 if (mix_videoconfigparamsdec_copy(MIX_PARAMS(duplicate), MIX_PARAMS(obj))) {
126 ret = MIX_PARAMS(duplicate);
127 } else {
128 mix_videoconfigparamsdec_unref(duplicate);
129 }
130 }
131
132 return ret;
133 }
134
135 /**
136 * mix_videoconfigparamsdec_copy:
137 * @target: copy to target
138 * @src: copy from src
139 * @returns: boolean indicates if copy is successful.
140 *
141 * Copy instance data from @src to @target.
142 */
mix_videoconfigparamsdec_copy(MixParams * target,const MixParams * src)143 gboolean mix_videoconfigparamsdec_copy(MixParams * target, const MixParams * src) {
144
145 MixVideoConfigParamsDec *this_target, *this_src;
146 MIX_RESULT mix_result = MIX_RESULT_FAIL;
147 MixParamsClass *root_class = MIX_PARAMS_CLASS(parent_class);
148
149 LOG_V( "Begin\n");
150
151 if (MIX_IS_VIDEOCONFIGPARAMSDEC(target) && MIX_IS_VIDEOCONFIGPARAMSDEC(src)) {
152
153 /* Cast the base object to this child object */
154 this_target = MIX_VIDEOCONFIGPARAMSDEC(target);
155 this_src = MIX_VIDEOCONFIGPARAMSDEC(src);
156
157 /* copy properties of primitive type */
158
159 this_target->frame_rate_num = this_src->frame_rate_num;
160 this_target->frame_rate_denom = this_src->frame_rate_denom;
161 this_target->picture_width = this_src->picture_width;
162 this_target->picture_height = this_src->picture_height;
163 this_target->raw_format = this_src->raw_format;
164 this_target->rate_control = this_src->rate_control;
165 this_target->mixbuffer_pool_size = this_src->mixbuffer_pool_size;
166 this_target->extra_surface_allocation = this_src->extra_surface_allocation;
167
168 /* copy properties of non-primitive */
169
170 /* copy header */
171 mix_result = mix_videoconfigparamsdec_set_header(this_target,
172 &this_src->header);
173
174 if (mix_result != MIX_RESULT_SUCCESS) {
175
176 LOG_E( "set_header failed: mix_result = 0x%x\n", mix_result);
177 return FALSE;
178 }
179
180 /* copy mime_type */
181 if (this_src->mime_type) {
182
183 mix_result = mix_videoconfigparamsdec_set_mime_type(this_target,
184 this_src->mime_type->str);
185 } else {
186 mix_result = mix_videoconfigparamsdec_set_mime_type(this_target, NULL);
187 }
188
189 if (mix_result != MIX_RESULT_SUCCESS) {
190 LOG_E( "set_mime_type failed: mix_result = 0x%x\n", mix_result);
191 return FALSE;
192 }
193
194 /* TODO: copy other properties if there's any */
195
196 /* Now chainup base class */
197 if (root_class->copy) {
198 LOG_V( "root_class->copy != NULL\n");
199 return root_class->copy(MIX_PARAMS_CAST(target), MIX_PARAMS_CAST(
200 src));
201 } else {
202 LOG_E( "root_class->copy == NULL\n");
203 return TRUE;
204 }
205 }
206
207 LOG_V( "End\n");
208
209 return FALSE;
210 }
211
212 /**
213 * mix_videoconfigparamsdec_:
214 * @first: first object to compare
215 * @second: seond object to compare
216 * @returns: boolean indicates if instance are equal.
217 *
218 * Copy instance data from @src to @target.
219 */
mix_videoconfigparamsdec_equal(MixParams * first,MixParams * second)220 gboolean mix_videoconfigparamsdec_equal(MixParams * first, MixParams * second) {
221
222 gboolean ret = FALSE;
223
224 MixVideoConfigParamsDec *this_first, *this_second;
225 MixParamsClass *root_class = MIX_PARAMS_CLASS(parent_class);
226
227
228 if (MIX_IS_VIDEOCONFIGPARAMSDEC(first) && MIX_IS_VIDEOCONFIGPARAMSDEC(second)) {
229
230 // Deep compare
231 // Cast the base object to this child object
232 this_first = MIX_VIDEOCONFIGPARAMSDEC(first);
233 this_second = MIX_VIDEOCONFIGPARAMSDEC(second);
234
235 /* check the equalitiy of the primitive type properties */
236 if (this_first->frame_order_mode != this_second->frame_order_mode) {
237 goto not_equal;
238 }
239
240 if (this_first->frame_rate_num != this_second->frame_rate_num
241 && this_first->frame_rate_denom
242 != this_second->frame_rate_denom) {
243 goto not_equal;
244 }
245
246 if (this_first->picture_width != this_second->picture_width
247 && this_first->picture_height != this_second->picture_height) {
248 goto not_equal;
249 }
250
251 if (this_first->raw_format != this_second->raw_format) {
252 goto not_equal;
253 }
254
255 if (this_first->rate_control != this_second->rate_control) {
256 goto not_equal;
257 }
258
259 if (this_first->mixbuffer_pool_size != this_second->mixbuffer_pool_size) {
260 goto not_equal;
261 }
262
263 if (this_first->extra_surface_allocation != this_second->extra_surface_allocation) {
264 goto not_equal;
265 }
266
267 /* check the equalitiy of the none-primitive type properties */
268
269 /* MixIOVec header */
270
271 if (this_first->header.data_size != this_second->header.data_size) {
272 goto not_equal;
273 }
274
275 if (this_first->header.buffer_size != this_second->header.buffer_size) {
276 goto not_equal;
277 }
278
279 if (this_first->header.data && this_second->header.data) {
280 if (memcmp(this_first->header.data, this_second->header.data,
281 this_first->header.data_size) != 0) {
282 goto not_equal;
283 }
284 } else if (!(!this_first->header.data && !this_second->header.data)) {
285 goto not_equal;
286 }
287
288 /* compare mime_type */
289
290 if (this_first->mime_type && this_second->mime_type) {
291 if (g_string_equal(this_first->mime_type, this_second->mime_type)
292 != TRUE) {
293 goto not_equal;
294 }
295 } else if (!(!this_first->mime_type && !this_second->mime_type)) {
296 goto not_equal;
297 }
298
299 ret = TRUE;
300
301 not_equal:
302
303 if (ret != TRUE) {
304 return ret;
305 }
306
307 /* chaining up. */
308 if (root_class->equal)
309 ret = root_class->equal(first, second);
310 else
311 ret = TRUE;
312 }
313
314 return ret;
315 }
316
317 #define MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT(obj) \
318 if(!obj) return MIX_RESULT_NULL_PTR; \
319 if(!MIX_IS_VIDEOCONFIGPARAMSDEC(obj)) return MIX_RESULT_FAIL; \
320
321 #define MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT(obj, prop) \
322 if(!obj || !prop) return MIX_RESULT_NULL_PTR; \
323 if(!MIX_IS_VIDEOCONFIGPARAMSDEC(obj)) return MIX_RESULT_FAIL; \
324
325 #define MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT_PAIR(obj, prop, prop2) \
326 if(!obj || !prop || !prop2 ) return MIX_RESULT_NULL_PTR; \
327 if(!MIX_IS_VIDEOCONFIGPARAMSDEC(obj)) return MIX_RESULT_FAIL; \
328
329 /* TODO: Add getters and setters for other properties. The following is incomplete */
330
mix_videoconfigparamsdec_set_frame_order_mode(MixVideoConfigParamsDec * obj,MixFrameOrderMode frame_order_mode)331 MIX_RESULT mix_videoconfigparamsdec_set_frame_order_mode(
332 MixVideoConfigParamsDec * obj, MixFrameOrderMode frame_order_mode) {
333 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
334 obj->frame_order_mode = frame_order_mode;
335 return MIX_RESULT_SUCCESS;
336 }
337
mix_videoconfigparamsdec_get_frame_order_mode(MixVideoConfigParamsDec * obj,MixFrameOrderMode * frame_order_mode)338 MIX_RESULT mix_videoconfigparamsdec_get_frame_order_mode(
339 MixVideoConfigParamsDec * obj, MixFrameOrderMode * frame_order_mode) {
340 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, frame_order_mode);
341 *frame_order_mode = obj->frame_order_mode;
342 return MIX_RESULT_SUCCESS;
343 }
344
mix_videoconfigparamsdec_set_header(MixVideoConfigParamsDec * obj,MixIOVec * header)345 MIX_RESULT mix_videoconfigparamsdec_set_header(MixVideoConfigParamsDec * obj,
346 MixIOVec * header) {
347
348 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
349
350 if (!header) {
351 return MIX_RESULT_NULL_PTR;
352 }
353
354 if (header->data && header->buffer_size) {
355 obj->header.data = g_memdup(header->data, header->buffer_size);
356 if (!obj->header.data) {
357 return MIX_RESULT_NO_MEMORY;
358 }
359 obj->header.buffer_size = header->buffer_size;
360 obj->header.data_size = header->data_size;
361 }
362 return MIX_RESULT_SUCCESS;
363 }
364
mix_videoconfigparamsdec_get_header(MixVideoConfigParamsDec * obj,MixIOVec ** header)365 MIX_RESULT mix_videoconfigparamsdec_get_header(MixVideoConfigParamsDec * obj,
366 MixIOVec ** header) {
367
368 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, header);
369
370 if (obj->header.data && obj->header.buffer_size) {
371
372 *header = g_malloc(sizeof(MixIOVec));
373
374 if (*header == NULL) {
375 return MIX_RESULT_NO_MEMORY;
376 }
377
378 (*header)->data = g_memdup(obj->header.data, obj->header.buffer_size);
379 (*header)->buffer_size = obj->header.buffer_size;
380 (*header)->data_size = obj->header.data_size;
381
382 } else {
383 *header = NULL;
384 }
385 return MIX_RESULT_SUCCESS;
386
387 }
388
mix_videoconfigparamsdec_set_mime_type(MixVideoConfigParamsDec * obj,const gchar * mime_type)389 MIX_RESULT mix_videoconfigparamsdec_set_mime_type(MixVideoConfigParamsDec * obj,
390 const gchar * mime_type) {
391
392 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
393
394 if (!mime_type) {
395 return MIX_RESULT_NULL_PTR;
396 }
397
398 if (obj->mime_type) {
399 if (obj->mime_type->str)
400 g_string_free(obj->mime_type, TRUE);
401 else
402 g_string_free(obj->mime_type, FALSE);
403 }
404
405 obj->mime_type = g_string_new(mime_type);
406 if (!obj->mime_type) {
407 return MIX_RESULT_NO_MEMORY;
408 }
409
410 return MIX_RESULT_SUCCESS;
411 }
412
mix_videoconfigparamsdec_get_mime_type(MixVideoConfigParamsDec * obj,gchar ** mime_type)413 MIX_RESULT mix_videoconfigparamsdec_get_mime_type(MixVideoConfigParamsDec * obj,
414 gchar ** mime_type) {
415 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, mime_type);
416
417 if (!obj->mime_type) {
418 *mime_type = NULL;
419 return MIX_RESULT_SUCCESS;
420 }
421 *mime_type = g_strdup(obj->mime_type->str);
422 if (!*mime_type) {
423 return MIX_RESULT_NO_MEMORY;
424 }
425
426 return MIX_RESULT_SUCCESS;
427 }
428
mix_videoconfigparamsdec_set_frame_rate(MixVideoConfigParamsDec * obj,guint frame_rate_num,guint frame_rate_denom)429 MIX_RESULT mix_videoconfigparamsdec_set_frame_rate(MixVideoConfigParamsDec * obj,
430 guint frame_rate_num, guint frame_rate_denom) {
431 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
432 obj->frame_rate_num = frame_rate_num;
433 obj->frame_rate_denom = frame_rate_denom;
434 return MIX_RESULT_SUCCESS;
435 }
436
mix_videoconfigparamsdec_get_frame_rate(MixVideoConfigParamsDec * obj,guint * frame_rate_num,guint * frame_rate_denom)437 MIX_RESULT mix_videoconfigparamsdec_get_frame_rate(MixVideoConfigParamsDec * obj,
438 guint * frame_rate_num, guint * frame_rate_denom) {
439 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT_PAIR (obj, frame_rate_num, frame_rate_denom);
440 *frame_rate_num = obj->frame_rate_num;
441 *frame_rate_denom = obj->frame_rate_denom;
442 return MIX_RESULT_SUCCESS;
443 }
444
mix_videoconfigparamsdec_set_picture_res(MixVideoConfigParamsDec * obj,guint picture_width,guint picture_height)445 MIX_RESULT mix_videoconfigparamsdec_set_picture_res(MixVideoConfigParamsDec * obj,
446 guint picture_width, guint picture_height) {
447 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
448 obj->picture_width = picture_width;
449 obj->picture_height = picture_height;
450 return MIX_RESULT_SUCCESS;
451 }
452
mix_videoconfigparamsdec_get_picture_res(MixVideoConfigParamsDec * obj,guint * picture_width,guint * picture_height)453 MIX_RESULT mix_videoconfigparamsdec_get_picture_res(MixVideoConfigParamsDec * obj,
454 guint * picture_width, guint * picture_height) {
455 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT_PAIR (obj, picture_width, picture_height);
456 *picture_width = obj->picture_width;
457 *picture_height = obj->picture_height;
458 return MIX_RESULT_SUCCESS;
459 }
460
mix_videoconfigparamsdec_set_raw_format(MixVideoConfigParamsDec * obj,guint raw_format)461 MIX_RESULT mix_videoconfigparamsdec_set_raw_format(MixVideoConfigParamsDec * obj,
462 guint raw_format) {
463 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
464
465 /* TODO: check if the value of raw_format is valid */
466 obj->raw_format = raw_format;
467 return MIX_RESULT_SUCCESS;
468 }
469
mix_videoconfigparamsdec_get_raw_format(MixVideoConfigParamsDec * obj,guint * raw_format)470 MIX_RESULT mix_videoconfigparamsdec_get_raw_format(MixVideoConfigParamsDec * obj,
471 guint *raw_format) {
472 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, raw_format);
473 *raw_format = obj->raw_format;
474 return MIX_RESULT_SUCCESS;
475 }
476
mix_videoconfigparamsdec_set_rate_control(MixVideoConfigParamsDec * obj,guint rate_control)477 MIX_RESULT mix_videoconfigparamsdec_set_rate_control(MixVideoConfigParamsDec * obj,
478 guint rate_control) {
479 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
480
481 /* TODO: check if the value of rate_control is valid */
482 obj->rate_control = rate_control;
483 return MIX_RESULT_SUCCESS;
484 }
485
mix_videoconfigparamsdec_get_rate_control(MixVideoConfigParamsDec * obj,guint * rate_control)486 MIX_RESULT mix_videoconfigparamsdec_get_rate_control(MixVideoConfigParamsDec * obj,
487 guint *rate_control) {
488 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, rate_control);
489 *rate_control = obj->rate_control;
490 return MIX_RESULT_SUCCESS;
491 }
492
mix_videoconfigparamsdec_set_buffer_pool_size(MixVideoConfigParamsDec * obj,guint bufpoolsize)493 MIX_RESULT mix_videoconfigparamsdec_set_buffer_pool_size(
494 MixVideoConfigParamsDec * obj, guint bufpoolsize) {
495
496 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
497
498 obj->mixbuffer_pool_size = bufpoolsize;
499 return MIX_RESULT_SUCCESS;
500
501 }
502
mix_videoconfigparamsdec_get_buffer_pool_size(MixVideoConfigParamsDec * obj,guint * bufpoolsize)503 MIX_RESULT mix_videoconfigparamsdec_get_buffer_pool_size(
504 MixVideoConfigParamsDec * obj, guint *bufpoolsize) {
505
506 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, bufpoolsize);
507 *bufpoolsize = obj->mixbuffer_pool_size;
508 return MIX_RESULT_SUCCESS;
509 }
510
mix_videoconfigparamsdec_set_extra_surface_allocation(MixVideoConfigParamsDec * obj,guint extra_surface_allocation)511 MIX_RESULT mix_videoconfigparamsdec_set_extra_surface_allocation(
512 MixVideoConfigParamsDec * obj,
513 guint extra_surface_allocation) {
514
515 MIX_VIDEOCONFIGPARAMSDEC_SETTER_CHECK_INPUT (obj);
516
517 obj->extra_surface_allocation = extra_surface_allocation;
518 return MIX_RESULT_SUCCESS;
519
520 }
521
mix_videoconfigparamsdec_get_extra_surface_allocation(MixVideoConfigParamsDec * obj,guint * extra_surface_allocation)522 MIX_RESULT mix_videoconfigparamsdec_get_extra_surface_allocation(
523 MixVideoConfigParamsDec * obj,
524 guint *extra_surface_allocation) {
525
526 MIX_VIDEOCONFIGPARAMSDEC_GETTER_CHECK_INPUT (obj, extra_surface_allocation);
527 *extra_surface_allocation = obj->extra_surface_allocation;
528 return MIX_RESULT_SUCCESS;
529
530 }
531
532
533
534
535