Home | History | Annotate | Download | only in src
      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 Intels 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 
     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 
     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 *
     74 mix_videoconfigparamsdec_new(void) {
     75 	MixVideoConfigParamsDec *ret =
     76 			(MixVideoConfigParamsDec *) g_type_create_instance(
     77 					MIX_TYPE_VIDEOCONFIGPARAMSDEC);
     78 
     79 	return ret;
     80 }
     81 
     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 *
    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 *
    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  */
    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  */
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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