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