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#include <glib.h> 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideolog.h" 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "mixvideoformat.h" 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define MIXUNREF(obj, unref) if(obj) { unref(obj); obj = NULL; } 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */ 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_getcaps_default(MixVideoFormat *mix, 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GString *msg); 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_initialize_default(MixVideoFormat *mix, 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec * config_params, 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameManager * frame_mgr, 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool * input_buf_pool, 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixSurfacePool ** surface_pool, 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay vadisplay); 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_videofmt_decode_default(MixVideoFormat *mix, 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer * bufin[], gint bufincnt, 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoDecodeParams * decode_params); 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_flush_default(MixVideoFormat *mix); 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_eos_default(MixVideoFormat *mix); 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_deinitialize_default(MixVideoFormat *mix); 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic GObjectClass *parent_class = NULL; 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_finalize(GObject * obj); 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeG_DEFINE_TYPE (MixVideoFormat, mix_videoformat, G_TYPE_OBJECT); 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_init(MixVideoFormat * self) { 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* public member initialization */ 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* These are all public because MixVideoFormat objects are completely internal to MixVideo, 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee no need for private members */ 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->initialized = FALSE; 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->framemgr = NULL; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->surfacepool = NULL; 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->inputbufpool = NULL; 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->inputbufqueue = NULL; 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->va_display = NULL; 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->va_context = VA_INVALID_ID; 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->va_config = VA_INVALID_ID; 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->va_surfaces = NULL; 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->va_num_surfaces = 0; 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->mime_type = NULL; 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->frame_rate_num = 0; 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->frame_rate_denom = 0; 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->picture_width = 0; 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->picture_height = 0; 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->parse_in_progress = FALSE; 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee self->current_timestamp = 0; 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void mix_videoformat_class_init(MixVideoFormatClass * klass) { 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GObjectClass *gobject_class = (GObjectClass *) klass; 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* parent class for later use */ 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent_class = g_type_class_peek_parent(klass); 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gobject_class->finalize = mix_videoformat_finalize; 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* setup vmethods with base implementation */ 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->getcaps = mix_videofmt_getcaps_default; 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->initialize = mix_videofmt_initialize_default; 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->decode = mix_videofmt_decode_default; 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->flush = mix_videofmt_flush_default; 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->eos = mix_videofmt_eos_default; 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee klass->deinitialize = mix_videofmt_deinitialize_default; 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormat * 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformat_new(void) { 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormat *ret = g_object_new(MIX_TYPE_VIDEOFORMAT, NULL); 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return ret; 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid mix_videoformat_finalize(GObject * obj) { 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* clean up here. */ 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VAStatus va_status; 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormat *mix = MIX_VIDEOFORMAT(obj); 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixInputBufferEntry *buf_entry = NULL; 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(mix->objectlock) { 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_free(mix->objectlock); 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->objectlock = NULL; 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type) 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type->str) 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, TRUE); 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, FALSE); 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MiVideo object calls the _deinitialize() for frame manager 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix->framemgr, mix_framemanager_unref); 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->surfacepool) 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_surfacepool_deinitialize(mix->surfacepool); 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix->surfacepool, mix_surfacepool_unref); 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //libVA cleanup (vaTerminate is called from MixVideo object) 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->va_display) { 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->va_context != VA_INVALID_ID) 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyConfig(mix->va_display, mix->va_config); 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "Failed vaDestroyConfig\n"); 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->va_config = VA_INVALID_ID; 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->va_context != VA_INVALID_ID) 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroyContext(mix->va_display, mix->va_context); 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "Failed vaDestroyContext\n"); 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->va_context = VA_INVALID_ID; 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->va_surfaces) 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee va_status = vaDestroySurfaces(mix->va_display, mix->va_surfaces, mix->va_num_surfaces); 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (va_status != VA_STATUS_SUCCESS) { 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_W( "Failed vaDestroySurfaces\n"); 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(mix->va_surfaces); 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->va_surfaces = NULL; 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->va_num_surfaces = 0; 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Deinit input buffer queue 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (!g_queue_is_empty(mix->inputbufqueue)) 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee buf_entry = g_queue_pop_head(mix->inputbufqueue); 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_unref(buf_entry->buf); 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(buf_entry); 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_queue_free(mix->inputbufqueue); 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MixBuffer pool is deallocated in MixVideo object 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->inputbufpool = NULL; 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Chain up parent */ 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (parent_class->finalize) { 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee parent_class->finalize(obj); 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMixVideoFormat * 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.leemix_videoformat_ref(MixVideoFormat * mix) { 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MixVideoFormat *) g_object_ref(G_OBJECT(mix)); 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Default vmethods implementation */ 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_getcaps_default(MixVideoFormat *mix, 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee GString *msg) { 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_print("mix_videofmt_getcaps_default\n"); 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_initialize_default(MixVideoFormat *mix, 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec * config_params, 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameManager * frame_mgr, 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool * input_buf_pool, 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixSurfacePool ** surface_pool, 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display) { 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "Begin\n"); 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIX_RESULT res = MIX_RESULT_SUCCESS; 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixInputBufferEntry *buf_entry = NULL; 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix || !config_params || !frame_mgr || !input_buf_pool || !surface_pool || !va_display) 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "NUll pointer passed in\n"); 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MIX_RESULT_NULL_PTR); 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Create object lock 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Note that g_thread_init() has already been called by mix_video_init() 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->objectlock) //If already exists, then deallocate old one (we are being re-initialized) 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_free(mix->objectlock); 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->objectlock = NULL; 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->objectlock = g_mutex_new(); 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix->objectlock) { 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "!mix->objectlock\n"); 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return (MIX_RESULT_NO_MEMORY); 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_lock(mix->objectlock); 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Clean up any previous framemgr 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix->framemgr, mix_framemanager_unref); 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->framemgr = frame_mgr; 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_framemanager_ref(mix->framemgr); 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->va_display = va_display; 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type) //Clean up any previous mime_type 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type->str) 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, TRUE); 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, FALSE); 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gchar *mime_tmp = NULL; 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee res = mix_videoconfigparamsdec_get_mime_type(config_params, &mime_tmp); 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mime_tmp) 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->mime_type = g_string_new(mime_tmp); 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(mime_tmp); 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix->mime_type) //new failed 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee res = MIX_RESULT_NO_MEMORY; 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Could not duplicate mime_type\n"); 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } //else there is no mime_type; leave as NULL 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee res = mix_videoconfigparamsdec_get_frame_rate(config_params, &(mix->frame_rate_num), &(mix->frame_rate_denom)); 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (res != MIX_RESULT_SUCCESS) 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Error getting frame_rate\n"); 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee res = mix_videoconfigparamsdec_get_picture_res(config_params, &(mix->picture_width), &(mix->picture_height)); 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (res != MIX_RESULT_SUCCESS) 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Error getting picture_res\n"); 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->inputbufqueue) 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Deinit previous input buffer queue 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (!g_queue_is_empty(mix->inputbufqueue)) 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee buf_entry = g_queue_pop_head(mix->inputbufqueue); 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix_buffer_unref(buf_entry->buf); 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_free(buf_entry); 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_queue_free(mix->inputbufqueue); 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MixBuffer pool is cleaned up in MixVideo object 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->inputbufpool = NULL; 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->inputbufpool = input_buf_pool; 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->inputbufqueue = g_queue_new(); 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!mix->inputbufqueue) //New failed 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee res = MIX_RESULT_NO_MEMORY; 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_E( "Could not duplicate mime_type\n"); 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee goto cleanup; 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // surface pool, VA context/config and parser handle are initialized by 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // derived classes 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee cleanup: 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (res != MIX_RESULT_SUCCESS) { 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MIXUNREF(mix->framemgr, mix_framemanager_unref); 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type) 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->mime_type->str) 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, TRUE); 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_string_free(mix->mime_type, FALSE); 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->mime_type = NULL; 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->objectlock) 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(mix->objectlock); 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_free(mix->objectlock); 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->objectlock = NULL; 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->frame_rate_num = 0; 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->frame_rate_denom = 1; 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->picture_width = 0; 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mix->picture_height = 0; 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Normal unlock 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (mix->objectlock) 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_mutex_unlock(mix->objectlock); 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee LOG_V( "End\n"); 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return res; 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_decode_default(MixVideoFormat *mix, 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBuffer * bufin[], gint bufincnt, 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoDecodeParams * decode_params) { 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_flush_default(MixVideoFormat *mix) { 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_eos_default(MixVideoFormat *mix) { 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic MIX_RESULT mix_videofmt_deinitialize_default(MixVideoFormat *mix) { 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //All teardown is being done in _finalize() 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_SUCCESS; 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* mixvideoformat class methods implementation */ 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_getcaps(MixVideoFormat *mix, GString *msg) { 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee g_print("mix_videofmt_getcaps\n"); 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->getcaps) { 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->getcaps(mix, msg); 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_NOTIMPL; 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_initialize(MixVideoFormat *mix, 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoConfigParamsDec * config_params, 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixFrameManager * frame_mgr, 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixBufferPool * input_buf_pool, 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixSurfacePool ** surface_pool, 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee VADisplay va_display) { 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->initialize) { 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->initialize(mix, config_params, frame_mgr, 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee input_buf_pool, surface_pool, va_display); 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_decode(MixVideoFormat *mix, MixBuffer * bufin[], 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gint bufincnt, MixVideoDecodeParams * decode_params) { 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->decode) { 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->decode(mix, bufin, bufincnt, decode_params); 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_flush(MixVideoFormat *mix) { 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->flush) { 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->flush(mix); 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_eos(MixVideoFormat *mix) { 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->eos) { 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->eos(mix); 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeMIX_RESULT mix_videofmt_deinitialize(MixVideoFormat *mix) { 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee MixVideoFormatClass *klass = MIX_VIDEOFORMAT_GET_CLASS(mix); 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (klass->deinitialize) { 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return klass->deinitialize(mix); 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return MIX_RESULT_FAIL; 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 402